理解TCP握手过程中建连接的流程和队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解TCP握手过程中建连接的流程和队列相关的知识,希望对你有一定的参考价值。

一、半连接队列和全连接队列

服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列

1.SYN队列(半连接队列):长度由tcp_max_syn_backlog决定

2.ACCEPT队列(全连接队列):长度由内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定


二、连接建立的流程

技术分享图片

1.当client通过connect()向server发出SYN包时,server收到syn后,把相关信息放到半连接队列(syns queue)中,同时回复syn+ack。

2.Client返回ACK后,如果全连接队列(accept queue)没满,那么Server从半连接队列拿出相关信息放入到全连接队列。

3.否则按照tcp_abort_on_overflow配置参数执行操作

1)0 表示直接丢丢弃该ACK

2)1 表示发送RST


三、查看队列情况

如果应用处理全连接队列(accept queue)过慢 socket overflow,影响半连接队列(syn queue)溢出socket dropped

# netstat -s|grep -i listen

8692 times the listen queue of a socket overflowed

8692 SYNs to LISTEN sockets ignored


四、命令 ss -tln

1.LISTEN 状态:

Recv-Q 表示的当前等待服务端调用 accept 完成三次握手的 listen backlog 数值,也就是说,当客户端通过 connect() 去连接正在 listen() 的服务端时,这些连接会一直处于这个queue里面直到被服务端 accept();

Send-Q表示的则是最大的listen backlog数值,这就就是上面提到的 min(backlog, somaxconn) 的值。

2.非 LISTEN 状态

Recv-Q 表示 receive queue 中的 bytes 数量

Send-Q 表示 send queue 中的 bytes 数值。


以上是关于理解TCP握手过程中建连接的流程和队列的主要内容,如果未能解决你的问题,请参考以下文章

三次握手和四次挥手

TCP 连接三次握手、四次挥手

TCP/IP协议三次握手与四次握手流程解析

深入理解TCP协议的三次握手,分析源码并跟踪握手过程

TCP连接之未连接队列的理解[转]

深入理解TCP协议及其源代码