没有合适的资源?快使用搜索试试~ 我知道了~
TCP 半连接队列和全连接队列 420 -452
需积分: 0 0 下载量 30 浏览量
2023-05-15
09:38:06
上传
评论
收藏 6.25MB PDF 举报
温馨提示
试读
33页
TCP 半连接队列和全连接队列 420 -452
资源推荐
资源详情
资源评论
4.4 TCP 半连接队列和全连接队列
⽹上许多博客针对增⼤ TCP 半连接队列和全连接队列的⽅式如下:
增⼤ TCP 半连接队列的⽅式是增⼤ /proc/sys/net/ipv4/tcp_max_syn_backlog;
增⼤ TCP 全连接队列的⽅式是增⼤ listen() 函数中的 backlog;
这⾥先跟⼤家说下,上⾯的⽅式都是不准确的。
“你怎么知道不准确?”
很简单呀,因为我做了实验和看了 TCP 协议栈的内核源码,发现要增⼤这两个队列⻓度,不
是简简单单增⼤某⼀个参数就可以的。
接下来,就会以实战 + 源码分析,带⼤家解密 TCP 半连接队列和全连接队列。
“源码分析,那不是劝退吗?我们搞 Java 的看不懂呀”
放⼼,本⽂的源码分析不会涉及很深的知识,因为都被我删减了,你只需要会条件判断语句
if、左移右移操作符、加减法等基本语法,就可以看懂。
另外,不仅有源码分析,还会介绍 Linux 排查半连接队列和全连接队列的命令。
“哦?似乎很有看头,那我姑且看⼀下吧!”
⾏,没有被劝退的⼩伙伴,值得⿎励,下⾯这图是本⽂的提纲:
什么是 TCP 半连接队列和全连接队列?
在 TCP 三次握⼿的时候,Linux 内核会维护两个队列,分别是:
半连接队列,也称 SYN 队列;
全连接队列,也称 accept 队列;
服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应
SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握⼿的 ACK 后,内核会把连接从半
连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列,等待进程调⽤
accept 函数时把连接取出来。
不管是半连接队列还是全连接队列,都有最⼤⻓度限制,超过限制时,内核会直接丢弃,或
返回 RST 包。
实战 - TCP 全连接队列溢出
如何知道应⽤程序的 TCP 全连接队列⼤⼩?
在服务端可以使⽤ ss 命令,来查看 TCP 全连接队列的情况:
但需要注意的是 ss 命令获取的 Recv-Q/Send-Q 在「LISTEN 状态」和「⾮ LISTEN 状态」
所表达的含义是不同的。从下⾯的内核代码可以看出区别:
在「LISTEN 状态」时, Recv-Q/Send-Q 表示的含义如下:
Recv-Q:当前全连接队列的⼤⼩,也就是当前已完成三次握⼿并等待服务端 accept()
的 TCP 连接;
Send-Q:当前全连接最⼤队列⻓度,上⾯的输出结果说明监听 8088 端⼝的 TCP 服务,
最⼤全连接⻓度为 128;
在「⾮ LISTEN 状态」时, Recv-Q/Send-Q 表示的含义如下:
Recv-Q:已收到但未被应⽤进程读取的字节数;
Send-Q:已发送但未收到确认的字节数;
如何模拟 TCP 全连接队列溢出的场景?
剩余32页未读,继续阅读
资源评论
Wangzc_1116
- 粉丝: 42
- 资源: 79
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功