TCP 三次握手性能优化

客户端优化

序列号同步
第一次握手的时候,客户端会向服务端发送链接请求的报文,叫SYN,SYN全称是Synchronize Sequence Numbers,翻译过来是同步序列号。
创建链接的第一件事就是同步序列号。只有同步了序列号才有保证稳定可靠的传输。一个序列号占四个字节的内存服务器

SYN重试
在第二次握手以前,客户端会等待服务端返回ACK报文。微信

通常状况下,ACK报文会在几毫秒内返回。but,若是客户端迟迟没有收到 ACK,客户端会一直重发 SYN报文,默认是6次
net.ipv4.tcp_syn_retries = 2cookie

第 1 次重试在 1 秒钟后,接着会以翻倍的方式在第 二、四、八、1六、32 秒共作 6 次重试,最后一次重试会等待 64 秒。若是依然没有收到 ACK,会终止三次握手。因此,总耗时是 1+2+4+8+16+32+64=127 秒。
咱们能够根据网络的稳定性和服务器的繁忙程度修改retries,调整客户端的三次握手时间上限。能够适当调低retries,尽早的把错误暴露给应用程序。网络


服务端优化

半链接队列
服务器收到 SYN 报文后会回复 SYN+ACK 报文。既确认了客户端的序列号,也把本身的序列号发给客户端。此时服务端状态是 SYN_RECV。这个状态下,服务端必须创建一个 SYN 半链接队列来维护未完成的握手信息,当这个队列溢出后,服务器将没法再创建新链接。tcp

可是,链接创建失败的缘由有不少。如何甄别出队列溢出引起的链接失败?能够经过netstat命令
netstat -s | grep "SYNs to LISTEN"函数

这里是队列溢出致使 SYN 被丢弃的个数累加值。若是数值持续增长,应该调大 SYN 半链接队列。
设置 tcp_max_syn_backlog测试


syncookies
若是 SYN 半链接队列已满,是否是只能丢弃链接?事实上若是开启 syncookies 功能就能够在不使用 SYN 队列的状况下也能创建链接。
net.ipv4.tcp_syncookies = 1。0表示关闭此功能,1表示当半链接队列已满的状况下开启此功能优化


SYN+ACK重试
客户端接收到服务端发来的 SYN+ACK 报文以后回复 ACK 去通知服务端,同时客户端链接状态从 SYN_SENT 转换为 ESTABLISHED,表示链接创建成功。
服务器端一直等到接收到 ACK 以后,状态才变为 ESTABLISHEDspa

but,若是服务端迟迟没有收到 ACK,就会一直重发 SYN+ACK 报文,tcp_synack_retries 的默认次数是 5 次。第 1 次重试在 1 秒钟后,接着会以翻倍的方式在第 二、四、八、16秒共作 5 次重试,若仍然没有收到 ACK,会关闭链接,总耗时是63s。
修改重发次数的方法是调整 tcp_synack_retries 参数
net.ipv4.tcp_synack_retries = 6.net


RST 复位
服务器收到 ACK 后表示链接创建成功,此时内核会把链接从 SYN 半链接队列中移出,再移入 accept 队列,等待进程调用 accept 函数时把链接取出来。若是进程不能及时地调用 accept 函数,就会形成 accept 队列溢出,致使创建好的 TCP 链接被丢弃。此时咱们能够选择向客户端发送 RST 复位报文,告诉客户端链接已经创建失败。须要将 tcp_abort_on_overflow设置为 1


一般状况下,tcp_abort_on_overflow应该设置为0。由于能够提升链接创建的成功率。只有当accept队列频繁溢出的时候,才能设置为1


accept队列长度
backlog 参数就能够设置 accept 队列的大小

net.core.netdev_max_backlog = 1024


backlog 参数受限于 Linux 队列长度,这个上限值能够经过 somaxconn 参数修改

net.core.somaxconn = 262144


经常使用tcp参数配置

net.ipv4.ip_local_port_range = 1024 65500
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.tcp_abort_on_overflow=0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2



本文分享自微信公众号 - 测试驿栈(uhz2008_2008)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索