TCP套接字中的 I/O 缓存
由于TCP套接字中数据收发无边界。
假设服务器端调用write函数一次传输100字节数据,客户端可能分两次调用read函数每次读取100字节的数据。
那么第一次读取完50字节的数据后,剩下的50字节的数据在何处呢?难道在网络中徘徊并等待接收?
实际上write函数调用后并非立即传输数据,read函数调用后也并非马上接收数据。
更准确地说,write函数调用瞬间,将数据转移至输出缓冲;read函数调用瞬间,从输入缓冲中读取数据.
调用write函数时,数据将转移到输出缓冲,在适当的时候(不管是分别传输还是一次性传输)传向对方的输入缓冲,这些I/O缓冲特性可整理如下。
- I/O 缓冲在每个TCP套接字中单独存在。
- I/O 缓冲在创建套接字时自动生成。
- 即使关闭套接字也会继续传递输出缓冲中的遗留数据。
- 关闭套接字将丢失输入缓冲中的数据。
那么如果之前问题中的客户端的输入缓冲为50字节.而服务器却传输了100字节呢?可能有同学会想在填满输入缓冲之前读取数据,这样就会腾出一部分控件,问题就解决了。这是错误的!
不会发生超过输入缓冲大小的数据传输。
也就是说,根本不会发生这类问题。因为TCP会控制数据流。TCP中有滑动窗口(Sliding Window)协议,对话简单呈现具体流程如下。
- 套接字A:我最多能接收50字节。
- 套接字B:OK。
- 套接字A:我腾出了20字节的空间,最多可以接收70字节。
- 套接字B:OK
数据收发也是如此。
因此TCP不会因为缓冲溢出而丢失数据。