TCP握手的时候维护的队列
- 半连接队列(SYN队列)
- 全连接队列(accepted队列)
服务器收到客户端SYN数据包后,linux内核会把该连接存储到半连接队列中,并响应SYN+ACK报文给客户端 。
全连接队列是什么?
服务器在收到客户端第三次握手的ACK报文后,内核会把该连接从半连接队列中移除,然后创建一个新的完全的连接并将其放入全连接队列中,等待应用程序调用accept函数把连接取走 。
队列溢出会有啥问题?
半连接和全连接队列都有最大长度限制,超过限制时,内核会直接丢弃,返回RST报文 。
如何查看全连接队列?
# -l 显示正在listening的socket# -n 不解析服务名称# -t 只显示tcp socketss -lnt
文章插图
Recv-Q/Send-Q在Listen状态和非Listen状态下代表的含义不一样 。
在Listen状态下:
- Recv-Q:当前全连接队列的大小,完成三次握手等待accept的TCP连接
- Send-Q:全连接队列的最大长度,上图中表示80端口的TCP服务全连接队列的最大长度为128 。
文章插图
在非Listen状态下:
- Recv-Q:已收到但未被应用程序读取的字节数
- Send-Q:已发送但未收到确认的字节数
netstat -s | grep overflowed
文章插图
通过上图可以看出,全连接队列一共溢出了1910次,如果这个数字在某个时间段一直增加,说明该时间段的全连接队列已经满载溢出 。
全连接队列溢出后的情况?
全连接队列溢出后的处理受内核参数tcp_abort_on_overflow控制:
# 通过以下命令可以看出默认值是0cat /proc/sys/net/ipv4/tcp_abort_on_overflow
- 0:如果全连接队列满了,服务端会直接丢弃客户端发送过来的ACK数据包
- 1:如果全连接队列满了,服务端会发送一个reset包给客户端,表示废弃这个握手过程和连接
tcp_abort_on_overflow设置为0更有利于应对突发流量 。
如何增加TCP全连接队列?
TCP全连接队列的最大值取决于somaxconn和blacklog之间的最小值:
- somaxconn:linux内核参数,可以通过/proc/sys/net/core/somaxconn修改其值
- backlog:listen(int sockfd, int backlog)函数中的backlog大小,一般应用程序都可以自定义该值
# 执行以下命令就可以查看半连接队列的大小netstat -natp | grep SYN_RECV | wc -l
如何查看TCP半连接队列溢出的情况?netstat -s | grep 'SYNs to LISTEN'
文章插图
上图中我们可以看出半连接队列累计一共丢弃了220418个TCP连接,如果多次执行该命令该值有上升趋势,说明当前时间段存在半连接队列溢出现象 。
半连接队列大小受哪些条件影响?
半连接队列的大小受内核参数tcp_max_syn_backlog控制,但是该值不一定是半连接队列的最大值(在较新版本的linux内核中理论上半连接队列的最大值是全连接队列的最大值),队列的溢出是有一定条件的:
- 如果半连接队列满了,并且没有开启tcp_syncookies,就会丢弃连接
- 如果全连接队列满了,并且没有重传SYN+ACK包的连接请求多余1个,也会丢弃连接
- 如果没有开启tcp_syncookies,并且tcp_max_syn_backlog减去当前半连接队列长度小于(tcp_max_syn_backlog >> 2),则会丢弃连接
syncookies是服务器根据当前状态计算一个值,然后再SYN+ACK报文中发出,当客户端返回ACK报文时,服务端取出该值进行验证,验证成功则认为连接建立成功 。
开启syncookies功能可以在不使用半连接队列的情况下成功建立连接 。
如何设置syncookies的值?
通过内核tcp_syncookies参数进行控制:
# 可以查看tcp_syncookies的值cat /proc/sys/net/ipv4/tcp_syncookies
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 微软|Win11中的祖传UI从Win9X流传至今!一文了解详情
- 一文看懂编程的本质,程序员有前途么?
- 一文掌握SQL基础
- 一文讲透 Python 协程
- 一文带你搞定TCP滑动窗口
- 电脑开机慢?三个步骤帮你搞定,电脑瞬间秒开机
- 交换机组网与PON组网哪个好?一文了解清楚
- 一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程
- 一文看懂“超融合”和“虚拟化”的区别
- 开机进入纯净的Windows系统,一个设置就能搞定