一、linux网络内核调优:三次握手

荒凉一梦 提交于 2019-12-13 18:49:52

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

TCP 三次握手过程如下:

三次握手图

与三次握手的系统参数有(系统默认值):

  • net.ipv4.tcp_syn_retries = 6
  • net.ipv4.tcp_synack_retries = 5

/etc/sysctl.conf 中添加或修改,执行sysctl -p 即可生效。

tcp_syn_retries

tcp_syn_retries 与 TCP 三次握手的第一步相关,也就是客户端向服务器发送一个 SYN 数据包。

在没有接收到服务器响应的情况下,SYN 数据包的会尝试发送 tcp_syn_retries 次。

查看系统设置

cat /proc/sys/net/ipv4/tcp_syn_retries 
6

测试

测试代码:http://my.oschina.net/lowkey2046/blog/716557

服务端(192.168.1.24),客户端(192.168.1.21)

  1. 正常情况下执行一次程序,主要是为了产生相应的路由数据
  2. 直接断开服务端网络
  3. 启动客户端
./client 192.168.1.24
connect: Connection timed out
connect_server 192.168.1.24 error

wireshark 抓包

测试截图

客户端的在 connect 函数上进行三次握手。客户端在发出 SYN 数据包后,等待服务器的响应。如果没有收到服务端响应,会尝试重发 SYN 数据包。总共尝试了6次,也就是 tcp_syn_retries 的数值。默认情况下,时间超过了60s。

优化方案

可以通过减小该数值提前结束连接,减少重试次数。

tcp_synack_retries

tcp_synack_retries 与 TCP 三次握手的第二步相关。也就是服务器向客户端发送一个 SYN-ACK 数据包。

服务器在接收到客户端发送的 SYN 数据包后,会发送 SYN-ACK 数据包进行响应。如果没有收到客户端对该 TCP 报文的响应,服务器会尝试重新发送 SYN-ACK 数据包,总共会尝试 tcp_synack_retries 次。

cat /proc/sys/net/ipv4/tcp_synack_retries 
5

测试

这个要构建数据包才可以测试,暂时省略。

优化方案

可以通过减小该数值提前结束连接,减少重试次数。

参考资料

tcp_syn_retries等参数详解

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!