架构性能优化_TCP详解_四次挥手(断开连接)

一、四次挥手(断开tcp连接)
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:

架构性能优化_TCP详解_四次挥手(断开连接)_第1张图片
正常断开连接过程描述:
1、第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
2、第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3、第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4、第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。


上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:

架构性能优化_TCP详解_四次挥手(断开连接)_第2张图片
具体过程分析,参考正常断开连接过程描述




常见异常情况(非正常断开连接情况,也是linux内核优化所关注的点):
1、TCP第四次挥手失败怎么办?
第四次挥手失败,此时客户端的状态为TIME_WAIT,会等待一段时间,服务器端状态仍然为LAST_ACK,超时一段时间仍然没有响应的话,服务器端会再发起一次FIN包,告诉客户端服务器端也要断开连接的请求,客户端收到后会再次发生ACK包确认断开连接。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
总结:因此可以调整linux内核参数/etc/sysctl.conf的net.ipv4.tcp_tw_reuse=1,快速释放连接重新建立连接;net.ipv4.tcp_tw_recycle=1,快速回收连接;net.ipv4.tcp_fin_timeout=30,30秒等待超时,默认60秒

你可能感兴趣的:(linux)