TCP/IP 协议模型
我们将从下往上依次介绍这些层级,这是因为,在网络中传输的数据包,会按照这些层级来封装报文。一个数据包只可能有下层没上层,绝不会有上层没下层(这句话要牢牢记住)。
层级 | 作用 | 在此层的协议 |
---|---|---|
链路层 | 负责节点之间数据的传输控制和寻址 | ATM, PPP 等 |
网络层 | 负责数据包的路由和转发 | IP, ICMP, OSPF 等 |
传输层 | 负责数据端到端之间的具体传输行为控制 | TCP, UDP 等 |
应用层 | 负责不同应用使用的通信协议的数据封装 | HTTP, SMTP, FTP, DNS, SSH 等 |
链路层
链路层负责节点之间数据的传输控制和寻址,重点在于控制和寻址。
- 控制,即谁先发,谁后发,发送时出现问题如何处理。
- 寻址,即如何找到数据包的接收方。
解决 "控制" 问题
网络中的链路分为两种类型,点对点链路和广播链路。
-
点对点链路,由链路一端的单个发送方和链路另一端的单个接收方组成,如 点对点协议(PPP,Point-to-Point Protocol)、高级数据链路控制(HDLC,High-level Data Link Control)。
-
广播链路 ,能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。很明显,在点对点链路中,由于只有两个节点参与通信,因此不需要进行数据传输的控制,"控制" 主要解决的问题是如何协调多个发送和接收节点对单一共享广播信道的访问,即多路访问问题。为了解决多路访问问题,于是出现了多路访问控制协议,(MAC,Multiple Access Control)。常见的多路访问协议如下:
1. 信道划分协议 (Channel Partitioning Protocol)
采用多路复用技术,将链路、网络资源(如带宽)划分为"资源片",将"资源片"分配给各路通信,每路通信独占其分配到的资源片进行通信
2. 轮转协议 (Taking-turns Protocol)
- 多个节点轮流发送数据
- 当只有一个结点活跃时,以信道的全部发送速率 R 发送
- 当有M个结点活跃时,每个活跃结点的吞吐量接近 R/M
3. 随机访问协议 (Random Access Protocol)
- 以信道的全部速率发送数据,检测到冲突时通过延时重传等方式恢复
- 以太网使用的方式
解决 "寻址" 问题
这里要用到一个物理地址,叫作链路层地址,或 MAC 地址。MAC 地址用于在网络中唯一标示一个网卡(并不是设备),一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的 MAC 地址。
在此层的头部一般被称为 MAC 头。具体格式如下图橙色部分
- 目标 MAC 地址:表示数据包应该被发送到哪个网络设备,由 6 个字节组成
- 源 MAC 地址:表示数据包是从哪个网络设备发送的,同样由 6 个字节组成
- 类型:表示数据包类型,0800 表示 IP 数据包,0806 表示 ARP 数据包
- 数据:表示实际的数据内容,长度可变
- CRC:(Cyclic Redundancy Check) 循环冗余检测,通过 XOR 异或的算法,计算整个数据包在发送的过程中是否出现了错误
网络层
网络层负责数据包的路由和转发,重点在于路由,即选择合适的路径转发到目标主机。
网络层使用 IP 协议来提供基本的数据传输服务,包括数据包的路由、分组和转发等功能。IP 协议使用 IP 地址唯一标识网络中的设备。
IP 地址主要有两个作用
- 定位,即提供设备网络中的"位置"信息
- 路由,即数据包选择什么 "路径" 到达目标设备
在网络层的头部一般被称为 IP 头。IPv4 头具体格式如下图所示
- 版本:表示指定 IP 协议的版本,4 表示 IPv4,占用 4 bits
- 首部长度 IHL:表示 IP 头的长度,占用 4 bits
- 区分服务:表示网络中不同类型的数据流,只有在使用区分服务时,此字段才有作用,占用 6 bits
- 显示拥塞通告:可选功能,在两端都支持且底层网络支持时可被使用,占用 2 bits
- 全长:表示IP 数据报总长度,包括 IP 首部和 IP 数据部分的长度,占用 16 bits
- 标识符:唯一标识一个 IP 数据报的所有分片,占用 16 bits
- 标志:用于控制和识别报文的分片,占用 3 bits
- 分片偏移:用于标识每个分片相对于原始报文开头的偏移量,占用 13 bits
- 生存时间:用于防止 IP 数据报在网络中无限循环,作为跳数计数器,每经过一个路由都会减 1,为0时,将丢弃该数据报,占用 8 bits
- 协议:表示 IP 数据报中使用的上层协议类型,例如 TCP、UDP 等,占用 8 bits
- 首部校验和:用于检验 IP 首部(不包括数据部分)在传输过程中是否有错,占用 16 bits
- 源地址:IP 数据报的源地址
- 目的地址:IP 数据报的目的地址
- 选项:其他附加信息,首部长度必须是 32 的倍数,若不满足则填充 EOL(0x00)至满足
传输层
传输层负责数据端到端之间的具体传输行为控制,重点在于端到端和传送控制。端到端,即将数据具体送达至哪个程序,传送控制,即如何将数据送达到目的地。
传输层上有两个最重要也最常见的协议,TCP 和 UDP,用于端到端的数据传输控制。这两块的内容比较复杂和重要,后文中会专门拿出来单独说明,在此暂不赘述。
应用层
应用层负责不同应用使用的通信协议的数据封装,重点在于通信协议的数据封装,即在通信时按照哪种格式如何封装数据。
应用层上的协议是和我们日常开发息息相关的,比如程序使用 HTTP 协议发送一个 HTTP 请求、使用 SMTP 协议向客户发送一封邮件等等。在应用层上,每个协议的封装和解析是协议特有的,HTTP 协议的数据不能被 SMTP 协议解析。
分层的原因
任何复杂、大型的工程都需要分层来实现模块化,用来降低不同模块之间耦合度,提高模块之间的可替代性和整个工程的复杂度。分层带来的优点有以下几个方面:
-
降低不同层级、模块之间的耦合度,提高网络的灵活性。每层的功能和任务清晰且明确,可以分别设计和实现,使得单一协议或模块的开发、维护、升级变得更加容易。
-
提高相同层级内模块的可替代性。比如 DNS 协议,既可以使用 TCP 协议又可以使用 UDP 协议作为传输层协议。
-
更低的层级可以统一的向上提供服务,比如传输层的 TCP 协议可以为应用层的 HTTP、FTP 协议等提供服务。
-
促进了层级和模块的标准化,使得网络在技术和商业上更加开放和透明。
这种分层的思想亦可日常的开发设计中,如:
- 模块化或分层:将系统按照不同的功能和职责进行分层,使各个部分/层级职责清晰、功能单一、易于维护和扩展。
- 标准化:遵循接口规范,对不同层之间的数据传输进行约束和规范,从而提高系统的稳定性、可靠性和可维护性。
- 可替代性:通过定义接口和协议来约束不同层之间的数据传输,降低模块间的耦合度,提高模块的可替代性。
小测验
- TCP/IP 协议模型有几层,它们的作用分别是什么?
- 在网络中的数据包,有没有可能有 TCP 头,但是没有 IP 头?如果有的话,举例说明。
- 在网络中的数据包,有没有可能有 TCP 头,但是没有 HTTP 头?如果有的话,举例说明。