1. SO_REUSEADDR
- 设置套接字的SO_REUSEADDR选项
- 一般来说,客户端调用close()后会进入TIME_WAIT状态, 监听的端口仍被占用着,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
2. SIGPIPE
- 忽略SIGPIPE信号
- 连接建立,若某一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGPIPE信号,通知进程此连接已经断开。而SIGPIPE信号的默认处理是终止程序.
- 如果服务器端没有忽略SIGPIPE信号,那如果有一个客户端断开连接,服务器对其因其产生SIGPIPE信号,那么服务器进程就会终止,影响其他客户端,所以要忽略这个信号.
3. TCP_NODELAY
-
设置套接字的TCP_NODELAY选项
-
主要是忽略Nagle算法, 这个算法大致就是send()后,收到ack确认,才会发下一个包, 完整描述如下
TCP_NODELAY选项是用来控制是否开启Nagle算法,该算法是为了提高较慢的广域网传输效率,减小小分组的报文个数, 该算法要求一个TCP连接上最多只能有一个未被确认的小分组,在该小分组的确认到来之前,不能发送其他小分组。 这里的小分组指的是报文长度小于MSS(Max Segment Size)长度的分组(MSS是在TCP握手的时候在报文选项里面进行通告的大小, 主要是用来限制另一端发送数据的长度,防止IP数据包被分段,提高效率, 一般是链路层的传输最大传输单元大小减去IP首部与TCP首部大小)。 如果小分组的确认ACK一直没有回来,那么就可能会触发TCP超时重传的定时器。
-
这个选项不是必须打开的,根据应用场景选择,但很多时候是打开的
实时性要求比较高的场景,类似用户鼠标操作,键盘输入,触摸屏事件输入, 状态更新等这种连续的小分组数据,需要在对端立刻呈现,让用户尽可能感受不到延迟。 但是如果网络延迟比较高,采用这种方式,那么会导致网路利用率下降。 一般类似HTTP协议请求响应的模型的场景不太需要考虑禁用这个算法, 因为在一条TCP连接上发送小报文,不管多小都代表了服务端任务执行的指示, 完成了这个请求之后才能继续执行下一个请求,即使Sender端提前发送过去也没有作用, 所以开启Nagle算法是能够优化网络传输的,并且在Receiver端有捎带延迟确认,省掉单独的ACK确认进一步优化小分组传输。 但有时候也需要,可能需要。即使对于那种只需要使用单个连接下载大量数据的客户端实现, 一些数据包仍然需要反向发回以达到最大的传送速度。没有 TCP_NODELAY(但仍然允许 Nagle 算法), 要发出去的数据包可能会被阻塞一会儿,以达到与后续数据包合并的目的 如果有这样一个数据包,它的目的是告诉对方仍有增加发送窗口的空间, 延迟它的发送几百毫秒(或更多)将会对高速连接产生负面的影响。