# 网络模型
- 一个计算机网络系统,比如城域网,可能混乱、复杂,因为包含很多种通信设备、传输介质、网络协议。
- 为了规范、简化,人们通常根据 TCP/IP 或 OCI 模型,来设计网络系统。
# TCP/IP 网络模型
1970 年代,美国国防部高级研究计划局(DARPA)在建立 ARPAnet 网络之后,进一步研究网络协议,制定了 TCP/IP 模型,开发了 TCP/IP 协议簇。
- TCP/IP 模型比 OCI 模型更早制定,更简化,更常用。
- TCP/IP 协议簇包含 IP、TCP、UDP 等多个协议,是因特网的核心通信协议。
TCP/IP 模型从上到下分为 4 个层次:
- 应用层
- 对应 OSI 最上方的应用层。
- 传输层
- 对应 OSI 的表示层、会话层、传输层。
- 网络层
- 对应 OSI 的网络层。
- 网络接口层
- 对应 OSI 最下方的物理层、数据链路层。
- 应用层
总结:
- 每一层的功能不同,因此存在不同用途的网络协议。而一个程序可能使用多种网络协议,同时工作在多个层。
- 每一层都将该层及其以下层服务封装起来,提供 API 供高层调用。高层调用底层的服务时不需要知道其具体实现方法,像调用一个黑盒。
- 例如在两个主机分别运行一个程序,使用同一种网络协议(比如 HTTP 或 TCP),就可以相互通信,不需要关注下层的通信细节。
- 假设用户想在主机之间进行网络通信,则可选用任意一层的网络协议。主要区别在于:应用层协议最贴近用户,方便人使用。越底层的协议越贴近机器,需要考虑软件配置、硬件配置等复杂因素。
# 协议数据单元
协议数据单元(Protocol Data Unit ,PDU):泛指各种网络协议传输数据的单位,统称为数据包。
一个协议数据单元的内容通常分为两部分:
- 元数据(metadata):记录该协议的一些参数。
- 有效载体(payload):记录要传输的数据。
假设用户 A 想对用户 B 说一句话 "Hello" ,则有多种方式:
- 在现实世界,以写信的方式通信时,需要将这句话写在纸上,封装在一个信封中,并在信封表面注明目标地址等信息,然后寄出去。
- 在计算机网络,以 TCP 协议通信时,需要将这句话(属于 payload )封装在一个数据包中,并在数据包的头部注明目标地址等信息(属于 metadata ),然后发送出去。
不同网络协议的 PDU 通常采用不同的数据格式、名称,例如:
网络协议 PDU HTTP 报文(message) TCP 段(segment) UDP 报文(datagram) IP 包(packet) ICMP 报文(message)
# 示例
上层的网络协议会调用下层的网络协议。当上层的协议数据单元传到下层时,会添加元数据,封装成下层的协议数据单元。
假设主机 A 上的一个程序,采用 HTTP 协议与主机 B 上的程序通信。则数据包会逐层传递:
- 程序发出一个 HTTP 报文,它是应用层的协议数据单元。
- HTTP 报文向下传到传输层。因为 HTTP 协议基于的传输层协议是 TCP ,此时需要给 HTTP 报文添加 TCP 头,封装成 TCP 段。
- 此时传输层的协议数据单元是 TCP 段,其中 metadata 是 TCP 头,payload 是 HTTP 报文。
- 协议数据单元通常会限制单个数据包的最大体积。例如一个 HTTP 报文体积较大时,会自动拆分成多个 payload ,放入多个 TCP 段进行传输。
- TCP 段向下传到网络层。因为 TCP 协议基于的网络层协议是 IP ,此时需要给 TCP 段添加 IP 头,封装成 IP 包。
- IP 包向下传到网络接口层。因为 IP 协议通常基于以太网协议进行通信,此时需要将 IP 包封装成以太网帧。
- 以太网帧从网卡发出,目标地址指向主机 B 。
主机 B 的网卡收到以太网帧之后,数据包会逐层传递:
- 网络接口层解析以太网帧,根据它的 metadata 识别出 payload 属于 IP 包。
- IP 包向上传到网络层,根据它的 metadata 识别出 payload 属于 TCP 段。
- TCP 段向上传到传输层,根据它的 metadata 识别出 payload 属于 HTTP 报文。并且根据 metadata 中的 Dest Port ,找到监听该端口的程序。
- HTTP 报文被传给目标程序。
# OSI 网络模型
1980 年代,国际标准化组织(International Organization for Standardization ,ISO)制定了开放系统互联(Open System Interconnection ,OSI)网络模型。
OSI 模型从上到下分为 7 个层次:
- 应用层(application layer)
- 负责直接面向用户。
- 该层协议举例:HTTP、FTP、DNS、SNMP 。
- 应用层的程序通常提供了 GUI 页面供用户操作。比如 Web 浏览器采用 HTTP 协议传输数据,会显示美观的网页。
- 表示层(presentation layer)
- 负责处理数据格式。比如数据的编码与解码、压缩与解压、加密与加密。
- 很少有程序专门设计了表示层来处理数据,因此该层的协议也少。
- 会话层(session layer)
- 负责建立并维持两个主机之间的网络会话,从而方便多次通信。建立会话时可能还需要身份认证、授权。
- 该层协议举例:SSL、SOCKS、RPC 。
- 传输层(transport layer)
- 负责在两个主机之间传输数据。
- 该层协议主要是 TCP、UDP 。
- 用户直接使用网络层就能传输数据,而增加传输层是为了控制通信效率、通信质量。
- 网络层(network layer)
- 负责连通不同局域网的主机,能进行路由选择、分组转发。
- 该层协议主要是 IP 。
- 通信子网中的结点通常工作在最下面三层,比如路由器工作在网络层。
- 数据链路层(data link layer)
- 负责连通两个主机之间的网络信道,从而能传输数据。
- 细分为两个子层:
- 逻辑链路控制(Logical Link Control ,LLC)子层:负责控制逻辑信道。
- 介质访问控制(Medium Access Control,MAC)子层:负责控制物理信道。
- 该层协议主要是以太网,以帧(frame)为单位传输数据,能进行 MAC 寻址、差错控制。
- 物理层(physical layer)
- 负责在双绞线、光纤等传输介质中,以比特(bit)为单位传输数据。不考虑寻址,只管把数据沿着物理信道传输。
- 应用层(application layer)