常用的套接字选项介绍

SO_REUSEADDR选项

经过setsockopt设置了SO_REUSEADDR选项后,即使当前套接字处于TIME_WAIT状态,与之绑定的socket地址也可以被立即重用。此外,我们也可以通过修改内核参数/proc/sys/net/ipv4/tcp_tw_recycle来快速回收被关闭的socket,从而使得TCP连接根本不进入TIME_WAIT状态,进而允许应用程序立即重用本地的socket地址。

SO_RECVBUF和SO_SNDBUF选项

SO_RECVBUF和SO_SNDBUF选项分别表示TCP接收缓冲区和发送缓冲区的大小。只是,但我们使用setsockopt来设置TCP的接收缓冲区和发送缓冲区的大小时,系统都会将其值加倍,并且TCP的发送缓冲区的最小值是256字节,而发送缓冲区的最小值是2048字节。

注意:
可以通过强制修改内核参数:

1
2
3
/proc/sys/net/ipv4/tcp_rmem

/proc/sys/net/ipv4/tcp_wmem

来修改TCP的接收和发送缓冲区。

SO_RCVLOWAT和SO_SNDLOWAT选项

SO_RCVLOWAT和SO_SNDLOWAT选项分别表示TCP接收缓冲区和发送缓冲区的底水位标记。它们一般被I/O复用系统调用来判断socket是否可读或可写。

  • 当TCP接收缓冲区中可读数据总数大于其低水位的标记时,I/O复用系统调用将通知应用程序可以从对应的socket上读取数据了。
  • 当TCP发送缓冲区空闲的空间大于其低水位标记时,,I/O复用系统调用将通知应用程序可以往对应的socket上写数据了

默认情况下,TCP缓冲区的低水位标记和TCP发送缓冲区的底水位标记均为1字节。