首先我们先了解一下计算机网络的三大模型
经典的OSI七层模型:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
简化的理论五层模型:
物理层、数据链路层、网络层、传输层、应用层(对应于七层模型的会话层、表示层、应用层)
实际应用中的TCP/IP体系四层模型:
网络访问层(五层模型的物理层和数据链路层的统一)、网络互连层、传输层、应用层
TCP协议位于三大模型中的传输层
传输层主要协议为UDP和TCP,其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
为了提供可靠的传输,就引出了今天的第一个问题。
TCP的三次握手
首先我们来看一下两军问题:
假设一支蓝军指挥官向另外一支蓝军发出消息:“我建议在明天佛晓发起进攻,请确认。”如果消息到达了另一支蓝军,其指挥官同意这一建议,并且他的回信也安全的送到,那么能否进攻呢?
不能。这是一个两步握手协议,因为该指挥官无法知道他的回信是否安全送到了,所以,他不能发起进攻,改进协议,将两步握手协议改为三步握手协议,这样,最初提出建议的指挥官必须确认对该建议的应答信息。假如信息没有丢失,并收到确认消息,则他必须将收到的确认信息告诉对方,从而完成三步握手协议。
然而,这样他就无法知道消息是否被对方收到,因此,他不能发起进攻。那么现在采用四步握手协议会如何呢?结果仍是于事无补。
那为什么三次握手就可以建立起一个真正的可靠连接,而不是两次握手,或者四次握手呢?
这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致,而为了达到一致,双方需要经过多少次应答。
其实,正如两军问题说描述,无论多少次握手,都会有连接不上的不确定性。而三次握手,保证了信道的基本可靠性,是理论上的最小值。
在谢希仁著的《计算机网络》中提及的三次握手的目的是
“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”
谢希仁版《计算机网络》中的例子是这样的:
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。
本