不管是TCP连接的建立还是双通道的关闭,亦或数据的传输等等
这些都是内核程序做的事,而应用程序更多的事感知Tcp的相关状态
以netty为例
包括
IdleState.READER_IDLE
IdleState.WRITER_IDLE
IdleState.ALL_IDLEsocket.close()
ServerBootstrap启动等
有些状态需要底层进程处理,有些状态需要业务进程处理
在内核程序中,tcp包含以下相关部分的状态
随着SYN,FIN相关数据报的发送以及Ack数据包的回馈,内核中监听指定端到端的TCP/IP的进程会进入不同的状态
虚线:服务端 实线:客户端 椭圆:状态
以上部分可以简化成
其中TIME_WAIT又称为2MSL 时间,位于主动关闭方
其存在的目的:
1让4次挥手关闭流程更加可靠;4次挥手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去
2更重要的是防止了TCP协议数据报解析发生致命错误,在2MSL阶段
定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用[TCP推荐如此,但并非所有实现如此]
在连接处于2MSL等待时,任何迟到的报文段将被丢弃 从而保障安全 因为MSL数值很大 标准为2分钟,但实现一般30s,60s
备注:tcp存在几种特殊的情况
1 同步打开 【这种特殊的情况为四次握手】
2 同时关闭
总结:一个TCP连接由一个4元组唯一确定:本地IP地址、本地端口号、远端IP地址和远端端口号。无论何时关闭一个连接,一端必须保持这个连接,我们看到TIME_WAIT状态将处理这个问题。处理的原则是执行主动打开的一端在进入这个状态时要保持的时间为TCP实现中规定的MSL值的两倍P连接由一个4元组唯一确定:本地IP地址、本地端口号、远端IP地址和远端端口号。无论何时关闭一个连接,一端必须保持这个连接,我们看到TIME_WAIT状态将处理这个问题。处理的原则是执行主动打开的一端在进入这个状态时要保持的时间为TCP实现中规定的MSL值的两倍