TCP三次握手与四次挥手与UDP内部工作机制

转自:http://baijiahao.baidu.com/s?id=1605593588700831781&wfr=spider&for=pc

图中这是一个网络层的数据包结构,从它已经有IP报头看得出来。本文主讲传输层中TCP与UDP的报头格式,先来看tcp的报头。从源端口与目标端口,基础的在前面的文章中都有讲解。下一个sequence number序列号,它用于将我们的文字图片等序列化成二进制比特流传输时在目标端进行反序列化所使用的。acknowledge number是确认号,是tcp独有的,因为其特殊的机制而存在。每次tcp报文发送过去之后需要对端返回acknowledge确认号才可以继续传输。window用来表示针对于对端能够接收的流量大小的多少以起到最大网络带宽利用率的效果。

那么tcp协议中双方的端口是由谁来指定的呢,一个tcp的会话本机端口通常为自动分配的,目标端口也是对应受访问的服务。端口的范围是1~65535,通常1~10000左右的端口现在是已经被常见应用程序所占用的,1~1023则被系统服务所使用。

看tcp三次握手工作原理,如图所示。主机A想要与主机B进行TCP通信,首先他需要向B发送一个syn同步序列编号syncsynchronized squsequence number用来标记保持同步,到这里第一次握手就结束了。第二次握手开始,主机B向A发送一个syn同步序列号和ack确认号确认号为A主机发送的syn号+1,到这里第二次握手结束。第三次握手开始主机A向主机B发送ack确认码为主机B的syn号+1,到此为止三次握手结束进入ESTABLISHED状态,开始进行数据传输。

主机A想要向主机B结束tcp长连接,第一次挥手发送fin请求,第一次挥手结束。第二次挥手开始,主机B向主机A发送ack确认码,为fin号+1到这里第二次挥手结束。第三次握手开始主机B向A发送fin号结束。第四次挥手开始主机A向B发送ack号为fin+1,这时tcp连接结束。

TCP连接同样具备缓存机制,这里叫缓冲。当A向B发送的报文超过B的win_Size时,溢出的数据包将被废弃,此时B需要向A返回一个接收到最新的数据包序列号的ack,A收到后将会从ack起始位置开始传输,此时传输数量就是B的ack号减去已经发包数量,这也就是B的缓冲区所能容纳的数据包的大小。这就是tcp中的窗口滑动机制,通俗的说就是自适应缓冲区大小。

这是UDP报头结构,可以看到童颜的端口,长度,校验以及data。udp很有意思,它没有序列号如何进行分片和重排序呢?这个协议由应用程序开发者自己编写排序和流量控制的代码,所以游戏或者某些应用程序中丢包了就是这块代码没有写好。UDP与TCP不具有重传机制,所以它发包的速率要比TCP更快,就目前网络而言,在传输速率受限的情况下大多视频语音等都采用udp进行传输,像斗鱼这种大型的直播平台,如果把udp换成tcp,它的机房网线会当场烧断。

猜你喜欢

转载自blog.csdn.net/chenxijie1985/article/details/89636422