TCP与UDP位于网络通信层中的同一层,首先看一下它们在网络通信层中的位置:
TCP与UDP就位于传输层。
首先介绍一下TCP协议
三次握手,以访问www.baidu.com为例
① 客户端发送报头 标志位 SYN ;SYN表示同步的意思 暂时就理解为要求对方返回数据; sequence number (序列号)为 0(或者为j)
② 服务器 收到请求后 回复,报头标志位 SYN ACK,SYN的意思同上, sequence number (序列号)为 0(或者为n); ACK的意思 是对客户端发送信息的确认 值为 0+1 (或者为 j+1)
③ 客户端收到服务器的信息后 回复一个报文,报头标志为ACK 值为1 (或者为n+1)
这样三次握手完毕; 如果再报文中 没有ACK 标志位,那么 acknowledgment number 也就没有意义。
OK 看一下报文吧!
①
②
③
握手协议的目的有两个 :① 确认网络是不是通的 ② 初始化序列号
下面看一下握手之后 是怎么发送消息的
以浏览器访问www.sogou.com 为例,看一下他们发送数据的的报文,使用wireshark 工具抓包,查看transmission control protcol层的协议
浏览器发送的第一条信息
浏览器发送的第二条信息
下面看一下浏览器的回复
基本的通信就是这样的:
1、客户端发送消息(报头 + 包体)
报头:源端口、地址端口、序列号、报文长度、标志位、windows size value(缓存大小)
包体:
2、发送完消息之后,这一条消息会被放在一个重发队列中,如果再一段时间内没有收到对方的回复(对方会收到后会回复的),则重发。如果收到回复,则在重发队列中删除。
关于TCP的缓存是这样的,假如要发送一段很长的消息,TCP会将这些消息分为几段来发送(截图中的 TCP segment a ressembeled PDU);为什么呢 这是由于TCP缓存决定的,关于TCP的缓存理解的还不是很清楚,这个缓存是在握手协议中就规定好的。主要原因是接收数据的一方,要将接受到的数据放在缓存里,而这个缓存又好像是受链路层的影响,,这就不太懂了,所以 TCP会分片发送。
四次挥手:
客户端 发送 FIN标志的报头 报头中带有序列号
服务端 回一个ACK标志的报头 ACK值为 收到的序列号 + 1 (为了防止 客户端重发 FIN 报文)
服务端发送一个 FIN标志的报头 报头中有一个序列号
客户端 回一个ACK标志的报头 ACK的值 为收到的序列号 +1
下面说一说 UDP吧;UDP也是分为 报头 和 包体的
UDP的报头
源端口、目标端口、报文长度、校验值 只有四个字节
UDP是无连接的,也就是在只管发送数据,至于网络通不通 或者 对方有没有接受到,不管不问。因此可靠性较差;
但是UDP相对于TCP来说 也是由有点的;
1、资源与时间消耗少 (报头短 没有握手协议等)
2、可以抢占网络 在网络不好的情况下,TCP发送速率会动态调节(具体怎么调节的不清楚) 但UDP仍然会向网络层扔大量数据
比如 QQ,就是使用的UDP协议,不过QQ在应用层 对 传输的可靠性做了处理。
QQ使用UDP的原因大概如下:资源占用少 时间消耗少 而且当时 没有epoll技术 去实现 多链接中 只有少数活跃这种病发情况的处理,另外 最初 QQ只有一个服务器,所以不能使用太多资源。
所以 UDP虽然“素质”差点 但如果再上层保证传输的准确性,也是很不错的选择,ping 也是发生的UDP协议。
问题:TCP中的缓存机制 MSS接受上限 从路由缓存中获得 等知识不了解。