TCP 状态有几种?
通常情况下我们说的 TCP 包状态实际上是 TCP 标志位,目前TCP标志位主要有以下有6种:
| 名称 | 英文 | 中文 | 详细说明 |
|---|---|---|---|
| SYN | synchronous | 同步 | 建立连接,同步状态 |
| ACK | acknowledgement | 确认 | 确认上一个包已收到(确认收到) |
| PSH | push | 推 | 发送数据 |
| FIN | finish | 结束 | 连接结束,不需要发送数据了 |
| RST | reset | 重置 | 重置连接状态(重新连接) |
| URG | urgent | 紧急 | TCP 带外数据相关,基本不会用到 |
其中URG在实际使用中属于百年一见的类型,所以我们就不与介绍了,主要介绍这些常见的TCP标志位。
一次正常的TCP连接都会发送那些包?
接下来,我们通过看一个完整的TCP交互都有哪些流程,对应包又是什么样。

1. 建立连接
| 客户端操作 | 包 | 方向 | 包 | 服务器操作 | 阶段 |
|---|---|---|---|---|---|
| connect | SYN | >>>>>> | accept | 建立连接 | |
| connect | <<<<<< | SYN,ACK | accept | 建立连接 | |
| connect_end | ACK | >>>>>> | accept_end | 建立连接 |
2. 服务器读,客户端写
| 客户端操作 | 包 | 方向 | 包 | 服务器操作 | 阶段 |
|---|---|---|---|---|---|
| read | 服务器读,客户端写 | ||||
| write | PSH | >>>>>> | read_end | 服务器读,客户端写 | |
| write_end | <<<<<< | ACK | 服务器读,客户端写 |
3. 客户端读,服务器写
| 客户端操作 | 包 | 方向 | 包 | 服务器操作 | 阶段 |
|---|---|---|---|---|---|
| <<<<<< | PSH | write | 客户端读,服务器写 | ||
| ACK | >>>>>> | write_end | 客户端读,服务器写 | ||
| read | 客户端读,服务器写 |
4. 服务端断开连接
| 客户端操作 | 包 | 方向 | 包 | 服务器操作 | 阶段 |
|---|---|---|---|---|---|
| <<<<<< | FIN | shutdown | 服务端断开连接 | ||
| ACK | >>>>>> | 服务端断开连接 |
6. 客户端断开连接
| 客户端操作 | 包 | 方向 | 包 | 服务器操作 | 阶段 |
|---|---|---|---|---|---|
| shutdown | FIN | >>>>>> | 客户端断开连接 | ||
| <<<<<< | ACK | 客户端断开连接 |
7. 服务器,客户端双方释放本地资源(内存,句柄等)
| 客户端操作 | 包 | 方向 | 包 | 服务器操作 | 阶段 |
|---|---|---|---|---|---|
| close(释放资源) | close(释放资源) | 释放本地占用资源 |
socket 方法和TCP包的对应关系是什么?
知道了一个完整的TCP交互流程后,就可以尝试总结一下 socket 方法和 TCP 包的对应关系了。
注意:下表内容不绝对正确,只是通过这种方式来辅助理解。
| 操作 | 发出的包 | 需要的回复 |
|---|---|---|
| connect | SYN | ACK |
| read | 无 | PSH |
| write | PSH | ACK |
| shutdown | FIN | ACK |
| close(读写缓冲区无数据) | 无 | 无 |
| close(读写缓冲区有数据) | RST | 无 |
处理过程中特殊情况怎么处理?
当然,仅仅知道操作和包的对应关系还不够,因为显示中还会存在一些其他状况,下面这个表格就列举了一部分特殊情况,可以帮助你更好的了解相关问题。
| 现象 | 错误信息 | Error info |
|---|---|---|
| 当连接的机器端口没有服务器的时候,机器会回复 RST 包 | 连接被拒绝 | Contection refused |
| 当任何一步操作没有收到回复包的时候会根据情况产生超时 | xxx操作超时 | xxx timeout |
| 当任何一步操作收到 RST 包的时候会产生错误 | 连接被重置 | Connection was reset |
| 当一方收到 FIN 包后,则收到的一方调用read是会返回长度0,但没有错误 | 无 | |
| 当调用close时,如果读写缓冲区里没有数据则close会先调用shutdown方法 | 无 | |
| 当调用close时,如果读写缓冲区里有数据则close会回复 RST 包 | 连接被重置 | Connection was reset |
拓展
可以尝试回答下面的问题,来确认自己对上面内容的理解程度。
| 问题 |
|---|
| 客户端连接成功后,服务器网线断了,客户端read返回什么? |
| 客户端连接成功后,服务器正常调用shutdown关闭连接,客户端read返回什么? |
本文详细解析了TCP连接的六种标志位及其作用,包括SYN、ACK、PSH、FIN、RST和URG,并通过实例展示了正常TCP连接的包交互流程。深入探讨了socket方法与TCP包之间的对应关系,以及处理过程中的特殊情况。
1万+

被折叠的 条评论
为什么被折叠?



