TCP三次握手/四次挥手到三体猜疑链

Posted 万能的小滑块

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP三次握手/四次挥手到三体猜疑链相关的知识,希望对你有一定的参考价值。

目录

个人对三次握手 /四次挥手的理解:

1.三体

2.爱情

一.可靠数据传输原理

1.经完全可靠信道的可靠数据传输:rdt 1.0

2.经具有比特差错信道的可靠数据传输:rdt 2.0

 2.1.rdt2.1

 2.2.rdt2.2

3.rdt3.0 

4.最终完善的协议:流水线可靠数据传输协议

二.TCP连接管理

1. TCP三次握手

2. TCP连接的释放一共需要四步,因此称为『四次挥手』:


个人对三次握手 /四次挥手的理解:

1.三体

        三体中大刘提出了一个很重要的理论"猜疑链".在俩个文明只能知道对方存在却无法交流的下,你不知道对方文明的善意或恶意,在都有可能发生技术爆炸的前提下,你只能拼命发展科技消灭对方.
        现在我们假设文明之间采用量子通讯解决了交流问题.那么解决猜疑链需要交流几次呢?最少需要三步,即TCP三次握手:

        第一次交流:

        地球(客户端):喂喂,三体兄弟,听得到吗(SYN=1)?我们绝对善良诚实,大家一起创建和谐宇宙.这是我们的诚意体现--人类百科全书(seq=client_isn),期待你们的回复.Over.

        第二次交流:

        三体(服务端):喂喂,听到了听到了(SYN=1).地球兄弟,我们收到了你们的公报了(ack=client_isn+1).我们也是很友好的啊,这是我们的诚意体现--半人马座安全条约(seq=server_isn),期待你们的回复Over.

        信息发出后,三体人内部讨论:我们收到他们信息了,他们收没收到我们的啊?他们怎么还不回我们啊?不会有诈吧?惴惴不安得等待中,地球来信了.

        第三次交流:

        地球(客户端):不好意思啊三体兄弟,刚网卡了.不过看来通讯没啥问题,以后不用太担心(SYN=0),我们收到了你们的安全公约了(ack=server_isn+1),看来大家都是文明人.顺便给你们传了下我们的音乐大全(seq=client_isn+1),你们好好品味下.现在这连接稳定,你们那边有啥文化艺术也发来看看呗.

        ......

        我是善意的,

        你知道我是善意的,你也是善意的,

        我知道你是善意的,我也知道你知道我是善意的.

        猜疑链消除,可靠连接建立.

2.爱情

        为什么双向奔赴的爱情才是最美好的?因为双方都做好了准备,郎有情,妾有意.三次握手即可成功.那为什么你向左,我向右的时候不能三次确认就完了呢?

        你以为的分手:

        小明:受不了了,分手!

        小红:渣男!分就分,老娘有的是人追!

        小明:再见!

        实际上的分手:

        四次挥手,俩次断开一个连接

        小红:不上进,不陪我,分手!(FIN)

        小明:啊?这么突然,先等等,我做错什么了?给我个机会我一定改!你别走啊!(ACK)

        小明把自己关在房间了, 经过一番痛苦的挣扎,在审视了自己无数次后.小明--他悟了!(CLOSE_WAIT)

               

        小明:我终于明白了.我也是个顶天立地的人,怎么就变成这样了呢?
                搬起砖就无法抱你,放下砖就无法养你.
                深情总是被辜负,众人嘲讽我舔狗.

                但我不怪你,因为你被物欲洗脑了,被消费主义裹挟了,被ZB异化了.祝你更好.
                结束吧,再见,再也不见.(FIN)

        小红:拜拜!(他在说什么啊?听不懂.算了等下让我新男友买个LV包包,这么肥的凯子可得                    狠狠宰,他家在帝都魔都深圳加起来几百套房子呢!)(ACK)
                

下面从根上说一下TCP数据传输的原理.        

一.可靠数据传输原理

        可靠传输协议(Reliable Data Transfer Protocol)为上层实体提供了这样一种服务抽象:数据可以通过一条可靠的信道进行传输.TCP(Transmission Control Protocol)正是在此基础上的面向连接的可靠的运输协议.

一个可靠数据传输协议,将要面对以下问题:分组丢失分组损坏到达分组乱序到达

总结可靠传输需要的技术:检验和序号定时器肯定和否定确认分组

1.经完全可靠信道的可靠数据传输:rdt 1.0

 最简答的情况,底层信号完全可靠,然而这在实际中不能实现

 2.经具有比特差错信道的可靠数据传输:rdt 2.0

1.0缺陷:比特可能受损(实际上怎么可能不受损)

2.0方案:肯定确认(Positive Acknowledgment)和否定确认(Negative Acknowledgment)即我们经常提到的:ACKNAK

基于这样重传机制的可靠数据传输协议称为自动重传请求(Automatic Repeat reQuest)协议.

2.1.rdt2.1

2.0缺陷:ACK和NAK分组也可能受损

2.1方案:在数据分组添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号(Sequence Number)放在该字段(最初都是0和1)(几乎所有数据传输协议都采用这种方法).

2.2.rdt2.2

2.1缺陷:接受方接受一个受损的分组,就会发一个NAK.不发NAK,对上一个正确分组发一个ACK效果也一样().发送方接收到对一个分组的两个ACK(冗余ACK)后,就知道接收方没有正确接收到跟在确认两次的分组后面的分组。

2.2方案(优化):接收方包括由一个ACK报文所确认的分组序号,让发送方明确重传哪个分组

3.rdt3.0 

2.2缺陷:网络中经常丢包,丢包无法检测

3.0方案:基于时间的重传机制,需要一个倒数定时器(Countdown Timer).

有了定时,分组就会交替发送.所以称为比特交替协议(Alternating-Bit Protocol).

 接收方与2.2相同

4.最终完善的协议:流水线可靠数据传输协议

3.0缺陷:它是一个停等协议(每发送一个分组都得等待确认这个分组),效率太低了

流水线方案:允许发送多个分组无需等待确认.当然需要做些措施来保证可靠:

①增加序号范围:因为每个分组(不算重传)必须有唯一序号,而且有许多个在输送中未确认的报文

②协议发送方和接收方俩端也必须缓存多个分组.

③所需序号范围和缓存要求取决于怎么处理丢失,损坏和延时过大.俩种基本方法:回退N步(Go-Back_N,GBN)和选择重传(Selective Repeat,SR).

二.TCP连接管理

1. TCP三次握手

PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。

第一次握手

客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。

    PS1:SYN=1,ACK=0表示该报文段为连接请求报文。
    PS2:x为本次TCP通信的字节流的初始序号。
    TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。

第二次握手

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
该应答发送完成后便进入SYN-RCVD状态。

    PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。
    PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。
    PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。

第三次握手

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
该报文段的头部为:ACK=1,seq=x+1,ack=y+1。
客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

为什么连接建立需要三次握手,而不是两次握手?

防止失效的连接请求报文段被服务端接收,从而产生错误。PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

2. TCP连接的释放一共需要四步,因此称为『四次挥手』:

我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。


第一次挥手  

若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:
FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。

    PS1:FIN=1表示该报文段是一个连接释放请求。
    PS2:seq=u,u-1是A向B发送的最后一个字节的序号。

第二次挥手

B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:
ACK=1,seq=v,ack=u+1。

    PS1:ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
    PS2:seq=v,v-1是B向A发送的最后一个字节的序号。
    PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。
    A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。

第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。

第三次挥手

当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。

第四次挥手

A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
为什么A要先进入TIME-WAIT状态,等待时间后才进入CLOSED状态?

为了保证B能收到A的确认应答。
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。


参考文章:计算机网络(自顶向下方法)学习笔记_王文萱的博客-CSDN博客_计算机网络自顶向下方法

网络 之 三次握手&四次挥手 介绍

参考技术A 要了解三次握手&四次挥手的过程,就需要对TCP的报头以及有限状态机的概念有所了解,本文将介绍TCP报头的字段的含义,以及有限状态机各个状态的意义,最后对三次握手和四次挥手的过程做介绍

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

这里将介绍TCP报头的特性以及TCP报头各个字段的含义

.工作在传输层面向连接协议

.全双工协议

.半关闭

.错误检查

.将数据打包成段,排序

.确认机制

.数据恢复,重传

.流量控制,滑动窗口

.拥塞控制,慢启动和拥塞避免算法

.源端口、目标端口 :计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个

. 序列号 :表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始

. 确认号 :表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号

. 数据偏移 :表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP 报文段的数据起始处距离TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

. URG :表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效

. ACK :表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段

. PSH :提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中

. RST :如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

. SYN :在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段

. FIN :表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

. 窗口大小 :表示现在充许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量

. 校验和 :提供额外的可靠性

. 紧急指针 :标记紧急数据在数据字段中的位置

. 选项部分 :其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节

常见选项 :

.最大报文段长度:MaxiumSegment Size,MSS

.窗口扩大:Windows Scaling

.时间戳:Timestamps

.a 最大报文段长度

指明自己期望对方发送TCP报文段时那个数据字段的长度。默认是536字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS接入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中

.b 窗口扩大

为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产

生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项

.c 时间戳

可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文

2.3 TCP协议PORT

.传输层通过port号,确定应用层协议

.Port number:

. tcp :0-65535,传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路.

. udp :0-65535,User Datagram Protocol,无连接的协议.

. IANA :互联网数字分配机构(负责域名,数字资源,协议分配)

0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1433/tcp(SqlServer),1521/tcp(oracle),

3306/tcp(mysql),11211/tcp/udp(memcached)

49152-65535:动态端口或私有端口,客户端程序随机使用的端口

其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

常见的计算机就是使用有限状态机作为计算模型的:对于内存的不同状态,CPU通过读取内存值进行计算,更新内存中的状态。CPU还通过消息总线接受外部输入设备(如键盘、鼠标)的指令,计算后更改内存中的状态,计算结果输出到外部显示设备(如显示器),以及持久化存储在硬盘。

TCP协议也存在有限状态机的概念,TCP 协议的操作可以使用一个具有 11 种状态的有限状态机来表示

.CLOSED 没有任何连接状态

.LISTEN 侦听状态,等待来自远方TCP端口的连接请求

.SYN-SENT 在发送连接请求后,等待对方确认

.SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

.ESTABLISHED 代表传输连接建立,双方进入数据传送状态

.FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

.FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

.TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

.CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

.LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

.CLOSING 双方同时尝试关闭传输连接,等待对方确认

.客户端通过connect系统调用主动与服务器建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态。

.此后connect系统调用可能因为如下两个原因失败返回:

.1、如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用(见后文),则服务器将给客户端发送一个复位报文段,connect调用失败。

.2、如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。

.connect调用失败将使连接立即返回到初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,连接转移至ESTABLISHED状态

.当客户端执行主动关闭时,它将向服务器发送一个结束报文段FIN,同时连接进入FIN_WAIT_1状态。若此时客户端收到服务器专门用于确认目的的确认报文段,则连接转移至FIN_WAIT_2状态。当客户端处于FIN_WAIT_2状态时,服务器处于CLOSE_WAIT状态,这一对状态是可能发生半关闭的状态。此时如果服务器也关闭连接(发送结束报文段),则客户端将给予确认并进入TIME_WAIT状态

.客户端从FIN_WAIT_1状态可能直接进入TIME_WAIT状态(不经过FIN_WAIT_2状态),前提是处于FIN_WAIT_1状态的服务器直接收到带确认信息的结束报文段(而不是先收到确认报文段,再收到结束报文段)

注意,客户端先发送一个FIN给服务端,自己进入了FIN_WAIT_1状态,这时等待接收服务端的报文,该报文会有三种可能:

a 只有服务端的ACK,只收到服务器的ACK,客户端会进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_WAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间,RFC 1122标准的建议值是2min).客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次。因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道ACK已丢失

b 只有服务端的FIN,回应一个ACK给服务端,进入CLOSING状态,然后接收到服务端的ACK时,进入TIME_WAIT状态

c 同时收到服务端的ACK和FIN,直接进入TIME_WAIT状态

.收到服务器ACK后,客户端处于FIN_WAIT_2状态,此时需要等待服务器发送结束报文段,才能转移至TIME_WAIT状态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似)。

.Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数:

./proc/sys/net/ipv4/tcp_max_orphans 指定内核能接管的孤儿连接数目

./proc/sys/net/ipv4/tcp_fin_timeout指定孤儿连接在内核中生存的时间

TCP协议中的三次握手和四次挥手

客户机端的三次握手和四次挥手

服务器端的三次握手和四次挥手

1 client 首先发送一个连接试探,此时ACK=0,表示确认号无效,SYN=1表示这是一个请求连接或连接接受报文,同时表示这个数据包不携带数据,seq=x表示此时client自己数据的初始序号是x,这时候client进入syn_sent状态,表示客户端等等服务器的回复

2 server 监听到连接请求报文后,如同意建立连接,则向client发送确认,将TCP报文首部的SYN和ACK都置为1,因为client上一个请求连接的报文中seq=x,所以服务器端这次就发ack=x+1,表示服务器端希望客户端下一个报文段的第一个数据字节序号是x+1,同时表示x为止的所有数据都已经正确收到了,其中,此时服务器端发送seq=y表示server自己的初始序号是y,这时服务器进入了SYN_RCVD状态,表示服务器已经收到了客户端的请求,等待client的确认。

3 client收到确认后还要再次给服务器端发送确认,同时携带要发给server的数据。ACK=1表示确认号ack=y+1有效,client这时的序号seq为x+1

一旦client确认后,这个TCP连接的client 和 server 都直接进入到established状态,可以发起http请求了

4.2 四次挥手详解

第一次挥手:client向server,发送FIN报文段,表示关闭数据传送,此时ACK=0,seq=u,表示客户端此时数据的报文序号是u,此时,client进入FIN_WAIT_1状态,表示没有数据要传输了

第二次挥手:server收到FIN报文段后进入CLOSE_WAIT状态(被动关闭),然后发送ACK确认,表示同意你关闭请求了,主机到主机的数据链路关闭,同时发送seq=v,表示此时server端的数据包字节序号是v,ack=u+1,表示希望client发送的下一个包的序号是u+1,表示确认了序号u之前的包都已经收到,客户端收到server的ACK报文后,进入FIN_WAIT_2状态

第三次挥手:server等待client发送完数据,发送FIN=1,ACK=1到client请求关闭,server进入LAST_ACK状态。此时发送的seq有变化,因为上一个ACK的后server端可能又发送了一些数据,说以数据字节序号发送了变化,为w,但是ack还是保持不变

第四次挥手:client收到server发送的FIN后,回复ACK确认到server,client进入TIME_WAIT状态。发送ack=w+1,表示希望服务器下个发送的报文的字节序号是w+1,确认了服务器之前发送的w字节都已经正确收到,发送seq=u+1表示当前client的字节序号是u+1.server收到client的ACK后就关闭连接了,状态为CLOSED。client等待2MSL,仍然没有收到server的回复,说明server已经正常关闭了,client关闭连接。

其中,MSL(Maximum Segment Lifetime):报文最大生存时间,是任何报文段被丢弃前在网络内的最长时间。当client回复server的FIN后,等待(2-4分钟),即使两端的应用程序结束。

TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态的原因是如果client直接进入CLOSED状态,由于IP协议不可靠性或网络问题,导致client最后发出的ACK报文未被server接收到,那么server在超时后继续向client重新发送FIN,而client已经关闭,那么找不到向client发送FIN的连接,server这时收到RST并把错误报告给高层,不符合TCP协议的可靠性特点。如果client直接进入CLOSED状态,而server还有数据滞留在网络中,当有一个新连接的端口和原来server的相同,那么当原来滞留的数据到达后,client认为这些数据是新连接的。等待2MSL确保本次连接所有数据消失。

当客户端等待2MSL后服务器端没有再次发送确认的报文后,client认为该次断开连接已经正常结束,client进入closed状态。四次挥手正式结束

以上是关于TCP三次握手/四次挥手到三体猜疑链的主要内容,如果未能解决你的问题,请参考以下文章

TCP为啥需要3次握手与4次挥手

TCP三次握手和四次挥手

三次握手&&四次挥手

一文搞懂TCP的三次握手和四次挥手

TCP三次握手与四次挥手

TCP的三次握手和四次挥手