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

本文详细解析了TCP连接的六种标志位及其作用,包括SYN、ACK、PSH、FIN、RST和URG,并通过实例展示了正常TCP连接的包交互流程。深入探讨了socket方法与TCP包之间的对应关系,以及处理过程中的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP 状态有几种?

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

名称英文中文详细说明
SYNsynchronous同步建立连接,同步状态
ACKacknowledgement确认确认上一个包已收到(确认收到)
PSHpush发送数据
FINfinish结束连接结束,不需要发送数据了
RSTreset重置重置连接状态(重新连接)
URGurgent紧急TCP 带外数据相关,基本不会用到

其中URG在实际使用中属于百年一见的类型,所以我们就不与介绍了,主要介绍这些常见的TCP标志位。

一次正常的TCP连接都会发送那些包?

接下来,我们通过看一个完整的TCP交互都有哪些流程,对应包又是什么样。
在这里插入图片描述
1. 建立连接

客户端操作方向服务器操作阶段
connectSYN>>>>>>accept建立连接
connect<<<<<<SYN,ACKaccept建立连接
connect_endACK>>>>>>accept_end建立连接

2. 服务器读,客户端写

客户端操作方向服务器操作阶段
read服务器读,客户端写
writePSH>>>>>>read_end服务器读,客户端写
write_end<<<<<<ACK服务器读,客户端写

3. 客户端读,服务器写

客户端操作方向服务器操作阶段
<<<<<<PSHwrite客户端读,服务器写
ACK>>>>>>write_end客户端读,服务器写
read客户端读,服务器写

4. 服务端断开连接

客户端操作方向服务器操作阶段
<<<<<<FINshutdown服务端断开连接
ACK>>>>>>服务端断开连接

6. 客户端断开连接

客户端操作方向服务器操作阶段
shutdownFIN>>>>>>客户端断开连接
<<<<<<ACK客户端断开连接

7. 服务器,客户端双方释放本地资源(内存,句柄等)

客户端操作方向服务器操作阶段
close(释放资源)close(释放资源)释放本地占用资源

socket 方法和TCP包的对应关系是什么?

知道了一个完整的TCP交互流程后,就可以尝试总结一下 socket 方法和 TCP 包的对应关系了。

注意:下表内容不绝对正确,只是通过这种方式来辅助理解。

操作发出的包需要的回复
connectSYNACK
readPSH
writePSHACK
shutdownFINACK
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返回什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值