计算机网络基础 — TCP/IP 网络模型

目录

前文列表

计算机网络基础 — 以太网
计算机网络基础 — 物理网络

前言

本文已经被重构,请浏览《互联网协议 — 概览

计算机网络的分层体系结构

计算机网络是一个非常庞大且复杂的系统,所以在设计之初就严格遵守着「分层」的设计理念。分层将庞大的问题细分为了若干个局部的小问题,具有下列好处:

  • 分层隔离
  • 灵活性好
  • 易于实现和维护
  • 能促进标准化工作

其中「标准化」是促进互联网全球化的关键,在计算机网络领域,你会听说到各种各样的协议,这些都是标准化的结果。试想,如果每个网卡厂商都使用了不同的网线接口风格,那无疑是一个灾难。

主流网络分层体系结构有两种:

  • OSI(Open Systems Interconnection Reference Model,开放系统互联基本参考模型),就是常说的七层网络模型。
  • TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/因特网协议) 四层网络模型,也有人愿意归为 “五层网络模型”,以其中最重要的 TCP 协议和 IP 协议命名。

值得一提的是,由国际化标准组织制定的 OSI 模型,本来是最应该在全球范围内推广的网络模型,不过因为 OSI 的设计过于理想不合实际,再加上当时应用 TCP/IP 模型的因特网(Internet)已经覆盖了全球大部分地区。种种原因,导致 OSI 并没有取得市场化的成功,仅仅是获得了理论上的研究成果。而 TCP/IP 模型则被作为了事实上的国际标准。

TCP/IP 网络模型

请注意,计算机网络的分层体系结构虽然是抽象的,但实现则是具体的。

上图展示了 HTTP 应用数据在主机间传输的过程,首先自上而下、宏观的来看数据在分层网络模型里的流转。

  • 应用层的 “HTTP 数据” 是实际需要被传输的数据
  • “HTTP 数据” 被下发到传输层,并添加上 TCP 首部成为传输层的 PDU(Protocol Data Unit,协议数据单元),称作数据段(Segment)。
  • 数据段再被下发到网络层,添加了 IP 首部后成为网络层的 PDU,称作数据包(Packet)。
  • 数据包再被下发到数据链路层添加了 Ethernet 首部后得到的 PDU 被称为数据帧(Frame)。
  • 数据帧最后被下发到物理层,以 01 电信号(比特数据位)的形式在物理介质中传输。

TCP/IP 的每个层级都依赖于下层支撑,越往上就离用户越近,反正则离硬件越近。从上至下,不断为应用数据附加首部的过程称为封装,从下至上不断解析首部的过程则称为解封装

最终在物理层传输的数据帧如上图所示,含有多个首部(Head),它们具有不同的数据结构和功能,服务于数据传输的可行性。学习计算机网络,其实就是学习各式 Head 的功能,学习每一层的核心协议以及它所解决的问题。

在这里插入图片描述

下面继续自下而上的对数据帧进行解析,深入各层级的实现细节。

网络包类型:帧、包、段、报文

  • 应用层 — 消息/报文(Message):应用层的信息分组称为数据报文,报文包含了将要发送的完整的数据信息,其长短不需一致。报文在传输过程中会不断地封装成段、包、帧来进行传输,封装的方式就是添加一些控制信息组成的首部,那些就是报文头。

  • 传输层 — 报文段(TCP,Segment)/数据报(UDP,Datagram)

    • 报文段:指起始点和目的地都是传输层的信息单元。
    • 数据段:面向无连接的数据传输,其工作过程类似于报文交换。采用数据段方式传输时,被传输的分组称为数据段。通常指起始点和目的地都使用无连接网络服务的的网络层的信息单元。
  • 网络层 — 数据包(Packet)/分组:分组/包是在网络中传输的二进制格式的单元,为了提供通信性能和可靠性,每个用户发送的数据报文会被分成多个更小的部分。在每个部分的前面加上一些必要的控制信息组成的首部,有时也会加上尾部,就构成了一个分组/包。它的起始和目的地是网络层。

  • 链路层 — 帧(Frame):帧是数据链路层的传输单元。它将上层传入的数据添加一个头部和尾部,组成了帧。它的起始点和目的点都是数据链路层。

  • 物理层 — P-PDU(Bit):以 01 电信号(比特数据位)的形式在物理介质中传输。

物理介质层

物理介质是连接网络终端设备(计算机、交换机、路由器)的物理手段,最常见的有网线(双绞线),除此还有光纤、无线电波等。不同的物理介质决定了电信号传输的距离、带宽、速率、抗干扰能力等性能参数。

所以物理介质层主要解决的问题是:

  • 规范了网络终端设备之间的电气、机械、流程和功能等方面的要求
  • 规范了电频、速率、最大传输距离和物理接口等特征

物理层所带来的最直观的好处就是,我们可以使用同一根网线插进任何品牌的计算机上。

数据链路层

上文提到,数据实际会以电信号的形式在物理介质中传输,不过单纯的 01 数字显然是没有价值的,需要为电信号进行分组和排序,以特有的组织方式来赋予其特定的含义。

数据链路层的主要协议有 :

  • 点对点协议(Point-to-Point Protocol)
  • 以太网(Ethernet);
  • 高级数据链路协议(High-Level Data Link Protocol);
  • 帧中继(FrameRelay);
  • 异步传输模式(AsynchronousTransfer Mode)

数据链路层为了解决这个问题先后提出过包括有 Ethernet v.2、IEEE 802.2、Internetwork 在内的多种协议,其中又以 Ethernet 协议占据主导地位。

在这里插入图片描述

Ethernet 协议,即以太网协议,规定了电信号的分组方式。一组电信号称为一个数据帧,数据帧又由帧首、数据和帧尾三部分组成。发送方通过物理介质把数据帧发送给接收方,接收方接收到一组电信号,就会认为是接收到了一个数据帧。

  • 数据帧首部:占 14 字节,包含有目标主机网卡 MAC 地址、源主机网卡 MAC 地址以及数据帧类型标识
  • 数据:从上层(网络层)传递下来的数据包,范围在 [46, 1500] 个字节之间
  • 数据帧尾部:占 4 个字节,是 CRC 校验序列,用来确定数据帧在传输过程中是否有损坏

MAC 地址

在规范了电信号解读方式后,数据链路层还要解决 “主机定位” 的问题:数据帧怎么知道自己应该被哪一台主机接收呢?

以太网协议规定了接入网络的终端设备都必须安装有网络设配器(即 NIC 网卡),数据帧必须由网卡发送,再由另一张网卡接收。每张网卡都被分配一个 MAC 地址,具有全球唯一性。而数据接收方的 MAC 地址就被记录在数据帧首部。

MAC 地址为 6 字节,使用 12 个十六进制数表示,e.g. 00:01:6C:06:A6:29

  • 前 6 个十六进制数为厂商编号,由 IEEE(电气和电子工程师协会)分配给厂商
  • 后 6 个则为该厂商的网卡流水号,由厂商自己分配

以太网协议数据帧定位原理:有了 MAC 地址以后,以太网协议采用广播形式,将数据帧发给本地网络内所有的主机,主机在接收数据帧后会解析数据帧首部的目标主机网卡 MAC 地址,再和自身的网卡 MAC 地址对比。若相同,就接收数据帧做下一步处理。若不同,则丢弃。

而且为了增幅广播的性能和组网的灵活性,一般会在本地网络中架设交换机来支持信号转发,交换机也是数据链路层的代表设备。

数据链路层主要解决的问题是:对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

网络层

从理论来讲,使用 MAC 地址就可以实现定位到这里世界上任意一台计算机,前提是广播的作用域也是全球范围的,但这并不现实。MAC 地址的定位方式存在本地子网的局限性。所以除了以太网协议之外,还迫切的需要解决下列问题:

  • 如何轻易的进行子网划分
  • 如何隔离子网之间的广播信号
  • 在隔离广播信号的前提下,如何保证子网之间的计算机依旧能够通信

IP 协议

IP(Internet Protocol,因特网协议) 是网络层的核心协议,规定了网络层的封装规范,将上层(传输层)传递下来的数据段附加上 IP 首部封装成 IP 数据包,又称数据报文,IP 数据包同样由包首部和数据两部分组成,这是数据部分实际为传输层的数据段。

ARP 协议

引入 IP 地址后,接入网络的主机至少拥有一个 IP 地址和 MAC 地址。需要强调的是,IP 地址本质上是一个逻辑地址,为了解决上层复杂的子网架构问题而生,并不能作为最终定位主机的依据,这仍要依靠 MAC 地址来完成。因此,网络层还需要找到一种方法来完成 IP to MAC 的映射,ARP 协议应运而生。

**ARP(Address Resolution Protocol,地址解析协议)**提供了根据 IP 地址来获取 MAC 地址的能力,地址解析之名由此而来。

地址解析原理:主机间的通信时,ARP 协议首先会发起一个请求 IP 数据包,IP 数据包的首部包含有目标主机 IP 地址,这个数据包经由数据链路层、物理介质层,最终广播到子网内所有主机,主机接受到该 IP 数据包后解析出其首部所包含的目标主机 IP 地址,再和自身 IP 地址进行比对。若相同,则根据数据包首部包含的源主机 IP 地址将 MAC 地址返回;若不相同,则丢弃该数据包。同时 ARP 协议还会缓存一份地址映射表在本地,表记录为返回的 MAC 地址和目标主机 IP 地址。下次再需要通信时,ARP 会直接查询地址映射表以提高效率。

路由协议

通过 ARP 协议的地址解析原理不难发现,ARP 协议同样具有子网局限性。为了突破这一限制实现跨子网通信,网络层实现了路由协议。

路由协议提供了异构网(子网间)互联的能力,可以将一个子网的 IP 数据包发送到另一个子网。所谓 “路由” 即指导数据包转发的路径信息。路由协议是运行在路由器上的协议,在错综复杂的网络世界中,路由器充当了交通枢纽的角色,它会视实际的网络环境来选择最佳路径进行数据包转发,路由器是网络层的代表设备。

IP 数据包路由原理:主机间的通信时,首先会通过 IP 协议来判断两台主机是否处在同一子网。若是,直接交给 ARP 协议和以太网协议来完成子网广播。若不是,以太网协议则会将 IP 数据包发送到子网网关(一般为路由器)进行路由决策,再经过若干次网关路由转发之后,IP 数据包就进入到目标主机 IP 地址所处的子网中,最后还是通过子网广播完成主机定位。

可见,路由器和路由协议解决了 “如何隔离子网之间的广播信号” 和 “子网之间的计算机依旧能够通信” 的问题。

传输层

通过物理介质层、数据链路层和网络层的底层支撑,或者说通过 MAC 地址和 IP 地址的支撑,得以实现了主机间在全球互联网中的互联互通,所以三者也会被归纳为「基础传输层」。

不过仅仅支持 “主机定位” 依旧是不足以满足需求的,还需要完成主机上的 “应用程序定位” 才可以。因为互联网传输的数据往往是应用程序的数据,比如微信聊天,实际是两台设备上微信 APP 之间的数据传输。所以主机在接收到数据后,还需要解决:这个 IP 数据包应该交由谁来处理?就是所谓的 “应用程序定位” 问题。

对此,传输层规定为每个应用程序都指定一个特殊的 “地址” 来辅助定位,这个 “地址” 就是 —— 进程端口(Port)

传输层的主要作用就是建立进程与进程之间的通信,即 Port 到 Port 之间的数据传输,主要有 UDP 协议和 TCP 协议两种实现。如果你具有网络应用编程经验,那么你对 (IP, Port) 的组合应该不会感到陌生,这就是 Unix 系列操作系统定义的 Socket 套接字。

这里写图片描述

可用端口号在 [0, 65535] 之间,其中 [0, 1023] 属于系统端口,由操作系统原生服务进程使用,其余为用户端口,由用户自由分配。传输层的 PUD 为数据段(Segment),其首部也有 TCP 首部和 UDP 首部两种类型。

数据段首部为 8 字节,数据部分为上层应用数据占 65527 字节,总长不超过 65,535 字节,正好作为下层 IP 数据包的数据部分。

TCP 协议

TCP(Transmission Control Protocol,传输控制协议),是一种面向连接的可靠传输协议,提供可靠(无差错、不丢失、不重复、按顺序)的字节流数据传输服务。在传输效率和可靠性之间选择了后者,所以有开销大、传输速度慢的缺点。

  • 面向连接:在使用 TCP 通信之前,需要进行 “三次握手” 建立发收双方连接,通信结束后还要进行 “四次挥手” 确保断开连接。
  • 点对点:一条 TCP 连接只能连接两个端点。
  • 全双工通信:允许通信双方任意时刻双向发送数据,发送方设有发送缓存,接收方设有接收缓存。
  • 字节流传输:TCP 会将数据当作字节流进行处理,不尝试理解所传输的数据含义,仅把数据看作一连串的字节序列。

UDP 协议

UDP(User Datagram Protocol,用户数据报协议),是一种无连接的非可靠传输层协议。UDP 不提供数据包分组、组装,不能对数据段进行排序,所以 UDP 数据段的首部非常简单。换句话说,当数据段发送出去之后,发送方是无法得知其是否完整且安全的到达了接收方的。这样的传输机制决定了它的最大优点就是快,同时也决定了它最大的缺点不可靠、不稳定。

应用层

应用层是直接面向用户的,所以相对于数据传输的细节,应用层更加关注数据的表示形式,其主要工作是定义数据格式并按照相应的格式要求进行数据解读。因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP(万维网), FTP(文件传输), SMTP(邮件) 等等。

以互联网上应用最广泛的 HTTP(HyperText Transfer Protocol,超文本传输协议)为例,其数据首部格式如下:

如上图标记内容,HTTP 规范了定义和解读数据格式的方式:

  • 在 Request Headers 中使用 Content-Type 表示客户端发送的数据格式类型,Accept 表示客户端期望接受的数据格式类型
  • 在 Response Headers 中使用 Content-Type 表示服务器端响应的数据格式类型
  • 通常 Request Accept 需要与 Response Content-Type 保持一致

总结一下,应用层的作用主要是为计算机上的应用程序提供服务,包括提供数据格式表现、数据加密、远程终端会话等应用功能。应用层无需关心数据的传输细节,这是分层设计带来的好处,程序员完全可以在不了解底层协议的前提下使用应用层的众多协议来进行工作。

最后

回顾总结一下:

  • 物理介质层:是最底层的数据传输物理媒介
  • 数据链路层:通过 MAC 地址来定位本地子网中的主机
  • 网络层:通过 IP 地址来定位不同子网间的主机
  • 传输层:通过 Port 来定位到主机上的应用程序
  • 应用层:为主机上不同的应用程序提供服务

相关阅读:

原文地址:https://www.cnblogs.com/hzcya1995/p/13310566.html