| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 夜谈TCP/IP的起源和胜利 -> 正文阅读 |
|
[网络协议]夜谈TCP/IP的起源和胜利 |
用去中心化的新式网络替代中心控制的传统网络以应对核打击,这是现代互联网前身的设计初衷。 为了使消息通过去中心化网络,即便在网络被局部攻击时依然可以到达接收端,引入两个要点以示冗余:
是不是看到了TCP的影子!但这是1950年代的事,还没有TCP,TCP是后话。值得一提的是,这种朴素的设计中,我们看到了正确的做法:
TCP之所以要保序,因为滑动窗口,因此这是个实现问题,而不是设计问题。后面讲。 说回最初,在防核打击之外,殊途同归的还有另一条路,即提高连接分时系统的链路利用率。 计算机彼时已经引入分时系统,在不同用户之间分时分配计算机时间,为每一个用户分配一条独占的线路是不经济的,学着分时系统的样子,链路也可以分时。 于是将键盘键入的消息打包成“消息块”,不同用户的消息块在链路上分时传输,这便是分组交换网络的另一种引入途径。 基本想法和初衷就是上面这些。值得注意的是,分组交换网的初始目标是在不同主机之间精确复制消息,当时没有分层模型,不晓得通过编码进行冗余,没有FEC思想,更没有柔性降级服务,以至于后面TCP的出现是理所当然的事,不求性能,不可模糊,只为精确复制。 到1960年代,基于排队论的存储转发论文成了实现分组交换网的理论依据,剩下的就是实现了。 阿帕网不细说。我在之前的文章里谈到了IMP的引入:
最终将这个buffer管理以及重传逻辑推到主机端的正是TCP协议。下面TCP协议开始登场。 TCP的前身是运行在连接阿帕网IMP的主机上的“协议软件”,这个“协议”名词来自“手稿第一页”,将数据包看作是手稿,它的第一页就是“协议”,这就是后来的网络协议原型,报头在整个数据包的前面。 起初定义“协议”的目的是连接不同类型的计算机(它们都连接在IMP),使其可以按照同一份约定通信。后来,当需要连接不同类型网络(而不仅是同一网络的不同类型计算机)时,这个思想自然就可以被复用。 不同类型的网络通过“网关”互连,网关在两个网络中均被看作自己网络的一台“主机”,让网关作为一个信使而不是一个代理是一个好主意,这使网关的工作变得简单。网关不再需要同时理解两边网络的“协议”,只需将消息看作一个“装着信的信封”,网关从一边转到另一边即可,这样一来,网关就“不必被两边看作是各自网络里的主机”了,它的工作也变得简单了许多。 为实现这一点,需要让两个网络里互相通信的主机可以找到对方,且可以理解对方的“协议”,这需做到两点:
有了以上的机制,阿帕网的IMP便不再需要,不光连接网关的IMP不再需要,连接阿帕网主机的IMP也不再需要。 网关负责转交数据包之外,还需要必要时将数据包进行拆分,因为两边网络的传输能力可能不同(即MTU不同)。由于分组交换网中数据包可以沿不同路径到达目的地,一个大数据包拆分成的多个小数据包便不一定通过相同的网关到达目标网络的目标主机,因此重组数据包的功能“必须”在主机侧完成,而不是网关侧。 IMP消失,网关变成现代路由器,它不再负责buffer以及处理回执。 另一方面,由于重组功能推到了主机,为了主机能重组成功,如果主机的buffer被淹没,重组便无法完成。此前的阿帕网是由IMP之间的交互保证其buffer不会被淹没,如今阿帕网已不再需要IMP,且互联的其它非阿帕网本身就没有IMP,buffer的管理便只能由主机负责。 基于窗口的端到端流控机制被引入。 这就是滑动窗口的由来。有了滑动窗口,乱序便只能限制在窗口以内。最初的实现中,为了实现简单,积累确认以及GBN甚至不允许乱序,窗口内允许乱序以及SACK是很久以后的事,但不论如何,只要乱序,窗口便憋住滑不动了。 回头看分组交换网的第二个要点:
在不确定的传输路径上,只有目标主机能确定是否收到了数据包并准确发送回执,同时只有源主机可以保证能确切收到回执,因此只有源主机有必要保留发送缓存。 至此,由于路径的不确定性:
这便实现了完整的端到端传输协议,这就是原始版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的逐步进化。 浙江温州皮鞋湿,下雨进水不会胖。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:55:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |