琐碎的想法(二)网络协议——人们给计算机的一组“约定”
网络协议学习方式一
学习网络协议的入门多种多样,如果是从术语上来讲协议,大概是这样的。
- 协议的作用意义
- 协议的定义。
- 协议的发展。
- 协议的特点。
...
这是一种靠强记,通过实践来加深印象,最后不自知地了解网络协议的过程。有效但趣味寥寥。
网络协议学习方式二
这一次,我想从开创者的角度来分析,如何让两台计算机的应用进行通讯。
试想,如果我们抛弃所有现有的网络协议思维,把自己当做一个科研人员,那么如何才能让两台计算机的软件进行通讯呢?
这就需要我们发明一种机制能够实现通讯。
但是,做事最好不要从头开始,应该多借鉴前人的思想,回忆一下最初信息是如何传递的。
烽火对照计算机
还记得历史课本讲过的烽火台(敌人白天来临时就燃烟,夜间来犯就点火)吗?
假设,只有一个烽火台,给一个城传递信息。
我们可以从这个具体事务中提取他能够传递信息的几个最基础的要素。
要素名 | 对应物 |
---|---|
信息发布者 | 烽火台的士兵 |
信息接收者 | 城的士兵 |
信息 | 烟、火 |
信息传递的规则 | 敌人白天来临时就燃烟,夜间来犯就点火 |
而我们把几个基础要素转化到两台计算机上。
要素名 | 对应烽火台 | 对应计算机 |
---|---|---|
信息发布者 | 烽火台的士兵 | 计算机A的软件a |
信息接收者 | 城的士兵 | 计算机B的软件a |
信息 | 烟、火 | 数据 |
信息传递的规则 | 敌人白天来临时就燃烟,夜间来犯就点火 | 两台计算机之间的“约定” |
邮寄对照计算机
前三者都是实体,第四点需要我们好好理解,烽火台的士兵和城的士兵应该是在之前都清楚“敌人白天来临时就燃烟,夜间来犯就点火”这个规则,那么我们要实现通讯也需要实现一个规则,并且让双方事先清楚。
总结:通讯是需要双方默认都事先理解的一套“约定”。
这时候,我们可以参考最常见的通讯方式之一的邮寄。
如果将一封邮件的构成要素和计算机的概念进行对比
信的构成 | 计算机元素 |
---|---|
收信人地址(城市、门牌号) | 计算机A的地址 |
收信人姓名 | 计算机A中的a应用的位置 |
寄信人地址(城市、门牌号) | 计算机B的地址 |
寄信人姓名 | 计算机B中的a应用的位置 |
邮件 | 数据 |
如果我们对每台计算器进行编号,并对我们使用的应用,也进行编号,记在一个记事本中。
如果这两台计算机都存着这个记事本,那么它们就可以区分,每一台电脑的每一个应用。
由此,我们就设计出一个能够实现数据传输的协议了。
计算机对照TCP协议
而现实中的协议也是如此,下面引用TCP协议来对比我们上面所描述的各个基本元素。(注意:事实上TCP不仅仅是实现了基本的数据传输,还处理了可靠性、流量控制、多路复用、连接数、优先与安全等问题,是一个值得深入学习的协议。)
信的构成 | 计算机元素 | 对应协议中的专业术语 |
---|---|---|
收信人地址(城市、门牌号) | 计算机A的地址 | A计算机的地址(IP地址加MAC地址) |
收信人姓名 | 计算机A中的a应用的位置 | a应用在A计算机中占用的端口 |
寄信人地址(城市、门牌号) | 计算机B的地址 | B计算机的地址(IP地址加MAC地址) |
寄信人姓名 | 计算机B中的a应用的位置 | a应用在A计算机中占用的端口 |
邮件 | 数据 | 数据包 |
以上内容仅仅涉及到了基本的数据传输,如有兴趣,可以想想如下的问题。
- 如何保证数据传输正确?需要涉及到数据校验的问题。
- 如何保证数据的可靠性?需要涉及到三次握手、四次挥手机制。
- 数据量过大怎么办?涉及数据拥塞控制(Reno、BBR)。
...