TCP握手与挥手详解(附有图)

为什么不是4次握手

首先我们知道TCP是3次握手与4次挥手,为什么不是4次握手呢,因为其中握手请求同步过程中并不需要数据传输因此将两次合并为一次了。

我们需要掌握哪些标志量

SYN:请求同步标志,为1的时候为有效 ACK:应答标志,表示接受到所发的数据,1为有效 FIN:结束请求标志,1为有效

ack:应答,值为告诉对方下一次所发数据地址 seq:值为所发数据地址

TCP握手

根据图片所示: 客户机主动唤醒处在Listen状态下的服务器,发送:SYN=1,seq=x表示请求同步,所发数据地址为x 当服务器接收到数据后,返回:SYN=1,ACK=1,seq=y,ack=x+1(合并的步骤),表示同步请求恢复,收到客户机所发数据,服务器发送数据地址为y,提醒客户机该发送地址为x+1的数据 接收到服务器反馈后客户机进行应答:ACK=1,seq=x+1,ack=y+1,表示接受到所发消息,本次数据地址为x+1,提醒服务器下次应发y+1地址的数据

TCP挥手

对照图片将哈: 首先客户机是主动发起断开连接请求的(结合实际也能理解),向服务器发送:FIN=1,seq=x,表示客户机向服务器发送断开连接的申请标志位,客户机所发送数据地址为x 服务器接收到数据后,ACK=1,seq=y,ack=x+1,这个就不解释了吧,但需要对比握手操作的是为什么后面服务器还发送了一次,而不是将两步合为一步,因为在服务器接收到客户机的断开请求后,可能还有些数据正在传输或未传输且需要传输,因此服务器先回复客户机表示接收到你的断开请求但还不能够断开,当数据传输完成后再次回复FIN=1,ACK=1,seq=z,ack=x+1表示可以断开了,注意这时seq变为z(就是不同于上面)因为中间数据传输了,地址变化了。 最后客户机回复:ACK=1,seq=x+1,ack=z+1 还要注意的是,为什么客户机最后回复后等待了2MSL

等待2MSL

首先我们要知道MSL代表的是最大报文时间,值报文在网络中所能存在的最大时长,因此可以理解如果过去了2MSL那么就表示服务器肯定没有收到客户端所发送的应答报文,那么就需要重发。那么有人可能会说那么服务器那边要不要也弄个2MSL或者如果一直发送失败怎么办,这个我们只能保证尽量减少可能出现错误的概率不能杜绝所有问题,这涉及到一个哲学上的悖论,没法避免哈。

报文格式图

最后附上TCP首部的报文图,里面有标志位啊,目标端口啊这些参数的位置以及大小

经验分享 程序员 微信小程序 职场和发展