三次握手和四次挥手

三次握手

投石问路

三次握手也是保证可靠性的一种机制,TCP要想保证可靠传输的前提是网络必须畅通,
TCP三次握手,就是验证网络是否畅通,以及验证每个主机的发送能力和接收能力是否正常.

在这里插入图片描述

消息协商

通信时涉及到一些参数,需要双方保持一致的,通过协商,来确定参数具体是什么…

TCP通信中,有很多信息需要协商,比如双方的序号从几开始(一般不会从0/1开始).
为了保证两次连接,消息的序号能够有较大的差异,从而去判断某个消息是否是属于这个连接的.
网络上传输的消息可能会后发先至,当消息到达对端时,客户端和服务器已经断开了连接,再次建立下一个
连接后,就可以通过序号识别出这是上一个连接发送的消息,此时就可以把它丢弃了.

四次挥手

当处于连接状态时,通信双方在内存中保存了对端的相关信息.
如果不需要连接了,就得及时释放上述空间.
6个标志位中,FIN = 1时是结束报文段

在这里插入图片描述

四次挥手也可以是三次,close()执行的很快时,有可能和上一个ACK合并,就变成三次挥手了.close()执行的很慢时,无法与上一个ACK合并,此时就是四次挥手.

当服务器始终不进行close()时,客户端的连接会始终不关闭吗?
此时服务器的TCP状态就会一直处于CLOSE_WAIT状态.

在这里插入图片描述

要发送对端的FIN请求,要从CLOSE_WAIT转换为LAST_ACK,虽然服务器的连接还没有关闭,
但是这个连接已经不能正常使用了.
针对当前socket进行读操作,如果数据还没读完,此时可以读到数据.
如果已经读完了,此时会读到EOF.
针对socket进行写操作时,会直接抛出异常.
当然,如果客户端迟迟读不到服务器的FIN请求,也会单方面释放连接.

当通信过程中,出现了丢包,会如何处理?此时就会进行"超时重传".
当第一组FIN/ACK丢失了,客户端直接重新重传FIN即可.
当第二组FIN/ACK丢失了,此时最有可能是ACK丢失了.
这种情况服务器会重传一个FIN到客户端…
注意:1. 如果A已经把连接释放了,重传的FIN就没有ACK了.
需要让客户端发出最后一个ACK时等一会,如果没有再次收到FIN,
就可以认为ACK已经被服务器收到了,此时客户端可以正确释放连接了.

那么客户端需要等待多久呢??
等待时间: 网络上任意两点之间传输数据的最大时间*2: MSL * 2(单位ms).
超时重传的时间必然 <= MSL.

小结

三次握手和四次挥手也对TCP可靠性机制起到一定作用,但是起到决定性作用的还是确认应答.
这篇博客到这结束了,有收获的小伙伴多多支持…

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值