TCP/IP协议中backlog分析与设置以及TCP状态变化

TCP/IP协议卷一中是有说明设置backlog这个值的,这值是作什么的呢?linux

你们都知道TCP创建链接时是要进行三次握手链接的,可是否三次握手完成了,服务端就进行处理了(accept)呢,若是没有处理就变成什么状况,假如没有及时accept的话,后续客户端就链接不上或链接失败。这样就谈不上吞吐量了。想必你们也认为TCP不是那么设计的。服务器

backlog实际上是一个链接队列,如下是backlog队列大小公式。
 backlog队列总和=未完成三次握手队列 +  已经完成三次握手队列socket

以上参数解释说明以下:函数

未完成三次握手队列:服务器处于listen状态时收到客户端syn 报文(connect)时放入未完成队列中。spa

已经完成三次握手队列:三路握手的第二个状态即服务器syn+ ack响应client后,此时第三个状态ack报文到达前(客户端对服务器syn的ack)一直保留在未完成链接队列中,若是三路握手完成,该条目将从未完成链接队列搬到已完成链接队列尾部..net

backlog参数设置既能够在Linux内核参数设置(修改文件/etc/sysctl相关参数),也能够在socket系统调用listen函数时设置(第二个参数),这两者区别是,前者为全局性的,影响全部socket,后者为局部性的,影响当前socket。设计

图1   如下表示backlog队列的变化状态server

当server调用accept时,从已完成(三次握手)队列中的头部取出一个socket链接给进程,如下是变化过程。队列

相关文章
相关标签/搜索