您的位置:首页 > 理论基础 > 计算机网络

TCP三次握手和四次分手

2016-09-05 19:07 232 查看
1.通过wireshark抓包看到

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



1. Frame:   物理层的数据帧概况
2. Ethernet II: 数据链路层以太网帧头部信息
3. Internet Protocol Version 4: 互联网层IP包头部信息
4. Transmission Control Protocol:  传输层的数据段头部信息,此处是TCP
5. 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 数据包,这个原因是:

MSL是Maximum
Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃 2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: