TCP Send函数的阻塞和非阻塞,以及TCP发送数据的异常情况

本文探讨了TCP协议中的ACK机制,解释了为何在操作系统层面的TCP发送成功后,仍需要业务层ACK。讨论了TCP send函数在阻塞和非阻塞模式下的工作方式,并介绍了TCP发送与接收缓冲区的作用。此外,还涉及了IPv4、IPv6的数据报最大大小、MTU、MSS等基础知识。
摘要由CSDN通过智能技术生成

  有了 TCP 协议本身的 ACK 机制为什么还需要业务层的ACK 机制?
答:这个问题从操作系统(linux/windows/android/ios)实现TCP协议的原理角度来说明更合适: 
     1 操作系统在TCP发送端创建了一个TCP发送缓冲区,在接收端创建了一个TCP接收缓冲区;
     2 在发送端应用层程序调用send()方法成功后,实际是将数据写入了TCP发送缓冲区;
     3 根据TCP协议的规定,在TCP连接良好的情况下,TCP发送缓冲区的数据是“有序的可靠的”到达TCP接收缓冲区,然后回调接收方应用层程序来通知数据到达;
     4 但是在TCP连接断开的时候,在TCP的发送缓冲区和TCP的接收缓冲区中可能还有数据,那么操作系统如何处理呢? 
           首先,对于TCP发送缓冲区中还未发送的数据,操作系统不会通知应用层程序进行处理(试想一下:send()函数已经返回成功了,后面再告诉你失败,这样的系统如何设计?太复杂了...),通常的处理手段就是直接回收TCP发送缓存区及其socket资源;
           对于TCP接收方来说,在还未监测到TCP连接断开的时候,因为TCP接收缓冲区不再写入数据了,所以会有足够的时间进行处理,但若未来得及处理就发现了连接断开,仍然会为了及时释放资源,直接回收TCP接收缓存区和对应的socket资源。

总结一下就是: 发送方的应用层程序,调用send()方法返回成功的时候,数据实际是写入到了TCP的发送缓冲区,而非

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值