网络层数据平面 Network Layer:Data Plane
Overview of Network Layer
Section titled “Overview of Network Layer”网络层提供的功能 从发送方主机传输报文段到接收方主机 发送方主机封装报文段(segments)为数据报(datagrams)给链路层 接收方主机递交报文段给传输层 在每个主机、路由器上都需要运行网络层协议 路由器会检查通过它的所有 IP 数据报的头部字段,然后根据目的 IP 地址对数据报进行转发
Forwarding and Routing: The Data Plane and Control Plane
Section titled “Forwarding and Routing: The Data Plane and Control Plane”- 转发(forwarding): 当数据包到达路由器的输入链路时,路由器必须将数据包移动到适当的输出链路。例如,从主机 H1 到路由器 R1 的数据包必须被转发到通往 H2 的路径上的下一个路由器。将分组从路由器的输入端口转移到正确的路由器输出端口(主要利用硬件)
- 路由(routing): 网络层必须确定数据包从发送者流向接收者时所走的路由 route 或路径 path,计算这些路径的算法被称为路由算法。例如,路由算法会确定数据包从 Host1 流向 Host2 的路径。路由在网络层的控制平面 Control Plane 中实现(主要利用软件)
转发指的是路由器在本地将数据包从输入链路接口转移到适当的输出链路接口的动作。转发在非常短的时间范围内发生(通常是几纳秒),因此通常在硬件中实现。路由指的是确定数据包从源到目的地的端到端路径的网络范围内的过程。路由在更长的时间范围内发生(通常是几秒钟),通常在软件中实现。
Control Plane: The Traditional Approach
Section titled “Control Plane: The Traditional Approach”每个路由器都有单独的路由算法组件,路由器之间通过交互来实现控制平面
由路由算法决定了路由器转发表的内容

Control Plane: The SDN Approach
Section titled “Control Plane: The SDN Approach”一个分离的(通常是远程的)控制器和路由器本地的控制代理 (local control agents,CAs) 交互,由 remote controller 计算并分发每个路由器要使用的转发表
远程控制器可能在具有高可靠性和冗余的远程数据中心中实现,并可能由 ISP 或某第三方管理,因为计算转发表并与路由器交互的控制器是在软件中实现的,故被称为软件定义网络(Software Defined Networking, SDN)

Network Service Model
Section titled “Network Service Model”网络服务模型(network service model)定义了分组在发送与接收端系统之间的端到端运输特性。
某些分组交换机称为链路层交换机(link-layer switch),基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层设备;其他分组交换机称为路由器(router),基于网络层数据报中的首部字段值做出转发决定,路由器因此是网络层设备。
网络层可能提供的服务
针对单个的数据报 datagram,可提供以下服务
- Guaranteed delivery 确保交付:确保分组到达目的地。
- Guaranteed delivery with bounded delay:最大时延的保证,例如确保主机到主机的时延不超过 40ms
针对数据包流(flow of datagrams),可提供的服务有
- In-order packet delivery 有序分组交付:按发送顺序到达。
- Guaranteed minimal bandwidth 确保最小带宽:当发送主机以低于特定比特率的速率发送比特,分组不会丢失,在一定时延到达。
- Security 安全性:网络层可以在源端对所有数据报进行加密,并在目的端进行解密,从而为所有传输层的段提供保密性。
互联网的网络层提供了一种单一的服务,称为尽力而为服务(best-effort service)。在尽力而为服务中,数据包既不能保证按照发送的顺序被接收,也不能保证最终被送达。没有对端到端延迟的保证,也没有最小带宽的保证。
| QoS 模型 | 优点 | 缺点 |
|---|---|---|
| Best Effort | 1. 简单,不需要复杂的网络策略或协议。<br>2. 允许数据包在网络中自由流动,无需预设路径。<br>3. 在无拥塞的情况下,可以提供可靠的服务。<br>4. 允许最大的网络效率和成本效益。 | 1. 不允许资源预留或任何其他与网络特殊处理相关的机制。<br>2. 对于实时(RT)流量需求的新兴应用,表现不佳。<br>3. 当网络资源不足以满足 QoS 应用程序的需求时,不应使用此模型。 |
| Integrated Services (IntServ) | 1. 允许网络流量的个性化处理。<br>2. 使用服务特定的预留协议为特定的数据流预留资源。<br>3. 可以准确预测并保证定义的性能水平。 | 1. 不可扩展,需要比其他 QoS 模型(如 DiffServ)更多的管理控制。<br>2. 实施此模型需要网络中存在 IntServ 能力的路由器,并使用 RSVP 进行端到端的资源预留。<br>3. 由于 RSVP 是一个软状态协议,持续的信令负载只会加剧可扩展性问题。 |
| Differentiated Services (DiffServ) | 1. 提供一种基于类别的服务,某些类别的流量可以优先于其他流量类别得到处理。<br>2. 适用于大型网络,因为它不需要为每个流量保留网络资源。 | 1. 不能为每个流量提供精确的 QoS 保证。<br>2. 对于需要高精度 QoS 保证的应用,可能不是最佳选择。 |
[!info] 虚电路
- 数据报 网络提供网络层的无连接 服务
- 虚电路 网络提供网络层的 连接 服务
- 类比于 TCP/UDP 的面向连接/ 无连接的传输层服务:
- 任何网络中的网络层只提供两种服务之一,不会同时提供。
- 虚电路网络:提供连接服务。
- 数据报网络:提供无连接服务。
- 传输层:面向连接服务在网络边缘的端系统中实现。
- 网络层:面向连接服务在端系统及网络核心的路由器中实现。
定义 > 虚电路(Virtual Circuits)“源主机-目的主机路径的行为类似于电话网络的行为”,性能上类似,沿着源-目的路径的网络行为类似。
- 在数据传输之前,需要为每个呼叫建立连接
- 每个分组携带 VC 标识符(不是目的主机地址)
- 位于“源-目的路径”上的每个路由器会维护经过它的每条连接的“状态”
- 链路和路由器的资源(带宽、缓存)可以被分配给 VC(专用资源)
特点 虚电路网络源于电话产业界(采用“真正”电路)。 呼叫建立及每次呼叫的状态要在网络中的路由器上维持,比面向数据报的网络要复杂。 网络功能复杂,端系统设备简单
What’s Inside a Router?
Section titled “What’s Inside a Router?”对于一般的路由器来说,它主要包含四个部分
-
输入端口 (Input Ports)
- 执行物理层功能,终止路由器上的入站物理链接。
- 执行链路层功能,与入站链接另一侧的链路层进行互操作。
- 在输入端口执行查找功能,这将在输入端口的最右侧的框中发生。在这里,将查询转发表以确定将通过交换结构转发到哪个路由器输出端口的到达数据包。
- 控制数据包(例如,携带路由协议信息的数据包)从输入端口转发到路由处理器。
-
交换结构 (Switching Fabric)
- 连接路由器的输入端口和输出端口。
-
输出端口 (Output Ports)
- 存储从交换结构接收的数据包,并执行必要的链路层和物理层功能在出站链接上传输这些数据包。
- 当链接是双向的时,输出端口通常会与同一线卡上的该链接的输入端口配对。
-
路由处理器 (Routing Processor)
- 执行控制平面 Data Plane 功能
- 在传统路由器中,它执行路由协议,维护路由表和附加的链路状态信息,并为路由器计算转发表。
- 在 SDN 路由器中,路由处理器负责与远程控制器通信,以便(在其他活动中)接收由远程控制器计算的转发表条目,并将这些条目安装在路由器的输入端口中。
- 执行网络管理功能。
Input Port Processing and Destination-Based Forwarding
Section titled “Input Port Processing and Destination-Based Forwarding”路由器输入端口处理的工作流程可以概括如下:
-
输入端口处理 终止路由器上的入站物理链接。路由器根据 forwarding table 来查找输出端口,到达的数据包将通过交换结构转发到该端口。
-
转发表的更新:通过路由处理器计算和更新转发表,或者从远程 SDN 控制器接收。
转发表是通过一个单独的总线(例如,PCI 总线)从路由处理器复制到线卡(line card)上的,每个线卡都有一个转发表的副本,可以在每个输入端口本地做出转发决策,无需在每个数据包都要调用路由处理器,从而避免了集中处理的瓶颈。
-
基于目标地址的转发:在最简单的情况下,即将到达的数据包将被转发到的输出端口是基于数据包的目标地址的。在 32 位 IP 地址的情况下,转发表的暴力实现将为每个可能的目标地址有一个条目。由于可能的地址超过 40 亿个,这个选项完全不可能。
实际上路由器中使用分组目的地址的前缀(prefix)与该表中的表项进行匹配,如下图所示:
当有多个匹配项目时,该路由器使用最长前缀匹配规则(longest prefix matching rule),即在该表中寻找最长的匹配项,并向与最长的前缀匹配先关联的链路接口转发分组。
| prefix | Link Interface |
|---|---|
11001000 00010111 00010 | 0 |
11001000 00010111 00011000 | 1 |
11001000 00010111 00011 | 2 |
Otherwise | 3 |
一个端系统发送给另一个端系统的一批分组可能在网络中选择不同的路径,到达的顺序可能不一致
鉴于转发表的存在,查找在概念上很简单 - 硬件逻辑只是在转发表中搜索最长的前缀匹配。在千兆传输速率下,这种查找必须在纳秒内执行,因此,不仅必须在硬件中执行查找,而且需要对大表进行快速查找的算法;还必须特别注意内存访问时间,从而在设计中嵌入式片上 DRAM 和更快的 SRAM(用作 DRAM 缓存)存储器。实践中经常使用三态内容可寻址存储器(Tenary Content Address Memory,TCAM)来查找
Switching
Section titled “Switching”Switch fabric 负责转发功能,完成交换的方式有很多,主要包括下面几种
- Memory
- 在 CPU 直接控制下交换的传统计算机,数据交换的执行与传统 IO 设备一致;
- 数据包复制到 processor memory,processor 从 header 中提取目标地址;
- 速度受内存带宽限制,交换速度受总线带宽的速度限制 (每个分组穿过两次总线:
Input>Memory>Output),故若总线带宽为每秒写入或读出 B 个分组,则总的转发吞吐量 (分组从输入端口被传送到输出端口的总速率)小于 B/2
- Bus
- 输入端口通过一条共享总线将分组直接传送到输出端口,不需要选路处理器的干预。
- 每次只能有一个分组通过总线传送。 分组到达一个输入端口时,若总线正忙,会被暂时阻塞,在输入端口排队
- 路由器交换带宽受总线速率限制。
- Interconnection network
- 数据报分割成固定长度信元, 通过交换矩阵来交换信元。到达输入端口的分组沿水平总线穿行,直至与所希望的输出端口的垂直总线交叉点:
- 若该条垂直总线空闲,则分组被传送到输出端口;
- 否则,该到达的分组被阻塞,必须在输入端口排队。
- 数据报分割成固定长度信元, 通过交换矩阵来交换信元。到达输入端口的分组沿水平总线穿行,直至与所希望的输出端口的垂直总线交叉点:
Output port processing
Section titled “Output port processing”取出存放在输出端口内存中的分组,并将其传输到输出链路上。 当交换结构将分组交付给输出端口的速率超过输出链路速率,就需要排队与缓存管理功能。当输出端口的缓冲区溢出时,就会出现延时和丢包。
When Does Queuing Occur
Section titled “When Does Queuing Occur”在输入端口和输出端口都可以形成分组队列,随着这些队列的增长,路由器的缓存空间最终将会耗尽,并且当无内存可用于存储到达的分组时将会出现丢包(packet loss)
Input Queueing
Section titled “Input Queueing”当交换结构的速度慢于输入端口的速度,就会在输入端口的缓冲区发生排队,会导致排队延时和由于输入缓冲区溢出导致的丢包 线头阻塞(Head-of-the-Line (HOL) blocking): 在队列前面的被阻塞的数据报会阻止队列中的其他数据报被转发
Output Queueing
Section titled “Output Queueing”当经过交换结构到达的速度超过了输出端口的处理线速就会发生排队,当输出端口的缓冲区溢出时就会发生丢包
Packet Scheduling
Section titled “Packet Scheduling”FCFS(FIFO) 维护一个 Queue,按照到达顺序依次处理分组
Priority Queuing
通常每个 Packet 都有一个优先级,不同优先级的 Packet 被分配到不同的队列中,然后按照优先级顺序处理

Round Robin and Weighted Fair Queuing(WFQ)
Round Robin 轮流服务将需要路由发送的资源进行分类,为每种类别生成自有的一个队列,发送时轮流从队列中选取队首的文件包进行发送。如果轮到某个队列时,该队列为空,则跳过该队列。
这样的服务能保障在各不同类型的网络服务中合理分配资源,不会让某一网络服务占用过大的带宽以至于影响其他的网络服务。比如某个下载程序占用过多网速,致使视频浏览出现卡顿或打开网页速度过慢。
WFQ 是基于 Round Robin 方法改进后而成的。对于某些网络服务,如网络电话或视频直播,为了保障能流畅进行,总是需要保留一定的优先带宽。这样情况下就可以使用 Round Robin 轮流服务的升级版本 Weighted Fair Quequing(WFQ)加权公平队列。其中的思想很简单,轮流服务中已经有了各个公平队列,需要做的就是对一些带宽敏感型服务进行标记并附以相应权重
WFQ 在发送时仍然轮流从队列中选取队首文件包,但选取的数量根据权重
The Internet Protocol (IP): IPv4, Addressing, IPv6, and More
Section titled “The Internet Protocol (IP): IPv4, Addressing, IPv6, and More”IPV4 Datagram Format
Section titled “IPV4 Datagram Format” 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Datagram Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identificatifer |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live |UpperLayerProto| Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 版本号(Version):4bit。指定了数据报的 IP 协议版本。通过查看版本号,路由器可以确定如何解释 IP 数据报的其余部分。不同版本的 IP 使用不同的数据报格式。
- 首部长度(Internet Header length):长度 4 bit 。描述 IP 报头的长度,因为在 IP 报头中有变长的可选部分。该部分占 4 个 bit,长度单位为 4 个字节;因此一个 IP 报头的最大长度为 1111,即 15 x 4 个字节 = 60 个字节。同时约定了 IP 报头最小长度为 20 字节;
- 服务类型(Type of service):不同类型的数据报可以相互区分;在 RFC2474,RFC 3168 中,该字段划分为 👇
- dscp(Differentiated Services Code Point)字段,6bit;前 3bit 记为 X,后 3bit 记为 Y,用于区分不同的服务类别;
- ECN(Explicit Congestion Notification)字段,3bit;采用更先进的拥塞控制机制;第一个 bit 记为 ECT,第二个 bit 记为 CE,用于标识网络拥塞,更详细的说明可以看rfc3168;
- 数据报长度(Datagram length):16 bit;IP 数据报的总长度(首部加上数据),以字节计数;长度 。以字节为单位计算的 IP 包的长度(包括头部和数据),所以 IP 包最大长度为 65535 字节。
- 标识(Identifier)、标志(Flags)、分片偏移(Fragmentation offset):主要用于数据包分片和重组。当一个数据包的大小超过了网络的最大传输单元(MTU),它就会被分割成多个较小的片段。当这些片段到达目的地时,就可以利用这 3 个字段将它们正确地重组回原始的数据包。IPV6 不允许分片
Identifer负责标识一个数据包;Flag共三位,第一位不使用。第二位Flags_DF(Don’t Fragment)表示是否分片;第三位Flags_MF(More Fragment)为 0 时表示当前分片为最后一个分片;Fragmentation offset负责确认偏移量,长度 13 bit,以 8bytes 为单位MTU(Maximum Transmission Unit)指在网络通信中,数据链路层(如以太网)上一次可以传输的最大数据包大小,以字节为单位。以太网的标准 MTU 大小是 1500 字节
- 生存时间(Time-to-live,TTL):确保数据段不会永远在网络中循环;每次数据报被路由器处理时,这个字段就会减 1。如果 TTL 字段达到 0,路由器必须丢弃该数据报。
- 上层协议(Upper-layer protocol):IP 数据报到达最终目的地时使用。这个字段的值指示应该将该 IP 数据报的数据部分传递给特定的传输层协议。例如,值 6 表示数据部分传递给 TCP,而值 17 表示数据传递给 UDP。
- 首部检验和(Header checksum):帮助路由器检测收到的 IP 数据报中的比特错误;更详细的说明见 [[Internet_Checksum]]
- 源和目的 IP 地址(Source and Destination IP address);
- 选项(Options):允许 IP 首部被扩展;
- 数据(Data):一般为运输层报文段;
IPV4 Addressing
Section titled “IPV4 Addressing”- IP 地址: 分配给主机或路由器接口的标识符
- 接口: 主机/路由器与物理链路之间的边界
- 路由器有多个接口
- 主机可以有多个接口
- 每个接口有一个 IP 地址
- IPV4 和 IPV6
- IPV4:32 bits(4 Bytes)常用点分十进制(dotted-decimal notation)表示;
- IPV6:128 bits(16 Bytes)常用冒号分隔表示
32 比特的二进制表示和点分十进制表示法:
223.1.1.111011111 00000001 00000001 00000001
根据不同的取值范围,早期将 IP 地址分为五类。IP 地址中前 5 位用于标识 IP 地址的类别,A 类地址的第一位为“0”,B 类地址的前两位为“10”,C 类地址的前三位为“110”,D 类地址的前四位为“1110”,E 类地址的前五位为“11110”。其中,A 类、B 类与 C 类地址为基本的 IP 地址。
- A 类地址:地址范围为
1.0.0.1-127.255.255.254全 0 表示本地地址,全 1 表示在本地网络中向所有机广播 - B 类地址:地址范围为
128.0.0.1-191.255.255.254 - C 类地址:地址范围为
192.0.0.1-223.255.255.254
特殊 IP 地址段
- 本地回环地址
127.0.0.1-127.255.255.254是预留的一组 IP 地址,主要是用来识别主机本身的地址。也叫做“localhost”,一般用来测试。 - 私有地址(Private address)
10.x.x.x, 172.16.x.x-172.31.x.x, 192.168.x.x三个地址段被称为私有 IP 地址段,也就是局域网所使用的地址段,在公网上不能被路由 0.0.0.0这个地址严格上来说都不是真正意义上的 IP 地址。主要是用来标识不清楚的网络和主机的。系统遇到无法识别的网络或主机的时候会统一的归纳到这个地址255.255.255.255这个地址是受限的广播地址。主要指一个网段内的所有主机
IP 地址: 网络号 (高位 bits):指明主机所在网络的编号 主机号 (低位 bits):作为主机在网络中的编号。
网络号相同的 IP 地址属于同一个网络。而网络还可以划分为若干子网(subnet),划分子网的方法是从主机号借用若干个比特作为子网号,剩下的主机位为主机号。
子网 Subnet: 设备接口的 IP 地址具有同样的网络部分;没有路由器的介入,物理上能够相互到达
子网掩码 Subnet Mask,子网掩码用来确定网络地址(包括网络号和子网号)和主机地址的长度。子网掩码长为 32 位比特,其中的 1 对应于 IP 地址中的网络号和子网号,而子网掩码中的 0 对应于主机号。有公式 ip_address & subnet_mask = network_address
下图中,一台路由器(具有三个接口)用于互联 7 台主机。
图中左侧的 3 个主机和它们连接的路由器接口,都有一个形如 233.1.1.xxx的 IP 地址。用 IP 的术语说,互联这 3 个主机接口与 1 个互联网接口的网络形成一个子网(subnet)。IP 编址为这个子网分配一个地址 233.1.1.0/24,其中 /24记法,指示 32 比特中的最左侧 24 比特定义了子网地址。
使用子网掩码的分组转发 不划分子网时,路由表只有两项:目的网络地址和下一跳地址。使用子网划分后,路由表中将包括三项:目的网络地址、子网掩码和下一跳地址。
一个 A 类的 IP 地址,可以有 24bit 用于分配主机地址,因此可以支持
CIDR,也被称为无类别域间路由选择(Classless Interdomain Routing,CIDR), 消除了传统的 A 类、B 类和 C 类地址的概念。使用斜线记法,又称为 CIDR 记法来区分网络前缀和主机号,即在 IP 地址后面加上一个斜线 /,斜线后面用一个数字指定网络前缀的长度。CIDR 将网络前缀都相同的连续的 IP 地址组成 CIDR 地址块。
一个 CIDR 地址块可以表示分类 IP 的多个分类地址,这种地址的聚合称为路由聚合,又称为构造超网(superneting)。
下图为一个示例,
- ISP 获得地址块的方法——从 ICANN(Internet Corporation for Assigned Names and Numbers)
- 分配 IP 地址
- 管理 DNS
- 分配域名,解决纠纷
- 组织机构如何获取 IP 地址? 从 ISP 的地址空间中划分一块给申请者
所有的 IP 地址都由 ICANN 规划,然后主要由国际组织 NIC(Network Information Center)具体负责统一分配。 目前全世界共有五个这样的网络信息中心(ARIN,LACNIC,RIPE NCC,AFRINIC,APNIC) 我国申请 IP 地址要通过 APNIC,APNIC 的总部设在日本东京大学。申请时要考虑申请哪一类的 IP 地址,然后向国内的代理机构提出。
[!example]
Q 现有一公司已获得网络号为 202.1.1.0/24,如果该公司有 3 个部门, (1)如果第 1 个部门有 60 台计算机,第二个部门有 20 台计算机,第三个部门有 16 台计算机,问如何分配地址? (2)如果第 1 个部门有 120 台计算机,第 2 个部门有 60 台计算机,第 3 个部门有 60 台计算机,使用上述方法可以分配地址吗?使用 CIDR 方法如何分配地址? A (1)以最多台数的部门(60 台)为准,需要的最接近数为 2^6=64,故要从最后个字节借 8-6=2 位, 子网分别为
202.1.1.0, 202.1.1.64, 202.1.1.128, 202.1.1.192,在这 4 个其中任选 3 个即可。掩码均为255.255.255.192。 (2)部门 1 有 120 台主机,需要用 7bit 表示 subnet host id,这样只剩下 1bit 表示子网。而 TCP/IP 协议不允许 subnet id 为全 1 或全 0,因此该策略无法满足。应采用 CIDR 法首先以最小需求台数部门为准(60 台),此时主机号位数需要 6 位(因为
),则 subnet id 的位数为 8-6=2 位,然后将子网划分出来,子网分别为 202.1.1.0, 202.1.1.64, 202.1.1.128, 202.1.1.192接下来,部门 2、3 可以直接在 4 个子网中任选两个,部门 1 选剩下 2 个以满足 120 台的要求(但这两个子网要连续,以便用 CIDR 法合并之,做超网)。比如202.1.1.128、202.1.1.192分别给部门 2、3,部门 1 用202.1.1.0、202.1.1.64最后将各部门 IP 段用 CIDR 超网形式描述,以便对外发布: 部门 1:202.1.1.0/25; (注意含义:表示前 25 位是网络号,且最后一个字节最高位为 0,后面 7 位是主机号) 部门 2:202.1.1.128/26; (最后一个字节最高两位为 10,后面 6 位是主机号) 部门 3:202.1.1.192/26; (最后一个字节最高两位为 11,后面 6 位是主机号)
将 202.1.1.128、202.1.1.192 给部门 1,202.1.1.0、202.1.1.64 分别给部门 2、3 亦可。此时答案为: 部门 1:202.1.1.0/26; 部门 2:202.1.1.64/26; 部门 3:202.1.1.128/25;
[!warning]
RFC950 参考规定:第一个子网(也就是“全 0 子网”)和最后一个子网(也就是“全 1 子网”)不可用,为的就是避免全 0 子网的网络地址和全 1 子网的广播地址分别与没有划分子网前的网络地址和广播地址相冲突,按照这种旧规定,2 个子网就要借 2 位,00,11 不能用。 但是在后来 RFC1878 中(CIDR),该项规定已被废止了,现在的设备基本上都普遍支持 RFC1878。尼电课程实验/作业/考试都基于新标准 对于第一个子网,网络地址和主网络的网络地址是重叠的,对于最后一个子网,广播地址和主网络的广播地址也是重叠的。即地址有二义性。因此 RFC950 规定 subnet id 不能全 1 或全 0,但如此一来子网划分的 IP 地址浪费严重。 后来 IETF 就研究出了其他一些技术,比如可变长子网掩码 VLSM,该技术是在子网上进一步划分子网,可提高 IP 地址资源的利用率;后来在此基础上研究出了无类别域间路由 CIDR,即消除了传统的 A/B/C 等分类以及划分子网,才是采用网络前缀和主机号的方式来分配 IP 地址,这使得 IP 地址的利用率更好。
Obtaining a Host Address: The Dynamic Host Configuration Protocol
Section titled “Obtaining a Host Address: The Dynamic Host Configuration Protocol”主机如何得到 IP 地址?
- 手工指定(保存在系统配置中)
- Windows: 控制面板->网络
- UNIX/LINUX: 在/etc/rc.config 中,可使用 ifconfig 命令配置
- DHCP: Dynamic Host Configuration Protocol,自动从一个 DHCP 服务器得到 IP 地址,方便灵活
DHCP
DHCP 是应用层协议。其分配的不仅仅是 IP 地址,还可分配:
- 客户的第一跳路由器的地址(网关)
- DNS 服务器的 IP 地址或域名
- 子网掩码
报文格式
OP若是 client 送给 server 的封包,设为 1,反向为 2;Htype硬件类别,ethernet 为 1;Hlen硬件长度,ethernet 为 6;Hops若数据包需经过 router 传送,每站加 1,若在同一网内,为 0;TransactionID:事务 ID,是个随机数,用于客户和服务器之间匹配请求和相应消息;Seconds由用户指定的时间,指开始地址获取和更新进行后的时间;Flags从 0-15bits,最左一 bit 为 1 时表示 server 将以广播方式传送封包给 client,其余尚未使用;Ciaddr用户 IP 地址;Yiaddr客户 IP 地址;Siaddr用于 bootstrap 过程中的 IP 地址;Giaddr转发代理(网关)IP 地址;Chaddrclient 的硬件地址;Sname可选 server 的名称,以 0x00 结尾;File启动文件名;Options,厂商标识,可选的参数字段
Steps
-
DHCP 服务器被动打开 UDP 端口 67,等待客户端发来的报文。DHCP 客户端启动时,由于其还未配置 IP 地址,因此只能使用广播方式发送 Dhcpdiscover 包,即该数据包的源地址为 0.0.0.0,目标地址为 255.255.255.255
-
DHCP 客户从 UDP 端口 68 发送 DHCP Discover 报文。
-
凡收到 DHCP discover 报文的 DHCP 服务器 都发出 DHCP offer 报文,因此 DHCP 客户 可能收到多个 DHCP offer 报文
-
DHCP 客户从几个 DHCP 服务器中选择 其中的一个,并向所选择的 DHCP 服务 器发送 DHCP request 报文
-
被选择的 DHCP 服务器发送确认报文 DHCPACK,客户进入已绑定状态,并可 开始使用得到的临时 IP 地址了 DHCP 客户现在要根据服务器提供的租用期 T 设置两个计时器 T1 和 T2,它们的超时时间分别是 0.5T 和 0.875T。当超时时间到就要请求更新租用期。
-
租用期过了一半(T1 时间到),DHCP 发送 request 报文 DHCPREQUEST 要求更新租用期。
-
DHCP 服务器若不同意,则发回否认报文 DHCPNACK。这时 DHCP 客户必须立即停止使用原来的 IP 地址,而必须重新申请 IP 地址(回到步骤 2)
-
DHCP 服务器若同意,则发回确认报文 DHCPACK。DHCP 客户得到了新的租用期,重新设置计时器。若 DHCP 服务器不响应步骤 6 的 request 报文 DHCPREQUEST,则在租用期过了 87.5% 时,DHCP 客户必须重新发送请求报文 DHCPREQUEST(重复步骤 6),然后又继续后面的步骤。
-
DHCP 客户可随时提前终止服务器所提供的 租用期,这时只需向 DHCP 服务器发送释 放报文 DHCPRELEASE 即可。
Network Address Translation (NAT)
Section titled “Network Address Translation (NAT)”对于外部网络而言,本地网络中的所有设备只共享一个 IPv4 地址。这样做有以下几点好处:
- 不需要从 ISP 分配一系列地址—— 只要一个 IP 地址用于所有设备
- 在本地网络,改变设备的 IP 地址不用通知外部世界
- 可以变更 ISP ,不用改变本地网络的设备的地址
- 本地网络内部设备不能被外部世界明确寻址,或是不可见 (增加了安全性)
但同时,为与外部网络交互,需进行网络地址转换(NAT),执行 NAT,路由器
- 外出的分组: 把每个外出的分组的 (源 IP 地址, 端口号) 替换为 (NAT IP 地址, 新端口号)
- 在 NAT 转换表(NAT Translation Table)中记录每个(源 IP 地址, 端口号)到 (NAT IP 地址, 新端口号) 转换配对
- 进来的分组: 对每个进来的分组,用保存在 NAT 表中的对应的(源 IP 地址, 端口号) 替换分组中的目的域 (NAT IP 地址, 新端口号)
Nat 的一些局限——16bit 端口号使得一个局域网地址可以同时支持 60,000 个并发连接!
NAT 存在争议
- 路由器只应该处理到第三层
- 违反了端到端主张
- 应用程序设计者在设计时不得不将 NAT 加以考虑
- 如 P2P 应用程序
- 应使用 IPv6 来解决地址短缺问题
Internet Control Message Protocol(ICMP,互联网控制消息协议),负责在网络设备间传递控制与错误信息,确保数据包能够顺利抵达目的地。互联网中丢包、路由错误、网络拥塞等状况时有发生。这时,ICMP 便如同一位经验丰富的“诊断医生”,通过发送特定的消息类型,帮助识别并报告这些网络问题。
ICMP 的基本运作原理 ICMP 位于 Internet 协议(IP)之上,属于 TCP/IP 协议栈的网络层。它并不直接参与数据的传输,而是作为 IP 协议的一个辅助工具,通过差错报告和询问机制来实现其功能。ICMP 报文通常封装在 IP 数据包内,包含类型、代码和校验和等字段,用以区分不同的消息类型和提供完整性检查。
差错报告:当数据包无法到达目标或遇到其他传输问题时,路由器或主机可以通过发送 ICMP 错误消息(如“目标不可达”、“超时”等)给源主机,告知发生了什么问题。
| ICMP type | Code | Description |
|---|---|---|
| 0 | 0 | echo reply (ping) |
| 3 | 0 | destination network unreachable |
| 3 | 1 | destination host unreachable |
| 3 | 2 | destination protocol unreachable |
| 3 | 3 | destination port unreachable |
| 3 | 6 | destination network unknown |
| 3 | 7 | destination host unknown |
| 4 | 0 | 源端抑制 source quench(congestion control) |
| 8 | 0 | echo request (ping) |
| 9 | 0 | router advertisement |
| 10 | 0 | router discovery |
| 11 | 0 | TTL expired |
| 12 | 0 | IP header bad |
ICMP 的实用价值
网络故障排除:对于网络管理员而言,通过分析 ICMP 反馈的信息,可以迅速定位网络故障,比如判断是网络拥塞还是链路故障导致的数据包丢失。
路径监测与测量:“Traceroute”利用 ICMP 的 TTL(Time to Live)字段递减特性,逐跳追踪数据包的传输路径,帮助理解网络拓扑结构及延迟情况。
可用性检查:“Ping”命令简单有效,成为检测远程主机是否可达的日常工具,广泛应用于网络维护和服务器监控中。
安全考量与限制 尽管 ICMP 对网络运维至关重要,但它也存在被滥用的风险,例如用于 DDoS 攻击中的 Smurf 攻击或放大攻击。因此,合理配置防火墙策略,对 ICMP 流量进行适当限制和监控,是保障网络安全的必要措施。
- 初始动机:
- 32-bit IPv4 地址空间即将用尽
- 其他动机:
- 首部格式可帮助加速处理/转发
- 改变首部利于 QoS 要求
- IPv6 数据报格式
- 固定长度的 40 字节首部
- 不允许分片
IPV6 报文格式
Priority: 表示流中分组的优先级 Flowlabel: 表示分组在同一个“stream”中 (“流”的概念尚未完全定义) next hdr(header): 表示数据的上层协议
IPV6 地址表示
在 IPv6 中,地址分为 8 个段来表示,每段共 4 个字符
- 冒号十六进制表示法
104.220.136.100.255.255.255.255.0.0.18.128.140.10.255.255用冒号十六进制表示为:69DC:8864:FFFF:FFFF:0:1280:8C0A:FFFF - 零压缩表示法
多个连续的
0可用::替换;当计算机拿到这个压缩后的地址,发现比正常的 128 位少了 n 位,计算机就会试图在::的地方补上 n 个 0,从结果中可以发现,当一个 IPv6 地址被压缩后,如果计算机出现两个或多个::的时候,计算机在将地址还原时,就可能出现多种情况。这将导致计算机还原后的地址不是压缩之前的地址,将导致地址错误,最终通信失败。所以在压缩 IPv6 地址时,一个地址中只能出现一个::FF0C:0:0:0:0:0:B1零压缩表示为:FF0C::B1
从 IPV4 到 IPV6 过渡 两种推荐方法: 双栈:一些路由器具有双重栈 (v6, v4) 能够在两种格式中转换 隧道: 在穿过 IPv4 路由器时,IPv6 分组作为 IPv4 分组的负载
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址空间 | 32 位(约 43 亿地址) | 128 位(近乎无限的地址) |
| 报头结构 | 20-60 字节,可变长度 | 40 字节,固定长度 |
| 报头校验和 | 由每个路由器计算和验证 | 已移除,由其他协议层保证 |
| 分片处理 | 由发送主机和路由器执行 | 仅由发送主机执行 |
| 选项字段 | 包含在报头中,处理复杂 | 作为扩展报头,处理高效 |
| 地址配置 | 手动或 DHCP | 支持无状态自动配置(SLAAC) |
| 地址解析 | 使用 ARP(广播) | 使用邻居发现协议(NDP) |
| 安全性 | 可选,通过 IPsec 实现 | 内置 IPsec支持 |
| 本地通信 | 广播 | 多播 |
流量控制的相关算法与数据结构——Round Robin 轮流服务,Weighted Fair Quequing(WFQ)加权公平队列与 Leaky Bucket 漏桶限流 关于子网划分—为什么全 0 全 1 子网号不能使用