socket接收的所有连接都是存放在队列类型的数据结构中,关键问题是这种队列有两个,而且其长度都是可以设置的。 分别是下面两个内核参数: /proc/sys/net/ipv4/tcp_max_syn_backlog
/proc/sys/net/core/somaxconn
tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半连接上限
somaxconn是指服务端所能accept即处理数据的最大客户端数量,即完成连接上限。 对于没有调优的新装的centOS6.5系统,这两个参数的值都是128。
试想一个场景,发送端不停地给接收端发很小的包,一次只发 1 个字节,那么发 1 千个字节需要发 1000 次。这种频繁的发送是存在问题的,不光是传输的时延消耗,发送和确认本身也是需要耗时的,频繁的发送接收带来了巨大的时延。
而避免小包的频繁发送,这就是 Nagle 算法要做的事情。
具体来说,Nagle 算法的规则如下:
试想这样一个场景,当我收到了发送端的一个包,然后在极短的时间内又接收到了第二个包,那我是一个个地回复,还是稍微等一下,把两个包的 ACK 合并后一起回复呢?
延迟确认(delayed ack)所做的事情,就是后者,稍稍延迟,然后合并 ACK,最后才回复给发送端。TCP 要求这个延迟的时延必须小于500ms,一般操作系统实现都不会超过200ms。
不过需要主要的是,有一些场景是不能延迟确认的,收到了就要马上回复:
tcp_in_quickack_mode
设置)前者意味着延迟发,后者意味着延迟接收,会造成更大的延迟,产生性能问题。