为什么要有4次?
因为全双工, 双方都在发, 必须双方都结束FIN, 4次=2*2 一来一回
第一次: A-> B FIN(标志位), seq=p 发起结束
第二次: B-> A ACK, ack=p+1 好我收到了
这时A发起的结束,B也表示收到了,
但是
这时A不能关闭,因为B可能还要发,
B如果发了,得不到A的回复, B就不知道A是不是发到了.
这时B也不能直接关闭, 因为A在等他,A不知道B是不是还有话要说
所以 接下来是半关闭的状态。
第三次: B-> A FIN, ACK, seq: q, ack= p +1 我结束了 以后不发了
第四次: A-> B ACE ack=q+1 收到
A必须等到B也的FIN 表示自己没话要说了, 然后A回复B ack 表示收到
如果B没有有收到A最后的ACK , 就会把自己的关闭信息一直重发
为什么4次以后还要有TIME-WAIT, A最后还要等待2MSL才关闭?
1.怕B没有收到A最后的ack(第四次), 一直重发, 重发收不到回应再一直重发, 所以A等一下, 如果B重发了也再回ack
2.如果A 的端口被一个新的应用占用了,这个新的应用会收到上个连接中 B 发过来的包,虽然序列号是重新生成的,但是这里要上一个双保险
还有一个异常情况就是,超过了时间,B依然没有收到A发的 FIN 的 ACK,B 当然还会重发 FIN, A 再收到这个包已经超时(2MSL),于是就直接发送 RST(重新开始),B就知道 A 早关闭了
状态转换
image
阿拉伯数字,连接
中文数字,断开
实线 A
虚线 B
出现很多CLOSED-WAIT怎么办?
- 代码问题 资源没释放
- 请求线程配置不合理