reference:
https://www.bilibili.com/video/av52745283?from=search&seid=12963764065103857268
看到网上各种版本后整理了一个比较靠谱而且符合逻辑的版本- -
3次握手基本网上版本都一样,4次挥手有很多都是错误的。。。
ACK = 1 表示这个请求是一个回复了其它请求的请求。 (所以除了连接请求这种是主动第一次说话不需要加以外大部分情况都有。) (这个和ack不是一个东西,注意区分,为了不混淆下面说明的时候就不说这个ACK了)
SYN = 1 表示这是个连接请求。
FIN = 1 表示这是个结束连接请求。
发送方的seq是自己的发送序号,ack是回应的请求号+1,(比如ack = x + 1 说明回复的是 seq = x的请求)用来说明自己是回复的谁,可以验证是否有消息没有送到。
然后就很好理解了。
3次握手:
A: SYN = 1, seq = x
我想连接,这是个请求是我的第x个消息。
B:SYN = 1, ack = x + 1, seq = y
我也想连接,这个消息是回复的A的第x消息, 这是我的第y个消息(每个主机有自己独立的消息序号)
A:seq = x + 1, ack = y + 1
我这个消息是回复的B的第y个消息(用来说明我收到你同意连接的请求了), 这个消息是我的第x+1个消息 (每次发送消息seq要+1)
之后B就可以和A开始互相交流了,比如B再发个 seq = y+1,ack = x+2,消息内容写个你吃了么。。。这类的。
4次挥手:
A: FIN = 1, seq = u, ack = v
我想断开连接, 这是我的第u个消息,回复的是B之前发送的第v-1个消息(因为之前两个人在连接状态,肯定已经发送了一些内容量, 不难理解, B之前发给A的是 seq = v -1, ack = u - 1)
B: ack = u + 1, seq = v
这是回复的A之前发送的第u个消息(表示我收到了,需要花点时间告诉我正在和你连接的应用准备一下,做好断开准备), 这是我的第v个消息 ------------如果不理解原理只看网上的这些图片,很容易出现错误理解= =比如我就在奇怪为什么这里 B的seq 会等于 A的ack。。。。因为省略了上面的红字部分的说明。
B: FIN = 1,ack = u + 1, seq = w
我也想断开连接(我准备完了,可以断开了),这是回复A之前的第u个消息(因为这里等于B连续给A发了2次,所以回复的是同一个消息), 这是我的第w个消息(因为中间可能又发送了别的消息给其他客户端,这里seq看上去是不连续的,实际上是连续的只不过这里只显示A和B之间的消息所以省略了中间的一部分)。
A:seq = u+1, ack = w + 1
这是我的第u+1个消息(上一条发给B的是u,之后一直在等待所以没有发新消息),回复的是B的第w个消息(表示我收到了你的断开连接请求)
然后B收到消息后就关闭连接,完成断开。
A等2分钟后B没有发送异常消息一类的,也断开连接。
其实很容易发现规律和逻辑。但是在网上看到了好几个版本= =主要差异就是4次挥手的第3次和第4次消息。
这个是百度百科和书本上的图。
可以保证这个版本的可信度应该比较高。