TCP/IP详解
目录
三、移动 IP 的核心工作流程(4 个关键步骤,贴合 IP 转发逻辑)
4.ICMPv4和ICMPv6:Internet控制报文协议
目的不可达(ICMPv4类型3,ICMPv6类型1)和数据包太大(ICMPv6类型2)
回显请求/应答(ping)(ICMPv4类型0/8,ICMPv6类型129/128)
本地代理地址发现请求/应答(ICMPv6类型144/145)
组播路由器发现(IGMP类型48/49/50,ICMPv6类型151/152/153)
一、Internet地址结构
1.基本的IP地址结构
分类寻址:
现实中的不同网络可能有不同数量的主机,每台主机都需要一个唯一的IP地址。一种
划分方法是基于当前或预计的主机数量,将不同大小的IP地址空间分配给不同的站点。地
址空间的划分涉及五大类。每类都基于网络中可容纳的主机数量,确定在一个32位的IPv4
地址中分配给网络号和主机号的位数。


子网寻址:将一个分配给站点的网络号进一步细分为多个可分配的大小相同的子网,并根据网络管理员的合理要求使每个子网能支持相同数量的主机。

子网掩码:掩码由路由器和主机使用,以确定一个IP地址的网络/子网部分的结束和主机部分的开
始。子网掩码中的一位设为1表示一个IP地址的对应位与一个地址的网络/子网部分的对应位相结合,并将结果作为转发数据报的基础。相反,子网掩码中的一位设为0,表示一个IP地址的对应位作为主机ID的一部分。
广播地址:在每个IPv4子网中,一个特殊地址被保留作为子网广播地址。子网广播地址通过将
IPv4地址的网络/子网部分设置为适当值,以及主机部分的所有位设置为1而形成。比如,子网128.32.1.0/24的子网广播地址是128.32.1.255。从历史上看,使用这种地址作为目的地的数据报,也被称为定向广播。理论上,这种广播可作为一个单独的数据报通过Internet路由直至到达目标子网,再作为一组广播数据报发送给子网中所有主机。
可变长度子网掩码(VLSM):可用于分割一个网络号,使每个子网支持不同数量的主机。每个路由器和主机除了IP地址, 还需要配置一个子网掩码。大多数软件支持VLSM,除了一些旧的路由协议。

2.CIDR和聚合
为了帮助缓解IPv4地址(特别是B类地址)的压力,分类寻址方案通常使用一个类似VLSM的方案,扩展Internet路由系统以支持无类别域间路由(CIDR)。这提供了一种方便的分配连续地址范围的方式,包含多于255台但少于65536台主机,不只是单个B类或多个C类网络号可分配给站点。使用CIDR,未经过预定义的任何地址范围可作为一个类的一部分,但需要一个类似于子网掩码的掩码,有时也称为CIDR掩码。
CIDR掩码不再局限于一个站点,而对全球性路由系统都是可见的。因此,除了网络号之外,核心Internet路由器必须能解释和处理掩码。这个数字组合称为网络前缀,它用于IPv4和IPv6地址管理。

在树状拓扑的网络中,网络地址可采用特殊方式分配,以限制需保存在路由器中的路由信息
(“状态”)数量。如果不以这种(左侧的)方式分配地址,没有存储与需到达的节点数量成正
比的状态,则最短路径无法得到保证。当以保存状态的树状拓扑敏感的方式分配地址时,如果
网络拓扑发生变化,通常需要重新分配地址。

在Internet环境中,可采用分层路由思想以一种特定方式减少Internet路由条目数。这
通过一个称为路由聚合的过程来实现。通过将相邻的多个IP前缀合并成一个短前缀(称为一
个聚合或汇聚),可以覆盖更多地址空间。
在这个例子中,箭头表示将两个地址前缀聚合为一个,带下划线的前缀是每一步的结果。第一步,
190.154.27.0/26和190.154.27.64.0/26可以聚合,这是由于它们数值相邻,但190.154.27.192/26不能聚合。通过与190.154.27.128/26相加,它们可经过两步聚合形成190.154.27.0/24。最后,通
过与相邻的190.154.26.0/24相加,生成聚合结果190.154.26.0/23。
3.特殊用途地址
IPv4特殊用途地址:

IPv6特殊用途地址:

组播地址:
IPv4和IPv6支持组播寻址。一个IP组播地址(也称为组或组地址)标识一组主机接口,一个组可以跨越整个Internet。一个组所覆盖的网络部分称为组的范围,常见的范围包括节点本地(同一计算机)、链路本地(同一子网)、站点本地(适用于一些站点)、全球(整个Internet)和管理。管理范围的地址可用于一个网络区域内已手动配置到路由器的地址。站点管理员可将路由器配置为管理范围边界,这意味着相关组的组播流量不会被路由器转发。注意,站点本地和管理范围只在使用组播寻址时有效。
在软件的控制下,每个Internet主机中的协议栈能加入或离开一个组播组。当一台主机向一个组发送数据时,它会创建一个数据报,使用(单播)IP地址作为源地址,使用组播IP地址作为目的地址。已加入组的所有主机将接收发送到该组的任何数据报。发送方通常不知道主机是否接收到数据报,除非它们明确做出应答,发送方甚至不知道通常有多少台主机接收它的数据报。
二、协议
1.ARP地址解析协议
网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。操作系统软件(即以太网驱动
程序)必须知道目的主机的硬件地址,以便直接向它发送数据。对于TCP/IP网络,地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。ARP仅用于IPv4,IPv6使用邻居发现协议,它被合并入ICMPv6。
IPv4 直接交付是网络层 IP 协议的基础数据传输方式,核心定义为:源主机与目标主机处于同一物理网络(同一广播域)时,IP 数据包无需经过路由器转发,直接由源主机通过链路层协议发送至目标主机,是局域网内通信的核心实现方式,也是 IP 路由转发的基础场景。、
ARP高效运行的关键是维护每个主机和路由器上的ARP缓存(或表)。该缓存使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。当IPv4地址映射到硬件地址时,它对应于高速缓存中的一个条目,其正常到期时间是条目创建开始后的20分钟。
ARP帧格式:

代理ARP使一个系统(通常是一台专门配置的路由器)可回答不同主机的ARP请求。它使ARP请求的发送者认为做出响应的系统就是目的主机,但实际上目的主机可能在其他地方(或不存在)。
2.Internet协议
IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。“尽力而为”的含义是不保证IP数据报能成功到达目的地。“无连接”意味着IP不维护网络单元(即路由器)中数据报相关的任何链接状态信息, 每个数据报独立于其他数据报来处理。这也意味着IP数据报可不按顺序交付。
IPv4和IPv6数据报:


IP头部字段 第一个字段(只有4位或半个字节)是版本字段。它包含IP数据报的版本号:IPv4为4, IPv6为6。IPv4头部和IPv6头部除版本字段位置相同外再无其他是一样的。因此,这两个 协议不能直接互操作,主机或路由器必须分别处理IPv4或IPv6(或两者,称为双栈)。
Internet校验和是一个16位的数字和,它能以相当高的概率确定接收的消息或其中的部分内容是否与发送的相匹配。
IPv6扩展头部:
IPv6扩展头部机制将一些功能(例如路由和分片)与选项加 以区分。除了“逐跳选项”的位置之外(它是强制性的),扩展头部的顺序是建议性的,因 此一个IPv6实现必须按接收的顺序处理扩展头部。
隧道封装限制:
隧道是指将一个协议封装在另一个协议中。隧道可用于形成虚拟的覆盖网络,在覆盖网络中,一个网络可作为另一个IP的链路层使用。隧道可以嵌套,从这个意义上来说,一条隧道中的数据报本身也可采用递归方式封装在另一条隧道中。
在发送一个IP数据报时,发送者通常无法控制最终用于封装的隧道层次。发送者可使用这个选项设置一个限制。一台路由器打算将一个IPv6数据报封装在一条隧道中,它首先检查隧道封装限制选项是否存在并置位。如果这个限制选项的值为0,该数据报被丢弃,并将一个“ICMPv6参数问题”消息(见第8章)发送到数据报源端(即之前的隧道人口点)。如果这个限制选项的值不为0,该数据报可进行隧道封装,但新形成(封装)的IPv6数据报必须包括一个隧道封装限制选项,其值比封装之前的数据报中的封装限制选项值减1。封装限制行动类似于IPv4的TTL和IPv6的跳数限制字段,只不过采用隧道封装层次代替转发跳步。
家乡地址:
当使用IPv6移动选项时,这个选项保存发送数据报的IPv6节点的“家乡”地址。移动IP规定了IP节点的一系列处理过程,这些节点可能改变自已的网络接人点,同时不会断开自己的高层网络连接。这里存在一个节点的“家乡”的概念,它来自其典型位置的地址前缀。当远离家乡漫游时,通常为该节点分配一个不同的IP地址。该选项允许这个节点提供自己正常的家乡地址,以及它在漫游时的新地址(通常是临时分配)。当其他IPv6节点需要与移动节点通信时,它可以使用该节点的家乡地址。如果家乡地址选项存在,包含它的目的地选项头部必须出现在路由头部之后,并且在分片、认证和ESP头部之前。
分片头部:

当原始数据报被分片后,将会产生多个分片,其中每个分片都包含一个原始数据报中不
可分片部分的副本,但是需要修改每个IPv6头部的负载长度字段,以反映它所描述的分片
的大小。在不可分片部分之后,每个新的分片都包含一个分片头部,其中包含一个分片相应
的分片偏移字段(例如第一个分片的偏移量为0),以及一个原始分组的标识符字段的副本。
最后一个分片的M(更多分片)位字段设置为0。
IP转发:
一、IP 转发的核心前提
- 路由表:所有参与转发的设备(路由器、主机)都维护一张路由表,存储着不同目标网络对应的 “下一跳地址”“出接口” 等关键信息,是 IP 转发的核心依据,路由表的核心作用是 “指引数据包的转发路径”。
- IP 地址寻址:转发的核心判断依据是目标 IP 地址的网络号和子网号,而非完整 IP 地址,设备通过比对目标网络号,匹配路由表中的对应条目,确定转发路径。
- 链路层适配:IP 数据包本身无法在物理网络中传输,转发过程中需反复封装 / 解封装链路层帧(根据不同链路的 MTU、MAC 寻址规则),体现 TCP/IP 分层协作的逻辑。
二、IP 转发的两种核心方式(对应书中重点讲解内容)
1. 直接交付(局域网内转发)
- 适用场景:源主机与目标主机处于同一物理网络(同一广播域),无需路由器参与。
- 核心操作:
- 源主机比对自身与目标主机的网络号,确认同一网络;
- 通过 ARP 协议获取目标主机的 MAC 地址;
- 将 IP 数据包封装为链路层帧,直接发送至目标主机;
- 目标主机解封装帧,提取 IP 数据包并交付上层协议。
- 特点:延迟低、开销小,无需路由表查询(或仅匹配本机直连网络路由)。
2. 间接交付(跨网络转发)
- 适用场景:源主机与目标主机处于不同物理网络,必须通过路由器转发。
- 核心操作:
- 源主机(或前一跳路由器)接收 IP 数据包,提取目标 IP 地址;
- 查询路由表,匹配目标网络对应的下一跳路由器地址和出接口;
- 将数据包封装为对应出接口链路的帧,发送至下一跳路由器;
- 下一跳路由器重复 “接收 - 查询路由表 - 转发” 流程,直至数据包到达目标网络的网关路由器;
- 网关路由器通过直接交付,将数据包发送至目标主机。
- 特点:需多台路由器协同,依赖路由表的准确性,转发过程中可能涉及 IP 分片(若链路 MTU 不匹配)。
移动IP:

移动 IP 是 TCP/IP 协议族中,解决移动节点(如笔记本、手机)在跨物理网络移动时,仍能保持原有 IP 地址、维持网络连接不中断的扩展协议,核心目标是实现 IP 地址不变,位置动态迁移,弥补传统 IP 协议(节点位置固定)的局限性。
一、移动 IP 的核心前提与设计目标
- 核心痛点:传统 IP 协议中,节点的 IP 地址与物理网络绑定(网络号对应固定物理网络),一旦节点移动到其他物理网络,IP 地址需重新分配,导致原有网络连接中断(如正在进行的视频通话、文件传输)。
- 设计目标:① 移动节点移动时,保持原有 IP 地址不变(称为 “家乡地址”);② 不改变现有 TCP/IP 协议架构,与原有协议兼容;③ 不影响通信对端(固定节点)的通信逻辑,对端无需感知移动节点的位置变化;④ 高效转发数据,减少移动带来的通信延迟。
- 核心原则:依托 “代理转发” 机制,将移动节点的数据流,通过专用代理设备转发至移动节点当前所在的网络,实现跨网络的持续通信。
二、移动 IP 的核心组件(3 个关键角色,缺一不可)
这是移动 IP 实现的基础,对应书中 “协议协同工作” 的核心逻辑,各组件分工明确、协同配合:
- 移动节点(MN):可在不同物理网络间移动的终端设备(如手机、笔记本),拥有固定的家乡地址(HA)—— 即移动节点在 “家乡网络”(原始所属物理网络)中分配的 IP 地址,移动过程中始终不变;同时会获取当前所在 “外地网络” 的临时地址(转交地址 COA),用于接收转发过来的数据。
- 家乡代理(HA):部署在移动节点 “家乡网络” 中的路由器,核心作用是 “锚定” 移动节点的家乡地址,负责拦截所有发送给移动节点家乡地址的数据包,并将其转发至移动节点当前的转交地址;同时记录移动节点的位置信息(当前所在外地网络、转交地址),更新路由条目。
- 外地代理(FA):部署在移动节点 “外地网络”(当前所在的非家乡物理网络)中的路由器,核心作用是为移动节点分配临时的转交地址(COA),接收来自家乡代理转发的数据包,并传递给移动节点;同时向家乡代理反馈移动节点的当前位置,协助维持连接。
三、移动 IP 的核心工作流程(4 个关键步骤,贴合 IP 转发逻辑)
整体流程围绕 “地址绑定 + 代理转发” 展开:
- 位置注册:移动节点进入外地网络后,首先向外地代理发送 “注册请求”,获取临时的转交地址(COA);随后,移动节点通过外地代理,向家乡代理发送 “绑定请求”,告知家乡代理:“我的家乡地址是 XX,当前转交地址是 XX,请将发送给我的数据包转发至该转交地址”。
- 地址绑定:家乡代理接收并验证绑定请求后,更新自身的 “绑定表”(记录家乡地址与转交地址的对应关系),同时更新路由表,将 “发送至该家乡地址的数据包”,路由至移动节点的转交地址(即外地代理)。
- 数据转发(下行:对端→移动节点):
- 通信对端(固定节点)不知道移动节点已移动,仍向移动节点的家乡地址发送数据包;
- 该数据包到达家乡网络后,被家乡代理拦截;
- 家乡代理查询绑定表,获取移动节点当前的转交地址,将数据包封装后,转发至外地代理;
- 外地代理接收数据包后,剥离封装,将其传递给移动节点,完成下行数据转发。
- 数据回传(上行:移动节点→对端):移动节点发送数据时,直接以自身家乡地址为源 IP,向对端 IP 地址发送数据包,无需经过家乡代理(可通过外地代理转发,或直接接入互联网),对端接收后,仍以家乡地址回应,形成完整通信闭环。

3.DHCP动态主机配置协议
DHCP由两个主要部分组成:地址管理和配置数据交付。地址管理用于IP地址的动态分配,并为客户机提供地址租用。配置数据交付包括DHCP协议的消息格式和状态机。DHCP服务器可配置为提供三种地址分配:自动分配、动态分配和手动分配。三者之间的差异是地址分配是否基于客户机的身份,以及该地址是否可撤销或变更。最常用方法是动态分配,客户机从服务器配置的地址池(通常为一个预定义的范围)中获得一个可撤销的IP地址。自动分配使用的是相同方法,但地址不可撤销。在手动分配中,DHCP协议用于传输地址,但地址对于请求的客户机是不变的(即它不是由服务器维护的可分配池的一部分)。
DHCP协议在客户机和服务器中运行一个状态机。状态用于指出协议下一个处理的消息类型:

DHCP 的核心工作流程(4 步 “握手”)
TCP 三次握手、DNS 解析的交互逻辑一致,全程由客户端主动发起,服务器被动响应:
- 发现阶段(DHCP Discover):DHCP 客户端开机后,由于未分配 IP 地址,无法与服务器正常通信,因此会发送广播报文(目标 IP 为 255.255.255.255),寻找局域网内的 DHCP 服务器,告知服务器 “需要获取 IP 地址及网络配置”。此时客户端使用临时的链路层地址(MAC 地址)标识自身。
- 提供阶段(DHCP Offer):局域网内的 DHCP 服务器接收到广播请求后,会从自身的 IP 地址池中,挑选一个未被占用的 IP 地址,搭配子网掩码、网关、DNS 地址、IP 租期等配置信息,向客户端发送广播响应报文(因客户端暂无 IP,仍需广播),告知客户端 “可分配的网络配置”。若局域网内有多个 DHCP 服务器,客户端会接收所有 Offer 报文,后续选择第一个收到的进行确认。
- 请求阶段(DHCP Request):客户端接收 Offer 报文后,确认要使用该服务器分配的配置,再次发送广播报文,告知所有 DHCP 服务器(包括未发送 Offer 的服务器)“已选择某台服务器的配置,其他服务器可收回分配的 IP”,同时正式请求该服务器确认分配的配置。
- 确认阶段(DHCP Acknowledge):被选中的 DHCP 服务器接收到请求后,会确认该 IP 地址仍未被占用,然后发送广播确认报文,正式将 IP 地址及相关配置分配给客户端,并明确 IP 地址的租期(默认租期通常为 24 小时)。客户端接收确认后,即可使用该配置接入网络,完成整个动态分配流程。

4.ICMPv4和ICMPv6:Internet控制报文协议
IP协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包。此外,IP没有提供直接的方式来获取诊断信息(例如,哪些路由器在沿途中被使用了或使用一种方法来估计往返时间)。于是将一个特殊的Internet控制报文协议(Internet Control MessageProtocol,ICMP)与IP结合使用,以便提供与IP协议层配置和IP数据包处置相关的诊断和控制信息。
ICMP负责传递可能需要注意的差错和控制报文。ICMP报文通常是由IP层本身、上层的传输协议(例如TCP或者UDP),甚至某些情况下是用户应用触发执行的。ICMP并不为IP网络提供可靠性。相反它表明了某些类别的故障和配置信息。最常见的丢包(路由器缓冲区溢出)并不会触发任何的ICMP信息,而由其他协议如TCP来处理这种情况。
鉴于ICMP能够影响重要的系统功能操作和获取配置信息,黑客们已经在大量攻击中使用ICMP报文。由于担心这种攻击,网络管理员经常会用防火墙封阻ICMP报文,特别是在边界路由器上。如果ICMP被封锁,大量的诊断程序(例如ping,traceroute)将无法正常工作。
4.1ICMP报文:
ICMP报文是在IP数据报内被封装传输的。ICMP报文可分为两大类:有关IP数据报传递的ICMP报文(称为差错报文(error message)),以及有关信息采集和配置的ICMP报文(称为查询(query)或者信息类报文(informationalmessage))。

ICMP报文封装在IPv4和IPv6内部。ICMP头部包含了涵盖整个ICMP数据段的校验和。在
ICMPv6中,这个校验和也涵盖了IPv6头部中的源(Source)和目的IPv6地址(Destination
IPv6Address)字段、长度(Length)字段和下一个头部(NextHeader)字段。

所有的ICMP报文都以8位的类型(Type)和代码(Code)字段开始,其后的16位校验和 (Checksum)字段涵盖了整个报文。ICMPv4和ICMPv6中的类型和代码字段值是不同的。
ICMPv4报文
对于ICMPv4,信息类报文包括回显请求和回显应答(分别为类型8和0),以及路由器通告和路由器请求(分别为类型9和10,统一被称为路由器发现)。最常见的差错报文类型包括目的不可达(类型3)、重定向(类型5)、超时(类型11)和参数问题(类型12)。

表8-3给出了为ICMPv6定义的报文类型。注意ICMPv6负责的不仅是差错和信息类报 文,也负责大量IPv6路由器和主机的配置。


目的不可达(ICMPv4类型3,ICMPv6类型1)和数据包太大(ICMPv6类型2)
ICMPv4主机不可达(代码1)和ICMPv6地址不可达(代码3)
这种形式的目的不可达报文是由路由器或者主机产生的,出现在当它被要求使用直接交付方法发送一个IP数据报到一个主机,但由于某些原因无法到达目的地时。
ICMPv6目的无路由(代码0)
此报文对ICMPv4中的主机不可达报文进行了细分,将直接交付失败导致的和没有路由导致的区分开来。此报文出现在当到达的数据报不必采用直接交付的方式来转发,但却没有路由条目来指定下一跳该用哪个路由器时的情况下。如果IP路由器想要成功转发的话,它们必须为收到的任何数据包的目的地址包含一个有效的下一跳转发项。
ICMPv4端口不可达(代码3)和ICMPv6端口不可达(代码4)
当传人的数据报的目的应用程序还没准备好接收它时,就会生成一个端口不可达报文。这种情况最常出现在和UDP一起使用,当一个报文被发往的端口号并未被任何服务器进程使用时。如果UDP接收到一个数据报且对应的目的端口号并未被任何进程使用,UDP便会回应一个ICMP端口不可达报文。
ICMPv4PTB(代码4)
如果一个IPv4路由器收到一个打算转发的数据报,如果数据报大于选定的传出网络接口的MTU,则数据报需要分片。如果到达的数据报在IP头部中设置了不分片(Don'tFragment)位字段,那么它会被丢弃而不是转发,此时将产生ICMPv4目的不可达(PTB)报文。由于发送此报文的路由器知道下一跳的MTU,为此能够将MTU值包含在它生成的差错报文中。
ICMPv6超出源地址范围(代码2)
IPv6使用不同范围的地址。因此,有可能会构建一个不同范围的源和目的地址的数据包。此外,在相同范围内其目的地址有可能是无法到达的。例如,使用本地链路范围的源地址的数据包,其目的地址可能是一个需要遍历多跳路由的全局范围的地址。由于源地址的范围不足,数据包将被通过的路由器丢弃,同时生成一个这种形式的ICMPv6差错报文以表示这个问题。
ICMPv6拒绝路由到目的地(代码6)
一个拒绝(reject)或封阻路由(blockingroute)是一个特殊的路由或转发条目,指示匹配的数据包应该被丢弃,并生成一个ICMPv6目的不可达拒绝路由报文。一个类似的称为黑洞路由blackholeroute的条目也能够丢弃匹配的数据包,但是并不会生成目的不可达报文。这些路由可能会安装在路由器的转发表中,以防止数据包被发送到不希望的目的地中。不希望的目的地可能包括火星(martian)路由(公共互联网上并未使用的前缀)和虚假(bogons)路由(尚未分配的有效前缀)。
重定向(ICMPv4类型5,1CMPv6类型137)
假如一个路由器收到一个来自主机的数据报,并确定自身并不是主机将数据报投递到目 的地的对应下一跳,则该路由器发送一个重定向报文到主机并将该报文发送到正确的路由器 (或者主机)。也就是说,如果它能够确定给定的数据报存在一个比自己更好的下一跳路由, 它就向主机发送重定向报文使其更新转发表,这样以后目的地一样的流量就会被定向到新的节点中。这项功能通过向IP转发功能指示向哪里发送数据包提供了一种路由协议的原始形式。

ICMPv6重定向报文。目标地址字段指出了针对目的地址节点而言一个更好的下一跳路由器
的IPv6地址。这个报文也能够用于指出目的地址和发出报文进而导致差错报文的节点是在
同一个链路上的。在这种情况下,目的地址和目标地址是一样的。
ICMP超时(ICMPv4类型11,ICMPv6类型3)
每个IPv4数据报在头部中都有一个生存周期(Time-to-Live,TTL)字段,而每个IPv6数据报在其头部中都有一个跳数限制(HopLimit)字段(参见第5章)。按照最初的设想,8位TTL字段保存了一个数据报被强制丢弃之前允许活跃在网络中的秒数(如果存在转发环路,这将是一件好事)。因为另外一个规则表明,任何一个路由器对TTL字段至少减1,考虑到数据报的实际转发时间远小于1秒这个事实,在实际中TTL字段被用于限定一个IPv4数据报在被路由器丢弃之前所允许的跳数限制。这种用法最终在IPv6中被正式采用。当由于TTL或跳数限制字段值太小(即到达值0或1,且必须转发)致使路由器丢弃报文时,会产生ICMP超时(代码0)报文。此报文对于保证 traceroute工具的正常运作是很重要的(在Windows上称为 tracert)。
参数问题(ICMPv4类型12,ICMPv6类型4)
当一个主机或者路由器接收到一个IP数据报,其IP头部存在不可修复的问题时便会产 生一个ICMP参数问题报文。当一个数据报不能够被处理,且没有其他的ICMP报文来描述 这个问题时,这个报文充当了一个“包罗万象”的错误状态指示器。在ICMPv4和ICMPv6 中,当头部中某个字段超过可接受范围导致了一个错误时,一个特殊的ICMP差错报文指针(Pointer)字段指示了错误字段相对于出错IP头部的偏移值。
4.2ICMP查询/信息类报文
回显请求/应答(ping)(ICMPv4类型0/8,ICMPv6类型129/128)
一种最为常用的ICMP报文对就是回显请求和回显应答(或者回复)。在ICMPv4中,它们的类型分别是8和0,在ICMPv6中它们的类型分别是128和129。ICMP的回显请求报文大小几乎是任意的(受限于最终封装的IP数据报的大小)。收到ICMP回显请求报文后,ICMP的实现要求将任何接收到的数据返回给发送者,即使涉及多个IP分片。
路由器发现:路由器请求和通告(ICMPv4类型9,10)
IPv4的路由器发现是通过采用一对ICMPv4信息类报文实现的:路由器请求(RS,类型10)和路由器通告(RA,类型9)。通告由路由器通过两种方法发送。首先,它们定期对本地网络(使用TTL=1)的所有主机组播地址(224.0.0.1)进行组播,并提供给有需要的主机,它们通常使用RS报文进行请求。使用组播将RS报文发送到所有路由器组播地址上(224.0.0.2)。路由器发现的主要目的是让一台主机学习到它所在的本地子网中的所有路由器,因此它能够从中选择一台作为默认路由。它也被用于发现那些愿意充当移动IP代理的路由器。
本地代理地址发现请求/应答(ICMPv6类型144/145)
[RFC6275]定义了4种支持MIPv6的ICMPv6报文。其中2个ICMPv6报文用于动态本地代理地址发现,另外2个用于重新编号和移动配置。当一个MIPv6节点访问一个新的网络时,它使用本地代理地址发现请求报文动态地发现一个本地代理。为了本地前缀,报文被发送到MIPv6本地代理的任播地址。IPv6的源地址通常是移动节点从当前正在访问的网络上获取的地址。愿意为给定节点及它的本地前缀充当本地代理的节点会发送一个本地代理地址发现应答报文。
移动IPv6快速切换报文(ICMPv6类型154)
当一个移动节点从一个网络的接人点(AP)移动到另一个时,它指定的方法可以改善IP层的 切换延迟。这是通过在切换发生之前预测路由器和地址信息来完成的。这个协议涉及对所谓 的代理路由器(proxyrouter)的发现,它的行为类似于普通路由器,但是移动节点在切换到 一个新的网络时需要用到。有对应的ICMPv6代理路由器请求和通告报文(分别称为RtSolPr 和PrRtAdv)。
组播路由器发现(IGMP类型48/49/50,ICMPv6类型151/152/153)
[RFC4286]描述组播路由器发现(Multicast RouterDiscovery,MRD),该方法定义的特殊报文可以和ICMPv6和IGMP一起使用,用来发现能够转发组播数据包和它们的一些配置参数的路由器。最初的想法主要是和“IGMP/MLD侦听”一起使用。IGMP/MLD侦听是一种机制,主机和路由器(例如,第2层交换机)以外的系统也可以了解网络层组播路由器和感兴趣主机的位置。我们将在第9章IGMP上下文中详细地讨论它。MRD报文发送时总是将IPv4的TTL或IPv6的跳数限制字段设为1,并设有路由器警告选项,可能是如下类型之一:通告(151),请求(152),或终止(153)。在配置的时间间隔定期地发送通告,表明路由器愿意转发组播流量。终止报文表明要终止这种意愿。请求报文可用于请求路由器发送通告报文。
5.广播和本地组播(IGMP和MLD)
互联网组管理协议 (IGMP)和IPv6组播侦听发现(MLD)协议它们用来通知IPv4和 IPv6组播路由器子网中哪些组播地址在使用中。
广播
广播是指将报文发送到网络中的所有可能的接收者。在原理上,这是简单的:路由器简单地将它接收到的任意报文副本转离(forwardout)除报文到达的接口以外的每个接口。当有多个主机连接到同一个本地局域网时,事情就稍微有点复杂了,在这种情况下,链路层的特点可以使得广播在某种程度上更高效。
在IPv4中,每个子网都有一个本地定向子网广播地址,它是通过将地址中的主机部分全部置1形成的,特殊地址255.255.255.255对应于本地网络(也称为“有限”)广播。
组播
为了减少在广播中涉及的开销,可以只向那些对它感兴趣的接收方发送流量。这被称为组播(multicasting)。从根本上说,通过发送方指明接收方,或是通过接收方独立地指明它们的兴趣,就可以完成这项工作。然后网络只负责向预期的/感兴趣的收件方来发送流量。
一、组播地址(IPv4)
- 地址类型IPv4 组播使用 D 类地址:
- 范围:224.0.0.0 ~ 239.255.255.255
- 最高 4 位固定为
1110,无主机号、子网号概念。
- 常用保留组播地址
224.0.0.1:本网所有主机224.0.0.2:本网所有路由器- 这类地址只在本地链路有效,路由器不转发。
- 地址分类
- 链路本地组播:224.0.0.0~224.0.0.255,不跨路由。
- 全局组播:可在互联网上转发。
- 管理权限组播(私有组播):供企业 / 局域网内部使用。
二、组播转发基本原理
- 主机使用 IGMP 向本地路由器加入组播组。
- 路由器维护组成员关系表,记录哪个接口下有哪些组播成员。
- 源主机发往组播地址的数据包,进入网络。
- 路由器根据组播树,只转发到有组成员的接口,不泛洪。
- 未加入该组的主机收到后,直接丢弃。
互联网组管理协议和组播侦听发现协议

在IPv4中,IGMP被封装为一个单独的协议。MLD是ICMPv6报文的一种类型。IGMP和MLD定义了两组协议处理规则:由组成员的主机执行的和由组播路由器执行的。
IGMP和MLD组成员的部分被设计为允许主机指定它们对什么样的组有兴趣,以及从特定源发送的流量是否应该接受或过滤掉。这是通过向一个或多个连接到同一子网的组播路由器(和参与主机)发送报告完成的。报告可以作为接收查询的结果发送,或是因为接收状态(例如,一个应用程序加人或离开某个组)的本地改变而自发地(即主动提供)发送。
在IGMP和MLD中,组播路由器的工作是为每个组播组、接口和源列表确定是否至少 有一个组成员目前在接收相应的流量。这是通过发送查询,以及基于成员发送的报告,建立 描述成员存在性的状态来完成的。此状态是软状态,这意味着,如果没有被刷新,在经过一 个确定的时间后,它会被清除。为了建立这种状态,组播路由器发送IGMPv3查询。
6.用户数据报协议与IP分片
UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。它提供差错检测,包含我们在传输层中碰到的第一个真实的端到端(end-to-end)校验和。

UDP校验和是我们遇到的第一个端到端的传输层校验和(ICMP有一个端到端的校验和,但它不是一个真正的传输协议)。它覆盖了UDP头部、UDP数据和一个伪头部。它由初始的发送方计算得到,由最终的目的方校验,在传送中不会被修改。

IP分片

一个带有2992字节UDP负载的UDP数据报被分片成三个UDP/IPv4分组(没有选项)。包含源和目的端口号的UDP头部只出现在第一个分片里。分片由IPv4头部中的标识(Identification)、分片偏移(Fragment Offset)和更多分片 (MoreFragments,MF)字段控制。
7.DNS协议
一、DNS 基本概念
- 全称:Domain Name System,域名系统
- 核心作用属于应用层协议,实现域名 ↔ IP 地址的相互转换,让用户用易记的域名访问网络,而不用记数字 IP。
- 传输层协议
- 常规查询:使用 UDP 53 端口,速度快、开销小
- 大数据 / 区域传送:使用 TCP 53 端口
二、DNS 两种查询方式
- 递归查询
- 主机 → 本地 DNS
- 本地 DNS 必须返回最终结果,不能只返回中间信息
- 迭代查询
- 本地 DNS → 根 → 顶级域 → 权威服务器
- 每一级只返回下一级的地址,不直接给最终结果
标准解析流程
- 主机向本地 DNS 发起递归查询
- 本地 DNS 向根服务器发起迭代查询
- 根返回顶级域服务器地址
- 本地 DNS 查顶级域,得到权威服务器地址
- 本地 DNS 查权威服务器,得到真实 IP
- 本地 DNS 缓存结果,并返回给主机
三、常用 DNS 资源记录(RR)
- A 记录:域名 → IPv4 地址(最常用)
- AAAA 记录:域名 → IPv6 地址
- CNAME 记录:域名别名,一个域名指向另一个域名
- NS 记录:指明该域的权威 DNS 服务器
- MX 记录:邮件服务器地址,用于邮件路由
- PTR 记录:IP → 域名,用于反向解析
四、DNS 缓存机制
- 本地 DNS、主机都会缓存解析结果
- 由 TTL(生存时间) 控制缓存有效期
- 目的:减少重复查询、降低服务器压力、提高解析速度
五、反向 DNS 解析
功能:IP 地址 → 域名
依靠 PTR 记录 实现
多用于邮件服务器验证、日志追溯等场景
8.TCP传输控制协议
8.1TCP头部和封装

TCP头部紧跟着IP头部或IPv6扩展头部,经常是20字节长(不带TCP选项)。带选项的话, TCP头部可达60字节。常见选项包括最大段大小、时间戳、窗口缩放和选择性ACK。

TCP头部。它的标准长度是20字节,除非出现选项。头部长度(Header Length)字段以 32位字为单位给出头部的大小(最小值是5)。带阴影的字段(确认号(Acknowledgment Number)、窗口大小(WindowSize)以及ECE位和ACK位)用于与该报文段的发送方关联 的相反方向上的数据流。
8.2TCP连接管理
TCP是一种面向连接的单播协议。在发送数据之前,通信双方必须在彼此间建立一条连接。TCP服务模型是一个字节流。TCP必须检测并修补所有在IP层(或下面的层)产生的数据传输问题, 比如丢包、重复以及错误。
一个TCP连接由一个4元组构成,它们分别是两个IP地址和两个端口号。 一个TCP连接通常分为3个阶段:启动、数据传输(也称作“连接已建立”)和退出(关 闭)。
TCP连接的建立与终止:

一个普通TCP连接的建立与终止。通常,由客户端负责发起一个三次握手过程。在该过程中,客户端与服务器利用SYN报文段交换彼此的初始序列号(包括客户端的初始序列号和服务器的初始序列号)。在通信双方都发送了一个FIN数据包并收到来自对方的相应的确认数据 包后,该连接终止。
TCP选项:

常见重要 TCP 选项
1. MSS(最大分段大小)
- 类型:2
- 作用:通告本方能接收的最大 TCP 数据段长度(不含 TCP 头、IP 头)。
- 计算公式MSS = 链路 MTU − IP 头部长度 − TCP 头部长度
- 典型值以太网 MTU=1500 → MSS ≈ 1460
- 特点:只在 SYN/SYN-ACK 报文中交换,连接建立后不再改变。
2. 窗口缩放选项(Window Scale)
- 类型:3
- 作用:解决 TCP 固定窗口字段(16 位,最大 65535 字节)太小的问题,扩大接收窗口,适应高速、长时延网络(长肥管道)。
- 原理窗口值 = 窗口字段值 × 2^ 缩放因子(0~14)
- 特点:仅在 SYN 阶段协商。
3. 时间戳选项(Timestamps)
- 类型:8
- 两个核心作用
- 精确计算 RTT(往返时间),让超时重传更合理。
- PAWS(防止序号回绕):在高速大流量场景下,避免序号重复导致数据错乱。
- 长度:10 字节,是最常用的长选项之一。
4. 选择性确认 SACK(Selective ACK)
- 类型:5
- 作用允许接收方精确告诉发送方哪些数据收到了、哪些丢了,发送方只重传真正丢失的段,大幅提升丢包环境下的效率。
- 两步
- SACK 允许:在 SYN 中协商是否支持。
- SACK 选项:传输中携带已接收块信息。
5. 填充与结束类
- NOP(无操作)类型 1,长度 1,用于4 字节对齐,不做任何操作。
- EOL(选项结束)类型 0,表示选项列表到此结束。
TCP状态转换:

TCP状态转换图(也称作有限状态机)。箭头表示因报文段传输、接收以及计时器超时而引发的状态转换。粗箭头表示典型的客户端的行为,虚线箭头表示典型的服务器行为。粗体指令 (例如open、close)是应用程序执行的操作。
重置报文段:
一、基本概念
- 全称:TCP Reset 复位报文段
- 标志位:TCP 头部中 RST=1
- 核心作用用于异常、强制关闭 TCP 连接,是一种紧急终止机制,区别于 FIN 报文的 “优雅关闭”。
- 特点收到 RST 后,连接立即终止,无需确认、无需挥手、不进入 TIME_WAIT。
二、RST 报文的发送场景
以下任一情况发生时,TCP 会发送 RST 复位连接:
- 目标端口未监听客户端向服务器未打开的端口发送 SYN 请求,服务器无对应 LISTEN 套接字,直接回复 RST 拒绝连接。
- 收到不属于任何现有连接的报文收到一个 TCP 报文,但本机没有对应的四元组连接(源 IP / 端口、目标 IP / 端口不匹配),回复 RST 清理无效报文。
- 连接已关闭,仍收到数据连接已进入 CLOSED 状态,却收到对方发来的数据段,用 RST 强制清理。
- 程序异常退出进程崩溃、强制关闭,来不及发送 FIN,系统底层直接发送 RST 释放连接。
- 拒绝非法 / 过期连接收到过期、序号错误、窗口越界的无效报文,用 RST 终止异常连接。
三、RST 报文的关键特征
- 无需 ACK 确认发送 RST 后不等待对方回复,对方收到直接执行复位。
- 序号规则
- 对 SYN 请求的拒绝:RST 序号为 0
- 已建立连接的复位:序号为当前发送序号,确保在对方接收窗口内
- 不占用发送缓冲区不等待未发完的数据,立即发送。
- 不进入 TIME_WAIT发送 / 接收 RST 的一方都不会进入 TIME_WAIT,直接回到 CLOSED。
四、收到 RST 后的处理流程
- 立即终止当前 TCP 连接
- 释放所有连接资源(发送 / 接收缓存、控制块、状态机)
- 直接跳至 CLOSED 状态
- 向应用层上报错误:Connection reset by peer(对方重置连接)
8.3TCP超时与重传
超时与重传是 TCP 实现可靠传输最核心的兜底机制,用来解决:
(1)IP 网络本身不可靠、可能丢包;
(2)网络延迟、拥塞导致 ACK 无法按时返回通过 “发出去等确认,超时没收到就重发”,保证数据最终能到达对端。
一、两个核心指标
- RTT(Round-Trip Time,往返时间)
- 定义:从发送方发出报文段 → 收到对应 ACK 的总时间
- 特点:动态变化(受网络拥塞、距离、链路质量影响)
- 是计算超时时间的唯一依据
- RTO(Retransmission TimeOut,重传超时时间)
- 定义:发送方启动的超时定时器时长
- 原则:
- RTO 必须 > RTT,避免正常延迟被误判为丢包
- 不能太大,否则发现丢包太慢、效率低
二、RTO 计算规则
- 对 RTT 做平滑加权平均(SRTT),避免单次抖动影响
- 计算 RTT 的波动范围(平均偏差)
- 最终:偏差保证 RTO 能跟上网络变化,动态自适应调整。
三、Karn 算法
重传报文时,不使用其 ACK 来更新 RTT 和 RTO。
原因:
(1)重传后收到 ACK,无法判断这个 ACK 是对应原报文还是重传报文;
(2)如果误算,会导致 RTO 计算严重错误作用:保证超时机制稳定、不被重传干扰。
四、指数退避(Exponential Backoff)
连续超时、多次重传时:
第 1 次超时:RTO = 原值;第 2 次超时:RTO × 2;第 3 次超时:RTO × 4;(4)每次都翻倍
目的:
(1)给网络恢复时间;(2)避免频繁重传加剧拥塞
五、标准超时重传流程
- 发送方发送数据,启动 RTO 定时器
- 若在定时器到期前收到正确 ACK:
- 关闭定时器
- 继续发送下一段数据
- 若定时器超时仍未收到 ACK:
- 立即重传丢失的报文段
- 执行指数退避,加大下一次 RTO
- 重新启动定时器
六、快速重传
与 “超时重传” 互补,更快发现丢包:
(1)收到 3 个连续重复 ACK;(2)不等定时器超时;(3)直接重传丢失段。
原因:重复 ACK 说明后面的数据已到达,只有中间一段丢了,网络仍通畅。
8.4TCP数据流与窗口管理
TCP 是面向字节流的可靠传输协议,滑动窗口与窗口管理是实现:流量控制(防止发送方过快压垮接收方)与流水线高效传输(不用停等一个发一个)的核心机制,是 TCP 高效、可靠的关键。
一、TCP 面向字节流的基本特性
- 数据以字节为单位编号每个字节有唯一序号(Sequence Number),ACK 确认的是期望接收的下一字节序号。
- 无消息边界应用层写入的数据会被 TCP 合并 / 拆分,以报文段为单位发送,接收方再按序还原。
- PSH 推送标志用于强制将缓冲区数据立即发送并提交给应用层,不等待窗口填满。
二、滑动窗口机制(核心)
1. 窗口是什么
(1)发送窗口:发送方允许连续发送、但尚未收到确认的字节范围。
(2)接收窗口(rwnd):接收方在 ACK 中通告的可用接收缓冲区大小,单位为字节。
(3)窗口大小动态变化,由接收方根据自身处理能力决定。
2. 窗口工作流程
- 接收方通过 ACK 报文的 Window 字段告诉发送方:“我还能收多少”。
- 发送方按窗口大小连续发送多个报文段,实现流水线传输。
- 收到新 ACK 后,窗口向右滑动,继续发送新数据。
- 窗口内数据全部确认后,窗口持续前移。
3. 窗口内三类数据
(1)已发送并已确认:可移出窗口
(2)已发送未确认:等待 ACK
(3)未发送但允许发送:窗口剩余空间
三、流量控制(Flow Control)
- 目的避免发送方发送速度 > 接收方处理速度,导致缓冲区溢出、丢包。
- 实现方式接收方通过动态调整通告窗口大小(rwnd) 控制发送速率。
- 零窗口(Zero Window)
- 接收方缓冲区满 → 通告窗口 = 0 → 发送方停止发送。
- 发送方启动持续计时器(Persistence Timer),定期查询窗口是否恢复,防止窗口更新报文丢失。
四、糊涂窗口综合征(SWS)
- 问题接收方频繁通告极小窗口,发送方发送大量极小报文段,网络效率极低、开销巨大。
- 避免方案
- 接收方(Clark 算法):不通告小窗口,等到缓冲区有足够大空间(如 MSS 或 1/2 缓冲区)再更新窗口。
- 发送方(Nagle 算法):缓冲小数据,等收到 ACK 或凑够 MSS 再发送,减少小包数量。

五、Nagle 算法
- 作用为抑制大量小报文段,提高网络利用率。
- 规则
- 若发送缓冲区中已有未确认报文,则将后续小数据缓存。
- 直到收到 ACK 或数据凑够 MSS,再一次性发送。
- 适用场景普通文件传输、网页访问;不适合低延迟交互(如游戏、SSH)。

比较相似环境下使用Nagle算法与否的TCP连接情况。在启用Nagle算法的情况下,在任一 时刻最多只有一个包在传。这样可以减少小包数目,但同时也增大了传输时延。

Nagle算法与延时ACK的交互。可能会形成 一个短暂的死锁,一直持续到延时ACK计 时器超时。
六、窗口与效率的关系
- 窗口越大,流水线程度越高,吞吐量越大。
- 窗口受两个限制:
- 接收方缓冲区(rwnd)
- 网络拥塞程度(cwnd 拥塞窗口)
- 实际发送窗口 = min(rwnd, cwnd)。
8.5TCP拥塞控制
TCP 拥塞控制是防止发送方过度发送数据导致网络拥塞、瘫痪的机制,解决网络整体负载过大的问题。与流量控制的区别是,流量控制是端到端的,防止发送方压垮接收方(靠 rwnd);拥塞控制是全局网络的,防止发送方压垮网络链路 / 路由器(靠 cwnd)。
TCP 拥塞控制依靠 cwnd + ssthresh 动态调整发送速率,通过 慢启动(指数增)→ 拥塞避免(线性增)→ 快速重传 → 快速恢复 四个阶段,在网络吞吐量和拥塞预防之间取得平衡,是 TCP 能在复杂、不可靠的 IP 网络上稳定高效传输的核心机制。
一、关键参数
- cwnd(拥塞窗口)发送方维护,由网络拥塞程度决定,是拥塞控制的核心变量。
- ssthresh(慢启动门限)用于区分慢启动和拥塞避免阶段的阈值。
- cwnd < ssthresh → 慢启动;cwnd ≥ ssthresh → 拥塞避免
- 实际发送窗口实际发送窗口 = min (接收窗口 rwnd,拥塞窗口 cwnd)
二、TCP 拥塞控制四个核心算法
1. 慢启动(Slow Start)
适用于连接刚建立或发生超时重传后。
规则为(1)初始 cwnd = 1 个 MSS(2)每收到 1 个 ACK,cwnd + 1(3)一个 RTT 内,cwnd 指数增长。
目标为快速探测网络可用容量,尽快提升传输效率。

经典慢启动算法操作。在没有ACK延时情况下,每接收到一个好的ACK就意味着发送方可以发送两个新的数据包(左)。这会使得发送方窗口随时间呈指数增长(右,上方曲线)。当发生ACK延时,如每隔一个数据包生成一个ACK,cwnd仍以指数增长,但增幅较小(右,下方曲线)。
2. 拥塞避免(Congestion Avoidance)
适用于cwnd 增长到 ssthresh 后。
规则为(1)每个 RTT 只让 cwnd + 1(2)cwnd 线性缓慢增长。
目标:谨慎增加发送量,避免过早引发拥塞。

拥塞避免算法操作。若没有ACK延时发生,每接收一个好的ACK,就意味着发送方可继续发送1/W个新的数据包。发送窗口随时间近似呈线性增长(右,上方曲线)。当有ACK延时,如每隔一个数据包生成一个ACK,cwnd仍近似呈线性增长,只是增幅较小(右,下方曲线)。
3. 快速重传(Fast Retransmit)
触发条件:收到 连续 3 个重复 ACK。
行为:不等超时定时器到期,立即重传丢失的报文段。
意义:快速发现并修复丢包,大幅提升效率。
4. 快速恢复(Fast Recovery)
配合快速重传使用,不进入慢启动。流程:
(1)ssthresh = cwnd / 2
(2)cwnd = ssthresh + 3(或直接设为 ssthresh)
(3)直接进入拥塞避免阶段
目标:网络只是轻度丢包,无需大幅降速
三、两种拥塞触发的处理差异
- 收到 3 个重复 ACK(轻度拥塞)→ 快速重传 + 快速恢复→ 不重置 cwnd,不进入慢启动
- 超时重传(严重拥塞)→ ssthresh = cwnd / 2→ cwnd 重置为 1→ 重新进入慢启动