33.5.2. 系统范围的 TCP 套接字缓冲区设置
套接字缓冲区临时存储内核已接收或应发送的数据。
存在以下缓冲:
- 读套接字缓冲区保存内核已收到但应用程序尚未读取的数据包。
- 写套接字缓冲区保存应用程序已写到缓冲区,但内核尚未将它们传给 IP 堆栈和网络驱动程序的数据包。
如果 TCP 数据包太大,且超过缓冲区大小或数据包以很快的速度发送或接收,则内核会丢弃任何新传入的 TCP 数据包,直到数据从缓冲区中删除为止。在这种情况下,增加套接字缓冲区可以防止数据包丢失。
net.ipv4.tcp_rmem(读)和 net.ipv4.tcp_wmem(写)套接字缓冲区内核设置包含三个值:
net.ipv4.tcp_rmem = 4096 131072 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
显示的值以字节为单位,Red Hat Enterprise Linux 通过以下方式使用它们:
- 第一个值是最小缓冲区大小。新套接字不能有更小的尺寸。
- 第二个值是默认的缓冲区大小。如果应用程序没有设置缓冲区大小,则这是默认值。
-
第三个值是自动调优缓冲区的最大大小。在应用程序中使用带有
SO_SNDBUF套接字选项的setsockopt()函数禁用这个最大缓冲区大小。
请注意,net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 参数为 IPv4 和 IPv6 协议设置套接字大小。