TCP为什么要三次握手而结束要四次

举个打电话的例子:

  A : 你好我是A,你听得到我在说话吗

  B : 听到了,我是B,你听到我在说话吗

  A : 嗯,听到了

  建立连接,开始聊天!



简单而言:如果不是三次握手的话,那么到底需要几次握手最佳呢?2次握手,或者4次以上的握手?


先看2次握手的情况:客户端给服务器发送建立连接的请求,服务器同意连接请求发回应给客户端,连接就此建立。

有问题的就是网络中经常会出现的包的延迟,如果客户端的某个包在路由器上延迟了,过了很久才发给服务器,服务器收到这个包后回应给客户端,服务器以为连接就此建立成功,分配资源,这样就会出现问题。


再看四次握手的情况:

①A发送SYN,

②B收到SYN后发送ACK+SYN

③A发送ACK

④B再发送ACK

实际上这样的过程可以一直循环下去,其实3次握手已经是能够使双方知道对方设备都是好用的最少次数。四次握手会浪费资源。

综上所述,TCP 3次握手最好。




 

为什么TCP协议终止链接要四次?

1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。

2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。

3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

 

A为什么等待2MSL,从TIME_WAIT到CLOSE?

 在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

参考:http://blog.chinaunix.net/uid-25002135-id-3314682.html
http://www.cnblogs.com/vamei/archive/2012/12/16/2812188.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值