夜谈TCP/IP的起源和胜利
Posted dog250
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了夜谈TCP/IP的起源和胜利相关的知识,希望对你有一定的参考价值。
又到周末,居家办公无日无夜,明天一定好好读书看剧,今晚夜谈,一小时考古,写篇命题作文。
用去中心化的新式网络替代中心控制的传统网络以应对核打击,这是现代互联网前身的设计初衷。
为了使消息通过去中心化网络,即便在网络被局部攻击时依然可以到达接收端,引入两个要点以示冗余:
- 路径冗余,将消息分为固定长度的“数据包”,允许数据包沿不同路径分别乱序到达,在接收端重组。
- 重传冗余,沿途逐跳向前发送“回执”,若收到回执,上一跳删除数据包,若收不到,则重发数据包。
是不是看到了TCP的影子!但这是1950年代的事,还没有TCP,TCP是后话。值得一提的是,这种朴素的设计中,我们看到了正确的做法:
- 允许乱序传输,接收端重排序。
TCP之所以要保序,因为滑动窗口,因此这是个实现问题,而不是设计问题。后面讲。
说回最初,在防核打击之外,殊途同归的还有另一条路,即提高连接分时系统的链路利用率。
计算机彼时已经引入分时系统,在不同用户之间分时分配计算机时间,为每一个用户分配一条独占的线路是不经济的,学着分时系统的样子,链路也可以分时。
于是将键盘键入的消息打包成“消息块”,不同用户的消息块在链路上分时传输,这便是分组交换网络的另一种引入途径。
基本想法和初衷就是上面这些。值得注意的是,分组交换网的初始目标是在不同主机之间精确复制消息,当时没有分层模型,不晓得通过编码进行冗余,没有FEC思想,更没有柔性降级服务,以至于后面TCP的出现是理所当然的事,不求性能,不可模糊,只为精确复制。
到1960年代,基于排队论的存储转发论文成了实现分组交换网的理论依据,剩下的就是实现了。
阿帕网不细说。我在之前的文章里谈到了IMP的引入:
https://zhuanlan.zhihu.com/p/481610248
IMP将核心通信子网和边缘资源子网分离,一边连接不同计算机,另一边连接其它IMP,大大减少了所需的连接不同类型计算机的适配器数量。起初IMP负责管理收发buffer,实现分组交换网初衷里的下面要点:
- 沿途逐跳向前一跳发送“回执”,若收到回执,上一跳删除数据包,若收不到,则重发数据包。
最终将这个buffer管理以及重传逻辑推到主机端的正是TCP协议。下面TCP协议开始登场。
TCP的前身是运行在连接阿帕网IMP的主机上的“协议软件”,这个“协议”名词来自“手稿第一页”,将数据包看作是手稿,它的第一页就是“协议”,这就是后来的网络协议原型,报头在整个数据包的前面。
起初定义“协议”的目的是连接不同类型的计算机(它们都连接在IMP),使其可以按照同一份约定通信。后来,当需要连接不同类型网络(而不仅是同一网络的不同类型计算机)时,这个思想自然就可以被复用。
不同类型的网络通过“网关”互连,网关在两个网络中均被看作自己网络的一台“主机”,让网关作为一个信使而不是一个代理是一个好主意,这使网关的工作变得简单。网关不再需要同时理解两边网络的“协议”,只需将消息看作一个“装着信的信封”,网关从一边转到另一边即可,这样一来,网关就“不必被两边看作是各自网络里的主机”了,它的工作也变得简单了许多。
为实现这一点,需要让两个网络里互相通信的主机可以找到对方,且可以理解对方的“协议”,这需做到两点:
- 对两个网络里的主机进行统一编址,作为“信封上的地址”。
- 两个网络里的主机互相理解对方的“协议”,作为“信封里的信”。
有了以上的机制,阿帕网的IMP便不再需要,不光连接网关的IMP不再需要,连接阿帕网主机的IMP也不再需要。
网关负责转交数据包之外,还需要必要时将数据包进行拆分,因为两边网络的传输能力可能不同(即MTU不同)。由于分组交换网中数据包可以沿不同路径到达目的地,一个大数据包拆分成的多个小数据包便不一定通过相同的网关到达目标网络的目标主机,因此重组数据包的功能“必须”在主机侧完成,而不是网关侧。
IMP消失,网关变成现代路由器,它不再负责buffer以及处理回执。
另一方面,由于重组功能推到了主机,为了主机能重组成功,如果主机的buffer被淹没,重组便无法完成。此前的阿帕网是由IMP之间的交互保证其buffer不会被淹没,如今阿帕网已不再需要IMP,且互联的其它非阿帕网本身就没有IMP,buffer的管理便只能由主机负责。
基于窗口的端到端流控机制被引入。
这就是滑动窗口的由来。有了滑动窗口,乱序便只能限制在窗口以内。最初的实现中,为了实现简单,积累确认以及GBN甚至不允许乱序,窗口内允许乱序以及SACK是很久以后的事,但不论如何,只要乱序,窗口便憋住滑不动了。
回头看分组交换网的第二个要点:
- 沿途逐跳向前一跳发送“回执”,若收到回执,上一跳删除数据包,若收不到,则重发数据包。
在不确定的传输路径上,只有目标主机能确定是否收到了数据包并准确发送回执,同时只有源主机可以保证能确切收到回执,因此只有源主机有必要保留发送缓存。
至此,由于路径的不确定性:
- 基于滑动窗口的流控被推到了端主机,在阿帕网中它由IMP负责。
- 积累确认和重传被推到了端主机,在阿帕网中它由IMP负责。
这便实现了完整的端到端传输协议,这就是原始版TCP,即1973年~1976年的TCP。
由此可见,从分组交换网的初衷,到TCP的实现,其实是有一些gap的,初衷并没有阻止乱序收发,是TCP的实现阻止了,这就是设计和实现之间的差距。
回到TCP本身,层次感已经显现。信封只负责寻址,因此它便被剥离出来,成了单独的IP协议,路由器只需要支持IP协议,便不用管信封里的信了,这使路由器变得完全无状态。这发生在TCPv3版本。
到了TCPv4,IP正式分离出来,即IPv4。从此,TCP和IP一起被叫做TCP/IP。
标准已成,剩下的就是实战了,在和ISO/OSI的竞争中,为什么TCP/IP能赢得胜利成为事实的标准呢?可以一句话概括,TCP/IP在伯克利UNIX中实现了。UNIX的扩张,便是另一个故事了。
TCP/IP层次少,不如OSI,没有会话层,没有表示层,但它成功了,这恰恰说明务实才最重要,UNIX为什么不实现OSI呢?当前用不到的,那便是不重要的,写代码有成本,必须字字珠玑,有用,完备,但不多余,做减法。你可以给Linux社区提交一个完美但没用的东西,看看那些人如何怼你(如今Linux也是熟人社区,大量不中用自嗨品进入mainline,为了KPI早就是乌烟瘴气,所以很难实现TCP/IP那样的作品了,eBPF算一个,但不很)。
虽然TCP/IP没有会话层,没有表示层,但后来的QUIC,SSL/TLS,ISAKMP,IPSec优雅补位,这得益于TCP/IP的可扩展性。虽然一开始并没有OSI完备,但路子并没有堵死,可扩展性促成了TCP/IP的逐步进化。
浙江温州皮鞋湿,下雨进水不会胖。
以上是关于夜谈TCP/IP的起源和胜利的主要内容,如果未能解决你的问题,请参考以下文章