TCP原理 I/O 缓存

TCP套接字中的 I/O 缓存

由于TCP套接字中数据收发无边界。

假设服务器端调用write函数一次传输100字节数据,客户端可能分两次调用read函数每次读取100字节的数据。
那么第一次读取完50字节的数据后,剩下的50字节的数据在何处呢?难道在网络中徘徊并等待接收?

实际上write函数调用后并非立即传输数据,read函数调用后也并非马上接收数据。
更准确地说,write函数调用瞬间,将数据转移至输出缓冲;read函数调用瞬间,从输入缓冲中读取数据.

TCP套接字的I/O缓冲

调用write函数时,数据将转移到输出缓冲,在适当的时候(不管是分别传输还是一次性传输)传向对方的输入缓冲,这些I/O缓冲特性可整理如下。

  • I/O 缓冲在每个TCP套接字中单独存在。
  • I/O 缓冲在创建套接字时自动生成。
  • 即使关闭套接字也会继续传递输出缓冲中的遗留数据。
  • 关闭套接字将丢失输入缓冲中的数据。

那么如果之前问题中的客户端的输入缓冲为50字节.而服务器却传输了100字节呢?可能有同学会想在填满输入缓冲之前读取数据,这样就会腾出一部分控件,问题就解决了。这是错误的!

不会发生超过输入缓冲大小的数据传输。

也就是说,根本不会发生这类问题。因为TCP会控制数据流。TCP中有滑动窗口(Sliding Window)协议,对话简单呈现具体流程如下。

  • 套接字A:我最多能接收50字节。
  • 套接字B:OK。
  • 套接字A:我腾出了20字节的空间,最多可以接收70字节。
  • 套接字B:OK

数据收发也是如此。

因此TCP不会因为缓冲溢出而丢失数据。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值