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 网关

网关与路由器类似,不过负责的是传输层及以上的数据的转发、转换。

例子:

  • 手机邮件与PC邮件的协议不相同,却可以通过网关转换格式后进行通信
  • VPN等代理服务器

    一些思考


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们仍然没有将任何一个微内核放在用户空间。