网络上很多文章感觉太复杂了,我试试化繁为简! 上一章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状态,而确认应答因为网络缘故一直没有到达服务端,那么会造成服务端无法正常关闭