tcp缓冲区

一、先上结论

什么是tcp缓冲区?每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。

二、缓冲区的意义
write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。
TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,比如nagle算法,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。
read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。


图:TCP套接字的I/O缓冲区示意图
三、I/O缓冲区特性

1、I/O缓冲区在每个TCP套接字中单独存在;

2、I/O缓冲区在创建套接字时自动生成;

3、即使关闭套接字也会继续传送输出缓冲区中遗留的数据;

4、关闭套接字将丢失输入缓冲区中的数据。


输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:

int servSock = socket(PF_INET, SOCK_STREAM, 0);
unsigned optVal;
int optLen = sizeof(int);
getsockopt(servSock, SOL_SOCKET, SO_SNDBUF, (char*)&optVal, &optLen);
printf("Buffer length: %d\n", optVal);

运行结果:
Buffer length: 8192 

### 调整TCP缓冲区大小以优化网络性能 #### 设置TCP缓冲区大小的方法 在Linux系统中,可以通过修改内核参数来调整TCP缓冲区的大小。这些参数控制着TCP堆栈的行为以及其能够使用的最大和最小缓冲区空间。 以下是具体的配置方式: 1. **启用接收缓冲区自动调整功能** 为了使系统根据当前可用内存动态调整接收缓冲区大小,可以启用`tcp_moderate_rcvbuf`选项。该选项允许操作系统基于实际需求分配更多或更少的资源给每个连接。此操作可通过以下命令完成[^2]: ```bash sysctl -w net.ipv4.tcp_moderate_rcvbuf=1 ``` 2. **手动设置TCP缓冲区范围** 如果希望进一步微调缓冲区的具体数值,则需编辑三个关键参数:`net.ipv4.tcp_rmem` 和 `net.ipv4.tcp_wmem`。它们分别定义了读取(接收)和写入(发送)缓冲区的最低、默认及最高值。例如,下面的例子展示了如何将这两个变量设定在一个合理的区间内: ```bash sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216" sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216" ``` 这里,“16777216”表示新的上界被扩展至16MB,从而支持更高带宽延迟乘积(BDP)环境下的高效数据传输。 3. **应用程序层面的自定义设置** 对于某些特定应用而言,可能还需要在其内部显式指定所需的缓冲容量。比如,在Qt框架下开发的应用程序可利用`setSocketOption()`接口实现这一目标[^3]: ```cpp QTcpSocket *socket = new QTcpSocket(); socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, QVariant(16*1024*1024)); socket->setSocketOption(QAbstractSocket::SendBufferSizeSocketOption, QVariant(16*1024*1024)); ``` 上述代码片段设置了QTcpSocket实例的收发缓存均为16MB。 --- #### 需要注意的地方 尽管增大缓冲区有助于改善高延迟链路中的吞吐表现,但也可能导致其他负面效应,如增加RTT时间或者加剧拥塞状况。因此,在做出任何改动之前应当充分测试现有架构的表现瓶颈所在,并据此合理规划新策略实施后的预期收益与潜在风险评估过程[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值