tcp C/S模型 3个必要设置:SO_REUSEADDR,SIGPIPE,TCP_NODELAY

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 算法),
    要发出去的数据包可能会被阻塞一会儿,以达到与后续数据包合并的目的
    如果有这样一个数据包,它的目的是告诉对方仍有增加发送窗口的空间,
    延迟它的发送几百毫秒(或更多)将会对高速连接产生负面的影响。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值