谈谈我对TCP四次挥手的理解

240 阅读3分钟

网络上很多文章感觉太复杂了,我试试化繁为简! 上一章TCP三次握手

🔴简而言之就是4句话:
客户端:发送连接释放报文(我想要断开了),
服务端:回复确认报文(已知悉,请您稍等),
服务端:发送连接释放报文(我可以断开了),
客户端:回复确认报文(让我们断开连接吧)。

一、2个相关知识。

1、TCP四次挥手是什么?

对应TCP释放连接的一种概念(说法)。

2、回顾TCP头部中携带的信息有什么?

2.1 标识符

TCP头部的标识符中文名简要描述
ACK确认位ACK = 1 表示该确认号有效
SYN同步位SYN = 1 表示这是是一个连接请求的报文
FIN终止位FIN = 1 表示这是释放连接的报文

除了这三个标识符外还有3个这里不展开说明。

2.2 序列号和确认号

TCP头部的信息中文名简要描述
seq (Sequece Number)序列号表示当前TCP数据报数据的第一个字节的序号是多少
ack (Acknowledgement Number)确认号表示数据接收端期望收到的下一个数据的序号是多少,
同时也表示上一个序号之前的数据已收到

2.3 脑放

👇TCP首部信息在这里 👇seq 就是这段数据第一个字节的序号

2.4 来图看看TCP头部携带的各种信息

了解了这些概念之后就可以用比较通俗的话来展开四次挥手了。

二、具体说明

1、TCP协议中2个角色?

行为角色
主动发起请求的一方客户端
被动接收连接的一方服务端

2、TCP四次挥手的过程

🔴简而言之就是4句话:
客户端:发送连接释放报文(我想要断开了),
服务端:回复确认报文(已知悉,请您稍等),
服务端:发送连接释放报文(我可以断开了),
客户端:回复确认报文(让我们断开连接吧)。

🔴然后再看这个几个符号代表什么意思:
SYNSYN = 1 表示这是是一个连接请求的报文。
ACKACK = 1 表示该确认号有效。
seq表示当前TCP数据报数据的第一个字节的序号是多少。
ack表示数据接收端期望收到的下一个数据的序号是多少,同时也表示上一个序号之前的数据已收到。

🔴用表格呈现试试看

状态角色做什么
携带的信息
角色状态
ESTABLSHED 连接已建立客户端<===发送和接收数据===>客户端ESTABLSHED 连接已建立
FIN-WAIT-1客户端发送连接释放的报文===>
FIN=1 ,seq=u
服务端
FIN-WAIT-1客户端<===回复确认报文表示收到请求了
ACK=1,seq=v,ack=u+1
服务端CLOSE-WAIT 关闭等待
FIN-WAIT-2客户端<===发送连接释放的报文
FIN=1,ACK=1,seq=w,ack=u+1
服务端LAST-ACK 最终确认
TIME-WAIT 等待计时器客户端发送连接确认释放的应答===>
ACK =1,seq=u+1,ack=w+1
服务端CLOSE 关闭
CLOSE 关闭客户端断连服务端

🔴用图片呈现看看(这个图不是我画的,我在慕课上截的,冒犯联系删)

🔴为什么第4次挥手后,客户端要等待2MSL才进入CLOSE状态?

​ 2MSL:指报文在网络中生存的最大时间的2倍,超过MSL报文就会被抛弃

​ 为了保证 服务端 可以收到 客户端的确认应答(第4次挥手),如果 客户端发送消息后就进入CLOSE状态,而确认应答因为网络缘故一直没有到达服务端,那么会造成服务端无法正常关闭