TCP的TIME_WAIT状态是为了防止迷路的FIN/ACK包出现后破坏已有的连接的防护机制,但等待的时间也太长了(应该是ip包在网络上的最大生存时间决定的),如果通过设置套接字的DONTLINNER选型或者修改系统内核参数使之变小,虽然可以暂时解决问题,但毕竟隐患始终存在,会造成不确定的情况下的服务器不稳定。
我个人认为有可能是TCP协议中的早期设计问题(个人观点):对于一个成功创建的TCP连接,协议中应该会有一个int型的标识符保存在该连接相关的任何ip包中,TCP协议本身要定义一个全局作用域的int型标识符(初始=0),每次成功进行三向握手的新连接都将该标识符增一赋予该连接(服务器端),在通讯过程中所有的TCP包和连接关闭时的四向握手(一方fin/fin+ack,另一方fin/fin+ack)的ip包中都包含所属连接标识,这样不论通讯两端哪一方主动关闭连接(等待最后发送的数据对等方接收完毕的确认,直接关闭连接)后都不需要进入TIME_WAIT状态了,因为此时对于本机而言该连接已关闭,后面收到的fin或fin ack中标识的连接已经不存在了,直接丢弃即可。
从根本上解决TCP TIME_WAIT问题只能是修改TCP协议。
TCP之TIME_WAIT
最新推荐文章于 2022-06-12 21:48:19 发布