http://chriszeng87.iteye.com/blog/1871772网络
传输控制协议
(Transmission Control Protocol,
TCP
)是一种面向链接的、可靠的、基于字节流的运输层(Transport layer)通讯协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的。互联网络与单个网络不一样,由于互联网络的不一样部分可能有着大相径庭的拓扑、带宽、延迟、分组大小和其余参数。TCP的设计目标是可以动态的适应互联网络的这些特性,并且当面对多种失败的时候仍然可以健壮。
每一次TCP链接都须要三个阶段:链接创建、数据传送和链接释放。“三次握手”就发生在链接创建阶段。
“三次握手”的具体过程网上有不少详解。可自行Google之。这里探讨的是——为何须要“三次握手”。
我Google该问题答案后发现,网络上对于“三次握手”的过程都有很详细的描述,但对于为何须要“三次握手”来创建链接却没有很好的答案。只能求助于书本了。
在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“
为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误”。在另外一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“
网络中存在延迟的重复分组
”的问题。
这两种不用的表述其实阐明的是同一个问题。
谢希仁版《计算机网络》中的例子是这样的,“已失效的链接请求报文段”的产生在这样一种状况下:client发出的第一个链接请求报文段并无丢失,而是在某个网络结点长时间的滞留了,以至延误到链接释放之后的某个时间才到达server。原本这是一个早已失效的报文段。但server收到此失效的链接请求报文段后,就误认为是client再次发出的一个新的链接请求。因而就向client发出确认报文段,赞成创建链接。假设不采用“三次握手”,那么只要server发出确认,新的链接就创建了。因为如今client并无发出创建链接的请求,所以不会理睬server的确认,也不会向server发送数据。但server却觉得新的运输链接已经创建,并一直等待client发来数据。这样,server的不少资源就白白浪费掉了。采用“三次握手”的办法能够防止上述现象发生。例如刚才那种状况,client不会向server的确认发出确认。server因为收不到确认,就知道client并无要求创建链接。”
这个例子很清晰的阐释了“三次握手”对于创建可靠链接的意义。
在Google Groups的TopLanguage中看到一帖讨论TCP“三次握手”以为颇有意思。贴主提出“TCP创建链接为何是三次握手?”的问题,在众多回复中,有一条回复写道:“
这个问题的本质是, 信道不可靠, 可是通讯双发须要就某个问题达成一致. 而要解决这个问题, 不管你在消息中包含什么信息, 三次通讯是理论上的最小值. 因此三次握手不是TCP自己的要求, 而是为了知足"在不可靠信道上可靠地传输信息"这一需求所致使的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就不要紧了. 所以,若是信道是可靠的, 即不管何时发出消息, 对方必定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就能够了.
”。这可视为对“三次握手”目的的另外一种解答思路。