TCP协议1

0,写在前面的话

作为IT的从业人员,很多人都经历过大大小小的面试,也、听过很多人(包括我自己)总是吐槽的一句话:面试造飞机,入职拧螺丝。很多面试的内容可能在实际的工作中永远也遇不到(但是为啥这些遇不到的东西总要打破砂锅问到底呢,哈哈哈。手动狗头)。三次握手和四次挥手就是我们面试过程中的常客。俗话说,基础不牢,地动山摇。那么我们就来详细的了解下三次握手

1,网络的前世今生

提起三次握手,必须要提起TCP/IP协议。而说起TCP/IP协议就又要说起网络了。

先来看一段历史吧

网络:是一组互相连接的通信设备,如计算机和打印机。互联网是指两个或者更多的可以彼此相连的网络。

20世纪60年代中叶,美国国防部的远景研究规划局(ARPA)希望找到一种连接计算机的方法,以使得可以共享研究成果。

1967年在一次计算机协会(ACM)的会议上,ARPA提出了他们连接一些计算机的小网络的ARPANET的概念,实现了四个节点的互联。

1972年, ARPANET的两个核心成员Vint Cerf(文顿·瑟夫)和Robert Kahn(罗伯特·卡恩)共同研究一项项目:网络互联项目。他们希望可以将不同的网络连接起来,使得一个网络上的主机可以和另一个网络上的主机进行通信。但是有很多的困难去克服:不同的分组长度,不同的接口,不同的传输速率以及不同要求的可靠性等等。他们发明了一个概念:就是使用成为网关的设备当做中间层,以便吧一个分组从一个网路发送发送到另一个网络。

1973年,Vint Cerf(文顿·瑟夫)和Robert Kahn(罗伯特·卡恩)发布了一篇里程碑的论文,阐述了实现分组的端到端的协议。这篇包括传输控制协议(TCP)的论文包含的概念有:封装,数据报以及网关的功能。

1977年,由三个不同(ARPANET,分组无线电网,分组卫星网)的网络组成的互联网成功的问世了。不就之后,当局决定把TCP划分成两个协议:传输控制协议(Transmission Control Protocol TCP)和 网际协议(Internet Protocol IP)。IP负责数据报的路由选择,而TCP负责高一层的一些功能,如分段,重装,差错检测等。这个组个称为TCP/IP协议。

以上就是一个TCP/IP的发展史,Vint Cerf(文顿·瑟夫)和Robert Kahn(罗伯特·卡恩)也因为其卓越的成就被誉为“互联网之父”。

进过数十年的发展,互联网技术日新月异,但是TCP/IP一直都是最重要的基础之一。

现在我们都知道我们现在的网络是分层的,著名的有OSI模型和TCP/IP协议族。

OSI模型的分层,功能以及每层支持的协议如下,这是一个理想的分层,并未实现。

我们现在用的最多的是TCP/IP协议族,它的分层结构和对比如下。

2,为什么是三次握手?

两台主机想要通过互联网进行通信,首先需要建立链接,即我们说的三次握手。那么为什么是三次握手呢?而不是两次或者是四次呢?

三次握手的主要目的是确认发送方和接收方的收发功能都是正常的。就好比你想和另外一个人对话一样,如果你们两个人想要正常的交流,就必须保证你们两人的听(收)/说(发)功能是正常的。任何一个人只能听不能发或者是只能发不能听都不能完成正常的交流。

看一个简单的图:

第一次:发送方主动发起:喂,你听的到吗?接收方接收到之后就会明白:发送方的发送功能和自己的接受功能是正常的。

第二次:接收方回复:听的到,你听的到我吗? 发送方接收到之后就会明白:接收方的接收功能和发送功能是正常的,自己的发送功能和接收功能也是正常的。但是这时候接收方并不知道自己的发送功能是不是正常的。所有需要第三次握手。

第三次:发送发回复:我也听的到,我们开始对话吧。这个时候接收方就知道了自己的发送功能也是正常的。就可以愉快的正常的对话了。

我们从另外一个角度来看下三次握手

在Google Groups的TopLanguage中看到一帖讨论TCP“三次握手”觉得很有意思。贴主提出“TCP建立连接为什么是三次握手?”的问题,在众多回复中,有一条回复写道:“这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足”在不可靠信道上可靠地传输信息”这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”

继续看一下三次握手的另一个观点:

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

这就很明白了,防止了服务器端的一直等待而浪费资源。

我们大致描述了一下TCP三次握手的过程,具体的实现待下回分解。