正常情况下的四次挥手: 一、客户端:服务器在嘛?我想要断开连接?
Client将FIN置为1,序号seq=u,发送给Server,进入FIN_WAIT_1状态;
二、服务器:在的,但是我这边还有数据没传送完,你等我下
Server收到后,将ACK置为1,ack=u+1,响应给Client,进入CLOSE_WAIT状态;Client收到响应后,进入FIN_WAIT_2状态;
三、服务器:客户端好了,我数据传输完成了,你可以彻底关闭连接离开我了
Server在结束所有数据传输后,将Fin置为1,seq=w,发送给Client,进入LAST_ACK状态;
四、客户端:好的服务器,我走啦
Client收到后,将ACK置为1,ack=w+1,响应给Server,进入TIME_WAIT状态,等待2MSL后,进入CLOSED状态 Server收到后,进入CLOSED状态
访问我的服务器的三次挥手 这边相比较于上面的四次挥手,这边少了一次ack;将第二次和第三次进行合并;
一、客户端:服务器在嘛?我想要断开连接?
二、服务器:在的,我这边也没有数据要传了,你可以直接关闭了
三、客户端:好的服务器,我走啦
原因: 在TCP/IP协议族翻书翻到,TCP连接终止时有两种选择:三次挥手和具有半关闭选项的四次挥手。 三次挥手:客户机发送FIN+ACK->服务器接受并发送FIN+ACK标记位的包->客户机发送ACK确认包,完成连接终止,我的测试服务器就是这种情况,而抓的百度数据包则是半关闭选项的四次挥手。
三次挥手:当一方关闭连接,另外一方没有数据发送时,马上关闭连接,也就将第二步的ack与第三步的fin合并为一步了,这个优化在RFC793 3.5节有讲,从理论上也确实是这样,之所以有四次挥手,是因为第二次和第三次中间服务端还需要继续发送数据,如果没有数据需要发送,就可以将这两次进行合并。
话外:time_wait是主动发起断开连接的一方的状态,2MSL等待时间,存在的原因: 1、为了可以处理延迟达到的请求。 2、防止发送ack丢失,可以保证ack的重新发送。
微信公众号: 少年的志向,不应该是房子,他们应该伏案疾书,或为心中的梦想而挥洒汗水,畅想着自己未来光明的人生,少年的梦想,也不应该是生活,他们应该想要集齐七颗龙珠,或者幻想着拥有一颗皮卡丘。
|