基本套接字选项
1. SO_BROADCAST开启或禁止进程发送广播消息的能力。
开启该选项后,内核将为TCP在该套接字发送和接收的所有分组保留详细跟踪信息。这些信息保存在内核的某个环型 缓冲区中
如果两小时内在该套接字的任一方向上都没有数据交换,TCP就自动给对端发送一个保持存活探测分节,它导致以下三种情况之一
3.1 对端以期望的ACK响应,应用进程得不到通知,在右经过仍无动静的2小时后,TCP将发出另一个探测分节
3.2 对端以RST响应,它告知本端TCP,对端已崩溃且已重新启动
3.3 对端对保持存活探测分节没有任何响应。
本选项指定close函数对面向连接的协议如何操作。默认操作close是立即返回。但是如果有数据残留在套接字发送缓冲区中,系统将试着把这些数据发送给对端
linger的数据结构,在<sys/socket.h>中定义
struct linger
{
int l_onoff; //0-off nonzero-on
int l_linger;
};
4.1 如果l_onoff为0,那么关闭本选项,l_lingger的值被忽略,close立即返回
4.2 如果l_onoff为非0其l_linger为0,那么当close某个连接时TCP将中止该连接。这就是说TCP将丢弃保留在套接字发送缓冲取中的任何数据,并发送一个RST给对端,而没有通常的四分组连接终止序列,这样避免了TIME_WAIT状态
4.3 如果l_onoff为非0且l_linger也为非0,那么当套接字关闭时内核将拖延一段时间。这就是说如果在套接字发送缓冲区中仍残留有数据,那么进程将被投入睡眠,知道所有数据都已发送完且均被对方确认或者延滞时间已到。
每个套接字有一个接收低水位和一个发送低水位。他们由select函数使用。接收低水位标记是让select返回"可读"时套接字接收缓冲区中所需的数据量。对于,TCP,UDP,SCTP,其默认值为1。发送低水位标记是让select返回"可写"时套接字发送缓冲区中所需的可用空间。对于TCP套接字,其默认值常为2048.而UDP套接字的发送缓冲区中可用空间的字节数从不改变(因为UDP从不为由应用程序传递给他的数据报保留副本),只要一个UDP套接字的发送缓冲区大小大于该套接字的低水位标记,该UDP套接字总是可写
这两个选项允许我们给套接字的接收和发送设置一个超时值。发送超时影响
write, send, sendto, sendmsg
接收超时影响:read,recvfrom, recvmsg
7.1 SO_REUSEADDR,允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将该端口用作他们的本地端口的连接仍存在
7.2 SO_REUSEADDR 允许在同一个端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址
7.3 SO_REUSEADDR允许单个进程捆绑同一个端口到多个套接字上,只要每次捆绑指定不同的本地IP地址即可
7.4 SO_REUSEPORT选项允许完全重复的捆绑,不过只有在想要捆绑同一IP地址河段口的每个套接字斗志顶了本套接字选项才行
建议:
1. 在所有TCP服务器程序中,在调用bind之前设置SO_REUSRADDR套接字选项
2. 当编写一个可在同一时刻在同一主机上运行多次的躲避应用程序时,设置SO_REUSRADDR套接字选项,并将所参加多播组的地址作为本地IP地址捆绑
8. SO_RCVBUF和SO_SNDBUF
每个套接字都有一个发送缓冲区和一个接收缓冲区。接收缓冲区被TCP,UDP和SCTP用来保存接收到的数据,直到应用程序进程来读取,大小限定为TCP通告对端的窗口大小。由于TCP有流量控制,所以接收缓冲区不可能溢出。但是UDP是没有流量控制的,较快的发送端可以很容易的淹没较慢的接收端,导致接收端的UDO丢弃数据报。
TCP套接字选项
1. TCP_MAXSEG
允许我们设置或获取TCP连接的最大分节大小(MSS),返回值是我们的TCP可以发送给对端的最大数据量
2. TCP_NODELAY
开启本选项将禁止TCP的Nagle算法,默认情况下该算法是启动的