网络分层模型


# 网络分层模型

# 为什么要分层

如果不分层,那么应用程序就要包办一切:把应用层数据转化为二进制数据,然后操控网卡,把二进制数据发送到网络上。这期间,通信的连接方式、传输的可靠性、速度和效率的保证等等,都需要这个程序去实现。每次开发一个应用,都要把这些步骤重复做一遍。

如果分层,应用程序、操作系统、网络设备等环节各自分工:应用程序只负责实现应用层的业务逻辑,操作系统负责连接的建立、处理网络拥塞和丢包乱序、优化网络读写速度等等,然后把数据交给网卡,后者和交换机等设备做好联动,负责二进制数据在物理线路上的传送和接收。

这跟编程中的解耦和复用的思想是类似的。

说到具体的分层模型,比较有名的方案就是 OSI 的七层模型TCP/IP 的四层 / 五层模型。这两种模型的最大区别,就是前者在传输层和应用层之间,还有会话层和表示层,而后者没有。

应用层表示层会话层传输层网络层数据链路层物理层OSI 模型七层模型应用层//传输层网络层数据链路层物理层TCP/IP 模型五层模型                      四层模型应用层//传输层网络层网络访问层OSI 七层模型特有

(OSI 模型和 TCP/IP 模型示意图)

一般来说,七层模型只是一个理论模型,实际的网络协议是四层。若是想要具体找到七层协议中对应实际的应用,是比较难的,有的应用由来已久,不可能在七层模型推出后又推翻重来。倒不如对照四层协议,看看七层里面哪一些被简化合并到哪一层,然后看看四层对应实际应用是什么。

两种分层模型的最大差异,其实还是在会话层和表示层上面。前四层已经基本统一了。而它们的最高层,表面上虽然并不一致,但实际上都可以用「应用层」来代替。因为会话层和表示层的协议确实比较少,把这两层都合并到应用层,这样既避免了可能的误解,也更加准确地表示了这一层的具体用途。

# OSI 七层模型

模型划分及各层功能定义如下图所示:

应用层为应用程序提供服务表示层数据格式转化、数据加密会话层建立、管理和维护会话传输层建立、管理和维护端到端的连接网络层IP 选址及路由选择数据链路层提供介质访问和链路管理物理层物理层OSI 参考模型各层的解释

(OSI 七层模型 - 模型划分及各层功能定义)

# 应用层

所属层级:第七层

作用:是最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。

常见网络服务协议:HTTP,HTTPS,FTP,POP3、SMTP 等。

# 表示层

所属层级:第六层

作用:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。

# 会话层

所属层级:第五层

作用:负责建立、管理、和终止表示层实体之间的通信会话,该层的通信由不同设备中的应用程序之间的服务请求和响应组成。

# 传输层

所属层级:第四层

作用:建立主机端到端的链接,为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。

常见协议:TCP、UDP。

# 网络层

所属层级:第三层

作用:通过 IP 地址进行寻址,通过交换机或路由设备选择合适的路由,将源端送来的分组传送给目的端。

常用设备:三层交换机、路由器。

常见协议:IP、ICMP、IGMP 等。

# 数据链路层

所属层级:第二层

作用:将比特流组成字节,再将字节组合成帧,使用链路层地址(MAC 地址)来访问介质,并进行差错检测。

常用设备:二层交换机

常见协议:ARP、RARP 等。

# 物理层

所属层级:第一层

作用:通过物理介质传输比特流,实现信号的传输。

常用设备:集线器、中继器、调制解调器、网线、双绞线、同轴电缆等传输介质。

# TCP/IP 模型

为什么 TCP/IP 还有四层和五层模型这两种说法呢?其实五层模型就是 OSI 的前四层,加上一个应用层。所以这个五层模型跟 OSI 七层模型的差异是比较小的。

TCP/IP 五层模型和 OSI 的七层模型对应关系如下:

应用层表示层会话层应用层传输层传输层网络层网络层数据链路层数据链路层物理层物理层OSI 七层模型TCP/IP 五层模型

(TCP/IP 五层模型和 OSI 七层模型对应关系)

由上可以看出,TCP/IP 是将 OSI 最上面的三层统称为应用层,其他每层的功能及协议与 OSI 基本一致。

# 一些术语

# TCP 流

在一些技术文档,特别是 Wireshark 相关的文档中,TCP 流是一个很常见的词汇。英文名是 TCP Stream,有「连续的事件」这样一个含义,所以它是有前后、有顺序的,这也正对应了 TCP 的特性。

跟 Stream(流)相对的一个词是 Datagram,它是指没有前后关系的数据单元,比如 UDP 和 IP 都属于 Datagram。在 Linux 网络编程里面,TCP 对应的 socket 类型是 SOCK_STREAM,而 UDP 对应的,就是 SOCK_DGRAM 了。显然,DGRAM 就是 Datagram 的简写。

在具体的网络报文层面,一个 TCP 流,对应的就是一个五元组:传输协议类型源 IP源端口目的 IP目的端口。比如访问百度,那么 TCP 流就可能就是这样一个五元组:

(TCP, your_ip, your_port, baidu_ip, 443)
1

一个 IP 报文,包含了所有这五个元素,所以 Wireshark 在解析抓包文件时,自然就能通过五元组知道每个报文所属的 TCP 流了。这也是为什么我们可以在 Wireshark 里,用 Follow TCP Stream 的方法,找到报文所在的 TCP 流。

有时候,也会有四元组的说法。其实它跟五元组大体上是一致的,只是四元组没有区分传输层协议类型(TCP 或者 UDP)。但是如果我们都清楚地知道应用类型,比如知道应用是 HTTP 协议的,那它的传输层协议默认就是 TCP,这一元是否算在里面,已经不重要了。

# 报文、帧、分组、段、数据包

报文(packet),是一种相对宽泛和通用的说法,基本上每一层都可以用。比如,在应用层可以说「HTTP 报文」;在传输层可以说「TCP 报文」;在网络层就是「IP 报文」了。事实上,网络层也是「报文」一词被使用最多的场景了。

数据包,是跟报文类似的,可以在很多场景下通用。

帧(frame),是二层也就是数据链路层的概念,代表了二层报文,它包含帧头、载荷、帧尾。注意,帧是有尾部的,而其他像 IP、TCP、HTTP 等层级的报文,都没有尾部。值得注意的是,HTTP/2 实现了多路复用,其中也有帧的概念,不过那个帧,跟这里网络二层的帧,除了名称相同以外,就没有别的联系了。

分组,是 IP 层报文,也就是狭义的 packet。

段特指 TCP segment,也就是 TCP 报文。segment 是「部分」的意思,相对应的「整体」就是在应用层交付给传输层的消息(message)。当 message 被交付给传输层时,如果这个 message 的原始尺寸,超出了传输层数据单元的限制(比如超出了 TCP 的 MSS),它就会被划分为多个 segment。这个过程就是分段(segmentation),也是 TCP 层的一个很重要的职责。

另外还有一个单词叫 Datagram,中文叫「数据报」,但不是「数据包」。「数据包」是一个通用词,所以能用「UDP 数据包」指代「UDP 数据报」。但反过来,非 UDP 协议的数据包,比如 TCP 段,就不能叫「TCP 数据报」了,因为 TCP 不是 Datagram。

层级和术语对应关系如下图所示:

应用层表示层会话层传输层网络层数据链路层物理层OSI 七层模型特有message(消息)packet(分组)segment(段)frame(帧)

(层级和术语对应关系)

(完)