0%

socket 调用对应 TCP 包对应关系,以及TCP包状态的详细介绍

TCP 状态有几种?

通常情况下我们说的 TCP 包状态实际上是 TCP 标志位,目前TCP标志位主要有以下有6种:

名称 英文 中文 详细说明
SYN synchronous 同步 建立连接,同步状态
ACK acknowledgement 确认 确认上一个包已收到(确认收到)
PSH push 发送数据
FIN finish 结束 连接结束,不需要发送数据了
RST reset 重置 重置连接状态(重新连接)
URG urgent 紧急 TCP 带外数据相关,基本不会用到
其中URG在实际使用中属于百年一见的类型,所以我们就不与介绍了,主要介绍这些常见的TCP标志位。
# 一次正常的TCP连接都会发送那些包?
接下来,我们通过看一个完整的TCP交互都有哪些流程,对应包又是什么样。
upload successful
1. 建立连接
客户端操作 方向
:– :– :– :–
connect SYN >>>>>>
connect <<<<<< SYN,ACK
connect_end ACK >>>>>>
2. 服务器读,客户端写
客户端操作 方向
:– :– :– :–
write PSH >>>>>>
write_end <<<<<< ACK
3. 客户端读,服务器写
客户端操作 方向
:– :– :– :–
<<<<<<
ACK >>>>>>
read
4. 服务端断开连接
客户端操作 方向
:– :– :– :–
<<<<<<
ACK >>>>>>
6. 客户端断开连接
客户端操作 方向
:– :– :– :–
shutdown FIN >>>>>>
<<<<<<
7. 服务器,客户端双方释放本地资源(内存,句柄等)
客户端操作 方向
:– :– :– :–
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返回什么?|