TCP/IP的三次握手和四次挥手

从一个小故事开始:

三次牵手:
男:我喜欢你。
女:我知道了,我也喜欢你。
男:我知道了,那我们在一起吧。
四次分手:
男:我不喜欢你了,我要和你分手。
女:我知道到了,等我先打完这把王者荣耀再说。
女:我打完了,我也不喜欢你了,我要和你分手。
男:我知道了,同意分手。

序列号与确认号的含义

ACK=1:确认序号有效;

SYN=1:发起一个新连接;

FIN=1:释放一个连接;

seq = x:本报文段发送的数据的第一个字节的序号

ACK=1, ack = y:期待收到对方下一个报文段的第一个字节的序号。

三次握手

 第一次握手

客户端  ------->>SYN=1,seq=x ---------->>服务器     客户端进入 SYN-SENT 状态(在发送连接请求后等待匹配的连接请求)

注:客户端向服务器发起一个连接,并发送一个第一个字节的序号为x的报文字段

第二次握手

服务器 ------->>SYN=1,ACK=1,seq=y,ack=x+1 ---------->>客户端      服务器端进入 SYN-RCVD 状态  (在收到和发送一个连接请求后等待对连接请求的确认)

注:服务器向客户端发起一个连接,并发送一个随机产生一个值 seq=y,确定发出的序号有效,并向客户端发送期待下次接受到一个第一个字节的序号为x+1的报文字段

第三次握手

 客户端  -------->> ACK=1,seq=x+1,ack=y+1----------->>服务器    客户端和服务器端进入 ESTABLISHED 状态   ( 代表一个打开的连接,数据可以传送给用户)

注:客户端收到确认后,检查 ack 是否为 x+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=y+1,并将该数据包发送给服务器端,服务器端检查 ack是否为 y+1,ACK 是否为 1,如果正确则连接建立成功

四次挥手

第一次挥手

客户端 -------->>FIN=1,seq=u ---------->>服务器       客户端进入 FIN-WAIT-1 状态   (等待远程 TCP 的连接中断请求,或先前的连接中断请求的确认)

 注:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为 seq=u 等于前面已经传送过来的数据的最后一个字节的序号加 1,并将该数据包发送给服务器端,用来关闭客户端到服务器端的数据传送。

第二次挥手

服务器 -------->> ACK=1,seq=v,ack=u+1---------->>客户端      客户端就进入 FIN-WAIT-2 状态     (从远程 TCP 等待连接中断请求)

 注:服务器端收到 FIN=1 后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号 seq=v。

第三次挥手

服务器 --------->>FIN=1,ACK=1,seq=w,ack=u+1---------->> 客户端      服务器端进入 LAST-ACK 状态     (等待原来发向远程 TCP 的连接中断请求的确认)

注:当服务器端确定数据已发送完成,就向客户端发送连接释放报文。置 FIN=1,ACK=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为 seq=w

第四次挥手

客户端 --------->>ACK=1,seq=u+1,ack=w+1 ------------->>服务器     客户端就进入 TIME-WAIT 状态     (等待足够的时间以确保远程 TCP 接收到连接中断请求的确认)  服务器只要收到了客户端发出的确认,立即进入 CLOSED 状态     (没有任何连接状态)

注:客户端收到服务器端的连接释放报文后,必须发出确认 ACK=1,ack=w+1,而自己的序列号是 seq=u+1,此时,客户端就进入 TIME-WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。注意此时 TCP 连接还没有释放,必须经过 2MSL(最长报文段寿命)的时间后,当客户端撤销相应的 TCB 后,才进入 CLOSED 状态。服务器只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销 TCB 后,就结束了这次的 TCP 连接。可以看到,服务器结束 TCP 连接的时间要比客户端早一些

原文地址:https://www.cnblogs.com/wbf980728/p/14121177.html