我用自己的话总结一下吧。
三次握手
客户端发起请求,服务端确认收到请求,客户端再次确认收到服务器的确认,服务器收到客户端的确认后三次握手结束。
- 原因:一开始也以为两次就可以了,但因为很可能客户端的第一次请求因为网络问题,到服务端的时候,客户端已经出现关机等状态了,然后服务器发出确认后就会一直等着。
但假如三次握手就不会出现这种状况。
当然更多的握手会更安全,但会因此牺牲效率。
四次分手
tcp是全双工,所以任何一方都可能发起结束请求的信号。
A方发出结束请求的信号fin,表示自己不会再发送数据了,但可能还会接收数据,B方马上确认,发出信号ack,同时假如它不需要再发出数据了,就紧接着发出结束的信号fin。最后A发出确认信号ack,等待2mls后结束连接。
我也思考过,为什么B不在发出fin后直接断开连接,为什么A发出ack后还要等2mls?
答案很简单,因为发出的信号可能到达不了对面,假如你直接就关闭了,对面又一直在等你,那就gg了。
- 所以B要确认一下对面收到自己的fin了,同理,A最后等2mls的意义在于,B要是没收到自己的ack会再次发送fin,A等了2mls都没收到第二个fin,那就说明B收到了自己的ack。