A protocol for packet network intercommunication 论文笔记

less than 1 minute read

Published:

这篇文章是1974年发表的,作者为Vinton Cerf和Robert Kahn,正是他们联合设计的TCP/IP协议和互联网架构,是当今计算机网络的先驱。在文中,他们提出了TCP的分组网络互通协议,对独立网络的互联具有重要的意义,他们提出的网络互联原则确定了互联网的体系。文章首先介绍了网关(Gateway)的概念并对其重要性进行了描述,然后详细的介绍了协议的组成部分(如报文段结构、流量控制、出错控制等等)。

在这篇文章提出之前,关于如何设计一个分组交换网络方面,已经有大量的研究。但是相关的研究主要研究同一个网络中的通信问题,而对于不同网络间的通信问题研究较少。当时在一个网络内部已经有了很好的协议去解决数据可靠传输的问题,可是怎样将若干个具有不同协议的网络互连起来以方便不同主机之间的资源信息共享呢?作者正是在这个背景下提出了TCP这样一种协议设计,可以支持在不同的分组交换网络中传递信息和共享资源。

网关

网络边界的接口设计面临一个矛盾,一方面在设计上应该简单可靠,另一方面接口如果可以解决所有网络的不同(比如地址、包长、路由等等)将带来极大的便利。由于要求所有的主机实现网络上所有的协议是不现实的,所以就需要在不同的网络中有一个通用的协议使得网络间的接口(文中命名为网关Gateway)所需要的功能尽量的简单。

网关在传输层上以实现网络互连,使用不同的协议、数据格式或语言,甚至体系结构不同的两个系统之间,网关是一个翻译器。作者认为,网关应该只需要简单的对收到的信息进行适当的简单分割(使得新的包满足下一个网络的长度要求),而不需要实现再拼接等其他复杂的功能。

进程间通信

TCP是主机上存在的一个为应用传输和接受数据的一个程序。在发送时,TCP必须多路传输来自不同应用的网络包给包交换机(packet switches);在接收时,TCP会从网络上接收一系列的包,并将他们重新组建和发送给不同目的应用。为了使得进程可以区分多路的信息流,文中提出了端口(port)的概念。进程有一个或者多个端口,它们是从网络向进程传送数据和从进程向网络传送数据的门户。

地址

为了在不同网络中可以进行路由和包传输,TCP必须有统一的地址协议(当时并没有明确的分出传输层和网络层,所以地址是分配给TCP的)。同样为了使得在不同的操作系统中识别端口,端口号也必须有统一的协议。作者基于当时的网络规模,给出了24位的TCP地址,其中8位是网络号,16位为网络内的主机号。另外,文中给出了16位的端口地址,用来使TCP将接收到的包分发给不同的应用,并且不需要关心TCP是怎么利用这16位端口地址的。 图片

重组和排序

重组和排序依赖于每个网络包中携带的序列号(sequence number)。序列号是将传输的信息排列成一个字节信号流后每个字节相对于起始的位置。当信息被分段时,首字节的相对位置就是这个包的序列号,另外还有一个长度字段(byte count)表示这段信息的长度。另外还有两个结束标识符ES和EM分别用来标识一段的结束和消息的结束,也在重组中起到重要作用。

重传

由于网络不是100%可靠的,所以需要进行包的丢失检测和重传。TCP根据回复信息(ACK)来判断是否传输成功,如果没有受到ACK则进行重传。为了使接收端可以检测重复的包,作者提出了一种滑动窗口策略。窗长w表示发送端在没有接收到ACK时,最多会传输的字节数。如果接受的包在窗外则会直接被丢弃,如果在窗内但是没有和左边窗沿重复则可能会被保留或者丢弃。 图片

流量控制

本文介绍的流量控制是通过接收者网络包中的建议窗口大小字段实现的,接收方可以根据某一种算法调整窗口大小,从而控制发送方的发送包大小。这种流量控制的机制非常有效和灵活,但是它依赖于一个有效的重传策略。

总结

文中体现出的网络分层思想(比如将应用和TCP分开,主机上的TCP协议把消息分段,再把不同的段发给下层装入交换包)正是现在网络架构的雏形,比OSI模型的提出早了9年。另外,文中提出的地址格式也仍被使用着,当时TCP地址只要24位就够了,而现在已经发展到了128位的IPv6。除此之外,作者讨论了流量控制机制,这种滑动窗口缓冲策略现在不仅在传输层用到,在数据链路层也有类似的机制,从而保证网络服务是可靠的。

总而言之,这篇论文向我们描述了一个简单的但十分灵活的协议,它的出现解决了不同网络之间资源共享的问题。不同网络之间的资源共享是一个重要的问题,随着技术的进步,将会有包括无线网络等更多类型的网络出现,那么网络之间的资源共享将仍是一个关键的问题。