考研冲刺前的总结 —— 计算机网络

26711 字
134 分钟
考研冲刺前的总结 —— 计算机网络
考研冲刺前的总结 —— 计算机网络

前言#

小东西太多了,需要经常看。

得花时间。

然后得去看计组,计组现在感觉很薄弱。

绪论#

绪论 - 考纲#

  • 计算机网络概述
    • 计算机网络的概念、组成与功能,计算机网络的分类
    • 计算机网络的性能指标
  • 计算机网络体系结构与参考模型
    • 计算机网络分层结构,计算机网络协议,接口,服务的概念
    • ISO/OSI 参考模型和 TCP/IP 模型

计算机网络概述#

需要注意电路交换,报文交换与分组交换的相关计算。

电路交换仅物理层,需要和虚电路区分,虚电路是分组交换的一种,另一种是数据报。

报文交换时,报文是整块发送的,所以需要存储转发。

分组交换时,将报文分成多个小块,每个小块称为一个分组。

计算机网络的组成与分类#

从组成上看,计算机网络由硬件、软件和协议三部分构成;按功能可以分成资源子网和通信子网,资源子网负责数据处理,通信子网负责数据传送。

按覆盖范围分为广域网、城域网、局域网、个人区域网;按拓扑分为总线型、星形、环形、网状;按交换方式分为电路交换、报文交换、分组交换。

需要注意,互联网(internet)泛指网络的网络,因特网(Internet)是其中最大的一个,题目里说“互联网”一般指后者。

性能指标#

速率指数据传输速率,单位是 b/s\text{b/s}。注意 M\text{M} 在速率里是 10610^6 而不是 2202^{20},只有存储容量才按 2202^{20} 算。

带宽本来指信号能通过的频率范围,单位 Hz\text{Hz};在计算机网络里通常指链路能传送的最高数据率,单位 b/s\text{b/s}。

吞吐量指单位时间内通过某个网络的实际数据量,受带宽和负载共同限制,所以吞吐量不会超过带宽。

时延由四部分组成:

时延=发送时延+传播时延+处理时延+排队时延\text{时延}=\text{发送时延}+\text{传播时延}+\text{处理时延}+\text{排队时延}

发送时延等于数据长度除以发送速率,发生在网卡上;传播时延等于信道长度除以电磁波传播速率,发生在链路上。两者不要搞混,这也是最容易错的一处。

时延带宽积等于传播时延乘以带宽,表示链路上一共能容纳多少比特,也叫“以比特为单位的链路长度”。

往返时间 RTT 指从发送方发出数据到收到确认的时间,包含往返的传播时延以及中间的处理、排队时间。

利用率分为信道利用率和网络利用率。信道利用率是有效发送时间占总时间的比例;网络利用率过高会让时延急剧增大,因为排队时延会随着利用率接近 1 而迅速变长。

需要注意,算时延时单位要先统一,尤其是 ms\text{ms}、μs\mu\text{s} 和 b/s\text{b/s}、Mb/s\text{Mb/s} 混着给的时候。

计算机体系结构与参考模型#

服务数据单元与协议数据单元#

服务数据单元是自下而上,下层为上层提供给了什么,是垂直的。

协议数据单元是水平的。

OSI 参考模型#

物理层 - 数据链路层 - 网络层 - 传输层 - 会话层 - 表示层 - 应用层

数据链路层:差错控制、流量控制、介质访问控制

网络层:差错控制、流量控制、拥塞控制

传输层:端到端的通信

会话层:建立、维护、管理会话、打断点、不同主机绘画

表示层:数据压缩、加密、解密、异构网络、数据格式变换

应用层:用户接口、文件传输、电子邮件、虚拟终端、网络管理、万维网

做题的时候,需要注意,下层为上层提供服务,例如传输层为会话层提供服务,而不是反过来。

TCP/IP#

网络接口层 - 网际层 - 运输层 - 应用层

网络接口层:物理地址、物理寻址、链路层协议、物理层设备(没有流量控制)

网际层:流量控制,差错校验(但是校验错误仅丢弃,这个是 ipv4,ipv6 直接没有校验)

运输层:端到端的通信、可靠传输、差错控制、流量控制、拥塞控制

教学模型#

物理层 - 数据链路层 - 网络层 - 运输层 - 应用层

物理层#

物理层 - 考纲#

  • 通信基础
    • 信道,信号,带宽,码元,波特,速率,信源与信宿等基本概念
    • 奈奎斯特定理与香农定理,编码与调制
    • 电路交换,报文交换与分组交换,数据报与虚电路
  • 传输介质
    • 双绞线,同轴电缆,光纤与无线传输介质,物理层接口的特性
  • 物理层设备
    • 中继器,集线器

通信基础#

信道是信号传输的媒介,信号分模拟信号和数字信号,信源是发送方,信宿是接收方。

按交互方式分为单向通信(单工)、半双工通信、全双工通信。

速率、波特、比特与带宽。

码元传输速率单位为波特(Baud),一个码元可以携带 log⁡2V\log_2 V 位比特,其中 VV 是码元的离散状态数。

需要注意,波特率是每秒传多少个码元,比特率是每秒传多少位,两者靠“每个码元带几位”换算。

编码与调制#

编码是把数据变成数字信号,调制是把数据变成模拟信号。

常见编码:

  • 不归零编码(NRZ):高低电平直接表示 0 和 1,没有自同步能力;
  • 归零编码(RZ):每个码元中间回到零电平,能自同步但占用带宽更大;
  • 曼彻斯特编码:码元中间跳变,跳变既当时钟又当数据,10Base-T 以太网用;
  • 差分曼彻斯特编码:码元开始处有没有跳变来表示 0 和 1,抗干扰更强,令牌环用;
  • 4B/5B 编码:4 位数据映射成 5 位码,保证有足够的跳变,编码效率 80%,100Base-TX 用。

常见调制:

  • 调幅(ASK):改变载波幅度;
  • 调频(FSK):改变载波频率;
  • 调相(PSK):改变载波相位;
  • 正交幅度调制(QAM):幅度和相位同时调制,mm 种状态可以携带 log⁡2m\log_2 m 位比特。

需要注意,曼彻斯特编码的波特率是数据率的两倍,因为一个码元中间必须跳变;问“波特率”时先确认编码方式。

奈奎斯特定理#

公式:

Cmax=2Blog⁡2(V)(bps)C_{max} = 2B \log_2(V) \quad (\text{bps})

物理意义:信道在理想无噪声状态下,码元传输速率的极限是 2B Baud2B \text{ Baud}(BB 为信道带宽,单位 Hz\text{Hz})。如果一个码元携带 log⁡2(V)\log_2(V) 个比特信息(VV 为离散电平数或码元状态数),则最大信息传输速率为 2Blog⁡2(V)2B \log_2(V)。

适用场景:题目明确提到了“无噪声信道”,或者给出了“调制电平数/状态数 VV”且要求极限速率。

香浓定理#

公式:

Cmax=Blog⁡2(1+SN)(bps)C_{max} = B \log_2(1 + \frac{S}{N}) \quad (\text{bps})

物理意义:在存在随机热噪声的信道中,即使码元状态数无限多,受噪声干扰影响,信息的传输速率依然存在绝对极限。其中 S/NS/N 为信噪比(必须是无量纲的功率比值)。

注意换算:若题目给的是分贝值(dB\text{dB}),需用公式换算:

信噪比=10log⁡10SN (dB)⟹SN=10dB/10\text{信噪比}=10\log_{10}\frac{S}{N}\ (\text{dB})\quad\Longrightarrow\quad \frac{S}{N}=10^{\text{dB}/10} 注:如果题目涉及信号与噪声的幅度比,功率比就是幅度比的平方;若要开方求幅度,也必须写成 (… )1/2(\dots)^{1/2} 的形式。

通信基础相关的计算辨析#

  1. 如果机械的限死频率,那么只需要看有没有达到上限,如果没有的话,那么就直接按这个频率算,不需要管其他的参数
  2. 需要注意题目是不是要求算极限,如果不是极限,那么按照正常的公式计算即可
  3. 对于没有提到的信息,不要多考虑,例如本题完全没给计算奈奎斯特定理的条件,仅给了香浓定理的条件,那么久不需要考虑奈奎斯特定理

双重约束取最小:若题目既给了带宽和调制进制,又给了信噪比,且问“信道的最大极限速率”,此时两个定理都要算一遍,取两者的最小值作为最终的物理极限速率:

Creal max=min⁡(2Blog⁡2V, Blog⁡2(1+S/N))C_{\text{real max}}=\min\bigl(2B\log_2 V,\ B\log_2(1+S/N)\bigr)

上述的 B 其实就是 W,是一个东西。

极限情况下(奈奎斯特定理):极限数据率 Cmax=2W⏟极限波特率 RB×log⁡2(V)⏟每个码元的比特数(bps)\text{极限数据率 } C_{max} = \underbrace{2W}_{\text{极限波特率 } R_B} \times \underbrace{\log_2(V)}_{\text{每个码元的比特数}} \quad (\text{bps})

非极限情况下,事实上就是:S=RB×log⁡2(V)(bps)S = R_B \times \log_2(V) \quad (\text{bps})

而在香浓公式里面,则没有波特率存在。

传输介质#

有线传输介质:双绞线、同轴电缆、光纤。

无线传输介质:无线电波、微波、红外线、激光。

几个需要注意的点:

  • 单模光纤纤芯细、只传一种模式,传输距离远、带宽大,光源用激光二极管(LD),价格贵;
  • 多模光纤纤芯粗、多种模式同时传播,距离近,光源用发光二极管(LED),价格便宜。

双绞线价格便宜,两根线绞合在一起可以在一定程度上抵消干扰,绞合越密抗干扰越好。

同轴电缆可以抗比较强的干扰。

此外还可以注意四个特性,即机械特性,电气特性,功能特性,过程特性。

物理层设备#

这俩都属于第一层,也就是物理层。

中继器#

放大和整形。

集线器#

从除了自己之外的所有端口转发,不能隔离冲突域、广播域。

需要注意集线器再生电流需要时间,看题目里怎么表示。

数据链路层#

数据链路层 - 考纲#

  • 数据链路层的功能
  • 组帧
  • 差错控制
    • 检错编码
    • 纠错编码
  • 流量控制与可靠传输机制
    • 流量控制
    • 可靠传输与滑动窗口
    • 停止等待
    • 后退 N 帧
    • 选择重传
  • 介质访问控制
    • 信道划分:频分复用,时分复用,波分复用,码分复用
    • 随机访问:ALOHA 协议,CSMA 协议,CSMA/CD 协议,CSMA/CA 协议
  • 局域网
    • 局域网的基本概念与体系结构
    • 以太网与 IEEE 802.3
    • IEEE 802.11
    • VLAN 的基本概念与基本原理
  • 广域网
    • 广域网的基本概念
    • PPP 点对点协议
  • 数据链路层设备
    • 以太网交换机及其工作原理

数据链路层基本功能#

对 OSI 参考模型,该层需要实现差错控制、流量控制、介质访问控制。

对 TCP/IP 模型而言,该层只需要实现差错校验(没有控制,错了就直接丢)。

组帧#

字符计数法#

在帧头用一个计数字段记录本帧的总字节数,接收方数够这么多字节就认为一帧结束。

问题是计数字段一旦出错,后面所有帧的边界都会跟着错位,所以实际协议很少单独用它。

字节填充法#

例如 PPP 协议,需要使用字节填充法。

零比特填充法#

每 5 个连续的 1,就往后面插入一个 0。

违规编码法#

例如差分曼彻斯特编码,不可能出现连续的电平,所以用这个标志来作为帧的边界。

差错控制#

检错码与纠错码理论#

l=d+c+1l=d+c+1,且 d≥cd\geq c。

l 是码距,该编码集的码距的意思是任意两个有效字的码距的最小值。

码距计算即按位异或,同为 0,异为 1,1 的个数即码距。

d 指的是检错能力,c 指的是纠错能力。

奇偶校验码#

  • 奇校验码:最后加一位校验码,导致总共 1 的个数是奇数

  • 偶校验码:最后加一位校验码,导致总共 1 的个数是偶数

如果发的信息违背了这个,那么就说明是错的。

只能检测奇数位错误,不能检测偶数位错误。

CRC 循环冗余校验#

采用多项式除法,余数为校验码。减法采用模 2 减法,即异或运算。

计算方法为约定一个 r+1 为的多项式,然后用原式补 r 个 0 进行除法,在计算的时候使用模 2 减法。

最后把余数拼接得到要发送的东西。

校验的时候直接除,为 0 是对的。

海明码#

  • 海明码的位数:背公式,设信息位为 n 位,校验位为 k 位,则 2k≥n+k+12^k \geq n + k + 1。其实简单来说,k 个校验位可以表达 2^k 种状态,必须要覆盖 n+k 个位置报错和 1 种无错状态。
  • 海明码的校验位占据所有 2 的整数次幂的位置,即 H1H_1、H2H_2、H4H_4、H8H_8,剩余位置为信息位,信息位按序填入。
位号(十进制)H7H_7H6H_6H5H_5H4H_4H3H_3H2H_2H1H_1
位号(二进制)111111110110101101100100011011010010001001
角色分配D4D_4D3D_3D2D_2P3P_3D1D_1P2P_2P1P_1
填入数值110011?00??

海明码如何填入?对于 P1,显然 H1,H3,H5,H7 的最后一位是 1,所以 P1 = D1 异或 D2 异或 D4。同理对于 P2,显然 H2,H3,H6,H7 为 1,所以 P2 = D2 异或 D3 异或 D4。

如何纠错?如果将 S1 = P1 异或 D1 异或 D2 异或 D4,如果 S1,S2,S3 全为 0,那么没有错误。如果 S3S2S1 = 二进制,对应的位错了,需要反过来。

流量控制与可靠传输机制#

停止等待协议#

停止等待协议顾名思义发一个,收完之后发确认帧然后再发。

可以采用 ack0 和 ack1 交替使用的方式。

回退 N 帧协议#

需要注意回退 n 帧协议的累计确认。

对于滑动窗口协议,假设用 nn 位序号编号,那么发送窗口与接收窗口之和不超过 2n2^n。

由于回退 N 帧的接收窗口为 1,所以发送窗口最大为 2n−12^n-1。

选择重传协议#

没有累计确认。

同样地,序号用 nn 位时,发送窗口与接收窗口之和不超过 2n2^n。

一般取发送窗口等于接收窗口,所以各设为 2n−12^{n-1}。但其实只要两者之和不超过 2n2^n 就行,不必相等。

信道利用率分析#

U=TdTd+RTT+TaU=\frac{T_d}{T_d+\text{RTT}+T_a}

最大信道利用率(对于回退 N 帧和选择重传协议):

Umax⁡=N TdTd+RTT+TaU_{\max}=\frac{N\,T_d}{T_d+\text{RTT}+T_a}

这里的 NN 指的是发送窗口。

尤其需要注意,信道利用率 ≠ 数据率,在计算的时候要注意不要想错算什么。

介质访问控制#

时分复用 TDM#

时分复用即按固定次序分配时序,优化为 STDM,统计时分复用,动态分配时隙。

通常用于数字信号的传播。

频分复用 FDM#

子频带之间需要隔离频带。

通常用于模拟信号的传播。

波分复用 WDM#

光的频分复用。

码分复用 CDM#

使用不同编码来区分各个原始信号,即共享时间,又共享信道的频率。

简单来讲,每个站点的码片都要和其他正交(注意如果选项中有多个码片,那么也得相互正交)。将得到的原始信息和自己相乘,除以码片长度得到信息。

如果是 1,代表 1,如果是 -1,代表 0。

ALOHA 协议#

  • 纯 ALOHA 协议:任何一个站点需要发送数据时,可以立刻发送,无须检测信道状态。如果一段时间未收到确认,则认为发生了冲突。
  • 时隙 ALOHA 协议:将时间划分为等长的时隙,要求所有站点同步时钟,且帧发送时间必须小于等于一个时隙。

CSMA 协议#

载波监听机制。

  • 1-坚持 CSMA 协议:如果监听到信道空闲,则立刻发送数据。如果监听到信道忙,则持续监听,直到信道空闲后立刻发送数据。
  • 非坚持 CSMA 协议:如果监听到信道空闲,则立刻发送数据。如果监听到信道忙,则等待一个随机时间后,再次监听信道。
  • p-坚持 CSMA 协议:如果监听到信道空闲,有概率 p 立刻发送数据,有概率 1-p 推迟到下一个时隙。

令牌传递协议#

一个令牌沿着环形网络在各个站点之间依次传递。

  • 当网络空闲时,环路中只有令牌帧在循环传递
  • 当令牌传递到有数据要发送的站点时,该站点修改标志位,并且在令牌中附带数据,发出去
  • 沿着环路传递,如果目的地址和本站点相同,复制帧到本地,但是继续转发
  • 返回到原站为止,不再转发,并判断是否出错,错了再生成再发
  • 源站重新生成令牌,交给下一个站交出控制权

适合高负载广播信道。

局域网#

LLC 子层与 MAC 子层。

可以理解为 LLC 子层是为了解决和物理层对接相关问题的,而 MAC 子层是解决和网络层对接相关问题的。

以太网与 IEEE 802.3#

以太网逻辑拓扑为总线型,物理拓扑为星形。

以太网本身是无连接的,采用曼彻斯特编码。

以太网传输介质#

标准名称传输介质编码方式物理拓扑最大段长最多节点数
10Base-5同轴电缆(粗缆)曼彻斯特编码总线形500m100
10Base-2同轴电缆(细缆)曼彻斯特编码总线形185m30
10Base-T非屏蔽双绞线曼彻斯特编码星形100m2
10Base-F光纤对(850nm)曼彻斯特编码点对点2000m2

网络适配器:

  • 工作层次:物理层与数据链路层(教材侧重其工作在数据链路层)。
  • 核心部件:内置处理器和存储器(用于缓存数据)。

网络适配器功能:

  • 串并转换:与局域网介质之间采用串行传输,与计算机内部 I/O 总线之间采用并行传输,网卡负责二者转换。
  • 信号匹配:负责物理连接与电信号的电平匹配。
  • 帧处理:负责数据帧的封装、拆封、发送与接收。
  • 介质访问控制:执行链路层的介质访问控制协议。
  • 编解码:负责物理信号的编码与解码。
  • 中断交互:收到正确的帧后通过硬件中断通知主机 CPU,将数据向上交付网络层;发送时接收网络层下传的 IP 数据报进行封装。

以太网 mac 地址#

48 位全球唯一地址,6B。

高 24 位为厂商标识,低 24 位由厂商自行分配。

需要注意,第一个字节的第 8 位如果为 0,代表是单播地址,如果为 1,代表为多播地址,只有 ff-ff-ff-ff-ff-ff 是广播地址;第一个字节的第 7 位如果是 0,那么代表是全球管理的设备,如果是 1,代表的是本地管理的设备。

CSMA/CD 协议#

需要注意避退。从 [0, 2^k - 1] 中选择一个数,k 为重传次数且最大为 10。

如果重传次数达 16 次还失败,那么网络拥塞,放弃该帧并汇报。

此外,如果检测到冲突,要人为发送干扰信号(32 位或 48 位),让所有站点都知道发生了冲突

帧间最小间隔为 96 bit 发送时间。

CSMA/CD 协议流程

  • 准备发送
  • 检测信道(在 96 bit 发送时间里保持空闲)开始发送
    • 发送成功
    • 发送失败

以太网的 mac 帧#

662n4,收发协数验。

目的地址(谁收) - 源地址(谁发) - 协议 - 数据(46-1500B) - FCS 验证(是 CRC 最后算出来的东西)。

当然最前面还有前同步码 8B,前 7B 为 10101010B,最后 1B 为 10101011。

以太网不需要帧结束界定符,因为有帧间最小间隔来界定。

协议指的是上层采用什么协议,例如 IP 协议。

高速以太网#

  • 100Base-T:星形以太网,全双工 / 半双工。半双工采用 CSMA/CD,最短帧长仍是 64B,用双绞线。帧间最小间隔从 9.6 μs9.6\,\mu\text{s} 减到 0.96 μs0.96\,\mu\text{s}
  • 吉比特以太网:全双工 / 半双工,采用光纤 / 双绞线。
  • 十吉比特以太网:全双工,采用双绞线 / 光纤

无线局域网#

有基础设施的 WLAN

  • BSS:基本服务集,无线网的最小构建单元,1 基站 + 若干移动站
  • ESS:扩展服务集,多个 BSS 通过分配系统(DS,通常是有线网络)组合起来

无基础设施的 WLAN

  • 临时组建,没有中心基站。每一个人都是发送接收端,又充当帮别人转发数据的路由器。

CSMA/CA#

802.11 协议采用的,并且采用停止等待协议。

DCF 方式与 PCF 方式。

前者是分布式协调功能,不需要任何中心控制。各站之间通过争夺信道来获得发送权,且这是最常见也是 CSMA/CA 必须实现的方式。

后者采用 AP 集中控制,采用类似探寻的机制轮流分配。

而基于此又引出三个帧间间隔:

DIFS、PIFS、SIFS。其中 SIFS 是最短的 IFS,他是用于分割一个对话的连续帧,例如 ACK、CTS,分片后的数据以及对 AP 的探寻等。

检测到冲突必须等待 DIFS 的时间,且推迟总是发生在 DIFS 之后。

以 A 发送数据为例子,假设检测到空闲,那么等待 DIFS 的时间直接发送。

如果检测到忙,那么设置一个计时器,冻结该计时器,自动等待空闲。当空闲的时候,先等待 DIFS 的时间,然后启动计时器开始争夺信道,如果计时器为 0,立刻发送,不是,重复 2。

争夺窗口采用二进制指数避退。

为缓解隐蔽站问题,802.11 协议允许对信道进行预约。

流程为:

  • A 先检测信道,空闲,等待 DIFS 的时间,然后发送 RTS 告诉所有人我要占用 SIFS+CTS+SIFS+DATA+SIFS+ACK 的时间
  • AP 收到 RTS 帧且空闲,等待 SIFS,广播一个允许发送 CTS 的控制帧。
  • A 站收到 CTS 后,等待 SIFS,发送数据。

需要注意的是,只有预约的时候才这么做,普通正常发送直接发就好了。

CSMA/CA 思想是先打招呼再发送。

802.11 mac 帧#

2-2-6-6-6-2-6-n-4,即帧控制 2B - 持续期 2B - 地址 1(6B)- 地址 2(6B)- 地址 3(6B)- 序列控制 2B - 地址 4(6B,用于自组网络,不讨论)- 0~2312B 数据 - FCS 4B

在一个局域网内,谁收,谁发,最终发给谁。

需要注意,如果是不同的局域网,那么要改最终发给谁。

VLAN 与 802.1q 帧#

在 802.3 帧的源地址后加了 4B 的 VLAN。

在数据链路层隔离广播域。

CSMA/CD 相关的计算#

对于 10Base-T 以太网,数据率为 10 Mb/s10\text{ Mb/s},最短帧长为 64 B64\text{ B},所以最短帧的发送时间为

64×8 bit10 Mb/s=51.2 μs\frac{64\times 8\text{ bit}}{10\text{ Mb/s}}=51.2\,\mu\text{s}

这个时间就是争用期,也叫端到端往返时延的上限。

假设介质传播速率为 vv,最大介质长度为 xx,则要求

2xv≤51.2 μs\frac{2x}{v}\le 51.2\,\mu\text{s}

此外,如果有额外的时延(例如 Hub 的再生比特流时延),需要 2 倍(因为一来一回)。

广域网#

点对点接入,OSI 层次为下三层。强调资源共享。

主要是 PPP 协议。

LCP:一个链路控制协议,建立配置。

NCP:一套网络控制协议,支持多个网络层协议。

先 LCP,然后 NCP。

PPP 是字符填充,面向字节的服务,提供有连接不可靠服务。

可以支持不同网络层协议。

仅支持点对点全双工。

字节填充法如下:

PPP 帧的前后都有一个专门标记帧开始和结束的标志字段(Flag),固定是十六进制的 0x7E(二进制 01111110)。

在 PPP 中,定义了转义字符为十六进制的 0x7D(二进制 01111101)。具体的转义规则是:遇到特殊字符,就插入 0x7D,并将原来的字符与 0x20 进行异或(XOR)运算。

具体分三种情况(发送端处理):

情况一:信息字段中出现了标志字节 0x7E

处理办法:把它转义成两个字节的序列:(0x7D, 0x5E)。

原理:0x7E⊕0x20=0x5E\mathtt{0x7E}\oplus\mathtt{0x20}=\mathtt{0x5E}。

情况二:信息字段中出现了转义字节 0x7D

处理办法:把它转义成两个字节的序列:(0x7D, 0x5D)。

原理:0x7D⊕0x20=0x5D\mathtt{0x7D}\oplus\mathtt{0x20}=\mathtt{0x5D}。

情况三:出现了 ASCII 控制字符(数值小于 0x20 的字符)

比如回车、换行或者通信控制符(如 0x03)。

处理办法:同样在前面插入 0x7D,同时该字符加上(或异或)0x20。

例如:字符 0x03 会被转化为 (0x7D, 0x23)。

接收端如何还原?

接收端扫描数据流,只要发现 0x7D,就把它丢弃(删除);

然后把紧接着后面的那个字节与 0x20 进行异或运算,直接恢复出原始字节!

如果是普通字符,就正常原样接收。

数据链路层设备#

属于第二层,也就是数据链路层设备。

网桥#

网桥工作在数据链路层,连接两个网段,按 MAC 地址转发帧,能隔离冲突域,不能隔离广播域。

收到帧后先看源 MAC 学习端口,再看目的 MAC:知道就单播转发,不知道就向除入口外的所有端口泛洪。

需要注意,网桥要防止环路,因为二层帧没有 TTL,环路上的广播会一直循环,所以要用生成树协议(STP)在逻辑上阻塞掉部分端口。

网桥和集线器的区别:集线器是物理层设备,收到什么就往所有端口发什么,所有端口在同一个冲突域;网桥是链路层设备,能按 MAC 选择性转发,每个端口就是一个冲突域。

交换机#

多端口网桥,隔离冲突域,不能隔离广播域。

共享式以太网与交换式以太网#

前者采用集线器,工作在物理层;后者采用交换机,工作在数据链路层。

交换机自学习模型(含 VLAN)#

设有一台支持 802.1Q 的以太网交换机 SW,拥有 4 个端口:

  1. 端口 1:Access 端口,PVID 为 10,连接主机 A(MAC 地址为 MAC_A)。
  2. 端口 2:Access 端口,PVID 为 20,连接主机 B(MAC 地址为 MAC_B)。
  3. 端口 3:Access 端口,PVID 为 10,连接主机 C(MAC 地址为 MAC_C)。
  4. 端口 4:Trunk 端口,允许 VLAN 10 和 VLAN 20 通过,连接上级交换机。

初始状态:

交换机的 MAC 地址表完全为空。

(注意:带 VLAN 的交换机,MAC 表项结构为:MAC 地址、VLAN ID、端口号)

步骤一:主机 A 向主机 C 发送数据帧(广播泛洪与初次学习)#

  1. 发送:主机 A 发送普通以太网帧(无 q 标签),源 MAC 为 MAC_A,目的 MAC 为 MAC_C。
  2. 接收与打标:数据帧从端口 1 进入。因为端口 1 是 Access 端口且 PVID 为 10,交换机在内部为该帧打上 VLAN 10 的 802.1Q 标签。
  3. 自学习:交换机记录下源地址与接口关系,MAC 地址表新增一条记录: MAC_A,VLAN 10,端口 1。
  4. 查找与转发: 交换机查找目的地址 MAC_C,在 VLAN 10 的表项中未找到(未知单播帧),执行局域网内泛洪。 根据 VLAN 隔离规则,该帧只能在 VLAN 10 内泛洪:
    • 端口 2 属于 VLAN 20,直接阻断,不转发。
    • 端口 3 是 Access 端口(属于 VLAN 10),交换机剥离 802.1Q 标签,还原为普通帧(无 q)发送给主机 C。
    • 端口 4 是 Trunk 端口(允许 VLAN 10),交换机保留 VLAN 10 的 802.1Q 标签(含 q),将带标签的帧发往上级交换机。

此时 MAC 表状态:

  • MAC_A,VLAN 10,端口 1

步骤二:主机 C 收到后,向主机 A 回复响应帧(单播转发与对端学习)#

  1. 发送:主机 C 发送普通以太网帧(无 q 标签),源 MAC 为 MAC_C,目的 MAC 为 MAC_A。
  2. 接收与打标:数据帧从端口 3 进入,交换机内部为其打上 VLAN 10 标签。
  3. 自学习:交换机记录 MAC_C 的位置,MAC 地址表新增记录: MAC_C,VLAN 10,端口 3。
  4. 查找与转发: 交换机在 VLAN 10 中查找目的地址 MAC_A,成功命中第一步学到的记录(端口 1)。 交换机将帧导向端口 1。端口 1 为 Access 端口,交换机剥离 802.1Q 标签,将无 q 的标准以太网帧发给主机 A。 本次转发为精确单播,端口 2 和端口 4 均不会收到此帧。

此时 MAC 表状态:

  • MAC_A,VLAN 10,端口 1
  • MAC_C,VLAN 10,端口 3

步骤三:上级交换机经由 Trunk 口向主机 B 发送数据帧(带 q 帧的学习)#

假设上级设备有一台属于 VLAN 20 的外部服务器 D(MAC 地址为 MAC_D),向主机 B 发送数据:

  1. 接收:数据帧通过端口 4(Trunk 口)流入,该帧在物理链路上本身就已经带有 VLAN 20 的 802.1Q 标签(含 q)。
  2. 自学习:交换机读取帧头和标签,记录外部主机的位置,MAC 地址表新增记录: MAC_D,VLAN 20,端口 4。
  3. 查找与转发: 交换机查找目的 MAC_B,此时表中还没有 MAC_B 的信息。 交换机在 VLAN 20 内部进行泛洪:
    • 端口 1、端口 3 属于 VLAN 10,受到逻辑隔离,绝对不会收到该数据。
    • 端口 2 是 Access 端口且属于 VLAN 20,交换机剥除 802.1Q 标签,将普通帧(无 q)递交给主机 B。

此时 MAC 表状态:

  • MAC_A,VLAN 10,端口 1
  • MAC_C,VLAN 10,端口 3
  • MAC_D,VLAN 20,端口 4

步骤四:主机 B 回复服务器 D(跨链路带 q 转发)#

  1. 发送:主机 B 发出响应帧(无 q),源 MAC 为 MAC_B,目的 MAC 为 MAC_D。
  2. 接收与打标:帧进入端口 2,被打上 VLAN 20 标签。
  3. 自学习:交换机记录 MAC_B 的位置,MAC 地址表补全: MAC_B,VLAN 20,端口 2。
  4. 查找与转发: 交换机查询 VLAN 20 表项,发现目的 MAC_D 对应的出口是端口 4。 端口 4 是 Trunk 口且允许 VLAN 20,因此交换机保留 802.1Q 标签(含 q),把带有 VLAN 20 标记的帧直接通过端口 4 送出。

最终完整的 MAC 表状态:

  • MAC_A,VLAN 10,端口 1
  • MAC_C,VLAN 10,端口 3
  • MAC_D,VLAN 20,端口 4
  • MAC_B,VLAN 20,端口 2

核心就是先登记后泛洪转发,如果采用了 VLAN 机制,那么在交换机内部需要登记为同一个网,而转发的时候则是发没有 q 的帧,或者如果就是要发往 q 的,直接发。

网络层#

网络层 - 考纲#

  • 网络层的功能
    • 异构网络互连
    • 路由与转发
    • SDN 的基本概念
    • 拥塞控制
  • 路由算法
    • 静态路由与动态路由
    • 距离 - 向量算法
    • 链路状态算法
    • 层次路由
  • IPv4
    • IPv4 分组
    • IPv4 与 NAT
    • 划分子网与子网掩码
    • CIDR
    • 路由聚合
    • ARP
    • DHCP
    • ICMP
  • 路由协议
    • 自治系统
    • 域内路由与域间路由
    • RIP
    • OSPF
    • BGP
  • IP 多播
    • 多播的概念
    • IP 多播地址
  • 移动 IP
    • 移动 IP 的概念
    • 移动 IP 的通信过程
  • 网络层设备
    • 路由器的组成和功能
    • 路由表与分组转发

网络层基本功能#

异构网络互连#

异构网络的意思是把体系结构、通信协议、传输介质、拓扑结构都不同的网络连起来,典型的代表是广域网和局域网互连。

IP 协议的存在是为了消除这些异构性的。

路由与转发#

  • 路由选择
  • 分组转发

虚电路与数据报#

辨析一下:

  • 电路交换
  • 报文交换
  • 分组交换
    • 虚电路
    • 数据报

虚电路和数据报都是分组交换的一种。

虚电路在建立之前需要进行路由选择,并且别的虚电路也可以使用自己的部分结点。

虚电路有自己的差错控制,可以保证按序到达,提供端到端的交付,有连接可靠的服务。由于存在 VCID,所以不必提供完整地址,首部开销小。

对故障能力适应差。

考虑这样一种情况,假设在运行的过程中所有的结点逐渐故障,那么虚电路需要频繁的重新建立和拆除。虚电路的建立和拆除非常消耗资源。并且,路径一开始就是定死的,所以一个结点故障直接瘫痪。

所以其对故障的适应能力差。

数据报提供无连接不可靠的服务,只是尽最大努力交付,所以对故障的适应能力强。

而对于电路交换,其是专门选择一条物理链路专门占有,其数据率高,对故障适应能力差。

即传输时延极小、实时性强、通信带宽稳定,但是资源利用率差。

软件定义网络#

SDN 即控制平面与数据平面解耦。控制平面负责路由选择,数据平面负责转发。

北向接口和南向接口,从实际角度理解,也就是北向南,给上层应用提供标准化 API,南向北,通过 OpenFlow 等协议统一控制。

东西 向接口,控制集群内部通信。

SDN 优势:集中控制与分布转发;灵活可编程;成本降低

SDN 挑战:安全风险,一旦崩溃全网络崩溃;性能瓶颈,集中控制着网络规模扩大,控制器成为性能瓶颈

拥塞控制#

在 OSI 模型对应的网络层,需要实现拥塞控制。

拥塞控制即负载增大单吞吐量增长甚微,进入轻度拥塞状态;负载增大吞吐量下降,进入拥塞状态。

主要有两种方法:

  • 开环控制:系统设计的时候预先考虑拥塞的情况,静态策略防止拥塞发生
  • 闭环控制:动态检测网络,基于反馈机制

IPV4#

IPv4 分组格式#

分组格式考试会给,不过还是要理解每个字段的含义。

  • 版本:4 位,表示 IP 协议版本,比如 IPv4 是 4。
  • 首部长度:4 位,4 字节为单位。如果首部没有可选字段,那么首部最短为 20 字节,首部长度字段也就是 0101,即 5,首部可选字段最长为 40,所以总共最长是 60 字节
  • 总长度:16 位,1 字节为单位。
  • 标识:占 16 位,源主机设置的递增 计数器,以便正确让目的主机重组为原数据报
  • 标志:3 位,低 2 位有意义,MF = 1 表示后面还有分片,DF = 1 表示不能分片
  • 片偏移:13 位,以 8 字节为单位,所以每个分片的数据部分必须是 8 的整数倍
    • 例如链路层 MTU 为 800B,减去 20B 首部后每个分片的数据部分最多 780B,但 780 不能被 8 整除,所以第一个分片取 776B,剩下的 224B 作为第二个分片
    • 第二个分片的片偏移是 776/8=97776/8=97,第一个分片的 MF 置 1,最后一个分片的 MF 置 0
  • 生存时间 TTL:占 8 位
  • 协议:占 8 位,表示应该交付给上层哪个协议,例如 TCP / UDP。TCP 是 6,UDP 是 17
  • 首部校验和:占 16 位,只校验首部,需要注意,采用反码求和,反码求和需要回卷
  • 源地址
  • 目的地址

IPv4 的地址(IP 地址)#

  • 分类的 IP 地址:A 类地址,B 类地址,C 类地址,D 类地址,E 类地址,其中 D 类地址是多播地址,E 类地址保留使用

  • 主机号全为 0,表示网络本地地址,即网络地址

  • 主机号全为 1,表示广播地址

  • 127.x.x.x,表示本地环回测试

  • 32 位全为 0,表示本网络上的本主机

  • 32 位全为 1,表示受限广播地址

  • 网络号为 0.x.x.x,表示特殊用途

  • 划分子网:从主机号里借若干位当子网号。原本主机号是 mm 位,借 nn 位就能划出 2n2^n 个子网,每个子网可用主机数是 2m−n−22^{m-n}-2,减 2 是因为主机号全 0 和全 1 不能用。

  • 子网掩码:网络号和子网号对应的位置全 1,主机号对应的位置全 0。例如 255.255.255.0 表示前 24 位是网络部分,后 8 位是主机部分。

    • 判断两个地址是否同子网,就是把各自的 IP 和子网掩码按位与,比较结果是否相同。
    • 变长子网掩码可以按需分配,前缀长的子网放主机少但需求多的网段,避免浪费。
  • 默认网关:即默认的网关地址,例如 192.168.1.1,表示默认的网关地址。

  • 无分类编址 CIDR:即无分类的域间路由,不区分网络号和主机号。例如 211.211.211.211/23,表示网络号为 23 位,主机号为 9 位。

  • 路由聚合:把多个连续的小前缀合并成一个更大的前缀。例如 211.211.212.0/24 和 211.211.213.0/24 可以合并成 211.211.212.0/23;211.211.211.0/24 与它们不连续,只能单独保留。

    • 想一次覆盖 211、212、213 三个网段,只能用 211.211.210.0/22,但这样会把 210、214、215 也一起宣告出去,实际配置里通常不这么做。
    • 聚合的前提是起始地址对齐到同一个边界,否则合并不了;最长前缀匹配保证更具体的路由优先。
  • 辨析 CIDR 与划分子网:简单来讲,对于一个网络 211.211.211.211/23,其表达能力和网络是 211.211.211.211,子网掩码是 255.255.254.0 是一致的。所以在路由聚合的时候,需要注意网络的表达

  • 划分子网

    • 定长子网掩码划分
    • 变长子网掩码划分

NAT 技术#

在做题的时候,一定要注意 NAT 技术。

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255

这三块地址是专门划分给内网使用的,不能直接用于公网。

网络层分组#

注意默认网关以及网络的设置,例如路由器里可以设置:

其他:0.0.0.0/0,或者 0.0.0.0,子网掩码为 0.0.0.0

默认路由写成 0.0.0.0/0,能匹配所有目的地址,但它前缀最短,所以只有其他路由都匹配不上时才会走它。

需要注意,默认路由的表项越少越好,因为它只在本地路由表里“托底”,真正的转发还是靠更具体的前缀。

ARP 地址解析协议#

工作在网络层,具体见后面的场景分析。

DHCP 协议#

  • 协议基础属性
  1. 协议定位:应用层协议,采用 C/S(客户/服务器)架构。
  2. 底层传输协议:基于 UDP 协议。
    • 端口号:DHCP 服务器监听端口为 UDP 67,DHCP 客户监听端口为 UDP 68。
  3. 为什么选择 UDP 而非 TCP?
    • 客户机在初始阶段没有自己的 IP 地址,也不知道服务器的 IP 地址,无法进行 TCP 的“三次握手”来建立面向连接的信道;
    • UDP 无须建立连接,并且天然支持广播,完全契合初始无 IP 状态下的通信需求。
  • 初次获取 IP 地址交互全过程(四步握手)

发现(Discover) →\to 提供(Offer) →\to 请求(Request) →\to 确认(ACK)

这四步的 IP 层通信全部采用广播方式。

DHCP 客户 DHCP 服务器群
| |
| ----- 1. DHCP Discover (广播寻找) --------> |
| |
| <---- 2. DHCP Offer (广播提供配置) -------- |
| |
| ----- 3. DHCP Request (广播选定并通告) ---> |
| |
| <---- 4. DHCP ACK (广播确认生效) ---------- |
v v
  • DHCP 发现报文(DHCP Discover)

    • 方向:客户 →\to 网络中所有主机(广播)
    • 源 IP 地址:0.0.0.0(客户尚未获得 IP)
    • 目的 IP 地址:255.255.255.255(受限广播地址)
    • 核心目的:寻找局域网内所有可用的 DHCP 服务器。
  • DHCP 提供报文(DHCP Offer)

    • 方向:DHCP 服务器 →\to 客户(广播)
    • 源 IP 地址:DHCP 服务器自身 IP
    • 目的 IP 地址:255.255.255.255
    • 携带信息:拟分配给客户的 IP 地址、子网掩码、默认网关、DNS 服务器 IP、租用期(Lease Time)等。
    • 注意点:凡收到 Discover 报文的服务器均可响应,因此客户机可能会收到多份 Offer 报文。
  • DHCP 请求报文(DHCP Request)

    • 方向:客户 →\to 网络中所有主机(广播)
    • 源 IP 地址:0.0.0.0(此时尚未正式得到最终确认授权,仍不可用)
    • 目的 IP 地址:255.255.255.255
    • 关键考点(为什么依然广播?):
      • 客户只能选择其中一个 Offer(通常选择最先到达的)。
      • 采用广播的目的是通知所有服务器:不仅正式向“被选中的服务器”请求配置,更重要的是公开通告其他未被选中的服务器,以便它们及时释放为该客户预留的 IP 地址及资源。
  • DHCP 确认报文(DHCP ACK)

    • 方向:被选中的 DHCP 服务器 →\to 客户(广播)
    • 源 IP 地址:DHCP 服务器自身 IP
    • 目的 IP 地址:255.255.255.255
    • 结果:确认绑定关系,将 IP 地址正式分配给客户。客户机收到 ACK 后,网络参数正式配置生效。
    • 注:若服务器发现拟分配的 IP 已被占用或无效,则发回 DHCP NAK(否认报文),客户需重新从第一步开始申请。
  • 租用期管理机制(Lease Lifecycle)

DHCP 分配的 IP 均为临时借用,具有时间限制(租用期,由服务器决定)。

触发节点动作类型通信方式源 IP目的 IP处理结果与后续操作
租期达到 50%发送 DHCP Request 申请续租单播当前已分配的 IP原分配服务器的 IP① 若同意:服务器返回 单播 DHCP ACK,租期重置刷新。② 若拒绝:服务器返回 单播 DHCP NAK,客户立刻停止使用该 IP,退回 Discover 重新申请。
租期达到 87.5%发送 DHCP Request 再次续租广播当前已分配的 IP255.255.255.255因原服务器无响应,改用广播向全网任何 DHCP 服务器求助。① 若收到 ACK:继续使用并更新租期。② 若租期到期(100%)仍无应答:客户强制释放该 IP,从头重新申请。
随时/提前退出发送 DHCP Release 释放租期单播当前已分配的 IP原分配服务器的 IP客户机主动下线或释放网络连接,服务器收回该 IP 地址供其他主机使用。
  • 关键陷阱
  1. 第 1 步与第 3 步的源 IP 为什么都是 0.0.0.0?
    • 答:第 1 步完全没有 IP;第 3 步虽然选定了 IP,但该 IP 尚未经过服务器最终 ACK 确认授权,因此仍不能作为有效源 IP 使用。
  2. 为什么 50% 续租是单播,而 87.5% 续租是广播?
    • 答:50% 时只是常规续约,定向找原服务器即可(单播精确省资源);87.5% 时原服务器大概率已宕机或脱网,必须广播向局域网内其他可能存在的 DHCP 服务器寻求续租拯救。
  3. 租期更新失败的下场?
    • 答:无论是在 50% 收到 NAK,还是在 100% 耗尽未果,客户机必须立刻停止使用当前 IP!

DHCP 具体流程分析见应用层的最终模型。

ICMP#

  • ICMP 差错报文

    • 终点不可达
    • 时间超过
    • 参数问题
    • 改变路由(重定向)
    • 源点抑制:拥塞而丢弃,新的已经取消
  • 防止无限循环或无意义反馈,对以下不汇报

    • ICMP 差错报文本身
    • 第一个数据分片后的所有分片
    • 目的地址为多播 / 广播
    • 特殊地址(127.0.0.0,0.0.0.0)
  • ICMP 询问

    • 回送请求和回答报文:是否可达
    • 时间戳请求和回答报文:测 TTL
  • ICMP 应用

    • 分组探测 ping
    • 路由跟踪(逐渐增大 TTL)

需要注意,ICMP 报文不对校验错误的报文发送差错报文,而是等待计时器超时自动重发。

因为 IP 协议是无连接不可靠的。

IPV6#

和 IPv4 不同的东西

  • 地址是 21282^{128} 个

  • 只有源主机才能分片,路由器碰到过大的分片直接丢弃

  • 没有校验和字段

  • 基本首部是 40B

  • 跳数限制最大为 255

  • IPv6 支持单播、多播、任播

  • IPv6 缩写

    • 省略前导 0
    • 仅可以出现一个 ::
  • IPv6 只有一个环回地址,是 ::1/128。

  • IPv4 向 IPv6 过度

    • 双协议
    • 隧道技术

路由算法#

  • 距离向量算法
  • 链路状态算法
  • 路径向量算法

距离向量算法基于 Bellman-Ford 方程,每个路由器只和邻居交换自己的整张路由表,更新规则是

D(x,y)=min⁡v{c(x,v)+D(v,y)}D(x,y)=\min_v\bigl\{c(x,v)+D(v,y)\bigr\}

其中 c(x,v)c(x,v) 是 x 到邻居 v 的链路代价,D(v,y)D(v,y) 是邻居 v 到目的地 y 的代价。RIP 就是这种算法,收敛慢,可能无穷计数。

链路状态算法基于 Dijkstra,每个路由器把自己周围的链路状态泛洪给全网,各自算最短路径树。收敛快、不会环路,代价是存储和计算开销大。OSPF 就是这种算法。

路径向量算法在距离向量基础上再记录完整的 AS 路径,BGP 用它,天然能检测环路。

需要注意,距离向量是“听邻居说”,链路状态是“自己看全局”,前者简单但慢收敛,后者复杂但稳定。

静态路由#

由网络管理员配置,例如可以配置 NAT 路由器的端口映射,比如把外网的 ip<80> 端口映射到内网的 ip<80> 端口。

层次路由#

层次路由是把网络按区域划分,区域内部用域内路由协议,区域之间用域间路由协议。

好处是路由表规模小、收敛快、区域内的拓扑变化不会扩散到全网;代价是最短路径可能不是全局最优。

需要注意,自治系统(AS)就是为了实现层次路由而划分的,域内追求最优路径,域间还要考虑策略、计费和政治因素,所以 BGP 选的不一定是最短路径。

内部网关协议 IGP - RIP#

跑在 UDP 上的,具体见下面的模型。

内部网关协议 IGP - OSPF#

划分出来的东西叫做区域,其边界路由器叫做区域边界路由器。

采用迪杰斯特拉算法,并且全局状态稳定了一致。

  • OSPF 报文
    • 问候(Hello)报文:发现并维护邻居关系
    • 数据库描述分组(DD 分组)
    • 链路状态请求(LSH)
    • 链路状态更新(LSA)
    • 链路状态确认(LSA)

外部网关协议 EGP - BGP#

iBGP:核心路由器,运行 iBGP 协议,时刻和其他核心路由器和边界路由器练习以确保得到路径。

eBGP:边界路由器。

划分出来的东西叫做自治系统。

  • BGP 路由选择优先级

    • 本地偏好值(网络管理员配置)
    • AS 跳数最短
    • 热土豆路由算法(这个指的是过内部网关协议的时候,走最短的那一条)
    • 选择 BGP 标识最小的
  • BGP 报文

    • 打开(open)报文
    • 更新(Update)报文
    • 保活报文(Keepalive)报文
    • 同质(Notification)报文

BGP 协议跑在 TCP 上。

IP 多播#

将 IP 地址的后 23 位,映射到 MAC 地址的后 23 位。

多播范围是 11100000.0.0.0-11101111.255.255.255,即 224.0.0.0-239.255.255.255。

采用多播转发树来避免环路。

多播组的管理靠 IGMP:主机通过 IGMP 报文告诉本地路由器自己要加入或退出某个多播组,路由器据此决定还要不要向这个网段转发多播数据。

需要注意,IGMP 只在主机和直连路由器之间工作,路由器之间的多播转发靠多播路由协议,这部分 408 不深究。

还要注意,多播 MAC 只映射后 23 位,所以一个 MAC 地址可能对应 32 个多播 IP,接收方还要在网络层再过滤一次。

移动 IP#

移动 IP 的全过程,就像你(移动节点)带号离家出走去外地旅游。

你到了外地后,先找当地的居委会(外地代理 FA)办个临时的暂住证(转交地址 CoA),并立刻打电话回老家,把这个暂住证号码告诉老家的村长(归属代理 HA)。

这样,以后别人再往你老家寄信(真实目的地仍是你的永久 IP),老家村长就会直接把信截胡,然后用一个更大的新信封把原信包起来(IP 隧道封装),写上你的暂住证号码寄到外地。

外地居委会收到大信封后,拆开扔掉,把里面的原信安全地交到你手里,从而保证你的 TCP 连接在漫游时永远不断线!

网络层设备#

路由器#

路由器工作在网络层,转发的是 IP 数据报,能连接不同的网络,也能在 IPv4 和 IPv6 之间做转换。

结构分四部分:

  • 输入端口:物理层接收、链路层解封装、查转发表决定送到哪个输出端口;
  • 交换结构:把分组从输入端口送到输出端口,常见实现是经内存交换、经总线交换、经交换网络(如 Crossbar)交换;
  • 输出端口:缓存排队、重新封装成帧发出去;
  • 路由处理器:运行路由协议,维护路由表,计算并下发转发表。

需要注意,输入端口排队过多会丢包,输出端口排队过多也会丢包,这就是路由器拥塞的来源;交换结构的速率决定了路由器的整体吞吐能力。

路由表与分组转发#

转发表由路由表计算得出。

路由表是路由协议算出来的,包含目的网络、下一跳、度量等;转发表是从路由表提炼的,只保留“查什么、从哪个口出去”,并且按最长前缀匹配来查。

需要注意,转发表里通常不存完整的 IP 地址,只存前缀,查表时把目的地址前缀逐位比较,取匹配最长的那一条,这就是默认路由 0.0.0.0/0 永远排在最后的原因。

RIP 协议全流程#

构建一条由三台路由器、四个子网组成的经典拓扑:

[子网 Net1] ----- (接口 E0) [路由器 R1] (接口 E1) ----- [子网 Net2] ----- (接口 E0) [路由器 R2] (接口 E1) ----- [子网 Net3] ----- (接口 E0) [路由器 R3] (接口 E1) ----- [子网 Net4]
  • 网络参数划分:
    • Net1:10.1.0.0/24
    • Net2:10.2.0.0/24(连接 R1 与 R2)
    • Net3:10.3.0.0/24(连接 R2 与 R3)
    • Net4:10.4.0.0/24
  • 协议规格说明:
    • 运行 RIPv2(底层基于 UDP 520 端口,多播目的地址为 224.0.0.9;若为 RIPv1 则为广播 255.255.255.255)。
    • 距离度量(Metric):跳数(Hop Count)。直连网络距离为 1(或在某些教材记为 0,王道/主流考研教材统一规定:直连网络跳数为 1,距离为 16 表示不可达)。以下均严格采用“直连跳数为 1,每过一跳加 1”的标准考研记法。

0 时刻启动#

  1. 0 时刻(刚开机/协议刚启动):主动索要(RIP Request)
    • 路由器刚启动时,如果在 30 秒周期内傻等,网络收敛就会很慢。
    • 因此,路由器刚初始化完毕,会立刻向所有使能接口多播发送一个 RIP 请求报文(Request Message),询问:“邻居们,把你们手头的路由表发我一份!”
    • 邻居收到后,立即针对该请求回送一个 RIP 响应报文(Response Message)。这样可以在几毫秒内迅速拿到邻居手里的初始路由。
  2. 常规运行期:周期性通告(RIP Response - 周期 30s)
    • 此后,路由器启动定时器,每隔 30 秒主动向外多播一次完整的路由表(携带自己当前所知的所有路由条目)。
    • -注:为防止同一局域网内所有路由器同时发包导致拥塞,这个 30s 通常会加上一个随机的小抖动(比如 25s ~ 35s)。-
  3. 三大定时器:
    • 更新定时器(30s):周期性发送全部路由。
    • 超时/失效定时器(180s):若 180s 没收到某个邻居关于某条路由的更新,将该路由的度量值直接置为 16(不可达)。
    • 垃圾收集定时器(120s):置为 16 后再等 120s,若仍无更新,彻底从路由表中抹除该条目。

时刻 T0T_0:初始上电状态#

各路由器仅知道与自己硬件端口物理直连的网络,跳数记为 1,下一跳为“直连(Direct)”:

  • R1 初始路由表:
    • Net1 →\to 距离:1, 下一跳:Direct
    • Net2 →\to 距离:1, 下一跳:Direct
  • R2 初始路由表:
    • Net2 →\to 距离:1, 下一跳:Direct
    • Net3 →\to 距离:1, 下一跳:Direct
  • R3 初始路由表:
    • Net3 →\to 距离:1, 下一跳:Direct
    • Net4 →\to 距离:1, 下一跳:Direct

第 1 次更新周期(T≈0∼30sT \approx 0 \sim 30\text{s}):相邻信息互换#

所有路由器向邻居发送自身的路由向量。

1. R1 与 R2 之间互换#

  • R2 将自己的表发给 R1:{Net2: 1, Net3: 1}
  • R1 收到后,先将所有条目距离全部加 1(变为 {Net2: 2, Net3: 2},下一跳设为 R2):
    • 对比 Net2:原先直连距离为 1,新送来的距离为 2,不更新。
    • 对比 Net3:原表中没有 Net3,学习新增条目!
    • R1 路由表更新为:
      • Net1 →\to 距离:1, 下一跳:Direct
      • Net2 →\to 距离:1, 下一跳:Direct
      • Net3 →\to 距离:2, 下一跳:R2(新学到!)
  • 同理,R2 收到 R1 的表 {Net1: 1, Net2: 1},加 1 后变为 {Net1: 2, Net2: 2}:
    • R2 学习到 Net1。

2. R2 与 R3 之间互换#

  • R2 收到 R3 的表,学习到 Net4(距离:2, 下一跳:R3)。
  • R3 收到 R2 的表,学习到 Net2(距离:2, 下一跳:R2)。

第 1 次更新结束后各表状态#

  • R1:知道 Net1(1), Net2(1), Net3(2);仍不知道 Net4!
  • R2:知道 Net1(2), Net2(1), Net3(1), Net4(2);(R2 率先收敛!)
  • R3:知道 Net2(2), Net3(1), Net4(1);仍不知道 Net1!

第 2 次更新周期(T≈60sT \approx 60\text{s}):跨跳信息扩散与全网收敛#

30 秒后,更新定时器再次触发。此时 R2 已经拥有了关于 Net4 和 Net1 的信息,并在本次广播中通告出去。

1. R2 发送路由表给 R1#

  • R2 发送的向量中包含条目 {Net4: 2}。
  • R1 收到后加 1 变为 {Net4: 3, 下一跳: R2}:
    • R1 查表发现自己此前完全不知道 Net4,立刻新增记录!
    • R1 最终路由表:
      • Net1 →\to 距离:1, 下一跳:Direct
      • Net2 →\to 距离:1, 下一跳:Direct
      • Net3 →\to 距离:2, 下一跳:R2
      • Net4 →\to 距离:3, 下一跳:R2

2. R2 发送路由表给 R3#

  • R2 发送的向量中包含条目 {Net1: 2}。
  • R3 收到后加 1 变为 {Net1: 3, 下一跳: R2}:
    • R3 查表新增记录 Net1。
    • R3 最终路由表:
      • Net1 →\to 距离:3, 下一跳:R2
      • Net2 →\to 距离:2, 下一跳:R2
      • Net3 →\to 距离:1, 下一跳:Direct
      • Net4 →\to 距离:1, 下一跳:Direct

RIP 模型结束#

至此,网络中所有路由器都获知了全网所有 4 个子网的完整到达路径,网络达到收敛(Convergence)状态!此后若拓扑无变化,每 30s 的更新报文仅用于重置超时定时器以维持活跃。

稳态后的异常处理:故障与“坏消息传得慢”#

如果此时 Net1 发生故障物理断开:

  1. R1 首先察觉,将 Net1 的度量置为 16(不可达)。
  2. 致命缺陷(慢收敛与路由环路):
    • 如果此时恰好 R2 的 30s 定时器先到了,R2 把自己旧的路由表(Net1: 2, 下一跳:R1)广播给 R1。
    • R1 以为 R2 还有一条通往 Net1 的路,加 1 误算为 Net1: 3, 下一跳: R2!
    • 接着 R1 又广播给 R2,R2 更新为 Net1: 4, 下一跳: R1……
    • 如此循环往复,两台路由器互相踢皮球,跳数不断攀升,直到数字累加到 16 判定彻底不可达,这就是著名的“无穷大计数问题(Count to Infinity)”!
  3. 解决方案(三大经典防环机制):
    • 水平分割(Split Horizon):“从哪个接口学来的路由,绝不再从该接口发回去”(R2 从 R1 学到 Net1,发给 R1 时绝不包含 Net1)。
    • 毒性逆转(Poison Reverse):“从该接口学到的路由,发回去时把度量直接设为 16(标为毒药)”。
    • 触发更新(Triggered Updates):一旦网络拓扑发生改变,不等 30s 定时器到期,立刻向周围全网广播坏消息!

关于 RIP 其他注意的点#

使用 RIP 的时候,若收到的更新报文中的下一跳地址,与本地路由表中已有条目的下一跳地址相同,则无论距离增大还是减小,都必须更新。

(目的网络 Net,下一跳路由器 Next-Hop,距离/跳数 Metric)(\text{目的网络 Net}, \quad \text{下一跳路由器 Next-Hop}, \quad \text{距离/跳数 Metric})

这是 RIP 记录的东西,假设当前路由器 A 有 2 条记录:

D,B,2;E,C,3

路由器 B 传过来两条他的记录:

D,4;E,1

路由器 A 先标准 +1,即

D,5;E,2

那么,对比,可以发现 A 的两条都应该更新,即 D,B,5;E,B,2。

ARP 协议解析全流程#

同一子网网段:192.168.1.0/24

  • 主机 H1:IP = 192.168.1.1,MAC = A1-A1-A1-A1-A1-A1(简记为 A1)
  • 主机 H2:IP = 192.168.1.2,MAC = A2-A2-A2-A2-A2-A2(简记为 A2)
  • 主机 H3:IP = 192.168.1.3,MAC = A3-A3-A3-A3-A3-A3(简记为 A3)
  • 主机 H4:IP = 192.168.1.4,MAC = A4-A4-A4-A4-A4-A4(简记为 A4)
  • 广播 MAC: FF-FF-FF-FF-FF-FF(简记为 FF)

在以太网传输 ARP 报文或 IP 数据报时,区分四个地址:

  1. 网络层(IP 协议字段):
    • 源 IP 地址:发送发起方的 IP。
    • 目的 IP 地址:最终接收方的 IP。
  2. 数据链路层(以太网帧首部字段):
    • 源 MAC 地址:当前跳发送网卡的物理地址。
    • 目的 MAC 地址:当前跳接收网卡的物理地址(若未知或为广播,则为 FF)。

ARP 报文自身的特殊载荷: ARP 报文属于网络层(或介于两者之间),封装在以太网帧中。ARP 请求报文内部包含字段:

  • 发送端 IP、发送端 MAC;
  • 目标端 IP、目标端 MAC(ARP 请求时由于不知道对方 MAC,此字段通常填全 0 即 00-00-00-00-00-00,而外层以太网帧的目的 MAC 填全 F 即 FF-FF-FF-FF-FF-FF 广播!)。

阶段一:H1 向 H4 发送数据#

步骤 1:H1 查询本地缓存并发送 ARP 请求广播#

  • 状态:H1 的 ARP 表为空,不知道 H4 的 MAC,将待发送的 IP 数据报挂起。
  • 动作:H1 广播发送 ARP 请求。
  • 以太网帧与报文结构辨析:
    • 以太网帧首部(数据链路层):
      • 源 MAC = A1
      • 目的 MAC = FF(以太网广播,局域网全员接收)
    • ARP 请求载荷内部:
      • 发送端 IP = 192.168.1.1,发送端 MAC = A1
      • 目标端 IP = 192.168.1.4,目标端 MAC = 00(未知,占位填 0)

步骤 2:全网接收与 ARP 缓存学习#

局域网内所有主机(H2、H3、H4)的网卡均接收到该广播帧,解封交给 ARP 模块处理:

  • 主机 H2:
    • 发现目标 IP(192.168.1.4)不是自己,不予以回复;
    • 但是!按照题目要求的机制,H2 解析出发送方的映射,顺手将 <192.168.1.1, A1> 记录到了自己的 ARP 缓存表中!
  • 主机 H3:
    • 目标 IP 不是自己,不予回复;同样顺手记录 <192.168.1.1, A1> 到缓存表。
  • 主机 H4:
    • 发现目标 IP 正是自己!
    • H4 将 <192.168.1.1, A1> 写入/更新自己的 ARP 缓存表;
    • 准备发起 ARP 响应。

步骤 3:H4 单播发送 ARP 响应给 H1#

  • 动作:H4 已经知道了 H1 的 MAC(A1),因此以单播形式回复。
  • 以太网帧与报文结构辨析:
    • 以太网帧首部(数据链路层):
      • 源 MAC = A4
      • 目的 MAC = A1(单播交付)
    • ARP 响应载荷内部:
      • 发送端 IP = 192.168.1.4,发送端 MAC = A4
      • 目标端 IP = 192.168.1.1,目标端 MAC = A1
  • 结果:H1 收到后,将 <192.168.1.4, A4> 存入本地 ARP 缓存表。

步骤 4:H1 正式向 H4 发送 IP 数据报#

  • 以太网帧首部(数据链路层):
    • 源 MAC = A1
    • 目的 MAC = A4
  • IP 首部(网络层):
    • 源 IP = 192.168.1.1
    • 目的 IP = 192.168.1.4
  • 传输:H4 顺利收到 H1 的数据报!

阶段二:随后,主机 H2 向主机 H1 发送数据#

步骤 5:H2 检查本地 ARP 缓存表#

  • 状态:H2 想要发送数据报给 H1(目的 IP:192.168.1.1)。
  • 关键推导:
    • 因为在步骤 2 中,H2 偷听(接收)到了 H1 发送的 ARP 广播,并启用了自动学习机制;
    • 所以此时 H2 的本地 ARP 表中已经存在条目 <192.168.1.1 -> A1>!
  • 结论:主机 H2 根本不需要再次发送 ARP 广播请求!

步骤 6:H2 直接封装并单播发送 IP 数据报给 H1#

  • 以太网帧首部(数据链路层):
    • 源 MAC = A2
    • 目的 MAC = A1(直接命中缓存,无需请求)
  • IP 首部(网络层):
    • 源 IP = 192.168.1.2
    • 目的 IP = 192.168.1.1
  • 传输:交换机依据 MAC 地址表将帧单播送达 H1,通信直接完成!

状态速查表#

主机阶段一结束后 ARP 表状态阶段二发送数据动作
H1拥有 H4(A4)接收 H2 的数据报
H2已学习到 H1(A1)直接单播发数据,0 次 ARP 开销
H3已学习到 H1(A1)无动作
H4已学习到 H1(A1)接收 H1 的数据报

内网 1 主机 A 向内网 2 WEB 服务器发送 IP 数据报#

一个标准拓扑(由一台双接口路由器连接内网 1 和内网 2):

【内网 1】 【路由器 R】 【内网 2】
[主机 A] <---> [交换机 SW1] <---> [接口 E0 | 接口 E1] <---> [交换机 SW2] <---> [Web 服务器 B]
  • 主机 A(内网 1):
    • IP 地址:192.168.1.10
    • 子网掩码:255.255.255.0
    • MAC 地址:AA-AA-AA-AA-AA-AA
    • 默认网关:192.168.1.1
    • ARP 缓存表:空
  • 路由器 R:
    • 接口 E0(连接内网 1):
      • IP 地址:192.168.1.1(即内网 1 的网关)
      • MAC 地址:R0-R0-R0-R0-R0-R0
    • 接口 E1(连接内网 2):
      • IP 地址:192.168.2.1(即内网 2 的网关)
      • MAC 地址:R1-R1-R1-R1-R1-R1
    • 路由表:直连网段 192.168.1.0/24 -> E0,192.168.2.0/24 -> E1
    • ARP 缓存表:空

阶段 1:主机 A 进行网段判断(路由决策)#

  1. 主机 A 的网络层生成待发送的 IP 数据报:
    • 源 IP:192.168.1.10
    • 目的 IP:192.168.2.80
  2. 主机 A 用自身的子网掩码(255.255.255.0)与目的 IP 进行按位逻辑与运算,得出目的网络号为 192.168.2.0。
  3. 主机 A 发现目的网络与自己所在的 192.168.1.0 网段不属于同一子网。
  4. 决策结果:主机 A 必须将该数据报交给默认网关(192.168.1.1)进行跨网段转发。

阶段 2:内网 1 内部的 ARP 寻址(A 寻找网关的 MAC)#

  1. 主机 A 准备将数据报封装成 MAC 帧,下一跳地址为网关 192.168.1.1。
  2. 主机 A 查询本地 ARP 缓存表,因为是“从零开始”,未命中,无法得知网关的 MAC。
  3. 主机 A 发送 ARP 请求报文:
    • 报文内容:“谁是 192.168.1.1?请告诉我你的 MAC,我是 192.168.1.10,MAC 是 AA-...-AA。”
    • MAC 帧封装:
      • 源 MAC:AA-AA-AA-AA-AA-AA
      • 目的 MAC:FF-FF-FF-FF-FF-FF(广播帧)
  4. 交换机 SW1 收到该广播帧,进行洪泛(转发到除入口外的所有端口)。
  5. 路由器接口 E0 收到广播帧,解封后识别到正在询问自己的 IP(192.168.1.1):
    • 路由器将主机 A 的映射(192.168.1.10 <-> AA-AA-AA-AA-AA-AA)记录到自己的 ARP 缓存中。
  6. 路由器接口 E0 发送 ARP 响应报文:
    • 报文内容:“我是 192.168.1.1,我的 MAC 是 R0-R0-R0-R0-R0-R0。”
    • MAC 帧封装:
      • 源 MAC:R0-R0-R0-R0-R0-R0
      • 目的 MAC:AA-AA-AA-AA-AA-AA(单播帧)
  7. 交换机 SW1 将该帧转发给主机 A。主机 A 收到后,将网关映射写入本地 ARP 缓存。

阶段 3:主机 A 封装并发送首个 IP 数据报#

  1. 主机 A 将之前暂存的 IP 数据报重新封装为数据链路层帧:
    • MAC 首部:源 MAC = AA-AA-AA-AA-AA-AA,目的 MAC = R0-R0-R0-R0-R0-R0
    • IP 首部:源 IP = 192.168.1.10,目的 IP = 192.168.2.80
  2. 交换机 SW1 根据目的 MAC(R0-...)进行转发,数据帧到达路由器接口 E0。

阶段 4:路由器解封装与查表路由#

  1. 路由器接口 E0 收到帧,比对目的 MAC 符合自身,接收并剥离数据链路层首部(MAC 帧头帧尾),送交网络层。
  2. 路由器检查 IP 首部:
    • 检查通过,将 TTL 减 1(重新计算 IP 首部校验和)。
    • 提取目的 IP:192.168.2.80。
  3. 路由器检索自身路由表,匹配到直连路由条目:192.168.2.0/24 对应出接口为 E1。
  4. 路由器准备将 IP 数据报从接口 E1 封装转发出去。

阶段 5:内网 2 内部的 ARP 寻址(路由器寻找 Web 服务器的 MAC)#

  1. 路由器准备从接口 E1 封装发往 Web 服务器(192.168.2.80)。
  2. 路由器检查接口 E1 的 ARP 缓存表,未命中(从零开始,没有任何缓存记录)。
  3. 暂存该 IP 数据报,路由器接口 E1 发送 ARP 请求广播帧:
    • 报文内容:“谁是 192.168.2.80?请回答,我是 192.168.2.1,MAC 是 R1-...-R1。”
    • MAC 帧封装:
      • 源 MAC:R1-R1-R1-R1-R1-R1
      • 目的 MAC:FF-FF-FF-FF-FF-FF(广播帧)
  4. 交换机 SW2 将广播帧洪泛,Web 服务器 B 收到该帧:
    • B 确认询问的是自己的 IP,把网关映射记录到自己的 ARP 缓存中。
  5. Web 服务器 B 发送 ARP 响应报文:
    • 报文内容:“我是 192.168.2.80,我的 MAC 是 BB-BB-BB-BB-BB-BB。”
    • MAC 帧封装:
      • 源 MAC:BB-BB-BB-BB-BB-BB
      • 目的 MAC:R1-R1-R1-R1-R1-R1(单播帧)
  6. 交换机 SW2 转发给路由器 E1 接口,路由器将 Web 服务器的 MAC 存入自己的 ARP 缓存表。

阶段 6:路由器封装并成功交付 IP 数据报#

  1. 路由器接口 E1 将此前暂存的 IP 数据报重新封装:
    • MAC 首部:
      • 源 MAC:R1-R1-R1-R1-R1-R1(变为出接口 E1 的 MAC)
      • 目的 MAC:BB-BB-BB-BB-BB-BB(变为 Web 服务器的 MAC)
    • IP 首部:
      • 源 IP:192.168.1.10(保持不变!)
      • 目的 IP:192.168.2.80(保持不变!)
  2. 路由器从 E1 接口发出该以太网帧。
  3. 交换机 SW2 依据目的 MAC 转发给 Web 服务器 B。
  4. Web 服务器 B 收到该帧,校验 MAC 地址一致,剥离 MAC 帧头,将 IP 数据报送上自身的网络层,最终根据协议号提交给传输层(TCP 80 端口)。

IP 与 MAC 会不会变#

  • IP 变不变?不走 NAT 时,源 IP、目的 IP 全程不变!
  • MAC 变不变?每过一个路由器(网关),源 MAC、目的 MAC 统一变

公网主机 1 向公网主机 2 发送 IP 数据报 TTL 辨析#

H1 -> R1 -> R2 -> R3 -> H4

H1 向 H4 发送 IP 数据报,假设 TTL 为 2。

本机发送到 R1,R1 进行处理后,发送前 -1,发现是 1,不丢弃。

R1 发送到 R2,R2 进行处理后,发送前 -1,发现是 0,丢弃。

H1 向 H4 发送 IP 数据报,假设 TTL 为 4。

本机发送到 R1,R1 进行处理后,发送前 -1,发现是 3,不丢弃。

R1 发送到 R2,R2 进行处理后,发送前 -1,发现是 2,不丢弃。

R2 发送到 R3,R3 进行处理后,发送前 -1,发现是 1,不丢弃。

R3 发送到 H4,H4 直接接收。所以最终 TTL 字段是 1(而不是 0)

传输层#

应用进程之间的通信。

传输层 - 考纲#

  • 传输层提供的服务
    • 传输层的功能
    • 传输层的寻址与端口
    • 无连接服务与面向连接服务
  • UDP
    • UDP 数据报
    • UDP 校验
  • TCP
    • TCP 报文段
    • TCP 连接管理
    • TCP 可靠传输
    • TCP 流量控制与拥塞控制

端口号#

服务器使用的端口号

  • 熟知端口号(0-1023)
    • FTP:21
    • SSH:22
    • Telnet:23
    • SMTP:25
    • DNS:53
    • HTTP:80
    • HTTPS:443
    • SNMP:161
  • 登记端口号(1024-49151)
  • 客户端临时端口号(49152-65535):由系统动态分配给客户进程,连接结束后释放

需要注意,服务端用熟知端口或登记端口,客户端一般用临时端口;一条连接靠“源 IP、源端口、目的 IP、目的端口、协议号”这个五元组来唯一标识。

面向连接与无连接#

TCP 面向连接,通信前要三次握手,提供可靠、有序、面向字节流的服务,有流量控制和拥塞控制。

UDP 无连接,直接发,提供不可靠、无序、面向报文的服务,没有流量控制和拥塞控制,但开销小、时延低。

对比项TCPUDP
连接面向连接无连接
可靠性可靠,有确认重传不可靠,尽最大努力
数据边界字节流,无边界面向报文,保留边界
通信方式点对点一对一、一对多、多对多
首部开销20B 起8B
流量与拥塞控制都有都没有
典型应用文件、网页、邮件DNS、视频、语音、广播

需要注意,UDP 不可靠不代表不能用,可靠性可以让应用层自己补,例如 DNS 超时后自己重传。

UDP#

UDP 首部#

首部仅有 8B,四个字段各 2B:源端口、目的端口、长度、校验和。

长度字段是首部加数据的总长度,最小值为 8;校验和可以填 0 表示不校验,IPv4 允许,IPv6 不允许。

源端口在不需要对方回复的时候填 0 就好了。

支持 1 对 1、1 对多、多对多。

需要注意,UDP 是面向报文的,应用层交下来一个报文,UDP 就加一个首部发出去,不合并也不拆分,所以报文边界保留;报文太长会在 IP 层被分片。

UDP 分用和复用#

源主机发送请求的时候是复用,多个不同的应用层进程(各自带着不同的源端口),共同使用(复用)同一个下层的网络层(IP 协议),目的地主机收到之后是分用。

UDP 校验#

二进制反码求和,校验全部,需要回卷,算完之后取反。

校验的时候,全部相加为 1,那么没错。

还需要注意求校验和的时候需要加上 12B 的伪首部。

TCP#

TCP 报文段#

首部最短 20B,最长 60B,其中选项最多 40B。

  • 源端口、目的端口:各 2B;
  • 序号:4B,本报文段数据第一个字节的编号;
  • 确认号:4B,期望收到的下一个字节编号;
  • 数据偏移:4 位,以 4B 为单位,指明首部长度;
  • 保留位:6 位,目前置 0;
  • 标志位:URG、ACK、PSH、RST、SYN、FIN,各 1 位;
  • 窗口:2B,接收窗口,以字节为单位,用于流量控制;
  • 校验和:2B,校验首部和数据,计算时加 12B 伪首部;
  • 紧急指针:2B,URG 置 1 时有效;
  • 选项:MSS、窗口扩大、时间戳、SACK 等。

需要注意,SYN 和 FIN 都要消耗一个序号,单纯的 ACK 不消耗序号,所以握手时 ack 等于对方的 seq 加 1。

窗口字段只有 16 位,最大 65535B,大带宽长时延的链路要用窗口扩大选项,否则吞吐量上不去。

重传#

超时与冗余 ACK。

超时指的是 RTO 重传计时器走完了。

冗余 ACK 指的是收到了 3 个连续的冗余 ACK(共 4 个,且再 RTO 重传前收到的)。

三报文握手#

时刻 C (客户端 / 主动打开方) S (服务端 / 被动打开方)
─── ───────────────────── ─────────────────────
t0 [CLOSED] [LISTEN]
│ │
├─ 1. 发送 SYN=1, seq=x ─────────────> (在途中,耗时 0.5 RTT)
▼ │
[SYN_SENT] │
│ ▼
t0 + 0.5 RTT │ [SYN_RCVD]
│ │
│ <──── 2. 发送 SYN=1, ACK=1 ──────────┤ (确认号 ack=x+1, seq=y)
│ (在途中,耗时 0.5 RTT) │
▼ │
[ESTABLISHED] │
│ │
t0 + 1.0 RTT ├─ 3. 发送 ACK=1, ack=y+1, seq=x+1 ──> (在途中,耗时 0.5 RTT)
│ (客户端此时已可携带数据应用数据) ▼
│ [ESTABLISHED]
│ │
t0 + 1.5 RTT │ │ (服务端收到最终 ACK,连接建立!)
▼ ▼
[数据传输阶段] [数据传输阶段]

为什么必须是三次,两次不行?因为要防止已失效的连接请求报文突然又传到服务端:如果只有两次,服务端收到一个迟到的 SYN 就会直接建立连接并分配资源,而客户端并不想连,资源就白占了。三次握手下,客户端收到服务端的 SYN+ACK 后还要再确认一次,服务端只有收到这个确认才认为连接建立。

需要注意,第三次握手的 ACK 可以携带数据,前两次不行,因为此时客户端还没确认服务端的接收能力。

四报文挥手#

时刻 H3 (主动关闭方) S (被动关闭方)
─── ────────────── ─────────────
t [ESTABLISHED] [ESTABLISHED]
│
├─ 发送 FIN=1 ─────────────────────────> (在途中,耗时 0.5 RTT)
▼
[FIN_WAIT_1]
│
t + 0.5 RTT │ │ (收到 FIN,状态变为 CLOSE_WAIT)
│ ├─ 理想极速下:S 既无数据要发,
│ │ 立刻合并不单发 ACK,而是直接
│ │ 连同自己的 FIN+ACK 一起回传!
│ <──────────────── 发送 FIN=1, ACK=1 ─┤ (或者分开连着发,耗时 0.5 RTT)
▼ ▼
[TIME_WAIT] [LAST_ACK]
│
t + 1.0 RTT ├─ 收到 S 的 FIN,发送最终 ACK ────────> (在途中,耗时 0.5 RTT)
▼
(进入 2MSL 等待...)
│
t + 1.5 RTT │ │ (S 终于收到 H3 的最终 ACK!)
▼
[CLOSED] (S 彻底释放连接!)

TIME_WAIT 要等 2MSL,原因有两个:一是保证最后一个 ACK 能到达服务端,如果它丢了,服务端会重传 FIN,此时客户端还能再回一次 ACK;二是让本连接产生的所有报文段都在网络中消失,不会干扰之后用同样端口建立的新连接。

需要注意,只有主动关闭方进入 TIME_WAIT,被动关闭方收到最后一个 ACK 就直接进入 CLOSED。

尤其要注意,关于四报文挥手,一定不是 H3 第一次发 FIN 报文后,S 就立刻关闭,而是变成 CLOSE_WAIT 状态。

TCP 流量控制#

流量控制指的是对方够不够收,每次接受方返回 ACK 的时候,都要顺便带上自己的接收窗口大小。

如果接受窗口为 0,那么每隔一段时间发送零窗口探测报文。

而保活计时器指的是 tcp 连接时间太久了,发送保活探针,连续发了好几个没人回应,那么主动关闭。

TCP 拥塞控制#

慢开始 - 拥塞避免 - 快重传 - 快恢复,具体模型见下面的模型辨析。

MSS 和序号的概念#

做题的时候,不要做昏头了,忘记这俩要转换。

TCP 的注意点#

需要注意,慢开始阶段每收到一个确认就把拥塞窗口加 1 个 MSS,一个 RTT 内收到几个确认就加几次,表现出来才是翻倍,不能直接一次性乘 2。

辨析超时和丢失#

现象TCP 对网络状况的看法拥塞严重级别
检测到 3 个冗余 ACK虽然有个报文丢了,但后面的报文还能送过去,B 还能给我回信,说明网络其实还能走得通轻度拥塞
RTO 超时整个信道死一般的寂静!网络可能已经堵死了,或者链路彻底断了!极度严重拥塞

RTO 超时相关的计算#

计算顺序是:先由测量样本算出平滑往返时间,再算往返时间偏差,最后算 RTO。

RTTS=(1−α) RTTS旧+α RTT新样本\text{RTT}_S=(1-\alpha)\,\text{RTT}_S^{\text{旧}}+\alpha\,\text{RTT}^{\text{新样本}}

参数标准:RFC 推荐 α=18=0.125\alpha=\frac{1}{8}=0.125。

α\alpha 越接近 0,对新测量值反应越迟钝、越平滑;越接近 1,对网络突发波动越敏感。

RTTD=(1−β) RTTD旧+β ∣RTTS旧−RTT新样本∣\text{RTT}_D=(1-\beta)\,\text{RTT}_D^{\text{旧}}+\beta\,\bigl|\text{RTT}_S^{\text{旧}}-\text{RTT}^{\text{新样本}}\bigr|

参数标准:RFC 推荐 β=14=0.25\beta=\frac{1}{4}=0.25。

初始状态(第一次测量)时,偏差值默认取样本的一半:

RTTD(1)=12RTT(1)\text{RTT}_{D(1)}=\frac{1}{2}\text{RTT}_{(1)}RTO=RTTS+4 RTTD\text{RTO}=\text{RTT}_S+4\,\text{RTT}_D

报文重传时,该样本的测量值不能用于更新 RTTS\text{RTT}_S 和 RTTD\text{RTT}_D

只要报文段超时重传了一次,不再代入公式计算,而是直接将当前的 RTO 翻倍:

RTO重传=2 RTO原\text{RTO}_{\text{重传}}=2\,\text{RTO}_{\text{原}}

只要连续重传,就按 2,4,8…2, 4, 8 \dots 的倍数指数退避,直到数据报成功发送且不再出现重传为止,才恢复上面的正常公式计算!

TCP 模型 1:双方同时发送数据#

以 A 向 B 发送 TCP 连接,A 拥塞窗口为 16,接收窗口恒为 10,B 拥塞窗口为 8,接收窗口恒为 18。A 和 B 均不从缓冲区回收,双方先发送完毕的先向对方发送 fin。

a 序列号一开始为 100,mss 为 1000,b 序列号一开始为 150。

第一阶段:三次握手(建立连接)#

  1. 第 1 步(A →\rightarrow B):A 发起连接请求
    • 标志位:SYN=1,ACK=0\text{SYN} = 1, \text{ACK} = 0
    • 序号:seq=100\text{seq} = 100
    • 宣告窗口:win=10000\text{win} = 10000(10 MSS10\text{ MSS}),宣告 MSS=1000\text{MSS} = 1000
  2. 第 2 步(B →\rightarrow A):B 确认并请求
    • 标志位:SYN=1,ACK=1\text{SYN} = 1, \text{ACK} = 1
    • 序号:seq=150\text{seq} = 150,确认号:ack=101\text{ack} = 101
    • 宣告窗口:win=18000\text{win} = 18000(18 MSS18\text{ MSS}),宣告 MSS=1000\text{MSS} = 1000
  3. 第 3 步(A →\rightarrow B):A 确认
    • 标志位:ACK=1\text{ACK} = 1
    • 序号:seq=101\text{seq} = 101,确认号:ack=151\text{ack} = 151
    • 双方进入 ESTABLISHED\text{ESTABLISHED} 状态。
    • 初始慢启动窗口:cwndA=1 MSS\text{cwnd}_A = 1\text{ MSS},cwndB=1 MSS\text{cwnd}_B = 1\text{ MSS}。

第二阶段:慢启动数据传输(RTT 1 ∼\sim RTT 4)#

RTT 1:初始慢启动(cwnd=1 MSS\text{cwnd} = 1\text{ MSS})#

  • A 发送:swndA=min⁡(1,18)=1 MSS\text{swnd}_A = \min(1, 18) = 1\text{ MSS}
    • A 发送数据段:seq=101∼1100\text{seq} = 101 \sim 1100(长 1000)
  • B 发送:swndB=min⁡(1,10)=1 MSS\text{swnd}_B = \min(1, 10) = 1\text{ MSS}
    • B 发送数据段:seq=151∼1150\text{seq} = 151 \sim 1150(长 1000)
  • 确认与窗口更新:
    • B 回复 A:ack=1101,win=17000\text{ack} = 1101, \text{win} = 17000(缓冲区剩 17 MSS)。A 收到后,cwndA\text{cwnd}_A 翻倍为 2 MSS2\text{ MSS}。
    • A 回复 B:ack=1151,win=9000\text{ack} = 1151, \text{win} = 9000(缓冲区剩 9 MSS)。B 收到后,cwndB\text{cwnd}_B 翻倍为 2 MSS2\text{ MSS}。

RTT 2:慢启动翻倍(cwnd=2 MSS\text{cwnd} = 2\text{ MSS})#

  • A 发送:swndA=min⁡(2,17)=2 MSS\text{swnd}_A = \min(2, 17) = 2\text{ MSS}
    • A 连续发送 2 段:seq=1101∼3100\text{seq} = 1101 \sim 3100
  • B 发送:swndB=min⁡(2,9)=2 MSS\text{swnd}_B = \min(2, 9) = 2\text{ MSS}
    • B 连续发送 2 段:seq=1151∼3150\text{seq} = 1151 \sim 3150
  • 确认与窗口更新:
    • B 回复 A:ack=3101,win=15000\text{ack} = 3101, \text{win} = 15000。A 收到后,cwndA\text{cwnd}_A 翻倍为 4 MSS4\text{ MSS}。
    • A 回复 B:ack=3151,win=7000\text{ack} = 3151, \text{win} = 7000。B 收到后,cwndB\text{cwnd}_B 翻倍为 4 MSS4\text{ MSS}。

RTT 3:慢启动翻倍(cwnd=4 MSS\text{cwnd} = 4\text{ MSS})#

  • A 发送:swndA=min⁡(4,15)=4 MSS\text{swnd}_A = \min(4, 15) = 4\text{ MSS}
    • A 连续发送 4 段:seq=3101∼7100\text{seq} = 3101 \sim 7100
  • B 发送:swndB=min⁡(4,7)=4 MSS\text{swnd}_B = \min(4, 7) = 4\text{ MSS}
    • B 连续发送 4 段:seq=3151∼7150\text{seq} = 3151 \sim 7150
  • 确认与窗口更新:
    • B 回复 A:ack=7101,win=11000\text{ack} = 7101, \text{win} = 11000。A 收到后,cwndA\text{cwnd}_A 翻倍为 8 MSS8\text{ MSS}。
    • A 回复 B:ack=7151,win=3000\text{ack} = 7151, \text{win} = 3000。B 收到后,cwndB\text{cwnd}_B 增长为 8 MSS8\text{ MSS}(达上限)。

RTT 4:B 发送完毕并率先发起挥手#

  • A 发送:swndA=min⁡(8,11)=8 MSS\text{swnd}_A = \min(8, 11) = 8\text{ MSS}
    • A 连续发送 8 段:seq=7101∼15100\text{seq} = 7101 \sim 15100(A 累计已发 15 MSS)
  • B 发送:B 总目标为 8 MSS,前三轮已发 7 MSS,本次仅剩最后 1 个 MSS!
    • B 发送最后一段数据:seq=7151∼8150\text{seq} = 7151 \sim 8150(长 1000)
    • B 的全部应用数据在此完全发完!
  • 确认反馈:
    • A 回复 B 的数据:ack=8151,win=2000\text{ack} = 8151, \text{win} = 2000(A 缓冲区仅剩 2 MSS)。
    • B 回复 A 的数据:ack=15101,win=3000\text{ack} = 15101, \text{win} = 3000。A 收到后,cwndA\text{cwnd}_A 翻倍达到上限 16 MSS16\text{ MSS}。

第三阶段:连接释放与尾部数据传输(B 率先发 FIN)#

由于 B 在 RTT 4 发送完毕,B 触发先发 FIN\text{FIN} 规则!

  1. 第 1 次挥手(B →\rightarrow A):B 率先发起断开请求

    • 标志位:FIN=1,ACK=1\text{FIN} = 1, \text{ACK} = 1
    • 序号:seq=8151\text{seq} = 8151(消耗 1 个序号)
    • 确认号:ack=15101\text{ack} = 15101
    • 状态:B 进入 FIN_WAIT_1\text{FIN\_WAIT\_1} 状态。
  2. 第 2 次挥手(A →\rightarrow B)与 A 发送最后剩余数据(RTT 5):

    • A 收到 B 的 FIN,先回复 ACK 确认:
      • 标志位:ACK=1\text{ACK} = 1
      • 序号:seq=15101\text{seq} = 15101
      • 确认号:ack=8152\text{ack} = 8152(确认 B 的 FIN)
      • 状态:B 进入 FIN_WAIT_2\text{FIN\_WAIT\_2},A 进入 CLOSE_WAIT\text{CLOSE\_WAIT}。
    • A 发送剩余的最后 1 个 MSS 数据(16−15=1 MSS16 - 15 = 1\text{ MSS}):
      • 标志位:ACK=1\text{ACK} = 1
      • 序号:seq=15101∼16100\text{seq} = 15101 \sim 16100(长 1000)
      • 确认号:ack=8152\text{ack} = 8152
      • A 的全部应用数据在此也彻底发完!
  3. B 确认 A 的最后数据:

    • B 回复:ACK=1,seq=8152,ack=16101,win=2000\text{ACK} = 1, \text{seq} = 8152, \text{ack} = 16101, \text{win} = 2000。
  4. 第 3 次挥手(A →\rightarrow B):A 数据发送完毕,发送自己的 FIN\text{FIN}

    • 标志位:FIN=1,ACK=1\text{FIN} = 1, \text{ACK} = 1
    • 序号:seq=16101\text{seq} = 16101(消耗 1 个序号)
    • 确认号:ack=8152\text{ack} = 8152
    • 状态:A 进入 LAST_ACK\text{LAST\_ACK} 状态。
  5. 第 4 次挥手(B →\rightarrow A):B 确认 A 的断开

    • 标志位:ACK=1\text{ACK} = 1
    • 序号:seq=8152\text{seq} = 8152
    • 确认号:ack=16102\text{ack} = 16102(确认 A 的 FIN)
    • 状态:B 进入 TIME_WAIT\text{TIME\_WAIT};A 收到后彻底进入 CLOSED\text{CLOSED}!

TCP 模型全流程#

阶段 / 轮次报文方向标志位seq\text{seq} 范围ack\text{ack}拥塞窗口变化与状态说明
握手 1A →\rightarrow BSYN100-win=10000\text{win}=10000
握手 2B →\rightarrow ASYN, ACK150101win=18000\text{win}=18000
握手 3A →\rightarrow BACK101151连接建立,双方 cwnd=1 MSS\text{cwnd} = 1\text{ MSS}
RTT 1A →\rightarrow B数据 (1 段)101∼1100101 \sim 1100151cwndA=1\text{cwnd}_A = 1,发 1000 字节
B →\rightarrow A数据 (1 段)151∼1150151 \sim 1150101cwndB=1\text{cwnd}_B = 1,发 1000 字节
B →\rightarrow AACK11511101cwndA→2 MSS\text{cwnd}_A \rightarrow 2\text{ MSS}
A →\rightarrow BACK11011151cwndB→2 MSS\text{cwnd}_B \rightarrow 2\text{ MSS}
RTT 2A →\rightarrow B数据 (2 段)1101∼31001101 \sim 31001151cwndA=2\text{cwnd}_A = 2,发 2000 字节
B →\rightarrow A数据 (2 段)1151∼31501151 \sim 31501101cwndB=2\text{cwnd}_B = 2,发 2000 字节
B →\rightarrow AACK31513101cwndA→4 MSS\text{cwnd}_A \rightarrow 4\text{ MSS}
A →\rightarrow BACK31013151cwndB→4 MSS\text{cwnd}_B \rightarrow 4\text{ MSS}
RTT 3A →\rightarrow B数据 (4 段)3101∼71003101 \sim 71003151cwndA=4\text{cwnd}_A = 4,发 4000 字节
B →\rightarrow A数据 (4 段)3151∼71503151 \sim 71503101cwndB=4\text{cwnd}_B = 4,发 4000 字节
B →\rightarrow AACK71517101cwndA→8 MSS\text{cwnd}_A \rightarrow 8\text{ MSS}
A →\rightarrow BACK71017151cwndB→8 MSS\text{cwnd}_B \rightarrow 8\text{ MSS}(达上限)
RTT 4A →\rightarrow B数据 (8 段)7101∼151007101 \sim 151007151cwndA=8\text{cwnd}_A = 8,累计已发 15 MSS
B →\rightarrow A数据 (1 段)7151∼81507151 \sim 81507101B 发送最后 1 MSS,全部发完!
A →\rightarrow BACK151018151A 确认 B 的所有数据
B →\rightarrow AACK815115101cwndA→16 MSS\text{cwnd}_A \rightarrow 16\text{ MSS}(达上限)
挥手 1B →\rightarrow AFIN, ACK815115101B 率先发完,发起 FIN(消耗 1 序号)
挥手 2A →\rightarrow BACK151018152A 确认 B 的 FIN,进入半关闭
RTT 5A →\rightarrow B数据 (1 段)15101∼1610015101 \sim 161008152A 发送最后剩余的 1 MSS,全部发完
B →\rightarrow AACK815216101B 确认 A 的最后数据
挥手 3A →\rightarrow BFIN, ACK161018152A 发完,发起 FIN(消耗 1 序号)
挥手 4B →\rightarrow AACK815216102B 确认 A 的 FIN,完全断开

TCP 模型 2:慢开始,拥塞避免,快重传,快恢复#

初始设定。

  1. 连接与角色:
    • 由 A 向 B 发起 TCP 连接,本模型为单边数据传输(A 传输数据给 B,B 仅回复确认 ACK,不发送应用层数据)。
    • A 端初始序号 ISNA=100\text{ISN}_A = 100,MSS=1000 字节\text{MSS} = 1000\text{ 字节}。
    • B 端初始序号 ISNB=500\text{ISN}_B = 500。
  2. 窗口与控制参数:
    • A 端初始拥塞窗口:cwnd=1 MSS=1000 字节\text{cwnd} = 1\text{ MSS} = 1000\text{ 字节};
    • A 端初始慢开始门限:ssthresh=8 MSS\text{ssthresh} = 8\text{ MSS};
    • B 端接收窗口:设 B 端应用层及时读取缓冲区,rwndB\text{rwnd}_B 恒为 32 MSS32\text{ MSS}(接收窗口极大,确保发送窗口完全受拥塞控制约束:swnd=cwnd\text{swnd} = \text{cwnd});
    • A 端计划发送的总数据量为 24 MSS=24000 字节24\text{ MSS} = 24000\text{ 字节}。
  3. 异常事件注入(触发快重传/快恢复):
    • 在 A 越过门限进入“拥塞避免”阶段后,传输至第 11 个报文段(数据字节序号 [10101∼11000][10101 \sim 11000])时在信道中意外丢失;
    • 随后的报文正常到达 B,B 收到失序报文后立刻产生重复 ACK(Duplicate ACK);
    • 收到第 3 个冗余 ACK 时,A 触发快重传补发丢失段,并执行 TCP Reno 快恢复。
  4. 终止规则:
    • A 端传输完毕所有数据后,率先向 B 发送 FIN\text{FIN} 报文,执行连接释放。

TCP 模型 2 流程分析#

  1. 慢开始(cwnd<ssthresh\text{cwnd} < \text{ssthresh}):
    • 初始 cwnd=1\text{cwnd} = 1。每经过 1 个 RTT,cwnd\text{cwnd} 指数翻倍:1→2→4→81 \rightarrow 2 \rightarrow 4 \rightarrow 8。
    • 前 3 轮累积发送:1+2+4=7 MSS1 + 2 + 4 = 7\text{ MSS}。
  2. 转折点(cwnd=ssthresh=8 MSS\text{cwnd} = \text{ssthresh} = 8\text{ MSS}):
    • 第 4 轮发送 8 个报文(报文 8 ∼\sim 15)。此时达到门限,随后切换为拥塞避免。
    • 此时在第 4 轮中,设第 11 个报文(序号 [10101∼11000][10101 \sim 11000])发生丢失!
  3. 快重传与快恢复(收到 3 个 Duplicate ACK):
    • 报文 12, 13, 14, 15 到达 B 端,因中间空缺报文 11,B 连续回复 4 个 ack=10101\text{ack} = 10101(1 个正常确认 + 3 个冗余确认)。
    • A 收到第 3 个冗余确认,断定报文 11 丢失:
      • 快重传:立即重传报文 11;
      • 快恢复(Reno):
        • 调整门限:ssthresh=⌊cwnd/2⌋=⌊8/2⌋=4 MSS\text{ssthresh} = \lfloor\text{cwnd} / 2\rfloor = \lfloor 8 / 2 \rfloor = 4\text{ MSS};
        • 设置新窗口:cwnd=ssthresh+3 MSS=7 MSS\text{cwnd} = \text{ssthresh} + 3\text{ MSS} = 7\text{ MSS};
        • 收到重传报文 11 的累计确认后,退出快恢复,设置 cwnd=ssthresh=4 MSS\text{cwnd} = \text{ssthresh} = 4\text{ MSS},重新进入拥塞避免(加法增大)。
  4. 恢复后的拥塞避免与传输完成:
    • 从 cwnd=4\text{cwnd} = 4 开始线性递增,把剩余的数据发完,直至总计发满 24 MSS24\text{ MSS}。

第一阶段:三次握手#

  1. A →\rightarrow B:SYN=1,seq=100\text{SYN} = 1, \text{seq} = 100,宣告 MSS=1000\text{MSS} = 1000。A 状态 →SYN_SENT\rightarrow \text{SYN\_SENT}。
  2. B →\rightarrow A:SYN=1,ACK=1,seq=500,ack=101,win=32000\text{SYN} = 1, \text{ACK} = 1, \text{seq} = 500, \text{ack} = 101, \text{win} = 32000。B 状态 →SYN_RCVD\rightarrow \text{SYN\_RCVD}。
  3. A →\rightarrow B:ACK=1,seq=101,ack=501\text{ACK} = 1, \text{seq} = 101, \text{ack} = 501。连接建立,进入 ESTABLISHED\text{ESTABLISHED}。
    • 初始变量:cwnd=1 MSS\text{cwnd} = 1\text{ MSS},ssthresh=8 MSS\text{ssthresh} = 8\text{ MSS}。

第二阶段:慢开始阶段(RTT 1 ∼\sim RTT 3)#

  • 【RTT 1】(cwnd=1\text{cwnd} = 1)
    • A 发送报文 1:seq=101∼1100\text{seq} = 101 \sim 1100(长 1000)。
    • B 回复确认:ACK=1,ack=1101\text{ACK} = 1, \text{ack} = 1101。
    • A 收到 ACK,cwnd\text{cwnd} 翻倍:cwnd=1×2=2 MSS\text{cwnd} = 1 \times 2 = 2\text{ MSS}。
  • 【RTT 2】(cwnd=2\text{cwnd} = 2)
    • A 发送报文 2、3:seq=1101∼3100\text{seq} = 1101 \sim 3100。
    • B 回复确认:ACK=1,ack=3101\text{ACK} = 1, \text{ack} = 3101。
    • A 收到 ACK,cwnd\text{cwnd} 翻倍:cwnd=2×2=4 MSS\text{cwnd} = 2 \times 2 = 4\text{ MSS}。
  • 【RTT 3】(cwnd=4\text{cwnd} = 4)
    • A 发送报文 4 ∼\sim 7:seq=3101∼7100\text{seq} = 3101 \sim 7100。
    • B 回复确认:ACK=1,ack=7101\text{ACK} = 1, \text{ack} = 7101。
    • A 收到 ACK,cwnd\text{cwnd} 翻倍:cwnd=4×2=8 MSS\text{cwnd} = 4 \times 2 = 8\text{ MSS}。
    • 状态迁移判断:cwnd=ssthresh=8 MSS\text{cwnd} = \text{ssthresh} = 8\text{ MSS},慢开始结束,下一轮进入拥塞避免!

第三阶段:丢包与快重传、快恢复(RTT 4)#

  • 【RTT 4 发送】(此时 cwnd=8\text{cwnd} = 8) A 连续发送 8 个数据段(报文 8 ∼\sim 15),序号区间 [7101,15100][7101, 15100]:

    • 报文 8: seq=7101∼8100\text{seq} = 7101 \sim 8100(成功)
    • 报文 9: seq=8101∼9100\text{seq} = 8101 \sim 9100(成功)
    • 报文 10: seq=9101∼10100\text{seq} = 9101 \sim 10100(成功)
    • 报文 11: seq=10101∼11000\text{seq} = 10101 \sim 11000 ⟶\longrightarrow 【在网络中不幸丢失!】
    • 报文 12: seq=1101∼12000\text{seq} = 1101 \sim 12000(成功到达,失序)
    • 报文 13: seq=12101∼13000\text{seq} = 12101 \sim 13000(成功到达,失序)
    • 报文 14: seq=13101∼14000\text{seq} = 13101 \sim 14000(成功到达,失序)
    • 报文 15: seq=14101∼15100\text{seq} = 14101 \sim 15100(成功到达,失序)
  • 【B 端的响应与冗余 ACK】:

    • 报文 8, 9, 10 顺利到达,B 发送正常累计确认:ack=10101\text{ack} = 10101。
    • 收到失序的报文 12 →\rightarrow B 产生第 1 个冗余 ACK:ack=10101\text{ack} = 10101。
    • 收到失序的报文 13 →\rightarrow B 产生第 2 个冗余 ACK:ack=10101\text{ack} = 10101。
    • 收到失序的报文 14 →\rightarrow B 产生第 3 个冗余 ACK:ack=10101\text{ack} = 10101!
  • 【快重传与快恢复执行(TCP Reno)】:

    1. A 连续收到第 3 个重复的 ack=10101\text{ack} = 10101:
      • 快重传触发:A 判定报文 11 丢失,不等待重传计时器超时,立即重新发送报文 11(seq=10101∼11000\text{seq} = 10101 \sim 11000)!
    2. 执行快恢复算法:
      • 门限折半:ssthresh=⌊cwnd/2⌋=⌊8/2⌋=4 MSS\text{ssthresh} = \lfloor\text{cwnd} / 2\rfloor = \lfloor 8 / 2 \rfloor = 4\text{ MSS}。
      • 窗口膨胀:cwnd=ssthresh+3 MSS=7 MSS\text{cwnd} = \text{ssthresh} + 3\text{ MSS} = 7\text{ MSS}。
      • A 随后收到失序报文 15 激发的第 4 个冗余 ACK,cwnd\text{cwnd} 临时增加为 8 MSS8\text{ MSS}。
    3. 确认到达与退出快恢复:
      • B 端收到重传成功的报文 11,加上之前已在接收缓存中排队的报文 12 ∼\sim 15,所有空洞被填满!
      • B 发送累积确认:ACK=1,ack=15101\text{ACK} = 1, \text{ack} = 15101!
      • A 收到该新确认,快恢复结束:设定 cwnd=ssthresh=4 MSS\text{cwnd} = \text{ssthresh} = 4\text{ MSS},重新切回拥塞避免阶段(加法增大)。

第四阶段:重回拥塞避免并完成剩余传输(RTT 5 ∼\sim RTT 6)#

目前 A 已成功发送并确认了 15 个报文段(共 15000 字节15000\text{ 字节}),还剩 24−15=9 MSS24 - 15 = 9\text{ MSS} 需发送。

  • 【RTT 5】(拥塞避免:cwnd=4 MSS\text{cwnd} = 4\text{ MSS})

    • A 发送 4 个报文(报文 16 ∼\sim 19):seq=15101∼19100\text{seq} = 15101 \sim 19100。
    • B 回复累计确认:ack=19101\text{ack} = 19101。
    • A 经历 1 个 RTT,拥塞窗口加法递增:cwnd=4+1=5 MSS\text{cwnd} = 4 + 1 = 5\text{ MSS}。
    • 累计已发:15+4=19 MSS15 + 4 = 19\text{ MSS},还剩 24−19=5 MSS24 - 19 = 5\text{ MSS}。
  • 【RTT 6】(拥塞避免:cwnd=5 MSS\text{cwnd} = 5\text{ MSS})

    • A 发送剩余的最后 5 个报文(报文 20 ∼\sim 24):seq=19101∼24100\text{seq} = 19101 \sim 24100。
    • B 回复累计确认:ack=24101\text{ack} = 24101。
    • A 计划发送的 24000 字节数据全部传输完毕且已被全部确认!

第五阶段:四次挥手(A 率先断开)#

因为是 A 单向传输数据且已全部发完,由 A 率先发起 FIN\text{FIN}:

  1. 挥手 1(A →\rightarrow B):A 发起断开
    • 标志位:FIN=1,ACK=1,seq=24101,ack=501\text{FIN} = 1, \text{ACK} = 1, \text{seq} = 24101, \text{ack} = 501
    • 状态:A 进入 FIN_WAIT_1\text{FIN\_WAIT\_1}。
  2. 挥手 2(B →\rightarrow A):B 确认断开请求
    • 标志位:ACK=1,seq=501,ack=24102\text{ACK} = 1, \text{seq} = 501, \text{ack} = 24102
    • 状态:B 进入 CLOSE_WAIT\text{CLOSE\_WAIT},A 收到后进入 FIN_WAIT_2\text{FIN\_WAIT\_2}。
  3. 挥手 3(B →\rightarrow A):B 无数据发送,直接发送关闭
    • 标志位:FIN=1,ACK=1,seq=501,ack=24102\text{FIN} = 1, \text{ACK} = 1, \text{seq} = 501, \text{ack} = 24102
    • 状态:B 进入 LAST_ACK\text{LAST\_ACK}。
  4. 挥手 4(A →\rightarrow B):A 确认关闭
    • 标志位:ACK=1,seq=24102,ack=502\text{ACK} = 1, \text{seq} = 24102, \text{ack} = 502
    • 状态:A 进入 TIME_WAIT\text{TIME\_WAIT},倒计时 2MSL2\text{MSL};B 收到后立即进入 CLOSED\text{CLOSED}!

TCP 模型 2 全过程#

阶段 / 事件发送方 cwnd\text{cwnd}门限 ssthresh\text{ssthresh}传输数据 seq\text{seq} 范围接收方确认 ack\text{ack}核心状态及机制说明
握手建立18--三次握手完成,进入慢开始
RTT 11→21 \rightarrow 28101∼1100101 \sim 11001101慢开始:指数增长
RTT 22→42 \rightarrow 481101∼31001101 \sim 31003101慢开始:指数增长
RTT 34→84 \rightarrow 883101∼71003101 \sim 71007101达门限,切入拥塞避免
RTT 4887101∼151007101 \sim 15100-报文 11 丢失(seq=10101\text{seq}=10101)
冗余确认88-10101 (重复 3 次)报文 12~14 触发 3 个 Dup ACK
快重传84重传 10101∼1100010101 \sim 11000-立即补发报文 11,不等待超时
快恢复 (Reno)7→87 \rightarrow 84--cwnd=ssthresh+3\text{cwnd} = \text{ssthresh} + 3 临时膨胀
退出快恢复44-15101累积确认到达,切回拥塞避免
RTT 54→54 \rightarrow 5415101∼1910015101 \sim 1910019101拥塞避免:加法增大(+1)
RTT 65→65 \rightarrow 6419101∼2410019101 \sim 2410024101全部发完,加法增大
挥手 1--FIN,seq=24101\text{FIN}, \text{seq}=24101501A 发起连接终止
挥手 2~4---24102 / 502B 确认并挥手,A 确认,全流程结束

应用层#

应用层 - 考纲#

  • 网络应用模型
    • 客户端/服务端模型
    • P2P 模型
  • DNS 系统
    • 层次域名空间
    • 域名服务器
    • 域名解析过程
  • 文件传输协议 FTP
    • FTP 的工作原理
    • 控制连接与数据连接
  • 电子邮件
    • 电子邮件系统的组成与结构
    • 电子邮件格式与 MIME
    • SMTP 与 POP3
  • 万维网 WWW
    • WWW 的概念与组成结构
    • HTTP

网络应用模型#

客户端/服务端模型#

客户端主动发起请求,服务端被动等待并响应,服务端要一直在线,有固定的地址和端口。

好处是集中管理、便于计费和安全控制;坏处是服务端容易成为瓶颈和单点故障。

P2P 模型#

每个节点既是客户端又是服务端,可以直接交换数据,不需要中心服务器。

好处是扩展性好,节点越多总带宽越大;坏处是管理困难、内容难以管控、节点行为不可靠。

需要注意,P2P 里没有固定的服务端角色,一个节点可以同时对别人提供服务,也可以同时向别人请求服务。

dns#

常用于 53 端口,采用 UDP。

域名服务器层级#

基于 blog.attilio.cc 为例。

  • . 为根域名服务器,一般省略
  • .cc 为顶级域名服务器
  • .attilio.cc 为权限域名服务器

可能设置多个权限域名服务器,例如在这里也可以把 blog 也设置为权限域名服务器。

一般做最坏例的讨论。

迭代查询#

如果前面有 www,忽略之,目标域名为 blog.attilio.cc。

首先考虑单权限域名服务器的情况(假设整个二级域及其子域都统一由一台权限域名服务器管理,不进行子域委派):

本机向本地域名服务器发起递归查询,委托其代为打听;本地域名服务器在本地无缓存的情况下,对外进行迭代查询:

  1. 本地域名服务器向根域名服务器发送请求,根域名服务器收到请求后,发现这是 .cc 结尾的域名,返回 .cc 顶级域名服务器 的 IP 地址;
  2. 本地域名服务器向 .cc 顶级域名服务器发送请求,.cc 顶级域名服务器收到请求后,发现这是 attilio.cc 的域,返回 attilio.cc 权限域名服务器 的 IP 地址;
  3. 本地域名服务器向 attilio.cc 权限域名服务器发送请求,attilio.cc 权限域名服务器收到请求后,由于没有单独设立下一级子域服务器,它直接在内部记录中查到了 blog 的主机映射,直接返回 blog.attilio.cc 对应的最终 IP 地址。

本地域名服务器对外进行了 3 次迭代查询;

本机自身只向本地域名服务器发送了 1 次查询请求;

整个解析流程在网络上一共产生了 4 个查询报文(本机 1 次 + 本地 DNS 3 次),最终成功得到 blog.attilio.cc 的 IP 地址。

然而,如果是最坏情况,也就是存在子域委派,那么就需要进行更多的查询。

修改 3,本地域名服务器向 attilio.cc 权限域名服务器发送请求,attilio.cc 权限域名服务器收到请求后,发现 blog 是子域,所以委派给 blog 权限域名服务器,返回 blog 权限域名服务器的 IP 地址;

增加 4,本地域名服务器向 blog 权限域名服务器发送请求,blog 权限域名服务器收到请求后,查询到 blog.attilio.cc 的 IP 地址,返回。

综上,要辨析清楚返回的是 DNS 服务器的 IP 地址还是对应解析的 IP 地址。

递归查询#

对于递归查询和上述类似的,只不过变成老大亲自去跑腿,本地域名服务器只需要发一次即可。

不过需要注意的是,递归查询和迭代查询是可以随时替换的,例如整条链路可能一部分是递归,一部分是迭代,不一定是课本标准模型里那样。

比如说,顶级域名服务器采用递归查询,而权限域名服务器使用迭代查询等。

ftp#

名称:文件传输协议(File Transfer Protocol),基于 TCP 的客户端/服务器(C/S)模型。

核心特征:带外(Out-of-band)控制,即控制信息和实际数据分别在两条不同的 TCP 连接中传输。

两个端口与两条连接#

控制连接(端口 21): 用于传输客户端的用户名、密码、各种操作命令(如 PUT、GET、LS)以及服务器的应答状态码。

生命周期:在整个 FTP 会话期间一直保持打开状态,直到用户退出登录。

数据连接(端口 20 或随机高位端口): 用于实际传输文件内容、目录列表等数据。

生命周期:每次有数据传输需求时才临时建立,传输完毕后立即关闭。

两种工作模式(谁连谁、用不用 20 端口的本质区别)#

主动模式(PORT 模式,服务器主动找客户端): 控制连接:客户端随机选择端口 N,连接服务器的 21 端口。

客户端通知:客户端在本地监听端口 N+1,并通过控制连接向服务器发送 PORT 命令,告知服务器:“我的 IP 和端口是 N+1”。

数据连接:服务器使用固定的 20 端口,主动向客户端的 N+1 端口发起 TCP 连接。

缺陷:若客户端处于内网或开启了防火墙,服务器主动发起的连接会被客户端防火墙拦截。

被动模式(PASV 模式,客户端主动找服务器,现代主流):

控制连接:客户端连接服务器 21 端口后,向服务器发送 PASV 命令。

服务器响应:服务器在本地开放一个临时的随机高位端口 P,并告知客户端。

数据连接:客户端主动向服务器的端口 P 发起 TCP 连接。

注意:在被动模式下,服务器的数据传输根本不用 20 端口,而是使用随机高位端口。

smtp#

smtp 解析#

定位:纯文本的、基于推(Push)模式的邮件传输协议。

端口:默认明文端口 25,加密端口(SMTPS)常用 465 或 587。

机制与缺陷: 工作在 TCP 之上,客户端或源邮件服务器将邮件主动“推”送到目的邮件服务器。 致命缺陷是最初只支持传输 7 位 ASCII 码文本,不能直接传输可执行文件、图片、音频及非 ASCII 编码的文字(如汉字)。

pop3#

定位:基于拉(Pull)模式的邮件读取协议。

端口:默认端口 110,SSL 加密端口 995。

机制:用户代理连接到邮件服务器,将邮件下载到本地计算机阅读。

工作模式:

删除模式:从服务器拉取邮件后,立刻在服务器端删除该邮件。

保留模式:拉取到本地后,服务器端依然保留副本。缺点是不同设备间不能很好地同步已读/未读状态(后被支持双向同步的 IMAP4 取代)。

IMAP#

定位:基于拉(Pull)模式的邮件读取协议,是 POP3 的升级替代。

端口:默认 143,SSL 加密端口 993。

和 POP3 的关键区别:邮件默认保留在服务器上,客户端只同步首部和状态,所以多设备之间的已读、未读、文件夹结构可以保持一致。

需要注意,POP3 适合“只在一台电脑上收信”的老场景,IMAP 适合手机、电脑多端同步的现代场景;两者都只负责收信,发信仍然靠 SMTP。

mime#

定位:不是独立的传输协议,而是寄生在 SMTP 之上的内容格式扩展标准。

机制:在原有邮件首部增加了额外字段(如 MIME-Version、Content-Type、Content-Transfer-Encoding)。

作用:将非 ASCII 码的二进制数据(如图片、视频、附件、汉字)通过 Base64 或 Quoted-Printable 等编码规则,全部无损转换成普通的 7 位 ASCII 码文本,使得老旧的 SMTP 能够安全可靠地传输富文本和多媒体内容。接收端再根据 MIME 首部反向解码还原。

http 邮件#

机制:现代主流模式(如 QQ 邮箱、Gmail 网页版)。 流向与协议分工: PC 端浏览器到源邮件服务器:使用 HTTP/HTTPS 协议(包含发送邮件和读取邮件)。

两个不同邮件服务器之间互转:依然使用传统的 SMTP 协议通过互联网中继转发。

目的邮件服务器到接收方浏览器:接收方同样使用 HTTP/HTTPS 协议登录网页拉取并阅读邮件。

优势:客户端无需安装专门的邮件客户端(如 Outlook),无需配置繁琐的 SMTP/POP3 端口,有浏览器即可收发。

http#

http 常用端口为 80,https 常用端口为 443。

考虑这样一个场景:内网 1 中的主机 A 需要向内网 2 中的 Web 服务器主机 B 发送一个 HTTP 请求。主机 A 首先从本地随机分配一个源端口,以源套接字 192.168.x.x<11452> 发送数据报,目的地址设置为内网 2 网关的公网 IP 及对应服务端口,例如 211.211.211.211<80>。

当数据报到达内网 1 的默认网关(NAT 路由器)时,网关将其源私网 IP 和端口转换为内网 1 自身的公网 IP 和新分配的端口,并记录到 NAT 转换表中,然后将该报文转发至公网。

公网路由将报文送达内网 2 的默认网关路由器(具有公网 IP 211.211.211.211)。该路由器通过预先配置的端口映射规则(如将外网 80 端口映射到内网主机 B 的 80 端口),将目的 IP 和端口转换为内网主机 B 的私网套接字,最终将 HTTP 请求准确投递给内网 2 中的主机 B。

HTTP 报文格式#

请求报文由请求行、首部行、空行和实体主体组成,请求行是“方法 URL 版本”,例如 GET /index.html HTTP/1.1。

响应报文由状态行、首部行、空行和实体主体组成,状态行是“版本 状态码 短语”,例如 HTTP/1.1 200 OK。

常见状态码:200 成功,301 永久重定向,304 未修改(命中缓存),400 请求错误,403 禁止访问,404 未找到,500 服务器内部错误。

需要注意,HTTP 是无状态的,所以要用 Cookie 或 Session 维持登录状态;Cookie 存在客户端,Session 存在服务端。

四种 http 形式#

以发送 index.html(包含 5 个图像为例)

  1. 非持续连接(无并行 / 串行) 机制:每个对象的获取都必须新建一次 TCP 连接,且传输完毕后立刻断开该连接。 过程: 获取 html 消耗 2 RTT(三次握手 1 RTT + 请求与返回 1 RTT); 后续 5 个图像每个依次单独建连并获取,各消耗 2 RTT。 总耗时:2+5×2=12 RTT2+5\times 2=12\text{ RTT}。

  2. 非持续连接(带并行 / 并发) 机制:浏览器允许同时建立多个并行的 TCP 连接(通常上限为 5 到 8 个),各自独立获取不同对象,获取后均断开。 过程: 先用 1 个连接获取 html,耗时 2 RTT; 解析出 5 个图像后,同时并发发起 5 个独立的 TCP 连接并行下载。 总耗时:2+2=4 RTT2+2=4\text{ RTT}。

  3. 持续非流水线连接(Persistent without Pipelining) 机制:服务器在发送响应后仍保持该 TCP 连接打开。客户端必须在收到前一个对象的响应后,才能在同一个连接上发出下一个对象的请求。 过程: 建立连接并获取 html,耗时 2 RTT; 连接不释放,依次发送第 1 到第 5 个图像的请求,每个图像在已有连接上花费 1 RTT。 总耗时:2+5=7 RTT2+5=7\text{ RTT}。

  4. 持续流水线连接(Persistent with Pipelining) 机制:保持 TCP 连接不释放,客户端在收到前一个响应之前,就可以一口气连续发出后续所有对象的请求。 过程: 建立连接并获取 html,耗时 2 RTT; 解析出 5 个图像后,在同一个连接中连续发出 5 个请求,服务器顺次流水线回传全部图像,仅需 1 个往返。 总耗时:2+1=3 RTT2+1=3\text{ RTT}。

应用层模型解析#

以发送 http 请求 + dns + ARP + 交换机自学习 + DHCP 为例。

DHCP 动态获取 IP#

  1. DHCP Discover(发现):
    • 主机 A 在应用层生成 DHCP 请求,封装在 UDP 数据报中(源端口 68,目的端口 67)。
    • IP 层:源 IP 为 0.0.0.0,目的 IP 为受限广播地址 255.255.255.255。
    • MAC 层:源 MAC 为主机 A 的 MAC,目的 MAC 为广播 MAC FF-FF-FF-FF-FF-FF。
    • 交换机自学习:广播帧路过局域网交换机,交换机立刻把 (主机 A 的 MAC, 入端口 1) 记录到自己的 MAC 地址转发表(CAM 表)中!然后将此广播帧向除端口 1 外的所有端口泛洪(Flooding)。
  2. DHCP Offer(提供):
    • 局域网内的 DHCP 服务器(通常由默认网关路由器兼任)收到广播,分配一个未使用的 IP 给 A,通过单播或广播回送 Offer。
  3. DHCP Request(请求) & DHCP ACK(确认):
    • A 正式请求租用该 IP,DHCP 服务器回复确认报文。
  • 最终成果:主机 A 彻底“合法落户”!此时主机 A 拥有了:
    • 本机私网 IP:192.168.1.100;
    • 子网掩码:255.255.255.0;
    • 默认网关路由器的 IP:192.168.1.1;
    • 本地 DNS 服务器的 IP:211.1.1.1;

ARP 解析网关 MAC#

主机 A 准备在浏览器输入 http://www.serverB.com。 A 想要解析这个域名,必须先发报文给 DNS 服务器(211.1.1.1)。 A 用自己的子网掩码一算:211.1.1.1 和自己不在同一个子网!必须走默认网关(192.168.1.1)! 可是,A 的 ARP 缓存表是空的!A 根本不知道网关的 MAC 地址是多少,链路层无法打包!

  1. A 发送 ARP 请求(广播):
    • 内容:“谁是 192.168.1.1?请把你的 MAC 地址告诉我!”
    • 目的 MAC:FF-FF-FF-FF-FF-FF。
    • 交换机再次确认学习:确保主机 A 的端口映射最新,然后泛洪广播。
  2. 默认网关单播回复 ARP 应答:
    • 网关收到广播,发现问的是自己,回复:“我是 192.168.1.1,我的 MAC 是 MAC_Gateway!”
    • 交换机自学习:网关的应答帧进入交换机,交换机立刻学习记录 (网关的 MAC, 入端口 2)!
    • 交换机查表发现目标是主机 A,精准单播转发给主机 A。
  • 最终成果:主机 A 在本地 ARP 缓存表中写下:192.168.1.1 -> MAC_Gateway。

DNS 域名解析#

现在 A 可以把数据包发给网关了,目标是去查出 www.serverB.com 的真正 IP!

  1. 封装 DNS 查询报文:
    • 应用层:DNS 查询请求(查 www.serverB.com)。
    • 传输层:UDP 协议(目的端口 53)。
    • 网络层:源 IP 192.168.1.100,目的 IP 211.1.1.1(DNS 服务器 IP)。
    • 链路层:源 MAC MAC_A,目的 MAC MAC_Gateway!
  2. 局域网转发与 NAT 转换:
    • 交换机查表,精准单播给网关。
    • 网关(NAT 路由器)收到报文,剥掉链路层,查看网络层:
      • 将源私网 IP 替换为网关公网 IP;
      • 将报文重新打包,通过广域网路由接口转发出去。
  3. 公网迭代/递归查询:
    • DNS 服务器(或经过根、顶级域、权威域多轮迭代后)找到了 www.serverB.com 对应的公网 IP:120.20.20.20。
    • DNS 响应原路返回,网关根据 NAT 表反向转换,送回主机 A。
  • 最终成果:主机 A 终于拿到了服务器 B 的 IP 地址:120.20.20.20!

TCP 三次握手#

有了目标 IP,但在发送 HTTP 之前,传输层必须先建立一条端到端、可靠的虚电路连接!

  1. 第一次握手(SYN):
    • A 生成 SYN=1, seq=x 报文,目的端口 80,目的 IP 120.20.20.20。
    • 经交换机、网关 NAT、公网各大自治域(OSPF、BGP 路由选择算法)跳跃转发,抵达服务器 B。
    • -(如果服务器 B 局域网也冷启动,B 的默认网关也会在内部广播一次 ARP 解析出 B 的 MAC,再送达 B 的网卡)-。
  2. 第二次握手(SYN + ACK):
    • 服务器 B 收到后,为该连接分配缓存和控制块,回送 SYN=1, ACK=1, seq=y, ack=x+1。
  3. 第三次握手(ACK):
    • 主机 A 收到 B 的回信,回复 ACK=1, ack=y+1。
  • 最终成果:双方的 TCP 状态机均进入 ESTABLISHED 状态,连接通道正式开通!

HTTP 请求与响应#

  1. 发送 HTTP GET 请求:
    • 主机 A 在应用层组装 HTTP 请求报文: GET /index.html HTTP/1.1\r\nHost: www.serverB.com\r\n...
    • TCP 将其切片封装并打上序号发送。
  2. 公网飞驰:
    • 报文穿过千山万水,穿透双向 NAT,安全送达服务器 B。
  3. Web 服务器响应:
    • 服务器 B 的 Web 守护进程读取请求,返回 HTTP/1.1 200 OK,正文携带 HTML 网页数据。
  4. 最终呈现:
    • 主机 A 收到响应报文,TCP 层向上交付给浏览器,浏览器内核解析渲染出漂漂亮亮的网页!

应用层模型总结#

阶段核心协议解决的根本痛点涉及的关键硬件动作
0. 认祖归宗DHCPA 没 IP、没掩码、没网关、没 DNS广播 Discover;交换机记录 A 的 MAC
1. 摸清家门ARPA 知道网关 IP,但链路层不知道网关 MAC广播求 MAC;交换机记录网关的 MAC
2. 问询天下DNSA 知道域名,不知道 B 的物理 IP跨公网 UDP 传输,NAT 替换 IP 与端口
3. 订立契约TCP准备发数据,但两端还没建立可靠连接经过公网路由器跳步转发,三次握手置位
4. 互通有无HTTP真正的应用层数据请求与网页回传建立在已通的 TCP 套接字之上流式交付

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

考研冲刺前的总结 —— 计算机网络
https://blog.attilio.cc/posts/npee/ne/
作者
ShaddockNH3
发布于
2026-09-09
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
ShaddockNH3
Just a humble and obscure soul, dreaming of ascending to prominence while journeying along the path.
公告
欢迎来到我的博客!
分类
标签
最新动态
站点统计
文章
17
分类
6
标签
32
总字数
689,780
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
1
前言
2
绪论
绪论 - 考纲
计算机网络概述
计算机网络的组成与分类
性能指标
计算机体系结构与参考模型
服务数据单元与协议数据单元
OSI 参考模型
TCP/IP
教学模型
3
物理层
物理层 - 考纲
通信基础
编码与调制
奈奎斯特定理
香浓定理
通信基础相关的计算辨析
传输介质
物理层设备
中继器
集线器
4
数据链路层
数据链路层 - 考纲
数据链路层基本功能
组帧
字符计数法
字节填充法
零比特填充法
违规编码法
差错控制
检错码与纠错码理论
奇偶校验码
CRC 循环冗余校验
海明码
流量控制与可靠传输机制
停止等待协议
回退 N 帧协议
选择重传协议
信道利用率分析
介质访问控制
时分复用 TDM
频分复用 FDM
波分复用 WDM
码分复用 CDM
ALOHA 协议
CSMA 协议
令牌传递协议
局域网
以太网与 IEEE 802.3
以太网传输介质
以太网 mac 地址
CSMA/CD 协议
以太网的 mac 帧
高速以太网
无线局域网
CSMA/CA
802.11 mac 帧
VLAN 与 802.1q 帧
CSMA/CD 相关的计算
广域网
数据链路层设备
网桥
交换机
共享式以太网与交换式以太网
交换机自学习模型(含 VLAN)
步骤一:主机 A 向主机 C 发送数据帧(广播泛洪与初次学习)
步骤二:主机 C 收到后,向主机 A 回复响应帧(单播转发与对端学习)
步骤三:上级交换机经由 Trunk 口向主机 B 发送数据帧(带 q 帧的学习)
步骤四:主机 B 回复服务器 D(跨链路带 q 转发)
5
网络层
网络层 - 考纲
网络层基本功能
异构网络互连
路由与转发
虚电路与数据报
软件定义网络
拥塞控制
IPV4
IPv4 分组格式
IPv4 的地址(IP 地址)
NAT 技术
网络层分组
ARP 地址解析协议
DHCP 协议
ICMP
IPV6
路由算法
静态路由
层次路由
内部网关协议 IGP - RIP
内部网关协议 IGP - OSPF
外部网关协议 EGP - BGP
IP 多播
移动 IP
网络层设备
路由器
路由表与分组转发
RIP 协议全流程
0 时刻启动
时刻 T0T_0T0​:初始上电状态
第 1 次更新周期(T≈0∼30sT \approx 0 \sim 30\text${s}T≈0∼30s):相邻信息互换
1. R1 与 R2 之间互换
2. R2 与 R3 之间互换
第 1 次更新结束后各表状态
第 2 次更新周期(T≈60sT \approx 60\text${s}T≈60s):跨跳信息扩散与全网收敛
1. R2 发送路由表给 R1
2. R2 发送路由表给 R3
RIP 模型结束
稳态后的异常处理:故障与“坏消息传得慢”
关于 RIP 其他注意的点
ARP 协议解析全流程
阶段一:H1 向 H4 发送数据
步骤 1:H1 查询本地缓存并发送 ARP 请求广播
步骤 2:全网接收与 ARP 缓存学习
步骤 3:H4 单播发送 ARP 响应给 H1
步骤 4:H1 正式向 H4 发送 IP 数据报
阶段二:随后,主机 H2 向主机 H1 发送数据
步骤 5:H2 检查本地 ARP 缓存表
步骤 6:H2 直接封装并单播发送 IP 数据报给 H1
状态速查表
内网 1 主机 A 向内网 2 WEB 服务器发送 IP 数据报
阶段 1:主机 A 进行网段判断(路由决策)
阶段 2:内网 1 内部的 ARP 寻址(A 寻找网关的 MAC)
阶段 3:主机 A 封装并发送首个 IP 数据报
阶段 4:路由器解封装与查表路由
阶段 5:内网 2 内部的 ARP 寻址(路由器寻找 Web 服务器的 MAC)
阶段 6:路由器封装并成功交付 IP 数据报
IP 与 MAC 会不会变
公网主机 1 向公网主机 2 发送 IP 数据报 TTL 辨析
6
传输层
传输层 - 考纲
端口号
面向连接与无连接
UDP
UDP 首部
UDP 分用和复用
UDP 校验
TCP
TCP 报文段
重传
三报文握手
四报文挥手
TCP 流量控制
TCP 拥塞控制
MSS 和序号的概念
TCP 的注意点
辨析超时和丢失
RTO 超时相关的计算
TCP 模型 1:双方同时发送数据
第一阶段:三次握手(建立连接)
第二阶段:慢启动数据传输(RTT 1 ∼\sim∼ RTT 4)
RTT 1:初始慢启动(cwnd=1 MSS\text${cwnd} = 1\text${ MSS}cwnd=1 MSS)
RTT 2:慢启动翻倍(cwnd=2 MSS\text${cwnd} = 2\text${ MSS}cwnd=2 MSS)
RTT 3:慢启动翻倍(cwnd=4 MSS\text${cwnd} = 4\text${ MSS}cwnd=4 MSS)
RTT 4:B 发送完毕并率先发起挥手
第三阶段:连接释放与尾部数据传输(B 率先发 FIN)
TCP 模型全流程
TCP 模型 2:慢开始,拥塞避免,快重传,快恢复
TCP 模型 2 流程分析
第一阶段:三次握手
第二阶段:慢开始阶段(RTT 1 ∼\sim∼ RTT 3)
第三阶段:丢包与快重传、快恢复(RTT 4)
第四阶段:重回拥塞避免并完成剩余传输(RTT 5 ∼\sim∼ RTT 6)
第五阶段:四次挥手(A 率先断开)
TCP 模型 2 全过程
7
应用层
应用层 - 考纲
网络应用模型
客户端/服务端模型
P2P 模型
dns
域名服务器层级
迭代查询
递归查询
ftp
两个端口与两条连接
两种工作模式(谁连谁、用不用 20 端口的本质区别)
smtp
smtp 解析
pop3
IMAP
mime
http 邮件
http
HTTP 报文格式
四种 http 形式
应用层模型解析
DHCP 动态获取 IP
ARP 解析网关 MAC
DNS 域名解析
TCP 三次握手
HTTP 请求与响应
应用层模型总结
文章目录
1
前言
2
绪论
绪论 - 考纲
计算机网络概述
计算机网络的组成与分类
性能指标
计算机体系结构与参考模型
服务数据单元与协议数据单元
OSI 参考模型
TCP/IP
教学模型
3
物理层
物理层 - 考纲
通信基础
编码与调制
奈奎斯特定理
香浓定理
通信基础相关的计算辨析
传输介质
物理层设备
中继器
集线器
4
数据链路层
数据链路层 - 考纲
数据链路层基本功能
组帧
字符计数法
字节填充法
零比特填充法
违规编码法
差错控制
检错码与纠错码理论
奇偶校验码
CRC 循环冗余校验
海明码
流量控制与可靠传输机制
停止等待协议
回退 N 帧协议
选择重传协议
信道利用率分析
介质访问控制
时分复用 TDM
频分复用 FDM
波分复用 WDM
码分复用 CDM
ALOHA 协议
CSMA 协议
令牌传递协议
局域网
以太网与 IEEE 802.3
以太网传输介质
以太网 mac 地址
CSMA/CD 协议
以太网的 mac 帧
高速以太网
无线局域网
CSMA/CA
802.11 mac 帧
VLAN 与 802.1q 帧
CSMA/CD 相关的计算
广域网
数据链路层设备
网桥
交换机
共享式以太网与交换式以太网
交换机自学习模型(含 VLAN)
步骤一:主机 A 向主机 C 发送数据帧(广播泛洪与初次学习)
步骤二:主机 C 收到后,向主机 A 回复响应帧(单播转发与对端学习)
步骤三:上级交换机经由 Trunk 口向主机 B 发送数据帧(带 q 帧的学习)
步骤四:主机 B 回复服务器 D(跨链路带 q 转发)
5
网络层
网络层 - 考纲
网络层基本功能
异构网络互连
路由与转发
虚电路与数据报
软件定义网络
拥塞控制
IPV4
IPv4 分组格式
IPv4 的地址(IP 地址)
NAT 技术
网络层分组
ARP 地址解析协议
DHCP 协议
ICMP
IPV6
路由算法
静态路由
层次路由
内部网关协议 IGP - RIP
内部网关协议 IGP - OSPF
外部网关协议 EGP - BGP
IP 多播
移动 IP
网络层设备
路由器
路由表与分组转发
RIP 协议全流程
0 时刻启动
时刻 T0T_0T0​:初始上电状态
第 1 次更新周期(T≈0∼30sT \approx 0 \sim 30\text${s}T≈0∼30s):相邻信息互换
1. R1 与 R2 之间互换
2. R2 与 R3 之间互换
第 1 次更新结束后各表状态
第 2 次更新周期(T≈60sT \approx 60\text${s}T≈60s):跨跳信息扩散与全网收敛
1. R2 发送路由表给 R1
2. R2 发送路由表给 R3
RIP 模型结束
稳态后的异常处理:故障与“坏消息传得慢”
关于 RIP 其他注意的点
ARP 协议解析全流程
阶段一:H1 向 H4 发送数据
步骤 1:H1 查询本地缓存并发送 ARP 请求广播
步骤 2:全网接收与 ARP 缓存学习
步骤 3:H4 单播发送 ARP 响应给 H1
步骤 4:H1 正式向 H4 发送 IP 数据报
阶段二:随后,主机 H2 向主机 H1 发送数据
步骤 5:H2 检查本地 ARP 缓存表
步骤 6:H2 直接封装并单播发送 IP 数据报给 H1
状态速查表
内网 1 主机 A 向内网 2 WEB 服务器发送 IP 数据报
阶段 1:主机 A 进行网段判断(路由决策)
阶段 2:内网 1 内部的 ARP 寻址(A 寻找网关的 MAC)
阶段 3:主机 A 封装并发送首个 IP 数据报
阶段 4:路由器解封装与查表路由
阶段 5:内网 2 内部的 ARP 寻址(路由器寻找 Web 服务器的 MAC)
阶段 6:路由器封装并成功交付 IP 数据报
IP 与 MAC 会不会变
公网主机 1 向公网主机 2 发送 IP 数据报 TTL 辨析
6
传输层
传输层 - 考纲
端口号
面向连接与无连接
UDP
UDP 首部
UDP 分用和复用
UDP 校验
TCP
TCP 报文段
重传
三报文握手
四报文挥手
TCP 流量控制
TCP 拥塞控制
MSS 和序号的概念
TCP 的注意点
辨析超时和丢失
RTO 超时相关的计算
TCP 模型 1:双方同时发送数据
第一阶段:三次握手(建立连接)
第二阶段:慢启动数据传输(RTT 1 ∼\sim∼ RTT 4)
RTT 1:初始慢启动(cwnd=1 MSS\text${cwnd} = 1\text${ MSS}cwnd=1 MSS)
RTT 2:慢启动翻倍(cwnd=2 MSS\text${cwnd} = 2\text${ MSS}cwnd=2 MSS)
RTT 3:慢启动翻倍(cwnd=4 MSS\text${cwnd} = 4\text${ MSS}cwnd=4 MSS)
RTT 4:B 发送完毕并率先发起挥手
第三阶段:连接释放与尾部数据传输(B 率先发 FIN)
TCP 模型全流程
TCP 模型 2:慢开始,拥塞避免,快重传,快恢复
TCP 模型 2 流程分析
第一阶段:三次握手
第二阶段:慢开始阶段(RTT 1 ∼\sim∼ RTT 3)
第三阶段:丢包与快重传、快恢复(RTT 4)
第四阶段:重回拥塞避免并完成剩余传输(RTT 5 ∼\sim∼ RTT 6)
第五阶段:四次挥手(A 率先断开)
TCP 模型 2 全过程
7
应用层
应用层 - 考纲
网络应用模型
客户端/服务端模型
P2P 模型
dns
域名服务器层级
迭代查询
递归查询
ftp
两个端口与两条连接
两种工作模式(谁连谁、用不用 20 端口的本质区别)
smtp
smtp 解析
pop3
IMAP
mime
http 邮件
http
HTTP 报文格式
四种 http 形式
应用层模型解析
DHCP 动态获取 IP
ARP 解析网关 MAC
DNS 域名解析
TCP 三次握手
HTTP 请求与响应
应用层模型总结