image.png

    连接状态解读:
    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次合并了