一、Internet 地址结构
1.基本的 IP 地址结构
分类寻址: 现实中的不同网络可能有不同数量的主机,每台主机都需要一个唯一的 IP 地址。一种划分方法是基于当前或预计的主机数量,将不同大小的 IP 地址空间分配给不同的站点。地址空间的划分涉及五大类。每类都基于网络中可容纳的主机数量,确定在一个 32 位的 IPv4 地址中分配给网络号和主机号的位数。
TCP/IP 协议详解涵盖 Internet 地址结构、IP 转发、移动 IP、DHCP、ICMP、IGMP、UDP 及 TCP 协议。重点解析了 IP 寻址分类、CIDR 聚合、ARP 地址解析、TCP 连接管理(三次握手)、拥塞控制(慢启动、拥塞避免)及流量控制机制。内容涉及 IPv4/IPv6 差异、路由表维护、数据包分片与重组等核心网络原理,适用于网络工程师及后端开发人员理解底层通信逻辑。

一、Internet 地址结构
分类寻址: 现实中的不同网络可能有不同数量的主机,每台主机都需要一个唯一的 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,除了一些旧的路由协议。

为了帮助缓解 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。
IPv4 特殊用途地址:

IPv6 特殊用途地址:

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

代理 ARP 使一个系统(通常是一台专门配置的路由器)可回答不同主机的 ARP 请求。它使 ARP 请求的发送者认为做出响应的系统就是目的主机,但实际上目的主机可能在其他地方(或不存在)。
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 实现必须按接收的顺序处理扩展头部。
隧道封装限制:
隧道是指将一个协议封装在另一个协议中。隧道可用于形成虚拟的覆盖网络,在覆盖网络中,一个网络可作为另一个 IP 的链路层使用。隧道可以嵌套,从这个意义上来说,一条隧道中的数据报本身也可采用递归方式封装在另一条隧道中。 在发送一个 IP 数据报时,发送者通常无法控制最终用于封装的隧道层次。发送者可使用这个选项设置一个限制。一台路由器打算将一个 IPv6 数据报封装在一条隧道中,它首先检查隧道封装限制选项是否存在并置位。如果这个限制选项的值为 0,该数据报被丢弃,并将一个'ICMPv6 参数问题'消息(见第 8 章)发送到数据报源端(即之前的隧道人口点)。如果这个限制选项的值不为 0,该数据报可进行隧道封装,但新形成(封装)的 IPv6 数据报必须包括一个隧道封装限制选项,其值比封装之前的数据报中的封装限制选项值减 1。封装限制行动类似于 IPv4 的 TTL 和 IPv6 的跳数限制字段,只不过采用隧道封装层次代替转发跳步。
家乡地址:
当使用 IPv6 移动选项时,这个选项保存发送数据报的 IPv6 节点的'家乡'地址。移动 IP 规定了 IP 节点的一系列处理过程,这些节点可能改变自已的网络接人点,同时不会断开自己的高层网络连接。这里存在一个节点的'家乡'的概念,它来自其典型位置的地址前缀。当远离家乡漫游时,通常为该节点分配一个不同的 IP 地址。该选项允许这个节点提供自己正常的家乡地址,以及它在漫游时的新地址(通常是临时分配)。当其他 IPv6 节点需要与移动节点通信时,它可以使用该节点的家乡地址。如果家乡地址选项存在,包含它的目的地选项头部必须出现在路由头部之后,并且在分片、认证和 ESP 头部之前。
分片头部:

当原始数据报被分片后,将会产生多个分片,其中每个分片都包含一个原始数据报中不可分片部分的副本,但是需要修改每个 IPv6 头部的负载长度字段,以反映它所描述的分片的大小。在不可分片部分之后,每个新的分片都包含一个分片头部,其中包含一个分片相应的分片偏移字段(例如第一个分片的偏移量为 0),以及一个原始分组的标识符字段的副本。最后一个分片的 M(更多分片)位字段设置为 0。

移动 IP 是 TCP/IP 协议族中,解决移动节点(如笔记本、手机)在跨物理网络移动时,仍能保持原有 IP 地址、维持网络连接不中断的扩展协议,核心目标是实现 IP 地址不变,位置动态迁移,弥补传统 IP 协议(节点位置固定)的局限性。
这是移动 IP 实现的基础,对应书中'协议协同工作'的核心逻辑,各组件分工明确、协同配合:
整体流程围绕'地址绑定 + 代理转发'展开:

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

TCP 三次握手、DNS 解析的交互逻辑一致,全程由客户端主动发起,服务器被动响应:

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

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

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

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

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

IP 分片

一个带有 2992 字节 UDP 负载的 UDP 数据报被分片成三个 UDP/IPv4 分组(没有选项)。包含源和目的端口号的 UDP 头部只出现在第一个分片里。分片由 IPv4 头部中的标识 (Identification)、分片偏移 (Fragment Offset) 和更多分片 (More Fragments,MF) 字段控制。
一、DNS 基本概念
二、DNS 两种查询方式
标准解析流程
三、常用 DNS 资源记录(RR)
四、DNS 缓存机制
五、反向 DNS 解析
功能:IP 地址 → 域名
依靠 PTR 记录 实现
多用于邮件服务器验证、日志追溯等场景

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

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

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

常见重要 TCP 选项
1. MSS(最大分段大小)
2. 窗口缩放选项(Window Scale)
3. 时间戳选项(Timestamps)
4. 选择性确认 SACK(Selective ACK)
5. 填充与结束类

TCP 状态转换图(也称作有限状态机)。箭头表示因报文段传输、接收以及计时器超时而引发的状态转换。粗箭头表示典型的客户端的行为,虚线箭头表示典型的服务器行为。粗体指令(例如 open、close)是应用程序执行的操作。
一、基本概念
二、RST 报文的发送场景
以下任一情况发生时,TCP 会发送 RST 复位连接:
三、RST 报文的关键特征
四、收到 RST 后的处理流程
超时与重传是 TCP 实现可靠传输最核心的兜底机制,用来解决:
(1)IP 网络本身不可靠、可能丢包;
(2)网络延迟、拥塞导致 ACK 无法按时返回通过'发出去等确认,超时没收到就重发',保证数据最终能到达对端。
重传报文时,不使用其 ACK 来更新 RTT 和 RTO。
原因:
(1)重传后收到 ACK,无法判断这个 ACK 是对应原报文还是重传报文;
(2)如果误算,会导致 RTO 计算严重错误作用:保证超时机制稳定、不被重传干扰。
连续超时、多次重传时:
第 1 次超时:RTO = 原值;第 2 次超时:RTO × 2;第 3 次超时:RTO × 4;(4)每次都翻倍
目的:
(1)给网络恢复时间;(2)避免频繁重传加剧拥塞
与'超时重传'互补,更快发现丢包:
(1)收到 3 个连续重复 ACK;(2)不等定时器超时;(3)直接重传丢失段。
原因:重复 ACK 说明后面的数据已到达,只有中间一段丢了,网络仍通畅。
TCP 是面向字节流的可靠传输协议,滑动窗口与窗口管理是实现:流量控制(防止发送方过快压垮接收方)与流水线高效传输(不用停等一个发一个)的核心机制,是 TCP 高效、可靠的关键。
1. 窗口是什么
(1)发送窗口:发送方允许连续发送、但尚未收到确认的字节范围。
(2)接收窗口(rwnd):接收方在 ACK 中通告的可用接收缓冲区大小,单位为字节。
(3)窗口大小动态变化,由接收方根据自身处理能力决定。
2. 窗口工作流程
3. 窗口内三类数据
(1)已发送并已确认:可移出窗口
(2)已发送未确认:等待 ACK
(3)未发送但允许发送:窗口剩余空间


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

Nagle 算法与延时 ACK 的交互。可能会形成 一个短暂的死锁,一直持续到延时 ACK 计 时器超时。
TCP 拥塞控制是防止发送方过度发送数据导致网络拥塞、瘫痪的机制,解决网络整体负载过大的问题。与流量控制的区别是,流量控制是端到端的,防止发送方压垮接收方(靠 rwnd);拥塞控制是全局网络的,防止发送方压垮网络链路 / 路由器(靠 cwnd)。
TCP 拥塞控制依靠 cwnd + ssthresh 动态调整发送速率,通过 慢启动(指数增)→ 拥塞避免(线性增)→ 快速重传 → 快速恢复 四个阶段,在网络吞吐量和拥塞预防之间取得平衡,是 TCP 能在复杂、不可靠的 IP 网络上稳定高效传输的核心机制。
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)直接进入拥塞避免阶段
目标:网络只是轻度丢包,无需大幅降速

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online