OSI参考模型与TCP/IP体系
设备 | 数据包名称 | 功能举例/说明 | 功能 | OSI参考模型 | TCP/IP体系 | 职责 | 具体协议/设施 |
---|---|---|---|---|---|---|---|
- | 电子邮件 | 针对特定应用的协议 | 应用层 | 应用层 | TELNET、SSH、HTTP、SMTP、SSL/TLS、HTML | ||
- | 音视频<->适合网络传输的格式 | 将固有的数据格式转换为标准数据格式 | 表示层 | ||||
- | 只管理/指挥传输层,不负责传输 | 通信管理。负责建立/断开逻辑通信链路 | 会话层 | ||||
实际上负责逻辑链路的管理 | 管理两个端之间的可靠数据传输 | 传输层 | 传输层 | TCP、UDP | |||
路由器 | IP分组(IP packet) | 地址管理和路由选择 | 网络层 | 网络层 | ARP、IPv4/6、ICMP | ||
交换机、网桥 | 数据帧frame | 一个以太网相连的两个节点之间的通信 | 互连设备之间传送和识别数据帧 | 数据链路层 | 网络接口层 | 以太网、无线LAN、光纤…… | |
HUB、中继器 | 01比特流 | 界定连接器和网线的规格 | 物理层 |
- 协议&接口
- 上层与下层之间交互所遵守的约定,叫做 接口
- 同一层之间的交互所遵守的约定,叫做 协议
- 以前总是说,数据链路层的数据包叫做帧frame,不过现在也意识到,数据链路层同样也负责将frame转换为比特流,交付给物理层
- 协议的分层
- TCP/IP
对传输方式的分类
1 按照连接分类
面向连接
- 在发送数据之前,需要在收发主机之间建立一条通信线路(真实/虚拟,独占/公用都是可以的)
类似打电话,拨号->接电话就是一个建立连接的过程,之后才是正是通信
无连接
没有建立&断开连接的过程,想发数据就直接发
- 就像是寄邮件,填写了地址,交给邮递员就可以了,至于能不能寄到,地址是否存在,都不需要操心了
似乎无连接也意味着不可靠,不过可以通过更高一层的协议来可靠地使用它
2 按照传输数据的方式分类
电路交换
- 历史久远,主要用于过去的电话网
交换机负责数据的中转处理,在两台通信机器之间建立一条独占的连接
分组交换
现在流行,比如TCP/IP就在使用
路由器负责数据的转发。每个分组都包含连接的信息(这也算是利用了冗余),所以一条线路可以为多组通信机器服务
3 按照接收端的数量分类
单播 Unicast
广播 Broadcast
将消息发送给多个对象
准确的说,是广播域内的全部对象。比如fm的频段、路由器的内部交换等
多播 Multicast
类似广播,将消息发送给多个主机,但会对目标进行限定,只发送给自己指定的一组主机
- 也就是说,对于接收方是受限制的,可控制的
-
任播 Anycast
类似多播,都是要发给一群特定的主机。但方式是,发送给一台机器,由这一台机器进行组内的广播
- 应用:DNS根域名解析服务器
地址
1 地址的唯一性
常见的地址有:
- 应用层中,电子邮件地址
- 传输层中,IP+端口号组成的SOCKET
- 网络层中的IP地址
- 数据链路层中的MAC地址
既然地址用于通信,也就意味着能够准确地描述通信的对象,也就需要地址具有唯一性。比如身份证号(一个对象)、Tencent公司(一组对象)、Tencent公司的某一个人(用于任播)……
2 地址的层次性
随着地址的数量增加,想要找到自己的目标地址的效率也会降低,所以地址的分层也是必要的。
我们最重要的两个地址是IP地址与MAC地址,它们都具有唯一性,但MAC地址并不具有层次性。MAC地址可以理解为网卡的地址,每块网卡的地址都是唯一的,并且也是真正负责最终通信的地址,但并没有进行分层。
而IP地址一方面分为网络号和主机号,网络号相同的主机属于同一网段,且通常在结构、地理位置上都比较相近、集中,所以是有层次的。
网络的硬件设备
1 中继器 Repeater
对于信号在传播过程发生的信号衰减等问题,中继器可以将信号进行整形放大的还原操作,以使得其有效的传播距离得到延伸。通过中继器相连的都属于同一个网络。
所以中继器的作用就是,无脑地将信号传给下一条链路。
多端口的中继器就是HUB。
现在可能对hub需要做区分了,有的hub只有中继功能,有的具有网桥功能
2 网桥/2层交换机
相比中继器,网桥可以将数据帧暂存与内存中,所以可以连接带宽不同的网络,所以网桥具有分割、划分网络的意义(可以隔离冲突域)。
3 路由器
后续的路由器等内容懒得记录了,这里讲的并不细致,没有太大价值。
4 4-7层交换机
也许书中对于4-7层交换机的阐述会让你对交换机这个名词的理解更深入一点,比如防火墙、Nginx就可以算作是4-7层交换机。
似乎路由器是一个更常用的词语,比如,Golang中的httprouter,也算是自定义的交换机了。
5 网关
网关与路由器类似,不过负责的是传输层及以上的数据的转发、转换。
例子:
1 HTML是应用层协议吗?
在这本书中,HTML被归类为TCP/IP中的应用层协议,我觉得还是很有意思的。
首先我们应该看看,什么是协议。参照书中的说明:
协议就是计算机与计算机之间通过网络实现通信时,事先达成的一种“约定”
参考一下OSI模型,每一层所做的事情,都是在按照自己的格式对上层交付的数据进行打包,进行格式化(发送方);或者是对下层提交的数据,按照自己的方式进行解析(接收方)。
而什么是HTML:
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言
按照我的理解,HTML就是各种浏览器可以解析的一种语言格式,那么换句话说,HTML就是浏览器所遵循的一种约定。从逻辑上来说,HTML是应用层的一种协议,我觉得也无可厚非。
不过按照这个逻辑,当你将JSON、XML作为你服务器与客户端之间交互的格式的时候,它们也可以算作是应用层的一种协议。所以在这个问题上,并不需要多么严肃或者拘谨,有理有据的逻辑认知,一定比这个问题的答案更重要。
在《Go语言圣经》中,确实也提到了,JSON、XML等,都是一种非标准的协议
2 协议的分层
OSI参考模型的划分十分详细,但是TCP/IP的协议体系最终成为了主流,也就是说,工业实现与标准并不一定要完全一致。这里完全可以推广到各个方面,譬如多路归并算法,作为一个外部排序算法,使用了败者树提升效率,不过当数据拉到内存的时候,简单地使用快速排序(比如Java中的 sort()
函数)在许多场景下,也是可行的。
回归正题,协议的分层就类似模块化开发,我觉得也可以说是面向接口的开发。这个理念在Go语言中也得到了推广,也算是对这个的相互印证吧。不过参照原文的描述:
而分层的劣势,可能就在于过分模块化,使处理变得更加沉重,以及每个模块都不得不实现相似的处理逻辑
其实这和过度优化、微服务的过度细分以及微内核的设计都有点像。设计得很优雅,但是着陆的时候可不见得漂亮,所以即便微内核的理想设计是将内核分布在内核空间和用户空间,但Mac OS X、Windows NT们仍然没有将任何一个微内核放在用户空间。