TCP三次握手性能优化
客户端:根据网络稳定性和对方服务器的繁忙程度通过tcp_syn_retries参数调整SYN的重传次数
服务端:半连接队列大小的调整,syncookie的使用
如何绕过TCP三次握手?
开启TFO(TCP Fast Open)
工作方式:
- 在客户端第一次请求连接时,发送的第一个SYN报文包含Fast Open选项,该选项目前为空(向服务端请求cookie)。服务端收到报文,生成的cookie存储在SYN-ACK报文的Fast Open选项。客户端收到报文,将cookie缓存到本地。
- 当客户端再次请求建立连接时,客户端发送的SYN报文包含数据以及缓存的cookie。服务端接收后会对cookie进行校验:如果cookie有效,服务端会在SYN-ACK报文中对数据和SYN进行确认,随后将数据推送到相应应用里;如果cookie无效,则会舍弃数据,发送的SYN-ACK报文为三次握手的正常版本。
开启TFO后,在cookie校验通过时,可以节省1个RTT的时间消耗开启后cookie是存储在TFO option字段里
TCP四次挥手性能优化
进程收到RST直接关闭连接(暴力优化)
FIN_WAIT1的优化:通过tcp_max_orphans参数,当调用的close函数的连接数>tcp_max_orphans,后续连接就不走四次挥手来关闭连接,而是直接回复RST报文关闭连接
TIME_WAIT的优化:
- tcp_max_tw_buckets 参数,当 TIME_WAIT 的连接数量超过该参数时,新关闭的连接就不再经历 TIME_WAIT 而直接关闭
- 在建立新连接时,复用处于 TIME_WAIT 状态的连接,那就是打开 tcp_tw_reuse 参数。但是需要注意,该参数是只用于客户端(建立连接的发起方),因为是在调用 connect() 时起作用的,而对于服务端(被动连接方)是没有用的
我们可以在程序中设置 socket 选项,来设置调用 close 关闭连接行为。如果
l_onoff
为非 0, 且l_linger
值为 0,那么调用 close 后,会立该发送一个 RST 标志给对端,该 TCP 连接将跳过四次挥手,也就跳过了 TIME_WAIT 状态,直接关闭