
连接状态解读:
FIN-WAIT-1:表示想主动关闭连接,向对方发送了FIN报文,此时进入到 FIN-WAIT-1状态。
CLOSE-WAIT: 表示在等待关闭
当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时进入到CLOSE-WAIT状态
在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方
FIN-WAIT-2: 只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文
CLOSING: 一种比较罕见的例外状态
表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文
如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态
表示双方都正在关闭连接
LAST-ACK: 被动关闭一方在发送FIN报文后,最后等待对方的ACK报文
当收到ACK报文后,即可进入CLOSED状态了
TIME-WAIT: 表示收到了对方的FIN报文,并送出了ACK报文,就等2MSL后即可进入CLOSED状态了
如果FIN-WAIT-1状态下,收到了对方同时带FIN的标志和ACK报文时
可以直接进入TIME-WAIT状态,而无须经过FIN-WAIT-2状态
TCP\IP协议栈在设计上,任何一方都可以先发起断开请求
client发送ACK后,需要有个TIME-WAIT阶段,等待一段时间后,在真正关闭连接
一般是等待2倍的MSL(Maximum Segment Lifetime, 最大分段生存期)
MST是TCP报文在Internet上的最长生存时间
每个具体实现的TCP实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟。
如果client发送ACK后马上释放了,然后又因为网络原因,server没有收到client的ACK,server就会重发FIN
这时可能出现的情况是
>client没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源
>client有个新的应用程序刚好分配到了同一个端口号,新的应用程序收到FIN后马上开始执行断开连接的操作,本来它可能是想和server建立连接的
为什么释放连接,要进行四次挥手?
TCP是全双工通信
第一次挥手: 当主机发出FIN报文段时
表示主机1告诉主机2,主机1已经没有数据要发送了,但是,此时主机1还是可以接受来自主机2的数据
第二次挥手: 当主机2返回ack报文段时
表示主机2已经知道主机1没有数据可以发送了,但是主机2还是可以发送数据到主机1的
第三次挥手: 当主机2也发送了FIN报文段时
表示主机2告诉主机1,主机2已经没有数据要发送了
有时候使用wireshark抓包发现没有四次挥手,因为2、3次合并了
