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

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返回什么?
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值