TCP三次握手和四次分手

来源:互联网 发布:淘宝贷款还不了不还了 编辑:程序博客网 时间:2024/04/29 21:34

1.通过wireshark抓包看到

抓到的包和对应的协议层如下图所示:


1. Frame:   物理层的数据帧概况2. Ethernet II: 数据链路层以太网帧头部信息3. Internet Protocol Version 4: 互联网层IP包头部信息4. Transmission Control Protocol:  传输层的数据段头部信息,此处是TCP5. Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议



2.TCP三次握手解析

请求百度链接,wireshark的抓包内容




1.第一次握手:客户端发送一个SYN =1 和Seq =X 给服务器(一般 Seq =0)



2.第二次握手:服务器收到客户端发送的报文后,由SYN=1知道客户端要求建立联机,向客户端发送一个SYN=1,ACK =1(ACK=X+1=0+1=1) ,Seq=0的报文


3.第三次握手:客户端收到服务器返回的报文后,检测ACK是否确证(即是否为第一次握手发出的 Seq+1,是否为1),  若正确,客户端再次发送确认包,ACK=1(ACK=Y+1),SYN为0,Seq=1 ,服务端收到ACK=1后,连接成功,可以传输数据了





3.TCP四次分手解析

为什么TCP握手只要三次,而分手却要四次呢?因为当客户端提出分手时,可能服务端还在传输数据,所以服务器在返回给客户端ACK=1 时,还需要返回FIN



1.第一次分手:客户端传给服务器一个Seq =1 ,ACK=1 , FIN=1 的报文,用来关闭客户端到服务端的数据传输


2.第二次分手:服务器收到FIN=1的报文后,知道客户端要关闭连接,返回ACK=2(客户端传给服务端的Seq+1),Seq=1(客户端传给服务端的ACK值)



3.第三次分手:服务器关闭与客户端的连接,返回客户端一个FIN=1,ACK=2,Seq=1


4.第四次分手:客户端收到服务端返回的FIN之后,返回ACK=2(服务端返回给客户端的Seq+1),Seq=2(服务端返回给客户端的ACK)



注意:自己之前抓包的时候,发现客户端close掉连接后,服务端没有立即返回FIN 数据包,这个原因是:

MSLMaximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃 2MSL即两倍的MSLTCPTIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。


0 0