TCP套接字选项介绍

通用套接字选项

其实应该是通用套接字选项,标题写错了,就不改了,仅仅作为自己学习使用,如有错误,不负责任

因为之前面试有问到,但自己不大熟悉,就学习记录一下,主要参考UNP这本书

SO_DEBUG套接字选项

这是一个仅仅由TCP支持的选项,开启该选项之后,内核将为TCP在该套接字上的所有分组保留详细的追踪信息,保存在内核的环形缓冲区。

SO_ERROR套接字选项

当一个套接字发送错误时,内核会将套接字的名为so_error的变量设为标准Unix Exxx值的一个,称为待处理的错误。一般会以以下两种方式之一立即通知进程这个错误。

  1. 进程阻塞在对该套接字的select调用上,那么无论是检查可读条件还是可写条件,select均返回并设置其中一个或所有两个条件;

  2. 如果进程使用信号驱动式IO模型,那就给进程产生一个SIGIO信号;

SO_KEEPALIVE套接字选项

套接字设置该选项后,如果在2小时内在该套接字上都没有数据交换,TCP会自动给对端发送一个保持存活探测分节。这是一个对端必须响应的TCP分节,会导致以下三种情况:

  • 对端以期望的ACK响应;

  • 对端以RST响应,告知本端TCP,对端已崩溃且已经重新启动;

  • 对端对保持存活探测分节没有任何响应;

SO_LINGER

本选项指定close函数堆面向连接的协议如何操作。默认操作是close立即返回,但是如果有数据残留在套接字发送缓冲区中,系统会试着将数据发送给对端。

本选项主要是在内核空间和用户进程之间传递以下的结构:

1
2
3
4
struct linger{
int l_onoff;
int l_lingger;
};

因此设置该选项时就会出现三种情况:

  1. l_onoff为0,关闭本选项,忽略l_lnlinger。即默认操作,close立即返回;

  2. l_onoff 非0,l_linger为0,这时调用close,会丢弃发送缓冲区的数据,并发送一个RST给对端,跳过TIME_WAIT的状态。当然这也会带来一个问题是,创建该连接的另一个化身时,有可能会导致刚刚被终止连接的旧分节被重复传递到新的化身上;

  3. 两个都为非0时,调用close后,套接字发送缓存区如果还有残留数据,那么进程会进入睡眠,直到所有数据都已经发送完并且被对方确认或延滞时间到(如果是这种情况会返回EWOULDBLOCK错误);

SO_RECTIMEO和SO_SNDTIMEO套接字选项

这两个选项允许我们给套接字的接收和发送设置一个超时值。

TCP套接字选项

TCP有两个套接字选项:

TCP_MAXSEG套接字选项

本选项允许我们获得或者设置TCP连接的最大分节大小。

TCP_NODELAY套接字选项

设置了该选项后会禁止TCP的Nagle算法。

Nagle算法:目的是减少广域网上小分组的数目。如果连接上有未被确认的小包(即小于MSS),那么下一个包会被缓存下来,直到上一个包得到确认或者缓存的包的大小达到最大值。

有两种情况不适用Nagle算法,一是其服务器不在相反方向产生数据以便携带ACK;二则是客户端是使用若干个小片数据向服务器发送单个逻辑请求的客户。