网络TCP创建链接为何须要三次握手而结束要四次

  突然顿悟了,无论三次握手,仍是四次握手,这是保证信息来回两个链路可达(也就是信息能从A到B,也能从B到A)的最低要求。-2018-9-17-晚上九点html

 

  举个打电话的例子:网络

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

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

  A : 嗯,听到了.net

  创建链接,开始聊天!unix

 



 

为何TCP协议终止连接要四次?htm

一、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(固然确认信号仍是能够发),就会发FIN给主机B。blog

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

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

四、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链接。

 

这个网上转载的例子不错:

三次握手:
A:“喂,你听获得吗?”A->SYN_SEND

B:“我听获得呀,你听获得我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED

A:“我能听到你,今天balabala……”B->ESTABLISHED

四次挥手:
A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,不然重说一次”我知道了”,A->CLOSED


连接:https://zhuanlan.zhihu.com/p/21940234

 

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

相关文章
相关标签/搜索