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)
- 正常情况下执行一次程序,主要是为了产生相应的路由数据
- 直接断开服务端网络
- 启动客户端
./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
测试
这个要构建数据包才可以测试,暂时省略。
优化方案
可以通过减小该数值提前结束连接,减少重试次数。