<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/assets/rss-20b3285f.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>标签: cnatda - ouuan's blog</title>
        <link>https://ouuan.moe/tag/cnatda</link>
        <description>标签为 cnatda 的文章 - ouuan 的博客</description>
        <lastBuildDate>Sun, 08 Oct 2023 09:32:15 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2022 - 2026 ouuan
Licensed under CC BY-SA 4.0</copyright>
        <atom:link href="https://ouuan.moe/tag/cnatda/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CNATDA 第七章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/09/cnatda-7</link>
            <guid>https://ouuan.moe/post/2023/09/cnatda-7</guid>
            <pubDate>Sun, 08 Oct 2023 09:32:15 GMT</pubDate>
            <description><![CDATA[
<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第七章 <span class="mojikumi">“</span>Wireless and Mobile Networks<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[
<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第七章 <span class="mojikumi">“</span>Wireless and Mobile Networks<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>

<h2 id="introduction" class="heading"><a href="#introduction" class="heading-anchor" aria-label="章节： Introduction" tabindex="-1"></a><span>Introduction</span></h2>
<p><span class="mojikumi-line-start">“</span>wireless<span class="mojikumi">”</span> 和 <span class="mojikumi">“</span>mobile<span class="mojikumi">”</span> 往往是密不可分的<span class="mojikumi-line-end">，</span>但它们实际上面临着不同的挑战<span class="mojikumi-line-end">，</span>需要不同的解决方案<span class="mojikumi-line-end">。</span></p>
<p>wireless network 一般包含 wireless host<span class="mojikumi-line-end">、</span>wireless link 和 base station<span class="mojikumi-line-end">，</span>但不是所有 wireless network 都有 base station<span class="mojikumi-line-end">。</span></p>
<p>根据 wireless hop 的次数<span class="mojikumi-line-end">、</span>是否有 base station (infrastructure)<span class="mojikumi-line-end">，</span>wireless network 可以大致分为四种<span class="mojikumi-line-end">：</span></p>
<ul>
<li>single-hop, infrastructure-based: 大部分 wireless network<span class="mojikumi-line-end">，</span>例如 802.11 和 4G LTE</li>
<li>single-hop, infrastructure-less: 例如 Bluetooth</li>
<li>multi-hop, infrastructure-based: 例如 wireless mesh network</li>
<li>multi-hop, infrastructure-less: 例如 mobile ad hoc network (MANET)<span class="mojikumi-line-end">、</span>vehicular ad hoc network (VANET)</li>
</ul>
<h2 id="wireless-links-and-network-characteristics" class="heading"><a href="#wireless-links-and-network-characteristics" class="heading-anchor" aria-label="章节： Wireless Links and Network Characteristics" tabindex="-1"></a><span>Wireless Links and Network Characteristics</span></h2>
<p>wireless network 面临着几个主要问题<span class="mojikumi-line-end">：</span></p>
<ul>
<li>信号衰减<span class="mojikumi-line-end">：</span>长距离传输<span class="mojikumi-line-end">、</span>穿越障碍</li>
<li>信号干扰<span class="mojikumi-line-end">：</span>其他同频段信号<span class="mojikumi-line-end">、</span>环境噪音</li>
<li>multipath propagation<span class="mojikumi-line-end">：</span>同一信号的多个部分从 sender 到 receiver 可能会走不同的路径</li>
</ul>
<p>总之<span class="mojikumi-line-end">，</span>wireless network 通常有更多 bit error<span class="mojikumi-line-end">，</span>所以往往除了 wired network 也会使用的 CRC error detection codes<span class="mojikumi-line-end">，</span>还会使用 link-layer reliable-data-transfer protocol<span class="mojikumi-line-end">。</span></p>
<p><i>signal-to-noise ratio</i> (SNR) 是接收到的信号强度与噪音之比<span class="mojikumi-line-end">，</span><i>bit error rate</i> (BER) 是 bit error 发生的概率<span class="mojikumi-line-end">。</span></p>
<p>wireless network 通过 modulation scheme 来决定如何 encoding 和 transmission<span class="mojikumi-line-end">。</span>对于同一个 modulation scheme<span class="mojikumi-line-end">，</span>SNR 越高 BER 越低<span class="mojikumi-line-end">；</span>对于同样的 SNR<span class="mojikumi-line-end">，</span>transmission rate 越高的 modulation scheme BER 越高<span class="mojikumi-line-end">。</span>所以<span class="mojikumi-line-end">，</span>往往会根据实际的 channel condition 动态选用 modulation scheme<span class="mojikumi-line-start">（</span>例如在 BER 满足一定限制的情况下尽可能提高 transmission rate<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>wireless network 中的 multiple access 也更加复杂<span class="mojikumi-line-end">，</span>例如<span class="mojikumi-line-end">，</span>A 和 C 分别能传输信号到 B<span class="mojikumi-line-end">，</span>但因为障碍物或距离等原因<span class="mojikumi-line-end">，</span>A 和 C 接收不到彼此发送的信号<span class="mojikumi-line-end">，</span>这可能导致 undetectable collision<span class="mojikumi-line-end">。</span></p>
<h2 id="cdma" class="heading"><a href="#cdma" class="heading-anchor" aria-label="章节： CDMA" tabindex="-1"></a><span>CDMA</span></h2>
<p>CDMA (code division multiple access) 是一种常用于 wireless network 的 multiple access protocol<span class="mojikumi-line-end">，</span>属于 <a href="/post/2023/07/cnatda-6#channel-partitioning-protocols">channel partitioning protocol</a><span class="mojikumi-line-end">。</span></p>
<p>在 CDMA 中<span class="mojikumi-line-end">，</span>每个装有 1 bit 的 time slot 会被再分为多个 mini-slot<span class="mojikumi-line-end">，</span>sender 将每个 slot 内的 data<span class="mojikumi-line-start">（</span>mini-slot 全 0 / 全 1<span class="mojikumi-line-end">）</span>异或上一个 code<span class="mojikumi-line-end">，</span>理想状态下<span class="mojikumi-line-end">，</span>receiver 再异或上这个 code 就可以得到 data<span class="mojikumi-line-end">。</span>实际上<span class="mojikumi-line-end">，</span>会有其他信号产生干扰<span class="mojikumi-line-end">，</span>而合适地选取 code 可以在有干扰的情况下依然能够读取出 data<span class="mojikumi-line-end">。</span>这相当于是在 code space 而非 time / frequency 上进行 channel partitioning<span class="mojikumi-line-end">。</span></p>
<p><span class="mojikumi-line-start">（</span>书中没有说明具体细节<span class="mojikumi-line-end">，</span>例如如何选取 code<span class="mojikumi-line-end">，</span>如何处理不同 sender 的信号强度不同<span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></p>
<h2 id="wi-fi-802-11-wireless-lans" class="heading"><a href="#wi-fi-802-11-wireless-lans" class="heading-anchor" aria-label="章节： Wi-Fi: 802.11 Wireless LANs" tabindex="-1"></a><span>Wi-Fi: 802.11 Wireless LANs</span></h2>
<p>Wi-Fi 的全称为 <span class="mojikumi">“</span>IEEE 802.11 wireless LAN<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>有 802.11b/g/n/ac/ax/af/ah 等版本<span class="mojikumi-line-end">，</span>不同版本有不同的最大传输速率<span class="mojikumi-line-end">、</span>传输距离以及使用的频段<span class="mojikumi-line-end">。</span></p>
<h3 id="the-802-11-wireless-lan-architecture" class="heading"><a href="#the-802-11-wireless-lan-architecture" class="heading-anchor" aria-label="章节： The 802.11 Wireless LAN Architecture" tabindex="-1"></a><span>The 802.11 Wireless LAN Architecture</span></h3>
<p>802.11 architecture 的 building block 是 <i>basic service set</i> (BSS)<span class="mojikumi-line-end">，</span>每个 BSS 包含一个被称作 <i>access point</i> (AP) 的 base station 以及连接到 AP 的若干 wireless station<span class="mojikumi-line-start">（</span>即 host<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>802.11 可以通过 AP 连接为 infrastructure wireless LAN<span class="mojikumi-line-end">，</span>也可以没有 AP 而只由几个 host 互相连接成 ad hoc network<span class="mojikumi-line-start">（</span>不对外连接到 Internet<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>本书只讨论 infrastructure wireless LAN<span class="mojikumi-line-end">。</span></p>
<p>每个 AP 有一个 <i>service set identifier</i> (SSID)<span class="mojikumi-line-end">，</span>即 Wi-Fi 的名称<span class="mojikumi-line-end">。</span>可以为 AP 设置 channel number<span class="mojikumi-line-end">，</span>2.4GHz 频段共有 11 个 channel number<span class="mojikumi-line-end">，</span>但相差不到 5 的 channel 会相交<span class="mojikumi-line-end">，</span>彼此不相交的 channel 最多只能有 3 个<span class="mojikumi-line-start">（</span>1<span class="mojikumi-line-end">、</span>6<span class="mojikumi-line-end">、</span>11<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>AP 会周期性地广播 <i>beacon frame</i> 来告诉 wireless device 自己的存在<span class="mojikumi-line-end">，</span>wireless device 可以监听 beacon frame 来进行 <i>passive scanning</i><span class="mojikumi-line-end">。</span>除此之外<span class="mojikumi-line-end">，</span>也可以主动发送 probe frame 来进行 <i>active scanning</i><span class="mojikumi-line-end">。</span></p>
<p>找到 AP 后<span class="mojikumi-line-end">，</span>wireless device 需要在可用的 AP 中选择一个<span class="mojikumi-line-start">（</span>802.11 standard 中没有规定选择 AP 的算法<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>发送 association request<span class="mojikumi-line-end">，</span>AP 返回 association response<span class="mojikumi-line-end">，</span>就建立了连接<span class="mojikumi-line-end">。</span></p>
<h3 id="the-802-11-mac-protocol" class="heading"><a href="#the-802-11-mac-protocol" class="heading-anchor" aria-label="章节： The 802.11 MAC Protocol" tabindex="-1"></a><span>The 802.11 MAC Protocol</span></h3>
<h4 id="csmaca" class="heading"><a href="#csmaca" class="heading-anchor" aria-label="章节： CSMA/CA" tabindex="-1"></a><span>CSMA/CA</span></h4>
<p>802.11 使用的 <a href="/post/2023/07/cnatda-6#multiple-access-links-and-protocols">MAC protocol</a> 是称作 <i>CSMA with collision avoidance</i> (CSMA/CA) 的 <a href="/post/2023/07/cnatda-6#random-access-protocols">random access protocol</a><span class="mojikumi-line-end">，</span>和 Ethernet 使用的 <a href="/post/2023/07/cnatda-6#csmacd">CSMA/CD</a> 类似<span class="mojikumi-line-end">，</span>但又有很大不同<span class="mojikumi-line-end">：</span></p>
<ul>
<li>CSMA/CA 是 <span class="mojikumi">“</span>collision avoidance<span class="mojikumi">”</span> 而非 CSMA/CD 的 <span class="mojikumi">“</span>collision detection<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>这意味着它不是在检测 collision 时中断传输<span class="mojikumi-line-end">，</span>而是不进行检测<span class="mojikumi-line-end">，</span>通过其他机制尽量避免 collision<span class="mojikumi-line-end">。</span>这是因为 wireless network 中很难进行 collision detection<span class="mojikumi-line-end">：</span>
<ul>
<li><a href="#wireless-links-and-network-characteristics">前文</a>中提到过<span class="mojikumi-line-end">，</span>wireless network 中可能存在 undetectable collision<span class="mojikumi-line-end">；</span></li>
<li>collision detection 需要在发送的同时接收信号<span class="mojikumi-line-end">，</span>而无线信号在发送端的强度会远高于接收端的强度<span class="mojikumi-line-end">，</span>这也加大了 collision detection 的难度<span class="mojikumi-line-end">。</span></li>
</ul>
</li>
<li>802.11 引入了 link-layer <a href="/post/2023/06/cnatda-3#principles-of-reliable-data-transfer">reliable-data-transfer</a><span class="mojikumi-line-end">。</span></li>
</ul>
<p>其完整流程为<span class="mojikumi-line-end">：</span></p>
<ol>
<li>等待一小段时间<span class="mojikumi-line-start">（</span>distributed inter-frame space, DIFS) 来看 channel 是否 idle<span class="mojikumi-line-end">。</span></li>
<li>如果 channel buzy<span class="mojikumi-line-end">，</span>进入 binary exponential backoff<span class="mojikumi-line-start">（</span>只在 channel idle 时 countdown<span class="mojikumi-line-end">，</span>channel buzy 则不计入等待时间<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>经历了足够长的 channel idle 后<span class="mojikumi-line-end">，</span>发送整个 frame<span class="mojikumi-line-start">（</span>不检测 collision<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>AP 接收到 frame 后<span class="mojikumi-line-end">，</span>等待一小段时间<span class="mojikumi-line-start">（</span>short inter-frame space, SIFS<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>然后发送 ACK<span class="mojikumi-line-end">。</span></li>
<li>如果 sender 接收到了 ACK<span class="mojikumi-line-end">，</span>则结束或继续发送下一个 frame<span class="mojikumi-line-end">；</span>否则进入 binary exponential backoff<span class="mojikumi-line-end">，</span>进行 retransmission<span class="mojikumi-line-end">。</span></li>
</ol>
<p>其中<span class="mojikumi-line-end">，</span>检测到 channel buzy 时直接进入 backoff<span class="mojikumi-line-end">，</span>是为了避免 channel 变为 idle 时多个 sender 同时发送而产生 collision<span class="mojikumi-line-end">。</span>这与 CSMA/CD 不同<span class="mojikumi-line-end">，</span>因为如果有 collision detection 的话<span class="mojikumi-line-end">，</span>即使发生了这样的 collision 也代价不大<span class="mojikumi-line-end">，</span>就无需通过 backoff 来避免<span class="mojikumi-line-end">。</span></p>
<h4 id="rtscts" class="heading"><a href="#rtscts" class="heading-anchor" aria-label="章节： RTS/CTS" tabindex="-1"></a><span>RTS/CTS</span></h4>
<p>wireless network 中不仅 collision detection 非常困难<span class="mojikumi-line-end">，</span>carrier sense 也比较困难<span class="mojikumi-line-end">，</span>光靠上面这些机制还是很可能出现 collision<span class="mojikumi-line-end">，</span>所以 802.11 还提供了另一种可选的机制<span class="mojikumi-line-end">：</span>使用 <i>request to send</i> (RTS) frame 和 <i>clear to send</i> (CTS) frame 来显式地预留出通信权<span class="mojikumi-line-end">：</span></p>
<ol>
<li>sender 发送 RTS<span class="mojikumi-line-end">，</span>告诉 AP 需要预留出的时长<span class="mojikumi-line-start">（</span>传输 data 和 ACK 的用时<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>AP 发送 CTS<span class="mojikumi-line-end">，</span>告诉 sender 可以发送<span class="mojikumi-line-end">，</span>以及告诉其他 station 一段时间内不要发送<span class="mojikumi-line-end">。</span></li>
<li>sender 发送 data<span class="mojikumi-line-end">。</span></li>
<li>AP 发送 ACK<span class="mojikumi-line-end">，</span>除了普通的 ACK<span class="mojikumi-line-end">，</span>也是告诉其他 station 可以发送了<span class="mojikumi-line-end">。</span></li>
</ol>
<p>使用 RTS/CTS 可以保证 data 和 ACK 的传输不会出现 collision<span class="mojikumi-line-end">，</span>而 RTS/CTS frame 自身非常短<span class="mojikumi-line-end">，</span>如果产生 collision 代价是较小的<span class="mojikumi-line-end">。</span>然而<span class="mojikumi-line-end">，</span>RTS/CTS 自身会消耗资源<span class="mojikumi-line-end">、</span>产生延时<span class="mojikumi-line-end">，</span>所以一般只有在 data 较大时才会使用<span class="mojikumi-line-end">，</span>wireless station 一般会设置一个发送 RTS 的 frame length threshold<span class="mojikumi-line-end">，</span>很多时候这个 threshold 比 maximum frame length 还大<span class="mojikumi-line-end">，</span>实际上就是禁用了 RTS<span class="mojikumi-line-end">。</span></p>
<h4 id="use-802-11-as-point-to-point-link" class="heading"><a href="#use-802-11-as-point-to-point-link" class="heading-anchor" aria-label="章节： Use 802.11 as Point-to-Point Link" tabindex="-1"></a><span>Use 802.11 as Point-to-Point Link</span></h4>
<p>上面说的是常见的 802.11 对 multiple access 的处理<span class="mojikumi-line-end">，</span>除此之外<span class="mojikumi-line-end">，</span>802.11 也可以通过 directional antenna 作为 point-to-point link 使用<span class="mojikumi-line-end">。</span></p>
<h3 id="the-ieee-802-11-frame" class="heading"><a href="#the-ieee-802-11-frame" class="heading-anchor" aria-label="章节： The IEEE 802.11 Frame" tabindex="-1"></a><span>The IEEE 802.11 Frame</span></h3>
<p>802.11 frame 的结构如下图所示<span class="mojikumi-line-end">：</span><sup><a href="#user-content-fn-fig-7.13" id="user-content-fnref-fig-7.13" data-footnote-ref aria-describedby="footnote-label">1</a></sup></p>
<ul>
<li>
<p>type<span class="mojikumi-line-end">、</span>subtype<span class="mojikumi-line-end">：</span>这决定了 association<span class="mojikumi-line-end">、</span>RTS<span class="mojikumi-line-end">、</span>CTS<span class="mojikumi-line-end">、</span>ACK<span class="mojikumi-line-end">、</span>data 等 frame 类型<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p>duration: 这是 RTS/CTS<span class="mojikumi-line-start">（</span>预留一段时长<span class="mojikumi-line-end">）</span>所需的<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p>address: 由于 AP 起到中介的作用<span class="mojikumi-line-end">，</span>在 infrastructure wireless LAN 中 frame 需要包含三个 address<span class="mojikumi-line-start">（</span>在 ad hoc mode 中需要四个<span class="mojikumi-line-end">，</span>此处不讨论<span class="mojikumi">）</span><span class="mojikumi-line-end">：</span></p>
<ul>
<li>前两个是 802.11 收发双方<span class="mojikumi-line-start">（</span>station 和 AP<span class="mojikumi-line-end">）</span>的 MAC address<span class="mojikumi-line-end">：</span>这是 802.11 通信所需的<span class="mojikumi-line-end">。</span></li>
<li>第三个是 AP 连接到的 router interface 的 MAC address<span class="mojikumi-line-end">：</span>AP 工作在 link layer<span class="mojikumi-line-end">，</span>router 感知不到 AP 的存在<span class="mojikumi-line-end">；</span>在 AP 向 station 发送时<span class="mojikumi-line-end">，</span>station 可以从 address 3 得到 router 的 MAC address<span class="mojikumi-line-end">；</span>在 station 向 AP 发送时<span class="mojikumi-line-end">，</span>AP 可以从 address 3 知道 Ethernet frame 需要发给谁<span class="mojikumi-line-end">。</span>总之<span class="mojikumi-line-end">，</span>address 3 是 Ethernet 通信所需的<span class="mojikumi-line-end">。</span></li>
</ul>
<p>不同场合下每个 address 分别代表什么是不同的<span class="mojikumi-line-end">，</span>这由 frame control 中的 <span class="mojikumi">“</span>to AP<span class="mojikumi">”</span> 和 <span class="mojikumi">“</span>from AP<span class="mojikumi">”</span> 决定<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p>sequence number: 这是 link-layer reliable-data-transfer 所需的<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p>payload: 802.11 允许 2312 bytes 的 payload<span class="mojikumi-line-end">，</span>但由于 Ethernet 的限制<span class="mojikumi-line-end">，</span>一般不会超过 1500<span class="mojikumi-line-end">。</span></p>
</li>
</ul>
<p><picture><img type="image/webp" srcset="/assets/cnatda-fig-7.13.5949ac2a.webp" loading="lazy" src="/assets/cnatda-fig-7.13.5949ac2a.webp" width="1006" height="307" alt="The 802.11 frame"></picture></p>
<h3 id="mobility-in-the-same-ip-subnet" class="heading"><a href="#mobility-in-the-same-ip-subnet" class="heading-anchor" aria-label="章节： Mobility in the Same IP Subnet" tabindex="-1"></a><span>Mobility in the Same IP Subnet</span></h3>
<p>当 host 从一个 BSS 移动到另一个 BSS 时<span class="mojikumi-line-end">，</span>如果两个 BSS 处于同一个 IP subnet 中<span class="mojikumi-line-end">，</span>mobility issue 就比较容易解决<span class="mojikumi-line-end">：</span>直接保持 IP address 不变即可<span class="mojikumi-line-end">。</span>而如果两个 AP 由 <a href="/post/2023/07/cnatda-6#link-layer-switches">switch</a> 连接<span class="mojikumi-line-end">，</span>还需要处理 switch interface 改变的问题<span class="mojikumi-line-end">，</span>由于 switch 的 self-learning<span class="mojikumi-line-end">，</span>一个处理方式是在和新的 AP 建立 association 后立刻发送一个 broadcast Ethernet frame 来告诉 switch 换了一个 interface<span class="mojikumi-line-end">。</span></p>
<p>如果使用 <a href="/post/2023/07/cnatda-6#virtual-local-area-networks-vlans">VLAN</a><span class="mojikumi-line-end">，</span>可以将很多<span class="mojikumi-line-start">（</span>地理位置不同的<span class="mojikumi-line-end">）</span>AP 放在同一个 IP subnet 中<span class="mojikumi-line-end">，</span>从而较为轻松地解决 mobility issue<span class="mojikumi-line-end">。</span></p>
<h3 id="advanced-features-in-802-11" class="heading"><a href="#advanced-features-in-802-11" class="heading-anchor" aria-label="章节： Advanced Features in 802.11" tabindex="-1"></a><span>Advanced Features in 802.11</span></h3>
<h4 id="802-11-rate-adaptation" class="heading"><a href="#802-11-rate-adaptation" class="heading-anchor" aria-label="章节： 802.11 Rate Adaptation" tabindex="-1"></a><span>802.11 Rate Adaptation</span></h4>
<p>如<a href="#wireless-links-and-network-characteristics">上文</a>所述<span class="mojikumi-line-end">，</span>不同环境下 SNR 不同会导致最佳的 transmission rate 不同<span class="mojikumi-line-end">。</span>在 802.11 中<span class="mojikumi-line-end">，</span>ACK 可以用作 rate adaptation 的 hint<span class="mojikumi-line-end">，</span>在没收到 ACK 时降低 transmission rate<span class="mojikumi-line-end">，</span>在连续收到很多 ACK 时提高 transmission rate<span class="mojikumi-line-end">，</span>这与 <a href="/post/2023/06/cnatda-3#classic-tcp-congestion-control">TCP 的 congestion control</a> 类似<span class="mojikumi-line-end">。</span></p>
<h4 id="802-11-power-management" class="heading"><a href="#802-11-power-management" class="heading-anchor" aria-label="章节： 802.11 Power Management" tabindex="-1"></a><span>802.11 Power Management</span></h4>
<p>一个 802.11 node 往往不需要一直通信<span class="mojikumi-line-end">，</span>在不进行通信的时候可以 sleep 来 save power<span class="mojikumi-line-end">：</span></p>
<ol>
<li>node 可以在 header 中设置 power management flag 来告诉 AP 自己即将 sleep<span class="mojikumi-line-end">。</span></li>
<li>如果 AP 接收到一个发送给正在 sleep 的 node 的 frame<span class="mojikumi-line-end">，</span>会将其存在 buffer 中<span class="mojikumi-line-end">。</span></li>
<li>AP 发送的 beacon frame 中包含一个有 buffered frame 的 node list<span class="mojikumi-line-end">，</span>node 会在 AP 发送 beacon frame 前 wake up<span class="mojikumi-line-end">，</span>根据自己是否有 buffered frame 来请求 AP 发送这些 buffered frame 或继续 sleep<span class="mojikumi-line-end">。</span></li>
</ol>
<p>一般来说<span class="mojikumi-line-end">，</span>AP 会周期性地每 100ms 发送一次 beacon frame<span class="mojikumi-line-end">，</span>而一次 wakeup 只需 250μs<span class="mojikumi-line-end">，</span>所以不进行通信的 station 可以在 99% 的时间内 sleep<span class="mojikumi-line-end">。</span></p>
<h2 id="personal-area-networks-bluetooth" class="heading"><a href="#personal-area-networks-bluetooth" class="heading-anchor" aria-label="章节： Personal Area Networks: Bluetooth" tabindex="-1"></a><span>Personal Area Networks: Bluetooth</span></h2>
<p>Bluetooth 使用 TDM 进行 channel partitioning<span class="mojikumi-line-end">，</span>同时在 79 个 frequency channel 中进行 pseudo-random 的 channel hopping (<i>frequency-hopping spread spectrum</i>, FHSS) 来降低外界干扰的影响<span class="mojikumi-line-end">。</span></p>
<p>Bluetooth network 是 ad hoc (infrastructure-less) 的<span class="mojikumi-line-end">，</span>一个 Bluetooth network 包含最多 8 个 active device<span class="mojikumi-line-end">，</span>其中一个是 master device<span class="mojikumi-line-end">，</span>它决定传输的 clock<span class="mojikumi-line-end">、</span>frequency-hopping pattern<span class="mojikumi-line-end">、</span>power<span class="mojikumi-line-end">，</span>邀请 client 进入 Bluetooth network<span class="mojikumi-line-end">，</span>通过 polling 来控制 client 何时通信<span class="mojikumi-line-end">。</span>network 中还可以有最多 255 个 parked device<span class="mojikumi-line-end">，</span>会长期处于 sleep mode<span class="mojikumi-line-end">，</span>周期性地接收 beacon message<span class="mojikumi-line-end">，</span>只有切换为 active 才能进行通信<span class="mojikumi-line-end">。</span></p>
<p>Bluetooth network 的建立过程为<span class="mojikumi-line-end">：</span></p>
<ol>
<li>neighbor discovery:
<ol>
<li>master 广播 inquiry message<span class="mojikumi-line-end">，</span>在 32 个不同的 frequency 发送至多 128 遍<span class="mojikumi-line-end">，</span>因为此时还没有协商好 frequency-hopping pattern<span class="mojikumi-line-end">。</span></li>
<li>client 收到 inquiry message 后<span class="mojikumi-line-end">，</span>随机等待 0~300ms 来避免 collision<span class="mojikumi-line-end">，</span>然后发送 response<span class="mojikumi-line-end">，</span>包含 client 的 device ID<span class="mojikumi-line-end">。</span></li>
</ol>
</li>
<li>Bluetooth paging:
<ol>
<li>master 向特定的 client 发送 paging invitation<span class="mojikumi-line-end">，</span>依然是在 32 个不同的 frequency<span class="mojikumi-line-end">。</span></li>
<li>client 收到 paging invitation 后返回 acknowledgment<span class="mojikumi-line-end">。</span></li>
<li>master 向 client 发送 frequency-hopping pattern<span class="mojikumi-line-end">、</span>clock synchronization information 以及 active member address<span class="mojikumi-line-end">。</span></li>
<li>使用 frequency-hopping pattern 来 poll client<span class="mojikumi-line-end">，</span>以确认 client 连上了<span class="mojikumi-line-end">。</span></li>
</ol>
</li>
</ol>
<h2 id="mobility-management-principles" class="heading"><a href="#mobility-management-principles" class="heading-anchor" aria-label="章节： Mobility Management: Principles" tabindex="-1"></a><span>Mobility Management: Principles</span></h2>
<a id="7-4-cellular-networks-4g-and-5g" name="7-4-cellular-networks-4g-and-5g" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-green-2 dark:bg-green-9 b-green-5" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h3 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-lightbulb-outline text-green" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Hint: </span><span data-v-a2ab257f>7.4 Cellular Networks: 4G and 5G</span></h3><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>7.4 这一节<span class="mojikumi-line-end">，</span>感觉可以直接跳过<span class="mojikumi-line-end">，</span>或者简单扫一眼<span class="mojikumi-line-end">。</span></p><ul>
<li>7.4.1<span class="mojikumi-line-end">：</span>没看 7.5<span class="mojikumi-line-end">、</span>7.6 的话感觉会完全不知道它在说什么<span class="mojikumi-line-end">，</span>看了 7.6 之后也不太需要回过头来看这里了<span class="mojikumi-line-end">。</span></li>
<li>7.4.2~7.4.5<span class="mojikumi-line-end">：</span>非常简略<span class="mojikumi-line-end">，</span>没什么东西<span class="mojikumi-line-end">。</span></li>
<li>7.4.6<span class="mojikumi-line-end">：</span>5G 的科普<span class="mojikumi-line-end">，</span>除了大家耳熟能详的以及过于简略的<span class="mojikumi-line-end">，</span>感觉就一条<span class="mojikumi-line-end">：</span>5G 为了提升 transmission rate<span class="mojikumi-line-end">，</span>base station 需要建得更密集<span class="mojikumi-line-end">。</span></li>
</ul><p>说到底<span class="mojikumi-line-end">，</span>这样编排说是为了将 <span class="mojikumi">“</span>wireless<span class="mojikumi">”</span> 和 <span class="mojikumi">“</span>mobility<span class="mojikumi">”</span> 这两方面的问题分开讨论<span class="mojikumi-line-end">。</span>但是<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">“</span>wireless<span class="mojikumi">”</span> 的部分在 802.11 已经讲得差不多了<span class="mojikumi-line-end">，</span>细节上会有差异但书上也没有细讲<span class="mojikumi-line-end">。</span>其实讲 cellular network 主要就是要讲它的 mobility<span class="mojikumi-line-end">，</span>所以 7.5<span class="mojikumi-line-end">、</span>7.6 就够了<span class="mojikumi-line-end">。</span></p></div></div></aside>
<p>mobility 指的是 mobile device 到网络的接入点发生变化<span class="mojikumi-line-end">，</span>而从 network layer 的角度来看<span class="mojikumi-line-end">，</span>只有 access network 发生了变化且需要保持连接<span class="mojikumi-line-start">（</span>例如 TCP connection<span class="mojikumi-line-end">）</span>不中断<span class="mojikumi-line-end">，</span>才会带来 mobility issue<span class="mojikumi-line-end">。</span>如果设备在每个 session 只连到同一个接入点<span class="mojikumi-line-end">，</span>则不需要特殊处理<span class="mojikumi-line-end">。</span></p>
<p>在 cellular network 中<span class="mojikumi-line-end">，</span>有两方面的 mobility issue:</p>
<ul>
<li>handover: cellular network 中有很多 base station<span class="mojikumi-line-end">，</span>每个 base station 覆盖一个 cell 提供服务<span class="mojikumi-line-end">。</span>从一个 base station 移动到另一个 base station 时<span class="mojikumi-line-end">，</span>需要进行 handover 来改变 mobile device 连接到的 base station<span class="mojikumi-line-end">。</span></li>
<li>roaming on visited networks: 每个 cellular subscriber 会有一个 <i>home network</i><span class="mojikumi-line-end">，</span>提供了 subscriber 信息的集中管理<span class="mojikumi-line-end">。</span>home network 提供服务的范围是有限的<span class="mojikumi-line-end">，</span>如果 mobile device 移动到了 home network 之外<span class="mojikumi-line-end">，</span>可能就需要连接到由其他 cellular provider 提供的 <i>visited network</i><span class="mojikumi-line-end">，</span>此时需要特别的机制来处理 routing<span class="mojikumi-line-end">。</span></li>
</ul>
<p>mobile device 的接入点随时可能发生变化<span class="mojikumi-line-end">，</span>而 home network 会跟踪 device 当前接入的 visited network<span class="mojikumi-line-end">，</span>所以外界可以通过 home network 来找到 mobile device 当前的位置从而进行通信<span class="mojikumi-line-end">。</span></p>
<p>具体的 routing 有两种方式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>indirect: mobile device 有一个固定的 IP<span class="mojikumi-line-end">，</span>外界向这个 IP 发送消息会发到 home network 的 gateway<span class="mojikumi-line-end">，</span>而 home network 与 visited network 的 gateway 之间建立了 tunnel<span class="mojikumi-line-end">，</span>最后由 visited network 的 gateway 与 mobile device 通信<span class="mojikumi-line-end">。</span>也就是说<span class="mojikumi-line-end">，</span>外界与 mobile device 通信需要经过 home network 中转<span class="mojikumi-line-end">。</span></li>
<li>direct: 向 mobile device 发送消息时<span class="mojikumi-line-end">，</span>一开始先查询 mobile device 所在的 visited network<span class="mojikumi-line-end">，</span>后续则直接与 visited network 通信<span class="mojikumi-line-end">。</span></li>
</ul>
<p>indirect routing 的缺点在于 <i>triangle routing problem</i><span class="mojikumi-line-end">，</span>即通过 home network 中转可能带来很大的浪费<span class="mojikumi-line-end">。</span>direct routing 的问题在于<span class="mojikumi-line-end">，</span>需要特殊的机制来完成一开始的 visited network 查询以及后续 visited network 变更时的通知<span class="mojikumi-line-end">，</span>也就是说需要通信另一方的配合<span class="mojikumi-line-end">。</span></p>
<h2 id="mobility-management-in-4g5g-networks" class="heading"><a href="#mobility-management-in-4g5g-networks" class="heading-anchor" aria-label="章节： Mobility Management in 4G/5G Networks" tabindex="-1"></a><span>Mobility Management in 4G/5G Networks</span></h2>
<h3 id="attach-to-visited-network" class="heading"><a href="#attach-to-visited-network" class="heading-anchor" aria-label="章节： Attach to Visited Network" tabindex="-1"></a><span>Attach to Visited Network</span></h3>
<p>连接到 base station 时<span class="mojikumi-line-end">，</span>mobile device 会提供自己的 IMSI (<i>international mobile subscriber identity</i>)<span class="mojikumi-line-end">。</span>visited network 的 MME (<i>mobility management entity</i>) 会从 local cache 或 home network 的 HSS (<i>home subscriber server</i>) 获取到 mobile device 的 authentication<span class="mojikumi-line-end">、</span>encryption<span class="mojikumi-line-end">、</span>quality of service 等信息<span class="mojikumi-line-end">，</span>并通知 home network 的 HSS<span class="mojikumi-line-end">，</span>mobile device 现在位于这个 visited network<span class="mojikumi-line-end">。</span></p>
<p>然后<span class="mojikumi-line-end">，</span>会建立两个 tunnel<span class="mojikumi-line-end">，</span>从 mobile device 到 visited network 的 <i>serving gateway</i><span class="mojikumi-line-end">，</span>再从 serving gateway 到 home network 的 PDN (<i>packet data network</i>) gateway<span class="mojikumi-line-end">。</span>这两个 tunnel 使用 <i>GPRS tunneling protocol</i> (GTP)<span class="mojikumi-line-end">，</span>原理类似于 <a href="/post/2023/06/cnatda-4#ipv6">IPv6 tunneling</a><span class="mojikumi-line-end">。</span></p>
<a id="local-breakout" name="local-breakout" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-purple-2 dark:bg-purple-9 b-purple-5" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-help-circle-outline text-purple" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Question: </span><span data-v-a2ab257f>local breakout</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>书上前后提到两次 local breakout<span class="mojikumi-line-end">，</span>给我整懵了<span class="mojikumi-line-end">，</span>它到底是 direct 还是 indirect<span class="mojikumi-line-start">（</span><span class="mojikumi-line-end">；</span>好像也不重要<span class="mojikumi-line-end">，</span>当它不存在就好<span class="mojikumi-line-start">（</span></p></div></div></aside>
<h3 id="handover-management" class="heading"><a href="#handover-management" class="heading-anchor" aria-label="章节： Handover Management" tabindex="-1"></a><span>Handover Management</span></h3>
<p>handover 是 mobile device 从一个 base station 转移到邻近的另一个 base station 的过程<span class="mojikumi-line-end">。</span>这可能是从信号差的 base station 转到信号好的<span class="mojikumi-line-end">，</span>或者是从拥挤的转到畅通的<span class="mojikumi-line-end">。</span>mobile device 会周期性地向当前连接到的 base station (称作 <i>source</i> base station) 报告它接收到的各个 base station 的信号强度等信息<span class="mojikumi-line-end">，</span>而 source base station 可以根据它掌握的信息来做出 handover 的决定<span class="mojikumi-line-end">。</span></p>
<p><span class="mojikumi-line-start">（</span>在同一个 network 中<span class="mojikumi-line-end">）</span>handover 的过程如下<span class="mojikumi-line-end">：</span></p>
<ol>
<li>source base station 选择一个 <i>target</i> base station<span class="mojikumi-line-end">，</span>发送 handover request<span class="mojikumi-line-end">。</span></li>
<li>如果 target base station 同意<span class="mojikumi-line-end">，</span>会提前分配好连接所需的资源<span class="mojikumi-line-start">（</span>从而让 handover 能够尽快完成<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>然后发送 handover request acknowledge<span class="mojikumi-line-end">，</span>包含连接所需的各项信息<span class="mojikumi-line-end">。</span></li>
<li>source base station 告诉 mobile device 连接到 target base station 所需的信息<span class="mojikumi-line-end">。</span>此时在 mobile device 看来 handover 已经结束了<span class="mojikumi-line-end">，</span>可以和 target base station 进行通信<span class="mojikumi-line-end">。</span></li>
<li>source base station 停止向 mobile device 转发<span class="mojikumi-line-end">，</span>而是转发给 target base station<span class="mojikumi-line-end">。</span></li>
<li>target base station 告诉 MME 自己是这个 mobile device 新连接到的 base station<span class="mojikumi-line-end">，</span>MME 会更新 serving gateway 到 base station 的 tunnel 的 end point<span class="mojikumi-line-end">。</span></li>
<li>target base station 告诉 source base station<span class="mojikumi-line-end">，</span>新的 tunnel 已经配置好了<span class="mojikumi-line-end">，</span>source base station 可以释放为这个 mobile device 提供的资源了<span class="mojikumi-line-end">。</span></li>
<li>target base station 向 mobile device 发送之前由 source base station 转发来的 datagram<span class="mojikumi-line-end">，</span>之后就可以正常通信了<span class="mojikumi-line-end">。</span></li>
</ol>
<h2 id="wireless-and-mobility-impact-on-higher-layer-protocols" class="heading"><a href="#wireless-and-mobility-impact-on-higher-layer-protocols" class="heading-anchor" aria-label="章节： Wireless and Mobility: Impact on Higher-Layer Protocols" tabindex="-1"></a><span>Wireless and Mobility: Impact on Higher-Layer Protocols</span></h2>
<h3 id="impact-on-tcp" class="heading"><a href="#impact-on-tcp" class="heading-anchor" aria-label="章节： Impact on TCP" tabindex="-1"></a><span>Impact on TCP</span></h3>
<p>TCP 以 retransmission 作为 congestion 的标志进行 congestion control<span class="mojikumi-line-end">，</span>但在 wireless network 中<span class="mojikumi-line-end">，</span>bit error 更加常见<span class="mojikumi-line-end">，</span>而 handover 时也会带来 delay 或丢包<span class="mojikumi-line-end">，</span>所以 retransmission 不一定意味着 network congestion<span class="mojikumi-line-end">，</span>如果在 wireless network 中沿用一般的 TCP congestion control 可能会有性能问题<span class="mojikumi-line-end">。</span></p>
<p>目前的解决途径有<span class="mojikumi-line-end">：</span></p>
<ul>
<li>local recovery<span class="mojikumi-line-end">：</span>在 link layer 提供 reliable data transfer<span class="mojikumi-line-end">，</span>减少 bit error 的影响<span class="mojikumi-line-end">。</span></li>
<li>split-connection<span class="mojikumi-line-end">：</span>在 sender 到 base station<span class="mojikumi-line-end">、</span>base station 到 receiver 分别建立连接<span class="mojikumi-line-end">。</span>base station 到 mobile host 的连接可以是标准的 TCP 连接<span class="mojikumi-line-end">，</span>也可以是其他连接<span class="mojikumi-line-end">。</span></li>
<li>让通信双方意识到 wireless link 的存在<span class="mojikumi-line-end">，</span>并区分出 retransmission 是否由 congestion 引起<span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="impact-on-applications" class="heading"><a href="#impact-on-applications" class="heading-anchor" aria-label="章节： Impact on Applications" tabindex="-1"></a><span>Impact on Applications</span></h3>
<ul>
<li>wireless network 的 bandwidth 通常较小<span class="mojikumi-line-end">，</span>所以为 mobile device 提供服务时更需要减少传输的数据量<span class="mojikumi-line-end">。</span></li>
<li>mobility 使得 location-aware / context-aware application 成为可能<span class="mojikumi-line-end">。</span></li>
</ul>
<section data-footnotes class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-fig-7.13">
<p>p554, Figure 7.13: The 802.11 frame <a href="#user-content-fnref-fig-7.13" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/cnatda">cnatda</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[CNATDA 第八章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/07/cnatda-8</link>
            <guid>https://ouuan.moe/post/2023/07/cnatda-8</guid>
            <pubDate>Tue, 18 Jul 2023 14:32:44 GMT</pubDate>
            <description><![CDATA[<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第八章 <span class="mojikumi">“</span>Security in Computer Networks<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第八章 <span class="mojikumi">“</span>Security in Computer Networks<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>

<h2 id="what-is-network-security" class="heading"><a href="#what-is-network-security" class="heading-anchor" aria-label="章节： What Is Network Security?" tabindex="-1"></a><span>What Is Network Security?</span></h2>
<p><i>secure communication</i> 有下列性质<span class="mojikumi-line-end">：</span></p>
<ul>
<li>confidentiality: 由于通信可以被拦截<span class="mojikumi-line-end">，</span>保密意味着需要以某种方式加密</li>
<li>message integrity: 保证消息未被修改</li>
<li>end-point authentication: 能够确认对方的身份</li>
<li>operational security: 保护 organization network 不被攻击</li>
</ul>
<p>intruder 可以对 message 进行 eavesdropping<span class="mojikumi-line-end">、</span>modification<span class="mojikumi-line-end">、</span>insertion<span class="mojikumi-line-end">、</span>deletion<span class="mojikumi-line-end">，</span>进而实现各种攻击<span class="mojikumi-line-end">。</span></p>
<p>在网络中<span class="mojikumi-line-end">，</span>需要进行 secure communication 的双方可能是两个人类用户<span class="mojikumi-line-end">、</span>可能是 client 和 server<span class="mojikumi-line-end">、</span>可能是两个 router……</p>
<p>security functionality 可以在网络的各个 layer 提供<span class="mojikumi-line-end">。</span>虽然底层的 security 看起来覆盖了高层的 security<span class="mojikumi-line-end">，</span>但并非完全如此<span class="mojikumi-line-end">，</span>例如 IP-layer security 不能区分 IP address 相同的多个用户<span class="mojikumi-line-end">。</span>并且<span class="mojikumi-line-end">，</span>底层协议的更新<span class="mojikumi-line-end">、</span>普及相对更慢<span class="mojikumi-line-end">，</span>在上层采取措施可以更快生效<span class="mojikumi-line-end">。</span></p>
<h2 id="principles-of-cryptography" class="heading"><a href="#principles-of-cryptography" class="heading-anchor" aria-label="章节： Principles of Cryptography" tabindex="-1"></a><span>Principles of Cryptography</span></h2>
<p>plaintext (cleartext) 经 encryption algorithm 得到 ciphertext<span class="mojikumi-line-end">，</span>由 decryption algorithm 回到 plaintext<span class="mojikumi-line-end">。</span></p>
<p>encryption algorithm 一般是公开的<span class="mojikumi-line-end">，</span>为了达到保密的效果<span class="mojikumi-line-end">，</span>还需要使用 key<span class="mojikumi-line-end">。</span>设 plaintext 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></span><span class="mojikumi-line-end">，</span>sender 使用 key <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">K_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 进行 encrypt 得到 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>A</mi></msub><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">K_A(m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">)</span></span></span></span></span><span class="mojikumi-line-end">，</span>receiver 使用 key <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">K_B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 进行 decrypt 得到 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>B</mi></msub><mo stretchy="false">(</mo><msub><mi>K</mi><mi>A</mi></msub><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">K_B(K_A(m)) = m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></span><span class="mojikumi-line-end">。</span></p>
<p>在 symmetric key system 中<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>A</mi></msub><mo>=</mo><msub><mi>K</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">K_A = K_B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>是保密的<span class="mojikumi-line-end">；</span>在 public key system 中<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">K_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 是公开的<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">K_B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 是保密的<span class="mojikumi-line-end">。</span></p>
<h3 id="symmetric-key-cryptography" class="heading"><a href="#symmetric-key-cryptography" class="heading-anchor" aria-label="章节： Symmetric Key Cryptography" tabindex="-1"></a><span>Symmetric Key Cryptography</span></h3>
<p>在现代密码所使用的 block cipher 中<span class="mojikumi-line-end">，</span>plaintext 被划分为若干个 block<span class="mojikumi-line-end">，</span>例如在 AES 中每 128 bit 是一个 block<span class="mojikumi-line-end">，</span>cipher 会构建一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>128</mn></msup><mo>→</mo><msup><mn>2</mn><mn>128</mn></msup></mrow><annotation encoding="application/x-tex">2^{128} \to 2^{128}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">128</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">128</span></span></span></span></span></span></span></span></span></span></span></span></span> 的 plaintext 到 ciphertext 的一一对应<span class="mojikumi-line-end">，</span>而 key 用来生成这个对应关系<span class="mojikumi-line-end">，</span>AES 的 key length 可以是 128/192/256 bit<span class="mojikumi-line-end">。</span>太小的 block size / key length 会导致安全性不够<span class="mojikumi-line-end">；</span>将整个对应关系存下来 key 会过长<span class="mojikumi-line-end">，</span>所以只能用没那么长的 key 来生成对应关系<span class="mojikumi-line-end">；</span>太大的 block size / key length 可能会影响性能<span class="mojikumi-line-end">。</span></p>
<p>如果 plaintext 中有多个相同的 block<span class="mojikumi-line-end">，</span>它们对应的 ciphertext 也相同<span class="mojikumi-line-end">，</span>就会暴露出一定的信息<span class="mojikumi-line-end">。</span>为了避免这样的风险<span class="mojikumi-line-end">，</span>可以给每个 block 异或上一个随机数再加密<span class="mojikumi-line-end">。</span></p>
<p>如果真的每个 block 都独立地生成一个随机数<span class="mojikumi-line-end">，</span>则传输时需要附上这一堆随机数<span class="mojikumi-line-end">，</span>整个 message 的长度会翻倍<span class="mojikumi-line-end">。</span>所以实际上并不会这样做<span class="mojikumi-line-end">，</span>而是会使用称作 cipher block chaining (CBC) 的技术<span class="mojikumi-line-end">：</span>每条 message 只生成一个随机数<span class="mojikumi-line-end">，</span>称作 initialization vector (IV)<span class="mojikumi-line-end">，</span>记作 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">c_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>而 plaintext 的第一块记作 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">m_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>对 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>⊕</mo><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_{i-1} \oplus m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 加密得到 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>即每个 block 异或的是上一个 block 的加密结果<span class="mojikumi-line-end">，</span>这样传输时的 overhead 就只有一个 block size 的 IV 了<span class="mojikumi-line-end">。</span></p>
<h3 id="public-key-encryption" class="heading"><a href="#public-key-encryption" class="heading-anchor" aria-label="章节： Public Key Encryption" tabindex="-1"></a><span>Public Key Encryption</span></h3>
<p>symmetric key cryptography 需要双方以某种方式事先做到共享 key<span class="mojikumi-line-end">，</span>而这本身就需要 secure communication<span class="mojikumi-line-end">。</span>以前这可以通过线下之类的方式进行<span class="mojikumi-line-end">，</span>而在网络中则需要另外的方式<span class="mojikumi-line-end">。</span></p>
<p>在 public key encryption 中<span class="mojikumi-line-end">，</span>接收方有一对 key<span class="mojikumi-line-end">，</span>public key 用来加密<span class="mojikumi-line-end">，</span>private key 用来解密<span class="mojikumi-line-end">。</span>public key 是公开的<span class="mojikumi-line-end">，</span>从而不需要事先依赖于 secure communication 进行 key exchange<span class="mojikumi-line-end">。</span></p>
<p>public key encryption 带来身份认证的问题<span class="mojikumi-line-end">：</span>在 symmetric key cryptography 中<span class="mojikumi-line-end">，</span>知道 key 隐含了身份<span class="mojikumi-line-end">，</span>但知道 public key 则不代表身份<span class="mojikumi-line-end">，</span>所以需要额外的机制来进行认证<span class="mojikumi-line-end">。</span></p>
<p>RSA 是目前最流行的 public key encryption algorithm:</p>
<ol>
<li>选两个大质数 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span></span> 和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span></span><span class="mojikumi-line-start">（</span>一般要达到 1024~4096 bit 长<span class="mojikumi-line-end">）</span></li>
<li>令 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mi>p</mi><mi>q</mi></mrow><annotation encoding="application/x-tex">n = pq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">pq</span></span></span></span></span><span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi><mo>=</mo><mo stretchy="false">(</mo><mi>p</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">z = (p-1)(q-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span></li>
<li>选一个比 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 小<span class="mojikumi-line-end">、</span>和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span></span> 互质的数 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span></span></li>
<li>算出 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>e</mi></mrow><annotation encoding="application/x-tex">e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">e</span></span></span></span></span> 的乘法逆元 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi><mo>=</mo><msup><mi>e</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>z</mi></mrow><annotation encoding="application/x-tex">d = e^{-1} \bmod z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span></span></li>
<li>public key 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>e</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n, e)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">e</span><span class="mclose">)</span></span></span></span></span><span class="mojikumi-line-end">，</span>private key 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>d</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n, d)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">d</span><span class="mclose">)</span></span></span></span></span></li>
<li>encryption: 设 plaintext 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></span> (<span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>&#x3C;</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">m &#x3C; n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&#x3C;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>)<span class="mojikumi-line-end">，</span>则 ciphertext 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>=</mo><msup><mi>m</mi><mi>e</mi></msup><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">c = m^e \bmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span></li>
<li>decryption: <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>=</mo><msup><mi>c</mi><mi>d</mi></msup><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">m = c^d \bmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span></li>
</ol>
<p>RSA 的计算比 AES 慢<span class="mojikumi-line-end">，</span>为了性能<span class="mojikumi-line-end">，</span>通常会结合 symmetric key cryptography 一起使用<span class="mojikumi-line-end">：</span>每次生成一个用于 symmetric key cipher 的 session key<span class="mojikumi-line-end">，</span>通过 public key encryption 来进行 key exchange<span class="mojikumi-line-end">，</span>实际的通信则使用 symmetric key cipher<span class="mojikumi-line-end">。</span></p>
<p>RSA 的安全性依赖于大数分解的困难性<span class="mojikumi-line-end">，</span>这受到量子计算的挑战<span class="mojikumi-line-end">。</span></p>
<h2 id="message-integrity-and-digital-signatures" class="heading"><a href="#message-integrity-and-digital-signatures" class="heading-anchor" aria-label="章节： Message Integrity and Digital Signatures" tabindex="-1"></a><span>Message Integrity and Digital Signatures</span></h2>
<p>message integrity 即 sender 身份真实<span class="mojikumi-line-end">，</span>message 未遭篡改<span class="mojikumi-line-end">。</span></p>
<p>cryptographic hash function 在一般的 hash 的基础上要求难以构造 collision<span class="mojikumi-line-end">，</span>从而可以用来验证消息未被篡改<span class="mojikumi-line-end">。</span></p>
<p>可以用 message authentication code (MAC) 来验证 message integrity<span class="mojikumi-line-end">：</span>双方共享保密的 authentication key<span class="mojikumi-line-end">，</span>设 message 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></span><span class="mojikumi-line-end">，</span>cryptographic hash function 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>H</mi></mrow><annotation encoding="application/x-tex">H</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span></span></span></span></span><span class="mojikumi-line-end">，</span>最终传输的是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>m</mi><mo separator="true">,</mo><mi>H</mi><mo stretchy="false">(</mo><mi>m</mi><mo>+</mo><mi>s</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(m, H(m + s))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mclose">))</span></span></span></span></span><span class="mojikumi-line-start">（</span>具体实现可能有所不同<span class="mojikumi-line-end">，</span>例如 HMAC 会 hash 两次<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>可以使用 public key encryption 或者其他方式来 exchange authentication key<span class="mojikumi-line-end">。</span>MAC 本身可以不涉及 encryption<span class="mojikumi-line-end">，</span>如果只需保证 message integrity 而不在意 confidentiality 则无需付出 encryption 的性能代价<span class="mojikumi-line-end">。</span></p>
<p>digital signature 相当于 MAC 的 <span class="mojikumi">“</span>public key 版本<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>可以用来验证 sender 的身份<span class="mojikumi-line-end">，</span>而验证者只需知道 public key<span class="mojikumi-line-end">，</span>可以保持 private key 的私密<span class="mojikumi-line-end">。</span>RSA 的 encryption 和 decryption 其实是可交换的<span class="mojikumi-line-end">，</span>即先 public key 再 private key 或者先 private key 再 public key 都可以得到原来的 plaintext<span class="mojikumi-line-end">。</span>digital signature 即使用 private key 进行<span class="mojikumi-line-start">“</span>加密<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>而使用 public key 进行<span class="mojikumi-line-start">“</span>解密<span class="mojikumi">”</span><span class="mojikumi-line-end">。</span>RSA 计算慢<span class="mojikumi-line-end">，</span>所以可以对 cryptographic hash 而非 message 本身计算 digital signature<span class="mojikumi-line-end">。</span></p>
<p>虽然 MAC 和 digital signature 功能有一定的类似<span class="mojikumi-line-end">，</span>但 MAC 可以完全不涉及 encryption<span class="mojikumi-line-end">，</span>digital signature 则依赖于 public key infrastructure (PKI)<span class="mojikumi-line-end">。</span></p>
<p>digital signature 验证的是 message 和 public key 的对应关系<span class="mojikumi-line-end">，</span>还需要额外的措施来保证 public key 和 entity (sender) 的对应关系<span class="mojikumi-line-end">。</span>certification authority (CA) 提供了这一服务<span class="mojikumi-line-end">，</span>通过某些手段认证 public key 和 entity 的对应关系<span class="mojikumi-line-end">，</span>并颁发 certificate<span class="mojikumi-line-end">，</span>certificate 包含 entity 和 public key 的相关信息<span class="mojikumi-line-start">（</span>以及有效期<span class="mojikumi-line-end">）</span>以及使用 CA 的 public key 对这些信息创建的 digital signature<span class="mojikumi-line-end">。</span>有了 certificate<span class="mojikumi-line-end">，</span>对 public key 和 entity 之间关联的信任取决于对 CA 的信任<span class="mojikumi-line-end">。</span></p>
<h2 id="end-point-authentication" class="heading"><a href="#end-point-authentication" class="heading-anchor" aria-label="章节： End-Point Authentication" tabindex="-1"></a><span>End-Point Authentication</span></h2>
<p>书上说了很多<span class="mojikumi-line-end">，</span>但感觉本质上就是<span class="mojikumi-line-end">，</span>Alice 要向 Bob 证明自己的身份<span class="mojikumi-line-end">，</span>则 Bob 提供一个一次性的随机数 <i>nonce</i><span class="mojikumi-line-end">，</span>Alice 通过某种方式<span class="mojikumi-line-start">（</span>例如 symmetric key cryptography / MAC<span class="mojikumi-line-end">）</span>发回 nonce 并保证 message integrity<span class="mojikumi-line-end">。</span>nonce 用来防止 playback attack<span class="mojikumi-line-end">。</span></p>
<h2 id="securing-e-mail" class="heading"><a href="#securing-e-mail" class="heading-anchor" aria-label="章节： Securing E-Mail" tabindex="-1"></a><span>Securing E-Mail</span></h2>
<h3 id="secure-e-mail" class="heading"><a href="#secure-e-mail" class="heading-anchor" aria-label="章节： Secure E-Mail" tabindex="-1"></a><span>Secure E-Mail</span></h3>
<p>就是上面这些东西的一个实例<span class="mojikumi-line-end">，</span>没啥新东西<span class="mojikumi-line-end">：</span>结合 digital signature 和使用 session key 的 encryption 即可<span class="mojikumi-line-end">；</span>需要双方互相知道对方的 public key<span class="mojikumi-line-start">（</span>分别用于 digital signature 的验证和 session key 的传输<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>public key 可以由 CA 认证<span class="mojikumi-line-end">。</span></p>
<a id="spf、dkim、dmarc" name="spf、dkim、dmarc" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-purple-2 dark:bg-purple-9 b-purple-5" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-help-circle-outline text-purple" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Question: </span><span data-v-a2ab257f>SPF、DKIM、DMARC</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>为啥不讲 SPF<span class="mojikumi-line-end">、</span>DKIM<span class="mojikumi-line-end">、</span>DMARC 🤔</p></div></div></aside>
<h3 id="pgp" class="heading"><a href="#pgp" class="heading-anchor" aria-label="章节： PGP" tabindex="-1"></a><span>PGP</span></h3>
<p>PGP 提供了 sign<span class="mojikumi-line-end">、</span>encrypt<span class="mojikumi-line-end">、</span>sign and encrypt 等功能<span class="mojikumi-line-end">，</span>public key 通过用户之间的 web of trust 而非 CA 来 certify<span class="mojikumi-line-end">，</span>可以线下举办 key-signing party 来互相 sign<sup><a href="#user-content-fn-sign" id="user-content-fnref-sign" data-footnote-ref aria-describedby="footnote-label">1</a></sup><span class="mojikumi-line-end">。</span></p>
<h2 id="securing-tcp-connections-tls" class="heading"><a href="#securing-tcp-connections-tls" class="heading-anchor" aria-label="章节： Securing TCP Connections: TLS" tabindex="-1"></a><span>Securing TCP Connections: TLS</span></h2>
<p>TLS (Transport Layer Security) 为 TCP 提供了 security services<span class="mojikumi-line-end">，</span>是 SSL (Secure Sockets Layer) 标准化后的升级版<span class="mojikumi-line-start">（</span>只不过现在人们有时仍会把 TLS 误称为 SSL<span class="mojikumi-line-end">，</span>OpenSSL 的名字也有一定的误导性<sup><a href="#user-content-fn-opentls" id="user-content-fnref-opentls" data-footnote-ref aria-describedby="footnote-label">2</a></sup><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>TLS 通常用于 HTTP<span class="mojikumi-line-end">，</span>表现为网址开头是 <code>https://</code><span class="mojikumi-line-end">，</span>但它实际上可以用于任何基于 TCP 的 application<span class="mojikumi-line-end">。</span>TLS 位于 application layer<span class="mojikumi-line-end">，</span>但它提供了类似 TCP 的 API<span class="mojikumi-line-end">，</span>对于 application developer 来说就像是 transport layer 的一部分<span class="mojikumi-line-end">。</span></p>
<h3 id="tls-handshake" class="heading"><a href="#tls-handshake" class="heading-anchor" aria-label="章节： TLS Handshake" tabindex="-1"></a><span>TLS Handshake</span></h3>
<ol>
<li>TCP 3-way handshake</li>
<li>client 发送 TLS version<span class="mojikumi-line-end">、</span>supported cipher suites (symmetric algorithm<span class="mojikumi-line-end">、</span>public key algorithm<span class="mojikumi-line-end">、</span>HMAC algorithm)<span class="mojikumi-line-end">、</span>client nonce<span class="mojikumi-line-end">。</span></li>
<li>server 发送 selected cipher suite<span class="mojikumi-line-end">、</span>certificate<span class="mojikumi-line-end">、</span>server nonce<span class="mojikumi-line-end">。</span></li>
<li>client 验证 certificate<span class="mojikumi-line-end">，</span>得到 server 的 public key<span class="mojikumi-line-end">；</span>随机生成 pre-master secret (PMS)<span class="mojikumi-line-end">，</span>发送经 server 的 public key 加密的 PMS<span class="mojikumi-line-end">。</span></li>
<li>由 PMS<span class="mojikumi-line-end">、</span>client nonce<span class="mojikumi-line-end">、</span>server nonce 可以计算得到 master key<span class="mojikumi-line-end">，</span>由 master key 可以得到一系列用于后续加密的 key<span class="mojikumi-line-end">：</span>client 和 server 各有用于 symmetric key encryption 的 key 和用于 HMAC 的 key<span class="mojikumi-line-end">，</span>如果使用 CBC 则还有双方的 IV<span class="mojikumi-line-end">。</span></li>
<li>client 发送上面这些 handshake message 的 HMAC<span class="mojikumi-line-start">（</span>可以和 encrypted PMS 一同发送<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>server 发送上面这些 handshake message 的 HMAC<span class="mojikumi-line-end">。</span></li>
</ol>
<p>其中<span class="mojikumi-line-end">，</span>一开始的 nonce 用来防止 replay attack<span class="mojikumi-line-end">，</span>并且 server nonce 参与 master key 的计算<span class="mojikumi-line-end">，</span>可以防止 key 完全由 client 决定<span class="mojikumi-line-end">。</span>而最后的 HMAC 用来防止篡改 handshake message<span class="mojikumi-line-end">，</span>例如将 supported cipher suites 改为只有 weak algorithm<span class="mojikumi-line-end">。</span></p>
<p>TLS 1.3 对 handshake 过程进行了简化<span class="mojikumi-line-end">。</span></p>
<h3 id="tls-data-transfer" class="heading"><a href="#tls-data-transfer" class="heading-anchor" aria-label="章节： TLS Data Transfer" tabindex="-1"></a><span>TLS Data Transfer</span></h3>
<p>在 TLS 中<span class="mojikumi-line-end">，</span>TCP byte stream 被切分为 records<span class="mojikumi-line-end">，</span>为每个 record 计算 HMAC<span class="mojikumi-line-end">，</span>并将 record + HMAC 进行 encrypt<span class="mojikumi-line-end">。</span>这只保证了每个 record 的 integrity<span class="mojikumi-line-end">，</span>为了保证整个 byte stream 的 integrity<span class="mojikumi-line-end">，</span>每个 record 还有一个 sequence number<span class="mojikumi-line-end">，</span>参与 HMAC 的计算<span class="mojikumi-line-end">，</span>来防止攻击者对 record 进行 reorder / replay / remove<span class="mojikumi-line-end">。</span></p>
<p>TLS record 包含<span class="mojikumi-line-end">：</span></p>
<ol>
<li>type: handshake / data</li>
<li>TLS version</li>
<li>length: 用来标记 record 的结尾</li>
<li>data + HMAC, encrypted</li>
</ol>
<h3 id="tls-connection-closure" class="heading"><a href="#tls-connection-closure" class="heading-anchor" aria-label="章节： TLS Connection Closure" tabindex="-1"></a><span>TLS Connection Closure</span></h3>
<p>为了防止 truncation attack<span class="mojikumi-line-end">，</span>即伪造 TCP FIN segment<span class="mojikumi-line-end">，</span>在 TLS 中需要先发送保证了 integrity 的 closure TLS record 再发送 TCP FIN segment 来结束连接<span class="mojikumi-line-end">。</span></p>
<h2 id="network-layer-security-ipsec-and-virtual-private-networks" class="heading"><a href="#network-layer-security-ipsec-and-virtual-private-networks" class="heading-anchor" aria-label="章节： Network-Layer Security: IPsec and Virtual Private Networks" tabindex="-1"></a><span>Network-Layer Security: IPsec and Virtual Private Networks</span></h2>
<h3 id="ipsec-and-virtual-private-networks-vpns" class="heading"><a href="#ipsec-and-virtual-private-networks-vpns" class="heading-anchor" aria-label="章节： IPsec and Virtual Private Networks (VPNs)" tabindex="-1"></a><span>IPsec and Virtual Private Networks (VPNs)</span></h3>
<p>如果一个 institution 位于多个地理位置而想保证 institution 内通信的私密<span class="mojikumi-line-end">，</span>一种选择是建立一个 private network<span class="mojikumi-line-end">，</span>在物理上与 Internet 进行隔离<span class="mojikumi-line-end">，</span>但这样需要自己搭建整套网络基础设施<span class="mojikumi-line-end">，</span>开销非常大<span class="mojikumi-line-end">。</span></p>
<p>另一种选择是使用 virtual private network<span class="mojikumi-line-end">。</span>在 VPN 内<span class="mojikumi-line-end">，</span>通过 Internet 传输数据时会进行加密<span class="mojikumi-line-end">，</span>具体来说是在内网的 gateway router 或直接连到公网的 host 处<span class="mojikumi-line-start">（</span>例如学校连到 Internet 的 gateway router / 回家了的学生的设备上<span class="mojikumi-line-end">；</span>为了叙述方便<span class="mojikumi-line-end">，</span>下文中都假设是 gateway router 而不是 host<span class="mojikumi-line-end">）</span>在 payload 前加上 IPsec header<span class="mojikumi-line-end">。</span></p>
<h3 id="the-ah-and-esp-protocols" class="heading"><a href="#the-ah-and-esp-protocols" class="heading-anchor" aria-label="章节： The AH and ESP Protocols" tabindex="-1"></a><span>The AH and ESP Protocols</span></h3>
<p>IPsec 可以使用 Authentication Header (AH) protocol 或者 Encapsulation Security Payload (ESP) protocol<span class="mojikumi-line-end">。</span>其中 AH 只提供了 source authentication 和 data integrity<span class="mojikumi-line-end">，</span>ESP 在此基础上还提供了 confidentiality<span class="mojikumi-line-end">。</span>使用 IPsec 的场景中通常需要保证 confidentiality<span class="mojikumi-line-end">，</span>所以 ESP 用得更多<span class="mojikumi-line-end">，</span>书中只讲 ESP<span class="mojikumi-line-end">。</span></p>
<h3 id="security-associations" class="heading"><a href="#security-associations" class="heading-anchor" aria-label="章节： Security Associations" tabindex="-1"></a><span>Security Associations</span></h3>
<p>两个 entity (gateway router) 通过 IPsec 通信时需要建立称作 <i>security association</i> (SA) 的 logical connection<span class="mojikumi-line-end">。</span>SA 是单向的<span class="mojikumi-line-end">，</span>如果要互发消息则需要建立两个 SA<span class="mojikumi-line-end">。</span></p>
<p>SA 有下列 state information<span class="mojikumi-line-end">：</span></p>
<ul>
<li><i>security parameter index</i> (SPI)<span class="mojikumi-line-end">，</span>一个 32-bit identifier</li>
<li>source &#x26; destination IP address</li>
<li>encryption algorithm, encryption key</li>
<li>integrity check algorithm, authentication key</li>
</ul>
<p>一个 IPsec entity 可能同时 maintain 着很多 SA 的 state information<span class="mojikumi-line-end">，</span>存储在 security association database (SAD) 中<span class="mojikumi-line-end">。</span></p>
<h3 id="the-ipsec-datagram" class="heading"><a href="#the-ipsec-datagram" class="heading-anchor" aria-label="章节： The IPsec Datagram" tabindex="-1"></a><span>The IPsec Datagram</span></h3>
<p>IPsec 有两种 packet form<span class="mojikumi-line-end">，</span>分别用于 tunnel mode 和 transport mode<span class="mojikumi-line-end">，</span>其中 tunnel mode 更常用<span class="mojikumi-line-end">，</span>书中只讲 tunnel mode<span class="mojikumi-line-end">。</span></p>
<p>一个 IPsec datagram 的结构如下<span class="mojikumi-line-end">：</span></p>
<ul>
<li>new IP header (source / destination 是 gateway router<span class="mojikumi-line-end">，</span>protocol 是 ESP)</li>
<li><span class="mojikumi-line-start">“</span>enchilada<span class="mojikumi">”</span> (authenticated)
<ul>
<li>ESP header
<ul>
<li>SPI</li>
<li>sequence number</li>
</ul>
</li>
<li>(encrypted)
<ul>
<li>original IP header</li>
<li>original IP payload</li>
<li>ESP trailer
<ul>
<li>padding (for encryption block size requirement)</li>
<li>padding length</li>
<li>next header <span class="mojikumi">（</span><span class="mojikumi">“</span>4<span class="mojikumi">”</span> for <span class="mojikumi">“</span>IP Encapsulation within IP<span class="mojikumi">”</span> in tunnel mode<span class="mojikumi-line-end">）</span><sup><a href="#user-content-fn-esp-next-header" id="user-content-fnref-esp-next-header" data-footnote-ref aria-describedby="footnote-label">3</a></sup></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>ESP MAC <span class="mojikumi">（</span>for authentication of the <span class="mojikumi">“</span>enchilada<span class="mojikumi">”</span><span class="mojikumi-line-end">）</span></li>
</ul>
<p>gateway router 会维护一个 security policy database (SPD)<span class="mojikumi-line-end">，</span>当其接收到一个待转发的 IP datagram 时<span class="mojikumi-line-end">，</span>会查询 SPD<span class="mojikumi-line-end">，</span>根据 source IP address<span class="mojikumi-line-end">、</span>destination IP address<span class="mojikumi-line-end">、</span>protocol 来决定是否使用 IPsec 进行处理<span class="mojikumi-line-end">。</span></p>
<h3 id="ike-key-management-in-ipsec" class="heading"><a href="#ike-key-management-in-ipsec" class="heading-anchor" aria-label="章节： IKE: Key Management in IPsec" tabindex="-1"></a><span>IKE: Key Management in IPsec</span></h3>
<p>IPsec 可以手动配置 key<span class="mojikumi-line-end">，</span>但大型的 VPN 往往需要使用 Internet Key Exchange (IKE) protocol 来自动建立 SA<span class="mojikumi-line-end">。</span></p>
<p><span class="mojikumi-line-start">（</span>书中对 IKE 的描述太简陋了<span class="mojikumi-line-end">，</span>说了跟没说差不多<span class="mojikumi-line-end">，</span>以后再说吧<span class="mojikumi-line-start">（</span></p>
<h2 id="securing-wireless-lans-and-4g5g-cellular-networks" class="heading"><a href="#securing-wireless-lans-and-4g5g-cellular-networks" class="heading-anchor" aria-label="章节： Securing Wireless LANs and 4G/5G Cellular Networks" tabindex="-1"></a><span>Securing Wireless LANs and 4G/5G Cellular Networks</span></h2>
<p>security 在 wireless network 中更加重要<span class="mojikumi-line-end">，</span>因为 attacker 只需要将设备置于 sender 的 transmission range 内就可以窃听<span class="mojikumi-line-end">。</span></p>
<p>wireless network security 主要需要两个功能<span class="mojikumi-line-end">：</span></p>
<ul>
<li>mutual authentication: mobile device 和 access point / base station 需要互相认证对方<span class="mojikumi-line-end">。</span></li>
<li>encryption: 通信内容需要加密<span class="mojikumi-line-end">。</span>一般使用 symmetric key cryptography (AES)<span class="mojikumi-line-end">，</span>需要进行 shared symmetric key derivation<span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="authentication-and-key-agreement-in-802-11-wireless-lans" class="heading"><a href="#authentication-and-key-agreement-in-802-11-wireless-lans" class="heading-anchor" aria-label="章节： Authentication and Key Agreement in 802.11 Wireless LANs" tabindex="-1"></a><span>Authentication and Key Agreement in 802.11 Wireless LANs</span></h3>
<p>802.11 的认证由 authentication server (AS) 进行<span class="mojikumi-line-end">，</span>AS 可以和 AP 一体<span class="mojikumi-line-end">，</span>也可以通过网络连接<span class="mojikumi-line-end">。</span></p>
<p>802.11 的 security specification 有 WEP<span class="mojikumi-line-end">、</span>WPA1<span class="mojikumi-line-end">、</span>WPA2<span class="mojikumi-line-end">、</span>WPA3<span class="mojikumi-line-end">，</span>其中 WEP 有严重的漏洞<span class="mojikumi-line-end">。</span></p>
<p>总体上的步骤为<span class="mojikumi-line-end">：</span></p>
<ol>
<li>在 AP 广播自己的存在时<span class="mojikumi-line-end">，</span>会附带其支持的 security mechanism<span class="mojikumi-line-end">，</span>mobile device 连接到 AP 时可以选择要使用哪个<span class="mojikumi-line-end">。</span></li>
<li>mobile device 和 AS 预先有一个 pre-shared key<span class="mojikumi-line-start">（</span>PSK<span class="mojikumi-line-end">，</span>也就是 Wi-Fi 密码<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>会根据这个 PSK 进行 mutual authentication 和 shared symmetric key derivation<span class="mojikumi-line-end">。</span></li>
<li>AS 把 shared symmetric key 告诉 AP<span class="mojikumi-line-end">。</span></li>
<li>使用 shared symmetric key 进行加密通信<span class="mojikumi-line-end">。</span></li>
</ol>
<p>WPA 的核心是一套 four-way handshake<span class="mojikumi-line-end">，</span>其中前两步完成 mutual authentication 和 shared symmetric key derivation<span class="mojikumi-line-start">（</span>后两步用于 group key derivation<span class="mojikumi-line-end">，</span>书中不涉及<span class="mojikumi">）</span><span class="mojikumi-line-end">：</span></p>
<ol>
<li>AS 生成一个 AS nonce<span class="mojikumi-line-end">，</span>发给 mobile device<span class="mojikumi-line-end">。</span></li>
<li>mobile device 生成一个 mobile nonce<span class="mojikumi-line-end">，</span>根据双方的 nonce<span class="mojikumi-line-end">、</span>双方的 MAC address 以及 PSK 得到 shared symmetric key<span class="mojikumi-line-end">，</span>然后向 AS 发送 mobile nonce<span class="mojikumi-line-end">，</span>以及编码了 AS nonce 和 PSK 的 HMAC<span class="mojikumi-line-end">。</span></li>
</ol>
<p>mobile device 和 AS 的通信通过 EAP (extensible authentication protocol) 进行<span class="mojikumi-line-end">，</span>它在 mobile device 到 AP 使用 EAP over LAN<span class="mojikumi-line-end">，</span>在 AP 到 AS 使用 RADIUS 或更新的 DIAMETER 协议<span class="mojikumi-line-end">。</span></p>
<h3 id="authentication-and-key-agreement-in-4g5g-cellular-networks" class="heading"><a href="#authentication-and-key-agreement-in-4g5g-cellular-networks" class="heading-anchor" aria-label="章节： Authentication and Key Agreement in 4G/5G Cellular Networks" tabindex="-1"></a><span>Authentication and Key Agreement in 4G/5G Cellular Networks</span></h3>
<p>cellular network 使用存储在 SIM card 和 HSS 中的 PSK 进行认证<span class="mojikumi-line-end">。</span>在 4G LTE 中<span class="mojikumi-line-end">，</span>步骤如下<span class="mojikumi-line-end">：</span></p>
<ol>
<li>
<ol>
<li>mobile device 向 base station 发送 attach message<span class="mojikumi-line-end">。</span></li>
<li>MME 向 HSS 发送 IMSI 以及 visited network information<span class="mojikumi-line-end">。</span></li>
</ol>
</li>
<li>
<ol>
<li>HSS 计算出能证明自己身份的 auth token<span class="mojikumi-line-end">，</span>以及用于证明 mobile device 身份的 expected auth response<span class="mojikumi-line-end">，</span>将它们发送给 MME<span class="mojikumi-line-end">。</span></li>
<li>MME 将 auth token 发给 mobile device<span class="mojikumi-line-end">。</span></li>
</ol>
</li>
<li>
<ol>
<li>mobile device 根据 auth token 认证 HSS<span class="mojikumi-line-end">。</span></li>
<li>mobile device 计算出 auth response<span class="mojikumi-line-end">，</span>发送给 MME<span class="mojikumi-line-end">。</span></li>
</ol>
</li>
<li>
<ol>
<li>MME 比较 HSS 发送的 expected auth response 和 mobile device 发送的 auth response 来认证 mobile device<span class="mojikumi-line-end">。</span></li>
<li>MME 将下一步需要用到的 key 发给 base station<span class="mojikumi-line-end">。</span></li>
</ol>
</li>
<li>base station 和 mobile device 进行 shared symmetric key derivation<span class="mojikumi-line-end">，</span>会在 control plane 和 data plane 使用不同的 key<span class="mojikumi-line-end">。</span></li>
</ol>
<p>5G 的认证有一些不同<span class="mojikumi-line-end">：</span></p>
<ul>
<li>authentication decision 从 MME 挪到了 HSS<span class="mojikumi-line-end">，</span>使得 visited network 的 middleman 作用更小<span class="mojikumi-line-end">。</span></li>
<li>新增了两种 authentication protocol<span class="mojikumi-line-end">，</span>一种和 4G 类似但使用了 EAP<span class="mojikumi-line-end">，</span>一种不需要 PSK 而适用于 IoT<span class="mojikumi-line-end">。</span></li>
<li>使用了 public key cryptography 来加密 IMSI<span class="mojikumi-line-end">。</span></li>
</ul>
<h2 id="operational-security-firewalls-and-intrusion-detection-systems" class="heading"><a href="#operational-security-firewalls-and-intrusion-detection-systems" class="heading-anchor" aria-label="章节： Operational Security: Firewalls and Intrusion Detection Systems" tabindex="-1"></a><span>Operational Security: Firewalls and Intrusion Detection Systems</span></h2>
<h3 id="firewalls" class="heading"><a href="#firewalls" class="heading-anchor" aria-label="章节： Firewalls" tabindex="-1"></a><span>Firewalls</span></h3>
<p>firewall 用来控置哪些流量可以进入 internal network / host<span class="mojikumi-line-end">，</span>一般要保证所有出入的流量都经过 firewall<span class="mojikumi-line-end">，</span>并且 firewall 自身不会被攻击者控制<span class="mojikumi-line-end">。</span></p>
<h4 id="traditional-packet-filters" class="heading"><a href="#traditional-packet-filters" class="heading-anchor" aria-label="章节： Traditional Packet Filters" tabindex="-1"></a><span>Traditional Packet Filters</span></h4>
<p>通过 packet header 来控制是否允许 packet 通过<span class="mojikumi-line-end">。</span>例如根据 IP address<span class="mojikumi-line-end">、</span>protocol type<span class="mojikumi-line-end">、</span>port<span class="mojikumi-line-end">、</span>TCP flags<span class="mojikumi-line-end">、</span>ICMP message type<span class="mojikumi-line-end">、</span>router interface 等进行控制<span class="mojikumi-line-end">。</span></p>
<p>一些 packet filter 可以实现的 policy 的例子<span class="mojikumi-line-end">：</span></p>
<ul>
<li>drop outgoing 的对 port 80/443 的访问<span class="mojikumi-line-end">：</span>禁止访问外部 Web<span class="mojikumi-line-end">。</span></li>
<li>drop incoming TCP SYN segment<span class="mojikumi-line-end">：</span>禁止从外界创建 TCP connection<span class="mojikumi-line-end">。</span></li>
<li>drop 除了外界 port 是 53 的所有 UDP traffic<span class="mojikumi-line-end">：</span>禁止其他 UDP traffic<span class="mojikumi-line-end">，</span>只允许 DNS<span class="mojikumi-line-end">。</span></li>
<li>drop 发向 broadcast address 的 ICMP ping packets<span class="mojikumi-line-end">：</span>避免遭受 smurf DoS attack<span class="mojikumi-line-end">。</span></li>
<li>drop outgoing ICMP TTL expired packets<span class="mojikumi-line-end">：</span>避免被 traceroute<span class="mojikumi-line-end">。</span></li>
</ul>
<h4 id="stateful-packet-filters" class="heading"><a href="#stateful-packet-filters" class="heading-anchor" aria-label="章节： Stateful Packet Filters" tabindex="-1"></a><span>Stateful Packet Filters</span></h4>
<p>stateful packet filter 可以通过记录状态信息来实现更复杂的控制<span class="mojikumi-line-end">，</span>例如跟踪 TCP connection<span class="mojikumi-line-end">，</span>从而更加精准地只允许从内部建立的 TCP connection 而拒绝从外部建立的 TCP connection<span class="mojikumi-line-end">。</span></p>
<h4 id="application-gateway" class="heading"><a href="#application-gateway" class="heading-anchor" aria-label="章节： Application Gateway" tabindex="-1"></a><span>Application Gateway</span></h4>
<p>packet filter 只根据 header 中的信息进行控制<span class="mojikumi-line-end">，</span>而不管 application data<span class="mojikumi-line-end">。</span></p>
<p>application gateway 是一个 application-specific server<span class="mojikumi-line-end">，</span>所有 application data 都需要通过它<span class="mojikumi-line-end">。</span>一个 host 可以同时运行多个 application gateway<span class="mojikumi-line-end">。</span></p>
<p>application gateway 可以根据 application data 进行控制<span class="mojikumi-line-end">，</span>提供例如 authorization 的高级 filter 功能<span class="mojikumi-line-end">，</span>还可以提供除了 filter 外的其他功能<span class="mojikumi-line-end">，</span>例如 proxy<span class="mojikumi-line-end">。</span></p>
<h3 id="intrusion-detection-systems" class="heading"><a href="#intrusion-detection-systems" class="heading-anchor" aria-label="章节： Intrusion Detection Systems" tabindex="-1"></a><span>Intrusion Detection Systems</span></h3>
<p>和 application gateway 类似<span class="mojikumi-line-end">，</span>intrusion detection system (IDS) 不止查看 header<span class="mojikumi-line-end">，</span>还会查看 application data<span class="mojikumi-line-end">，</span>这称作 deep packet inspection<span class="mojikumi-line-end">。</span></p>
<p>与 application gateway 不同<span class="mojikumi-line-end">，</span>IDS 不是 application-specific 的<span class="mojikumi-line-end">，</span>而是会检测到各种各样的 suspicious packet / series of packets<span class="mojikumi-line-end">，</span>例如 network mapping<span class="mojikumi-line-end">、</span>port scan<span class="mojikumi-line-end">、</span>TCP stack scan<span class="mojikumi-line-end">、</span>DoS attack<span class="mojikumi-line-end">、</span>worm / virus<span class="mojikumi-line-end">、</span>OS / application vulnerability attack<span class="mojikumi-line-end">。</span>检测到时<span class="mojikumi-line-end">，</span>IDS 会向管理员发送警告<span class="mojikumi-line-end">，</span>而 intrustion prevention system (IPS) 则会 filter out 这些 packet<span class="mojikumi-line-end">。</span></p>
<p>因为 deep packet inspection 需要一定的算力<span class="mojikumi-line-end">，</span>当流量过大时<span class="mojikumi-line-end">，</span>一个 organization 往往需要多个 IDS<span class="mojikumi-line-end">，</span>分散在网络中<span class="mojikumi-line-end">，</span>而非只设置一个在整个网络的入口<span class="mojikumi-line-end">。</span></p>
<p>IDS 分为 signature-based 和 anomaly-based 两种<span class="mojikumi-line-end">。</span></p>
<p>signature 即 packet 的特征<span class="mojikumi-line-end">，</span>例如 header 的某些项以及 application data 包含某一内容<span class="mojikumi-line-end">。</span>IDS 维护了一个 signature database 用来进行匹配<span class="mojikumi-line-end">。</span>signature-based IDS 需要事先知道 attack 的特征<span class="mojikumi-line-end">，</span>所以无法防范新型 attack<span class="mojikumi-line-end">。</span>signature 的匹配容易出现 false alarm<span class="mojikumi-line-end">，</span>而且性能开销较大<span class="mojikumi-line-end">。</span></p>
<p>anomaly-based IDS 基于平时的 traffic 来检测 statistically unusual 的 traffic<span class="mojikumi-line-end">，</span>例如检测到突然增多的 ICMP packets<span class="mojikumi-line-end">。</span>anomaly-based IDS 不依赖于实现对攻击的了解<span class="mojikumi-line-end">，</span>所以有可能检测到新型的攻击<span class="mojikumi-line-end">。</span>但是区分 normal traffic 和 statistically unusual traffic 是困难的<span class="mojikumi-line-end">，</span>现在的 IDS 通常还是以 signature-based 为主<span class="mojikumi-line-end">。</span></p>
<p>Snort 是一款 open-source IDS<span class="mojikumi-line-end">，</span>有一个活跃的 community 维护着 signature database<span class="mojikumi-line-end">。</span></p>
<section data-footnotes class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-sign">
<p>P.S. 我有幸在 <a href="https://tuna.moe/event/2021/welcome-and-debian/">第一次参加 tunight</a> 时获得了续老师的 signing<span class="mojikumi-line-end">，</span>当时还完全不懂这些<span class="mojikumi-line-start">（</span><s>现在也不是很懂<span class="mojikumi-line-start">（</span></s> <a href="#user-content-fnref-sign" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-opentls">
<p>See <a href="https://github.com/openssl/openssl/issues/6384">Rename OpenSSL to OpenTLS To Comply with RFC7568 · Issue #6384 · openssl/openssl</a> &#x26; <a href="https://www.openssl.org/blog/blog/2018/12/20/20years/">Celebrating 20 Years of OpenSSL - OpenSSL Blog</a> <a href="#user-content-fnref-opentls" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-esp-next-header">
<p>可以参考 <a href="http://www.tcpipguide.com/free/t_IPSecEncapsulatingSecurityPayloadESP-2.htm" class="break-all">http://www.tcpipguide.com/free/t_IPSecEncapsulatingSecurityPayloadESP-2.htm</a> <a href="#user-content-fnref-esp-next-header" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/cnatda">cnatda</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[CNATDA 第六章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/07/cnatda-6</link>
            <guid>https://ouuan.moe/post/2023/07/cnatda-6</guid>
            <pubDate>Sat, 15 Jul 2023 09:18:30 GMT</pubDate>
            <description><![CDATA[
<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第六章 <span class="mojikumi">“</span>The Link Layer and LANs<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[
<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第六章 <span class="mojikumi">“</span>The Link Layer and LANs<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>

<h2 id="introduction-to-the-link-layer" class="heading"><a href="#introduction-to-the-link-layer" class="heading-anchor" aria-label="章节： Introduction to the Link Layer" tabindex="-1"></a><span>Introduction to the Link Layer</span></h2>
<p>link layer 的主要功能是将 datagram 从一个 node 传输到另一个 node<span class="mojikumi-line-end">，</span>还可以提供下列 service<span class="mojikumi-line-end">：</span></p>
<ul>
<li>framing: 将 network-layer datagram 封装在 link-layer frame 中进行传输<span class="mojikumi-line-end">。</span></li>
<li>link access: 通过 medium access control (MAC) protocol 控制 frame 在 link 上如何传输<span class="mojikumi-line-end">。</span>这对于 point-to-point link 来说是简单的<span class="mojikumi-line-end">，</span>但在 broadcast link 中会遇到 multiple access problem<span class="mojikumi-line-end">，</span>需要 MAC protocol 来进行协调<span class="mojikumi-line-end">。</span></li>
<li>reliable delivery: 通过与 TCP 类似的方式<span class="mojikumi-line-start">（</span>acknowledgement<span class="mojikumi-line-end">、</span>retransmission<span class="mojikumi-line-end">）</span>来保证单个 link 上的 reliable delivery<span class="mojikumi-line-end">。</span>这在出错率较高时可以避免单个 link 的传输错误导致 end-to-end retransmission<span class="mojikumi-line-end">，</span>而在出错率较低时会造成不必要的 overhead<span class="mojikumi-line-end">，</span>所以一般是出错率较高的 wireless link 才会提供 reliable delivery<span class="mojikumi-line-end">。</span></li>
<li>error detection and correction</li>
</ul>
<p>在 host 中<span class="mojikumi-line-end">，</span>link layer 一般实现于外接的 network adapter (network interface controller, NIC) 中<span class="mojikumi-line-end">，</span>由硬件实现<span class="mojikumi-line-end">。</span>host 中还会有软件用来连接 link layer 和 network layer<span class="mojikumi-line-end">。</span></p>
<h2 id="error-detection-and-correction-techniques" class="heading"><a href="#error-detection-and-correction-techniques" class="heading-anchor" aria-label="章节： Error-Detection and -Correction Techniques" tabindex="-1"></a><span>Error-Detection and -Correction Techniques</span></h2>
<p>参见 <a href="/post/2023/01/ddpp-2#codes-for-detecting-and-correcting-errors">DDPP 第二章的相关内容</a><span class="mojikumi-line-end">。</span></p>
<h2 id="multiple-access-links-and-protocols" class="heading"><a href="#multiple-access-links-and-protocols" class="heading-anchor" aria-label="章节： Multiple Access Links and Protocols" tabindex="-1"></a><span>Multiple Access Links and Protocols</span></h2>
<p>在 broadcast link 中<span class="mojikumi-line-end">，</span>同时只能有一方发送信息<span class="mojikumi-line-end">。</span>如果多方同时发送<span class="mojikumi-line-end">，</span>则会产生 collision<span class="mojikumi-line-end">，</span>每一方发送的信息都会丢失<span class="mojikumi-line-end">。</span>为了解决 multiple access problem<span class="mojikumi-line-end">，</span>需要使用 multiple access protocol 来进行协调<span class="mojikumi-line-end">。</span></p>
<p>一个理想的 multiple access protocol 能做到<span class="mojikumi-line-end">：</span></p>
<ul>
<li>只有一方发送时<span class="mojikumi-line-end">，</span>完全利用带宽</li>
<li>多方同时发送时<span class="mojikumi-line-end">，</span>均分全部的带宽</li>
<li>decentralized<span class="mojikumi-line-end">，</span>没有 single point of failure</li>
<li>simple, inexpensive to implement</li>
</ul>
<p>multiple access protocol 有非常多<span class="mojikumi-line-end">，</span>总体可以分为三大类<span class="mojikumi-line-end">：</span>channel partitioning protocols<span class="mojikumi-line-end">、</span>ramdom access protocols<span class="mojikumi-line-end">、</span>taking-turns protocols<span class="mojikumi-line-end">。</span></p>
<h3 id="channel-partitioning-protocols" class="heading"><a href="#channel-partitioning-protocols" class="heading-anchor" aria-label="章节： Channel Partitioning Protocols" tabindex="-1"></a><span>Channel Partitioning Protocols</span></h3>
<p>将单个 channel 分成多个 channel<span class="mojikumi-line-end">。</span></p>
<p>TDM (time-division multiplexing) 将时间分成 time frames<span class="mojikumi-line-end">，</span>将每个 time frame 分成 time slots<span class="mojikumi-line-end">，</span>将每个 time frame 内的各个 time slot 分配给各个 node<span class="mojikumi-line-end">。</span></p>
<p>FDM (frequency-division multiplexing) 利用不同的频率作为不同的 channel<span class="mojikumi-line-end">。</span></p>
<p>TDM 和 FDM 都能完全避免 collision<span class="mojikumi-line-end">，</span>但在只有一方发送时效率非常低<span class="mojikumi-line-end">：</span>唯一的 active sender 不能使用分配给其他 node 的 channel<span class="mojikumi-line-end">。</span></p>
<p>CDMA (code-division multiple access) 通过给每个 node 分配一个 code 来允许各方同时发送<span class="mojikumi-line-end">，</span>在 wireless channel 中较为常用<span class="mojikumi-line-end">。</span></p>
<h3 id="random-access-protocols" class="heading"><a href="#random-access-protocols" class="heading-anchor" aria-label="章节： Random Access Protocols" tabindex="-1"></a><span>Random Access Protocols</span></h3>
<p>通过随机的等待时间来在 collision 发生后错开发送时机<span class="mojikumi-line-end">。</span></p>
<h4 id="aloha" class="heading"><a href="#aloha" class="heading-anchor" aria-label="章节： ALOHA" tabindex="-1"></a><span>ALOHA</span></h4>
<p>假设传输每个 frame 的用时相同<span class="mojikumi-line-end">，</span>将时间划分为长度为这一用时的 slots<span class="mojikumi-line-end">，</span>所有 node 是同步的<span class="mojikumi-line-end">，</span>只在 slot 的开头发送信息<span class="mojikumi-line-end">，</span>发生 collision 后能在这一 slot 内检测到<span class="mojikumi-line-end">。</span></p>
<p>slotted ALOHA 在没有 collision 时在每个 slot 开头发送 frame<span class="mojikumi-line-end">，</span>在发生了 collision 后在每个 slot 开头以 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span></span> 的概率进行 retransmission 直到发送成功为止<span class="mojikumi-line-end">。</span></p>
<p>如果一个 slot 中没有任何一方发送信息或者有多方同时发送信息则这个 slot 就浪费掉了<span class="mojikumi-line-end">，</span>只有恰好有一方发送信息的 slot 才是 successful slot<span class="mojikumi-line-end">。</span></p>
<p>其 efficiency 就是 successful slot 的占比<span class="mojikumi-line-end">，</span>有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 个 active slot 时<span class="mojikumi-line-end">，</span>efficiency 为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mi>p</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>p</mi><msup><mo stretchy="false">)</mo><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">np(1-p)^{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>在 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 很大时<span class="mojikumi-line-end">，</span>其最大值是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mi>e</mi><mo>≈</mo><mn>0.37</mn></mrow><annotation encoding="application/x-tex">1/e \approx 0.37</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1/</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.37</span></span></span></span></span><span class="mojikumi-line-end">。</span></p>
<p>pure ALOHA 不进行 time slot 的划分<span class="mojikumi-line-end">，</span>或者说是每一方的 time slot 不是同步的<span class="mojikumi-line-end">，</span>这样更加去中心化<span class="mojikumi-line-end">，</span>但 efficiency 只有 slotted ALOHA 的一半<span class="mojikumi-line-end">。</span></p>
<h4 id="csmacd" class="heading"><a href="#csmacd" class="heading-anchor" aria-label="章节： CSMA(/CD)" tabindex="-1"></a><span>CSMA(/CD)</span></h4>
<p>CSMA (carrier sense multiple access) 基于 <span class="mojikumi">“</span>listen before speaking<span class="mojikumi">”</span> 的原则<span class="mojikumi-line-end">，</span>进行 <i>carrier sensing</i><span class="mojikumi-line-end">。</span></p>
<p>如果再加上 <span class="mojikumi">“</span>If someone else begins talking at the same time, stop talking<span class="mojikumi">”</span> 的原则<span class="mojikumi-line-end">，</span>即 <i>collision detection</i><span class="mojikumi-line-end">，</span>则是 CSMA/CD<span class="mojikumi-line-end">。</span></p>
<p>在理想状态下<span class="mojikumi-line-end">，</span>carrier sensing 可以完全消除 collision<span class="mojikumi-line-end">。</span>但实际上<span class="mojikumi-line-end">，</span>由于 propagation delay<span class="mojikumi-line-end">，</span>一方开始发送到另一方收到需要时间<span class="mojikumi-line-end">，</span>在这段时间内可能另一方也发送了信息<span class="mojikumi-line-end">。</span></p>
<p>在 CSMA/CD 中<span class="mojikumi-line-end">，</span>遇到 collision 需要等待一段时间再 retransmit<span class="mojikumi-line-end">，</span>等待时间通常由 binary exponential backoff 得到<span class="mojikumi-line-end">：</span>在一个范围内随机选择等待时间<span class="mojikumi-line-end">，</span>每多 retransmit 一次这个范围就加倍<span class="mojikumi-line-end">。</span>在 Ethernet 中<span class="mojikumi-line-end">，</span>第 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 次 retransmission 会在 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">0, 1, \ldots, 2^{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></span> 中随机选择一个数 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span></span><span class="mojikumi-line-end">，</span>然后等待传输 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>512</mn><mo>⋅</mo><mi>k</mi></mrow><annotation encoding="application/x-tex">512 \cdot k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">512</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span></span> bits 的用时<span class="mojikumi-line-end">，</span>而 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 超过 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>10</mn></mrow><annotation encoding="application/x-tex">10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">10</span></span></span></span></span> 时也取 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>10</mn></mrow><annotation encoding="application/x-tex">10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">10</span></span></span></span></span><span class="mojikumi-line-end">。</span>这里 retransmission 次数是每个 frame 分别计算的<span class="mojikumi-line-end">，</span>新的 frame 会从 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></span> 开始<span class="mojikumi-line-end">。</span></p>
<p>CSMA/CD 的 efficiency 约为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mstyle displaystyle="true" scriptlevel="0"><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><mn>5</mn><msub><mi>d</mi><mrow><mi mathvariant="normal">p</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">p</mi></mrow></msub><mi mathvariant="normal">/</mi><msub><mi>d</mi><mrow><mi mathvariant="normal">t</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">s</mi></mrow></msub></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">\dfrac{1}{1 + 5 d_{\mathrm{prop}} / d_{\mathrm{trans}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.2935em;vertical-align:-0.9721em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">5</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">prop</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">trans</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>其中 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mrow><mi mathvariant="normal">p</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">d_{\mathrm{prop}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">prop</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></span> 表示 propagation delay<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mrow><mi mathvariant="normal">t</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">s</mi></mrow></msub></mrow><annotation encoding="application/x-tex">d_{\mathrm{trans}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">trans</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 表示一个 maximum-size frame 的传输用时<span class="mojikumi-line-end">。</span></p>
<h3 id="taking-turns-protocols" class="heading"><a href="#taking-turns-protocols" class="heading-anchor" aria-label="章节： Taking-Turns Protocols" tabindex="-1"></a><span>Taking-Turns Protocols</span></h3>
<p>轮流让各方发送信息<span class="mojikumi-line-end">，</span>如果一方不想发送则交给下一位<span class="mojikumi-line-end">。</span></p>
<p>在 polling protocol 中<span class="mojikumi-line-end">，</span>设有一个 master node<span class="mojikumi-line-end">，</span>它轮流 poll 每个 node 来让它发送至多若干个 frame<span class="mojikumi-line-end">，</span>发完再 poll 下一个<span class="mojikumi-line-end">。</span>polling protocol 是 centralized 的<span class="mojikumi-line-end">，</span>有 single point of failure<span class="mojikumi-line-end">；</span>并且<span class="mojikumi-line-end">，</span>对 inactive node 的 poll 会造成浪费<span class="mojikumi-line-end">。</span></p>
<p>token-passing protocol 是 decentralized 的<span class="mojikumi-line-end">，</span>有一个 token 在各个 node 之间环状地传递<span class="mojikumi-line-end">，</span>拿着 token 就可以发送至多若干个 frame<span class="mojikumi-line-end">，</span>发送完<span class="mojikumi-line-start">（</span>或者不想发送<span class="mojikumi-line-end">）</span>就把 token 交给下一个<span class="mojikumi-line-end">。</span>token-passing protocol 在有任何一个 node 出错时就会卡住<span class="mojikumi-line-end">，</span>需要采取一些 recovery procedure<span class="mojikumi-line-end">。</span></p>
<h3 id="docsis-the-link-layer-protocol-for-cable-internet-access" class="heading"><a href="#docsis-the-link-layer-protocol-for-cable-internet-access" class="heading-anchor" aria-label="章节： DOCSIS: The Link-Layer Protocol for Cable Internet Access" tabindex="-1"></a><span>DOCSIS: The Link-Layer Protocol for Cable Internet Access</span></h3>
<p>DOCSIS 用于 cable access network<span class="mojikumi-line-end">，</span>将 residential cable modems 连接到 cable modem termination system (CMTS)<span class="mojikumi-line-end">。</span>它同时用到了多种 multiple access protocol<span class="mojikumi-line-end">，</span>是一个很好的例子<span class="mojikumi-line-end">。</span></p>
<p>使用 FDM 分为 downstream 和 upstream 两个 channel<span class="mojikumi-line-end">，</span>其中 downstream channel 由 CMTS 向 cable modem 发送<span class="mojikumi-line-end">，</span>sender 唯一<span class="mojikumi-line-end">，</span>比较简单<span class="mojikumi-line-end">。</span></p>
<p>upstream channel 被分成了若干 mini-slots<span class="mojikumi-line-start">（</span>与 TDM 类似<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>而这些 mini-slots 是由 CMTS 动态分配的<span class="mojikumi-line-end">，</span>需要由 cable modem 发送 mini-slot-request frame<span class="mojikumi-line-end">，</span>这些 request 在一些特殊的 mini-slots 以 random access 的方式发送<span class="mojikumi-line-end">，</span>通过是否收到来自 CMTS 的 mini-slot 分配来判断 request 是否成功发送<span class="mojikumi-line-end">，</span>使用 binary exponential backoff<span class="mojikumi-line-end">。</span></p>
<h2 id="switched-local-area-networks" class="heading"><a href="#switched-local-area-networks" class="heading-anchor" aria-label="章节： Switched Local Area Networks" tabindex="-1"></a><span>Switched Local Area Networks</span></h2>
<h3 id="link-layer-addressing" class="heading"><a href="#link-layer-addressing" class="heading-anchor" aria-label="章节： Link-Layer Addressing" tabindex="-1"></a><span>Link-Layer Addressing</span></h3>
<p>host 和 router 的每个 interface (adapter) 都有一个 link-layer address<span class="mojikumi-line-end">：</span>MAC address (physical address / LAN address)<span class="mojikumi-line-end">。</span></p>
<p>MAC address 的长度为 6 bytes<span class="mojikumi-line-end">，</span>与 IP address 不同<span class="mojikumi-line-end">，</span>物理上的每个 interface 的 MAC address 是固定的<span class="mojikumi-line-end">，</span>不会因移动而变化<span class="mojikumi-line-end">。</span>MAC address 由 IEEE 管理<span class="mojikumi-line-end">，</span>在全球范围内是唯一的<span class="mojikumi-line-end">。</span></p>
<p>如果使用 broadcast link<span class="mojikumi-line-end">，</span>多个 interface 都会收到同样的 frame<span class="mojikumi-line-end">。</span>只有 MAC address 符合时才会接收<span class="mojikumi-line-end">，</span>否则会丢弃<span class="mojikumi-line-start">（</span>不会传递给 network layer<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>MAC broadcast address 是 <code>ff<wbr>:<wbr>ff<wbr>:<wbr>ff<wbr>:<wbr>ff<wbr>:<wbr>ff<wbr>:<wbr>ff</code><span class="mojikumi-line-end">。</span></p>
<h3 id="address-resolution-protocol" class="heading"><a href="#address-resolution-protocol" class="heading-anchor" aria-label="章节： Address Resolution Protocol" tabindex="-1"></a><span>Address Resolution Protocol</span></h3>
<p>ARP 用来将 subnet 内部的 IP address 翻译为 MAC address<span class="mojikumi-line-end">。</span></p>
<p>每个 host / router 会维护一张 ARP table<span class="mojikumi-line-end">，</span>用来记录 IP address 和 MAC address 的对应关系<span class="mojikumi-line-end">。</span>表项有过期时间<span class="mojikumi-line-end">，</span>到期自动删除<span class="mojikumi-line-end">。</span></p>
<p>如果在 ARP table 内没有查询到需要的 IP address<span class="mojikumi-line-end">，</span>则会发送一个 ARP query<span class="mojikumi-line-start">（</span>一个 broadcast packet<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>具有这个 IP address 的 interface 在收到 ARP query 后会回复 ARP response<span class="mojikumi-line-start">（</span>一般不是 broadcast<span class="mojikumi-line-end">，</span>因为此时 broadcast 可能造成浪费<span class="mojikumi-line-end">；</span>但是若采用 broadcast 也有助于发现 address conflict<sup><a href="#user-content-fn-arp-response-broadcast" id="user-content-fnref-arp-response-broadcast" data-footnote-ref aria-describedby="footnote-label">1</a></sup><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>收到 ARP response 后更新 ARP table<span class="mojikumi-line-end">。</span>通过这样的机制<span class="mojikumi-line-end">，</span>ARP table 可以自动建立<span class="mojikumi-line-end">，</span>不需要任何手动配置<span class="mojikumi-line-end">。</span></p>
<p>如果要向 subnet 外发送信息<span class="mojikumi-line-end">，</span>则需要向 gateway (first-hop router) 发送信息<span class="mojikumi-line-end">，</span>所以需要查询的是 gateway 的 MAC address<span class="mojikumi-line-end">。</span></p>
<h3 id="ethernet" class="heading"><a href="#ethernet" class="heading-anchor" aria-label="章节： Ethernet" tabindex="-1"></a><span>Ethernet</span></h3>
<p>Ethernet 是现在最常用的 wired LAN<span class="mojikumi-line-end">。</span></p>
<p>Ethernet 通常使用 hub 或 switch 来连接各个 interface<span class="mojikumi-line-end">。</span>hub 会将收到的每个 bit 转发给其他所有 interface<span class="mojikumi-line-end">，</span>可能产生 collision<span class="mojikumi-line-end">。</span>switch 则根据 MAC address 进行转发<span class="mojikumi-line-end">，</span>不会产生 collision<span class="mojikumi-line-end">。</span></p>
<p>Ethernet frame 包含<span class="mojikumi-line-end">：</span></p>
<ol>
<li>preamble (8 bytes): 31 个 <span class="mojikumi">“</span>10<span class="mojikumi">”</span> 和 1 个 <span class="mojikumi">“</span>11<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>用来标识 frame 的开头<span class="mojikumi-line-end">，</span>并同步时钟<span class="mojikumi-line-end">。</span></li>
<li>destination MAC address (6 bytes)</li>
<li>source MAC address (6 bytes)</li>
<li>type (2 bytes): upper layer protocol<span class="mojikumi-line-end">，</span>例如 IP<span class="mojikumi-line-end">、</span>ARP<span class="mojikumi-line-end">。</span></li>
<li>data (46 ~ 1500 bytes): 如果需要传送的数据不足 46 bytes 需要进行填充<span class="mojikumi-line-end">。</span>通过 type 以及 data 中的 header<span class="mojikumi-line-start">（</span>例如 IP header<span class="mojikumi-line-end">）</span>来判断 data 的长度<span class="mojikumi-line-end">。</span></li>
<li>CRC checksum (4 bytes)</li>
</ol>
<p>Ethernet 是 connectionless<span class="mojikumi-line-end">、</span>unreliable 的<span class="mojikumi-line-end">。</span></p>
<p>Ethernet 既是 link-layer protocol<span class="mojikumi-line-end">，</span>也是 physical layer protocol<span class="mojikumi-line-end">，</span>而且实际上是一类而非一个 protocol<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">，</span>10BASE-T<span class="mojikumi-line-end">、</span>10BASE-2<span class="mojikumi-line-end">、</span>100BASE-T<span class="mojikumi-line-end">、</span>1000BASE-LX<span class="mojikumi-line-end">、</span>10GBASE-T<span class="mojikumi-line-end">、</span>40GBASE-T 是不同的 Ethernet technology<span class="mojikumi-line-end">。</span>开头表示 10Mbps<span class="mojikumi-line-end">、</span>100Mbps<span class="mojikumi-line-end">、</span>1Gbps<span class="mojikumi-line-end">、</span>10Gbps<span class="mojikumi-line-end">、</span>40Gbps 的传输速度<span class="mojikumi-line-end">，</span>BASE 表示 media 只传送 Ethernet traffic<span class="mojikumi-line-end">，</span>最后是不同的 physical media<span class="mojikumi-line-end">。</span></p>
<h3 id="link-layer-switches" class="heading"><a href="#link-layer-switches" class="heading-anchor" aria-label="章节： Link-Layer Switches" tabindex="-1"></a><span>Link-Layer Switches</span></h3>
<p>switch 和 router 的功能类似<span class="mojikumi-line-end">，</span>但它工作于 link layer<span class="mojikumi-line-end">，</span>而且是 <i>transparent</i> 的<span class="mojikumi-line-end">，</span>其他设备感受不到 switch 的存在<span class="mojikumi-line-end">，</span>也不需要手动进行任何配置<span class="mojikumi-line-end">。</span></p>
<p>switch 的每个 interface 都有一个 output buffer<span class="mojikumi-line-end">，</span>与 router 类似<span class="mojikumi-line-end">。</span></p>
<p>switch 维护了一张 switch table<span class="mojikumi-line-end">，</span>表示每个 MAC address 对应的 switch 的 interface<span class="mojikumi-line-end">，</span>以及表项的过期时间<span class="mojikumi-line-end">。</span></p>
<p>对于从 interface <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></span> 收到的 destination MAC address 为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span></span> 的 frame<span class="mojikumi-line-end">：</span></p>
<ol>
<li>若 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span></span> 不在 switch table 中<span class="mojikumi-line-end">，</span>broadcast<span class="mojikumi-line-end">；</span></li>
<li>若 switch table 中 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span></span> 对应 interface <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></span><span class="mojikumi-line-end">，</span>discard<span class="mojikumi-line-end">；</span></li>
<li>若 switch table 中 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span></span> 对应 interface <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo mathvariant="normal">≠</mo><mi>x</mi></mrow><annotation encoding="application/x-tex">y \ne x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></span><span class="mojikumi-line-end">，</span>forward to <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span></span><span class="mojikumi-line-end">。</span></li>
</ol>
<p>switch 是 <i>self-learning</i> 的<span class="mojikumi-line-end">：</span>如果在 interface <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></span> 收到 source MAC address 为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span></span> 的 frame<span class="mojikumi-line-end">，</span>则会在 switch table 中记录 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span></span> 到 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></span> 的对应关系<span class="mojikumi-line-end">。</span></p>
<p>相对于 hub<span class="mojikumi-line-end">，</span>switch 的优点有<span class="mojikumi-line-end">：</span></p>
<ul>
<li>没有 collision<span class="mojikumi-line-end">，</span>可以优化性能<span class="mojikumi-line-end">。</span></li>
<li>可以将不同 technology 的 link (media) 连接在一起<span class="mojikumi-line-end">。</span></li>
<li>switch 还提供了一些 network management 功能<span class="mojikumi-line-end">，</span>例如自动检测异常的 adapter 并禁用<span class="mojikumi-line-end">、</span>对流量进行统计<span class="mojikumi-line-end">。</span></li>
</ul>
<p>switch 减少了 broadcast<span class="mojikumi-line-end">，</span>在提升性能的同时也增强了安全性<span class="mojikumi-line-end">。</span>但是 attacker 可以设法用 bogus entries 将 switch table 填满<span class="mojikumi-line-end">，</span>使得大部分 frame 被 broadcast<span class="mojikumi-line-end">，</span>这被称作 <i>switch poisoning</i><span class="mojikumi-line-end">。</span></p>
<p>switch 和 router 都可以将多个 host 连接在一起<span class="mojikumi-line-end">：</span></p>
<ul>
<li>switch 不需要手动配置<span class="mojikumi-line-end">；</span>性能一般更好<span class="mojikumi-line-end">。</span>只能连成生成树<span class="mojikumi-line-end">，</span>不能连出环<span class="mojikumi-line-end">；</span>如果同一个 subnet 内有太多 host 可能影响性能<span class="mojikumi-line-end">；</span>可能遭受 broadcast storm<span class="mojikumi-line-end">。</span></li>
<li>router 需要手动配置<span class="mojikumi-line-end">；</span>性能可能略差<span class="mojikumi-line-end">。</span>可以随便连<span class="mojikumi-line-end">，</span>从而可以提供多条 route 供 routing protocol 选择<span class="mojikumi-line-end">；</span>提供 firewall 来防止遭受 broadcast storm<span class="mojikumi-line-end">。</span></li>
</ul>
<p>一般来说多至数百个 host 时用 switch 即可<span class="mojikumi-line-end">，</span>有更多 host 的话则需要适当使用 router 来进行中转<span class="mojikumi-line-end">。</span></p>
<h3 id="virtual-local-area-networks-vlans" class="heading"><a href="#virtual-local-area-networks-vlans" class="heading-anchor" aria-label="章节： Virtual Local Area Networks (VLANs)" tabindex="-1"></a><span>Virtual Local Area Networks (VLANs)</span></h3>
<p>有时<span class="mojikumi-line-end">，</span>物理上的 switch 会对网络管理造成一些限制<span class="mojikumi-line-end">：</span></p>
<ul>
<li>一个 switch 一般有很多 port<span class="mojikumi-line-end">，</span>但希望设置的 subnet 大小<span class="mojikumi-line-start">（</span>为了安全等原因想分成不同的 subnet<span class="mojikumi-line-end">）</span>可能和 port 数量不符<span class="mojikumi-line-end">。</span></li>
<li>如果要在不同 subnet 之间移动 host<span class="mojikumi-line-end">，</span>需要更改物理连线<span class="mojikumi-line-end">。</span></li>
</ul>
<p>VLAN 可以用来解决这些问题<span class="mojikumi-line-end">。</span></p>
<p>VLAN 通过软件控制一个 switch 上哪些 port 属于同一个 subnet<span class="mojikumi-line-end">。</span>为了将两个 subnet 相连<span class="mojikumi-line-end">，</span>需要将它们连到同一个 router 上<span class="mojikumi-line-end">，</span>为了方便这样操作<span class="mojikumi-line-end">，</span>支持 VLAN 的 switch 往往自带一个 router<span class="mojikumi-line-end">。</span></p>
<p>可以使用 VLAN trunking 来将多个 switch 上的 port 合并为一个 VLAN<span class="mojikumi-line-end">：</span>每个 switch 上有一个 trunk port<span class="mojikumi-line-end">，</span>将需要 trunking 的 switch 的 trunk port 相连<span class="mojikumi-line-end">，</span>发送到 VLAN 的 frame 会被 forward 到 trunk port<span class="mojikumi-line-end">。</span>trunking 时所属 VLAN 的识别通过扩展的 Ethernet frame format 802.1Q 来实现<span class="mojikumi-line-end">，</span>在 header 中添加 VLAN tag 来表示所属的 VLAN<span class="mojikumi-line-end">。</span></p>
<p>除了基于 switch port 的 VLAN<span class="mojikumi-line-end">，</span>还有基于 MAC address 的 VLAN<span class="mojikumi-line-end">，</span>以及基于 network-layer protocol 的 VLAN<span class="mojikumi-line-end">。</span></p>
<h2 id="multiprotocol-label-switching-mpls" class="heading"><a href="#multiprotocol-label-switching-mpls" class="heading-anchor" aria-label="章节： Multiprotocol Label Switching (MPLS)" tabindex="-1"></a><span>Multiprotocol Label Switching (MPLS)</span></h2>
<p>MPLS 基于 fixed-length label 进行 switch<span class="mojikumi-line-end">，</span>在 link-layer header 和 IP header 之间添加 MPLS header<span class="mojikumi-line-end">，</span>需要在支持 MPLS 的 router 之间进行传输<span class="mojikumi-line-end">，</span>switch 时不需要管 IP header<span class="mojikumi-line-end">。</span></p>
<p>MPLS 有 switch 速度快<span class="mojikumi-line-end">、</span>便于进行 traffic management 等优点<span class="mojikumi-line-end">。</span></p>
<p><span class="mojikumi-line-start">（</span>书中对它的介绍过于简略<span class="mojikumi-line-end">，</span>感觉说了和没说差不多<span class="mojikumi-line-end">，</span>我就在此基础上再简略一点（<span class="mojikumi">（</span></p>
<h2 id="data-center-networking" class="heading"><a href="#data-center-networking" class="heading-anchor" aria-label="章节： Data Center Networking" tabindex="-1"></a><span>Data Center Networking</span></h2>
<p>很多大型互联网公司都有由数万台 server 组成的 data center<span class="mojikumi-line-end">。</span>data center 对外接入 Internet<span class="mojikumi-line-end">，</span>而其内部又有一套 data center network<span class="mojikumi-line-end">。</span></p>
<p>data center 主要提供三部分的功能<span class="mojikumi-line-end">：</span>向终端用户 serve content<span class="mojikumi-line-end">，</span>进行 distributed computation<span class="mojikumi-line-end">，</span>对外提供 cloud computing 服务<span class="mojikumi-line-end">。</span></p>
<p>data center 中的 host 被称作 <i>blade</i><span class="mojikumi-line-end">，</span>一般数十个 blade 会放在一起组成一个 <i>rack</i><span class="mojikumi-line-end">，</span>连到同一个 switch<span class="mojikumi-line-start">（</span>top of rack, TOR switch<span class="mojikumi-line-end">）</span>上<span class="mojikumi-line-end">，</span>而整个 data center 通过多级 router 和 switch 构成一个 hierarchy<span class="mojikumi-line-end">，</span>其中 access router 的下方可以分为多个 VLAN<span class="mojikumi-line-end">。</span>如下图所示<span class="mojikumi-line-end">：</span><sup><a href="#user-content-fn-fig-6.30" id="user-content-fnref-fig-6.30" data-footnote-ref aria-describedby="footnote-label">2</a></sup></p>
<p><picture><img type="image/webp" srcset="/assets/cnatda-fig-6.30.2bc76e92.webp" loading="lazy" src="/assets/cnatda-fig-6.30.2bc76e92.webp" width="1643" height="996" alt="A data center network with a hierarchical topology"></picture></p>
<p>在 data center 中<span class="mojikumi-line-end">，</span>一个 application 通常由很多 host 来提供同样的服务<span class="mojikumi-line-end">，</span>而对外只提供一个 IP address<span class="mojikumi-line-end">。</span>load balancer 通过类似 NAT 的方式<span class="mojikumi-line-end">，</span>将 request 均衡地分配给各个 host 进行处理<span class="mojikumi-line-end">。</span></p>
<p>树状的网络结构使得一个 data center 可以有数万台 server<span class="mojikumi-line-end">，</span>但 host-to-host capacity 还是会受限<span class="mojikumi-line-end">，</span>尤其是两个 host 的 LCA 位于较高层级时<span class="mojikumi-line-end">。</span>为了解决这一问题<span class="mojikumi-line-end">，</span>可以<span class="mojikumi-line-end">：</span></p>
<ul>
<li>使用更高速的 router 和 switch<span class="mojikumi-line-end">，</span>但这会大大增加开销<span class="mojikumi-line-end">。</span></li>
<li>尽量将需要互相通信的 host 放在较低的同一棵子树内<span class="mojikumi-line-end">，</span>但这不一定做得到<span class="mojikumi-line-start">（</span>可能大量 host 都需要互相通信<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>也会影响 host 位置的灵活性<span class="mojikumi-line-end">。</span></li>
<li>增加 interconnection 的数量<span class="mojikumi-line-end">，</span>从而增加 host-to-host 的路径数量<span class="mojikumi-line-end">，</span>在优化性能的同时也可以提升系统的可靠性<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">，</span>每个 TOR switch 连接到 8 个 tier-2 switch<span class="mojikumi-line-end">，</span>每个 tier-2 switch 连接到 16 个 tier-1 switch…… 这也被称作 <i>Clos network</i><span class="mojikumi-line-end">。</span></li>
</ul>
<p>data center 通常使用 SDN 来对网络进行集中管理<span class="mojikumi-line-end">。</span></p>
<p>为了支持 cloud computing<span class="mojikumi-line-end">、</span>更方便地进行管理<span class="mojikumi-line-end">，</span>通常会使用 virtual machine (VM) 等技术将 software 和 hardware 解耦<span class="mojikumi-line-end">。</span>为了让 VM 能方便地在不同 host 之间移动<span class="mojikumi-line-end">，</span>可以将 ARP 的 broadcast 机制改为类似于 DNS 的机制<span class="mojikumi-line-end">，</span>存储 VM 的 IP address 到 TOR switch 的映射关系<span class="mojikumi-line-end">。</span></p>
<p>data center network 通常具有极低的延迟以及较小的 buffer size<span class="mojikumi-line-end">，</span>而 congestion control 需要快速作出反应<span class="mojikumi-line-end">，</span>传统的 TCP 不再适用<span class="mojikumi-line-end">，</span>通常会使用为 data center 设计的 TCP 等方式来进行优化<span class="mojikumi-line-end">。</span></p>
<p>modular data center (MDC) 是一个内有至多数千个 host 的 container<span class="mojikumi-line-end">，</span>用来作为 data center 的组成部分<span class="mojikumi-line-end">。</span>在 MDC 的部分 component 坏掉时<span class="mojikumi-line-end">，</span>MDC 可以继续以 degraded performance 工作<span class="mojikumi-line-end">，</span>而在坏掉的 component 过多时则会报废<span class="mojikumi-line-end">。</span></p>
<p>很多公司会自己定制 data center 中的各个组成部分<span class="mojikumi-line-end">，</span>包括 network adapter<span class="mojikumi-line-end">、</span>switch<span class="mojikumi-line-end">、</span>router<span class="mojikumi-line-end">、</span>software<span class="mojikumi-line-end">、</span>networking protocol<span class="mojikumi-line-end">。</span></p>
<p>Amazon 通过 <span class="mojikumi">“</span>availability zone<span class="mojikumi">”</span> 提高了服务的可靠性<span class="mojikumi-line-end">，</span>即将 data center 在邻近但不同的地理位置上进行复刻<span class="mojikumi-line-end">，</span>从而提供 fault tolerance<span class="mojikumi-line-end">，</span>而地理位置上的邻近保证了 low latency<span class="mojikumi-line-end">，</span>便于同步<span class="mojikumi-line-end">。</span></p>
<section data-footnotes class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-arp-response-broadcast">
<p><a href="https://networkengineering.stackexchange.com/questions/7136/arp-replies-can-they-be-broadcast">ethernet - ARP Replies can they be Broadcast - Network Engineering Stack Exchange</a> <a href="#user-content-fnref-arp-response-broadcast" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-fig-6.30">
<p>p506, Figure 6.30: A data center network with a hierarchical topology <a href="#user-content-fnref-fig-6.30" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/cnatda">cnatda</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[CNATDA 第五章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/07/cnatda-5</link>
            <guid>https://ouuan.moe/post/2023/07/cnatda-5</guid>
            <pubDate>Sat, 08 Jul 2023 12:37:49 GMT</pubDate>
            <description><![CDATA[
<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第五章 <span class="mojikumi">“</span>The Network Layer: Control Plane<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[
<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第五章 <span class="mojikumi">“</span>The Network Layer: Control Plane<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>

<h2 id="introduction" class="heading"><a href="#introduction" class="heading-anchor" aria-label="章节： Introduction" tabindex="-1"></a><span>Introduction</span></h2>
<p>control plane 需要计算出 forwarding table / flow table<span class="mojikumi-line-end">，</span>有两种方式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>per-router control: router 之间互相发送信息<span class="mojikumi-line-end">，</span>分别进行计算</li>
<li>logicially centralized control: 使用 remote controller 集中地获取信息<span class="mojikumi-line-end">、</span>计算<span class="mojikumi-line-end">、</span>分发结果</li>
</ul>
<h2 id="routing-algorithms" class="heading"><a href="#routing-algorithms" class="heading-anchor" aria-label="章节： Routing Algorithms" tabindex="-1"></a><span>Routing Algorithms</span></h2>
<p>在 routing algorithm 中<span class="mojikumi-line-end">，</span>网络被抽象为一张图<span class="mojikumi-line-end">，</span>考虑 physical length<span class="mojikumi-line-end">、</span>link speed<span class="mojikumi-line-end">、</span>monetary cost 等因素作为边权<span class="mojikumi-line-end">。</span></p>
<p>routing algorithm 可以分为<span class="mojikumi-line-end">：</span></p>
<ul>
<li>centralized / decentralized<span class="mojikumi-line-end">：</span>计算过程中是否知道整个图的信息</li>
<li>static / dynamic<span class="mojikumi-line-end">：</span>是否对网络负载<span class="mojikumi-line-end">、</span>拓扑结构等的改变即时做出响应</li>
<li>load-sensitive/insensitive: 是否考虑 congestion 状况</li>
</ul>
<h3 id="the-link-state-ls-routing-algorithm" class="heading"><a href="#the-link-state-ls-routing-algorithm" class="heading-anchor" aria-label="章节： The Link-State (LS) Routing Algorithm" tabindex="-1"></a><span>The Link-State (LS) Routing Algorithm</span></h3>
<p>LS 是一个 centralized routing algorithm<span class="mojikumi-line-end">，</span>需要每个 node 将其 attached links 的信息进行广播<span class="mojikumi-line-start">（</span>link-state broadcast<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>使得每个 node 都有整张图的信息<span class="mojikumi-line-end">，</span>再用 Dijkstra 等算法计算最短路<span class="mojikumi-line-end">。</span></p>
<p>在 load-sensitive routing algorithm 中<span class="mojikumi-line-end">，</span>traffic load 的改变可能导致 oscillation<span class="mojikumi-line-end">，</span>要么改为 load-insensitive<span class="mojikumi-line-end">，</span>要么设法保证各个 router 不同时运行 routing algorithm<span class="mojikumi-line-end">。</span></p>
<h3 id="the-distance-vector-dv-routing-algorithm" class="heading"><a href="#the-distance-vector-dv-routing-algorithm" class="heading-anchor" aria-label="章节： The Distance-Vector (DV) Routing Algorithm" tabindex="-1"></a><span>The Distance-Vector (DV) Routing Algorithm</span></h3>
<p>每个 node 维护一个到其他每个 node 的 distance vector<span class="mojikumi-line-end">，</span>告诉 neighbor 自己的 distance vector<span class="mojikumi-line-end">，</span>通过 neighbor 的 distance vector 更新自己的 distance vector<span class="mojikumi-line-end">。</span>link state 发生改变时<span class="mojikumi-line-end">，</span>会经过多轮迭代进行传播并最终收敛<span class="mojikumi-line-end">。</span></p>
<p>在 link cost 减小时<span class="mojikumi-line-end">，</span>收敛是较快的<span class="mojikumi-line-end">。</span></p>
<p>但是在 link cost 增大时<span class="mojikumi-line-end">，</span>收敛可能需要边权值域大小轮次的迭代<span class="mojikumi-line-start">（</span>称作 <i>count-to-infinity problem</i><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>并在过程中产生 routing loop<span class="mojikumi-line-end">，</span>例如下图所示的情况<span class="mojikumi-line-end">：</span><sup><a href="#user-content-fn-fig-5.7-b" id="user-content-fnref-fig-5.7-b" data-footnote-ref aria-describedby="footnote-label">1</a></sup></p>
<p><picture><img type="image/webp" srcset="/assets/cnatda-fig-5.7-b.4a53bb07.webp" loading="lazy" src="/assets/cnatda-fig-5.7-b.4a53bb07.webp" width="371" height="207" alt="Changes in link cost"></picture></p>
<p>使用 <i>poisoned reverse</i> 可以避免出现二元环<span class="mojikumi-line-end">：</span>如果 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">u</span></span></span></span></span> 使用了 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(u, v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mclose">)</span></span></span></span></span> 这条边来走向 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span></span><span class="mojikumi-line-end">，</span>则在 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">u</span></span></span></span></span> 告诉 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span></span> 的 distance vector 中<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">u</span></span></span></span></span> 到 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span></span> 的距离是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">\infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord">∞</span></span></span></span></span><span class="mojikumi-line-end">。</span></p>
<p>但是 poisoned reverse 不能避免多元环的出现<span class="mojikumi-line-end">。</span></p>
<h3 id="comparison-of-ls-and-dv-routing-algorithms" class="heading"><a href="#comparison-of-ls-and-dv-routing-algorithms" class="heading-anchor" aria-label="章节： Comparison of LS and DV Routing Algorithms" tabindex="-1"></a><span>Comparison of LS and DV Routing Algorithms</span></h3>
<ul>
<li>message complexity: LS 需要让每个 node 都获取到全局的 link state<span class="mojikumi-line-end">，</span>要传送大量信息<span class="mojikumi-line-end">，</span>且信息需要发送到很远的地方<span class="mojikumi-line-end">；</span>DV 只需要从 neighbor 获取信息<span class="mojikumi-line-end">。</span></li>
<li>speed of convergence: LS 有 Dijkstra 的低复杂度<span class="mojikumi-line-end">，</span>DV 则较慢<span class="mojikumi-line-end">，</span>而且过程中可能出现 routing loop<span class="mojikumi-line-end">，</span>还有 count-to-infinity problem<span class="mojikumi-line-end">。</span></li>
<li>robustness: 在 LS 中<span class="mojikumi-line-end">，</span>每个 node 可以提供错误的 link state<span class="mojikumi-line-end">，</span>但影响有限<span class="mojikumi-line-end">，</span>每个 node 只为自己计算 forwarding table<span class="mojikumi-line-end">；</span>在 DV 中<span class="mojikumi-line-end">，</span>每个 node 的计算结果都是其他 node 的计算的一部分<span class="mojikumi-line-end">，</span>影响可以很大<span class="mojikumi-line-end">。</span></li>
</ul>
<p>实际上<span class="mojikumi-line-end">，</span>Internet 同时使用了这两种算法<span class="mojikumi-line-end">。</span></p>
<h2 id="intra-as-routing-in-the-internet-ospf" class="heading"><a href="#intra-as-routing-in-the-internet-ospf" class="heading-anchor" aria-label="章节： Intra-AS Routing in the Internet: OSPF" tabindex="-1"></a><span>Intra-AS Routing in the Internet: OSPF</span></h2>
<p>如果统一管理所有 router<span class="mojikumi-line-end">，</span>一方面规模过大性能无法接受<span class="mojikumi-line-end">，</span>另一方面无法满足自治的需求<span class="mojikumi-line-end">。</span>所以<span class="mojikumi-line-end">，</span>实际上 router 被分成了很多个 autonomous system (AS)<span class="mojikumi-line-end">，</span>每个 AS 有一个 ICANN 赋予的编号<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">，</span>每个 ISP 可能管理着一个或多个 AS<span class="mojikumi-line-end">。</span></p>
<p>每个 AS 内使用同一个 intra-AS routing protocol<span class="mojikumi-line-end">，</span>例如 OSPF (Open Shortest Path First) <span class="mojikumi-line-end">，</span>它非常复杂<span class="mojikumi-line-end">，</span>书中只有简要介绍<span class="mojikumi-line-end">。</span></p>
<p>OSPF 使用的是 LS routing algorithm<span class="mojikumi-line-end">，</span>边权由管理员设置<span class="mojikumi-line-end">，</span>每个 router 都会向整个 AS 内的其他所有 router<span class="mojikumi-line-start">（</span>在 link state 发生变化时 &#x26; 周期性地<span class="mojikumi-line-end">）</span>broadcast link state<span class="mojikumi-line-end">。</span></p>
<ul>
<li>OSPF message 直接通过 IP 传输<span class="mojikumi-line-end">，</span>不使用 transport-layer protocol<span class="mojikumi-line-end">。</span></li>
<li>支持 authentication<span class="mojikumi-line-end">。</span></li>
<li>有多条最短路时<span class="mojikumi-line-end">，</span>可以同时使用<span class="mojikumi-line-end">。</span></li>
<li>有 MOSPF 扩展来支持 multicast<span class="mojikumi-line-end">。</span></li>
<li>可以将 AS 划分为多个 area 形成 AS 内部的 hierarchy<span class="mojikumi-line-end">，</span>每个 area 内部走最短路<span class="mojikumi-line-end">，</span>不同 area 之间通过每个 area 的 border router 走 backbone area<span class="mojikumi-line-end">。</span></li>
</ul>
<h2 id="routing-among-the-isps-bgp" class="heading"><a href="#routing-among-the-isps-bgp" class="heading-anchor" aria-label="章节： Routing Among the ISPs: BGP" tabindex="-1"></a><span>Routing Among the ISPs: BGP</span></h2>
<h3 id="the-role-of-bgp" class="heading"><a href="#the-role-of-bgp" class="heading-anchor" aria-label="章节： The Role of BGP" tabindex="-1"></a><span>The Role of BGP</span></h3>
<p>BGP (Border Gateway Protocol) 是所有 AS 共用的 inter-AS routing protocol<span class="mojikumi-line-end">，</span>将各个 AS 连接在一起<span class="mojikumi-line-end">。</span></p>
<p>在 BGP 中<span class="mojikumi-line-end">，</span>destination 不是特定的 IP address<span class="mojikumi-line-end">，</span>而是 CIDR prefix<span class="mojikumi-line-end">。</span>BGP 使得一个 AS 可以向其他 AS advertise prefix<span class="mojikumi-line-end">，</span>并计算出到达各个 prefix 的 route<span class="mojikumi-line-end">。</span></p>
<h3 id="advertising-bgp-route-information" class="heading"><a href="#advertising-bgp-route-information" class="heading-anchor" aria-label="章节： Advertising BGP Route Information" tabindex="-1"></a><span>Advertising BGP Route Information</span></h3>
<p>不同 router 之间会建立称作 BGP connection 的 TCP connection<span class="mojikumi-line-start">（</span>不是 physical link<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>一般来说负责连接两个 AS 的 gateway router 之间会建立 external BGP (eBGP) connection<span class="mojikumi-line-end">；</span>而 AS 内部的 router 两两之间建立 internal BGP (iBGP) connection<span class="mojikumi-line-end">。</span></p>
<p>一条 BGP advertisement<span class="mojikumi-line-start">（</span>称作一个 <i>route</i><span class="mojikumi-line-end">）</span>包含 AS-PATH 和 NEXT-HOP 等信息<span class="mojikumi-line-end">：</span></p>
<ul>
<li>AS-PATH 即经过哪几个 AS 能到达目的地<span class="mojikumi-line-end">，</span>一个 AS 收到来自其他 AS 的 route 后<span class="mojikumi-line-end">，</span>可以在 AS-PATH 中加上自己<span class="mojikumi-line-end">，</span>继续向 neighbor 发送<span class="mojikumi-line-end">；</span></li>
<li>NEXT-HOP 是从当前 AS 出发向目的地走<span class="mojikumi-line-end">，</span>走出当前 AS 遇到的第一个 router 的 IP address<span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="determining-the-best-routes" class="heading"><a href="#determining-the-best-routes" class="heading-anchor" aria-label="章节： Determining the Best Routes" tabindex="-1"></a><span>Determining the Best Routes</span></h3>
<p>从一个 AS 出发到达某个 prefix 可能有很多条路径<span class="mojikumi-line-end">，</span>BGP 按照下面的顺序来决定 best route<span class="mojikumi-line-start">（</span>平局则使用下一条规则<span class="mojikumi">）</span><span class="mojikumi-line-end">：</span></p>
<ol>
<li>由管理员设置或从其他 AS 获取的 local preference</li>
<li>shortest AS-PATH<span class="mojikumi-line-start">（</span>经过最少个 AS<span class="mojikumi-line-end">）</span></li>
<li>在 AS 内走最短路<span class="mojikumi-line-start">（</span>通过 intra-AS protocol 以及 NEXT-HOP 得到<span class="mojikumi-line-end">）</span>到达 gateway router</li>
<li>根据 BGP identifier 选</li>
</ol>
<h3 id="ip-anycast" class="heading"><a href="#ip-anycast" class="heading-anchor" aria-label="章节： IP-anycast" tabindex="-1"></a><span>IP-anycast</span></h3>
<p>BGP 可以计算出到达某个 prefix (IP address) 的 best route<span class="mojikumi-line-end">，</span>如果为多个 host 设置相同的 IP address<span class="mojikumi-line-end">，</span>则可以实现 IP-anycast<span class="mojikumi-line-end">，</span>例如在 CDN 中可以让用户从多个内容相同的 server 中挑选最适合的一个<span class="mojikumi-line-end">，</span>而这一挑选是在 router 处通过 BGP 实现的<span class="mojikumi-line-end">。</span></p>
<p>但是 IP-anycast 如果用于 TCP 可能导致同一个 TCP connection 发给不同 host<span class="mojikumi-line-end">，</span>所以 CDN 一般不采用 IP-anycast<span class="mojikumi-line-end">，</span>而 DNS root server 则采用了 IP-anycast<span class="mojikumi-line-start">（</span>DNS 使用 UDP<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<h3 id="routing-policy" class="heading"><a href="#routing-policy" class="heading-anchor" aria-label="章节： Routing Policy" tabindex="-1"></a><span>Routing Policy</span></h3>
<p>BGP 通过 local preference 给管理员提供了决定如何选择 route 的自由<span class="mojikumi-line-end">，</span>以实现某些 policy<span class="mojikumi-line-end">。</span></p>
<p>例如<span class="mojikumi-line-end">，</span>当一个 access ISP 连接到多个 backbone ISP<span class="mojikumi-line-start">（</span>即 multi-home<span class="mojikumi-line-end">）</span>时<span class="mojikumi-line-end">，</span>access ISP 不应该作为中介在不同 backbone ISP 之间进行传输<span class="mojikumi-line-end">。</span>一般来说<span class="mojikumi-line-end">，</span>一个 ISP 只会在通信双方至少有一方是其 customer 时提供服务<span class="mojikumi-line-end">。</span></p>
<h2 id="the-sdn-control-plane" class="heading"><a href="#the-sdn-control-plane" class="heading-anchor" aria-label="章节： The SDN Control Plane" tabindex="-1"></a><span>The SDN Control Plane</span></h2>
<p>SDN 分为 SDN controller<span class="mojikumi-line-end">、</span>network management applications<span class="mojikumi-line-start">（</span>例如 routing<span class="mojikumi-line-end">、</span>access control<span class="mojikumi-line-end">、</span>load balancing<span class="mojikumi">）</span><span class="mojikumi-line-end">、</span>controlled devices 三个部分<span class="mojikumi-line-end">。</span>其中 SDN controller 连接了 network management applications 和 controlled devices<span class="mojikumi-line-end">。</span></p>
<p>SDN 使用 generalized forwarding<span class="mojikumi-line-end">，</span>将 data plane 和 control plane 分开<span class="mojikumi-line-end">，</span>通过 network management applications 提供 network control functions<span class="mojikumi-line-end">，</span>实现了 programmable network<span class="mojikumi-line-end">。</span></p>
<p>SDN 将 network functionality 进行了 unbundle<span class="mojikumi-line-end">，</span>使得 packet switches<span class="mojikumi-line-end">、</span>SDN controller<span class="mojikumi-line-end">、</span>network management applications 可以来自不同的供应商<span class="mojikumi-line-end">，</span>各自发展<span class="mojikumi-line-end">。</span></p>
<ul>
<li>communication layer (<i>northbound API</i>): controlled devices 和 SDN controller 进行通信<span class="mojikumi-line-end">。</span>SDN controller 向 controlled device 发送信息<span class="mojikumi-line-start">（</span>例如 flow table<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>从 controlled device 获取 link state 等信息<span class="mojikumi-line-end">，</span>并在 network state 发生改变时被通知<span class="mojikumi-line-end">。</span>可以使用 OpenFlow<span class="mojikumi-line-end">、</span>SNMP 等协议<span class="mojikumi-line-end">。</span></li>
<li>network-wide state-management layer: SDN controller 存储了一些信息<span class="mojikumi-line-end">，</span>包括 network state<span class="mojikumi-line-end">、</span>flow table<span class="mojikumi-line-end">、</span>统计数据等<span class="mojikumi-line-end">。</span></li>
<li>interface to the network-control application layer (<i>southbound API</i>): network management applications 可以从 SDN controller 获取 network state<span class="mojikumi-line-end">，</span>订阅状态发生改变的 event<span class="mojikumi-line-end">。</span>通过 RESTful API 等方式通信<span class="mojikumi-line-end">。</span></li>
</ul>
<p>在 OpenFlow 中<span class="mojikumi-line-end">，</span>SDN controller 可以向 controlled device 发送<span class="mojikumi-line-end">：</span></p>
<ul>
<li>configuration<span class="mojikumi-line-end">，</span>修改配置参数</li>
<li>modify-state<span class="mojikumi-line-end">，</span>例如修改 flow table</li>
<li>read-state<span class="mojikumi-line-end">，</span>例如获取统计信息</li>
<li>send-packet<span class="mojikumi-line-end">，</span>让 router 发出一个 packet</li>
</ul>
<p>controlled device 可以向 SDN controller 发送<span class="mojikumi-line-end">：</span></p>
<ul>
<li>flow-removed: 通知一个 flow table entry 已被移除<span class="mojikumi-line-start">（</span>timeout 或者被 modify-state 删除<span class="mojikumi-line-end">）</span></li>
<li>port-status: 例如一个 link up/down 了</li>
<li>packet-in: 如果一个 packet 在 flow table 中没有 match<span class="mojikumi-line-end">，</span>或者 action 为发送到 controller</li>
</ul>
<h2 id="icmp-the-internet-control-message-protocol" class="heading"><a href="#icmp-the-internet-control-message-protocol" class="heading-anchor" aria-label="章节： ICMP: The Internet Control Message Protocol" tabindex="-1"></a><span>ICMP: The Internet Control Message Protocol</span></h2>
<p>ICMP 用来进行 router 和 host 之间的通信<span class="mojikumi-line-end">，</span>作为 IP payload 进行传输<span class="mojikumi-line-end">。</span></p>
<p>ICMP message 有很多种<span class="mojikumi-line-end">，</span>例如<span class="mojikumi-line-end">：</span></p>
<ul>
<li>用来 ping 的 echo request 和 echo reply</li>
<li>destination network/host/protocol/port unreachable</li>
<li>router advertisement</li>
<li>router discovery</li>
<li>TTL expired</li>
<li>IP header bad</li>
</ul>
<p>Traceroute 就是通过 ICMP 实现的<span class="mojikumi-line-end">：</span>向一个 unlikely port number 发送 TTL 递增的 UDP datagram<span class="mojikumi-line-end">，</span>通过 TTL expired 得到每个 router 的信息<span class="mojikumi-line-end">，</span>通过 port unreachable 得到终点的信息<span class="mojikumi-line-end">。</span></p>
<h2 id="network-management-and-snmp-netconfyang" class="heading"><a href="#network-management-and-snmp-netconfyang" class="heading-anchor" aria-label="章节： Network Management and SNMP, NETCONF/YANG" tabindex="-1"></a><span>Network Management and SNMP, NETCONF/YANG</span></h2>
<blockquote>
<p>Network management involves the deployment, integration and coordination of all the hardware, software and human elements to monitor, test, poll, configure, analyze, evaluate, and control the network and element resources to meet the real-time, operational performance and quality-of-service (QoS) requirements at reasonable cost.<sup><a href="#user-content-fn-saydam-1996" id="user-content-fnref-saydam-1996" data-footnote-ref aria-describedby="footnote-label">2</a></sup></p>
</blockquote>
<p>network management 包括 managing server (以及 network manager)<span class="mojikumi-line-end">、</span>managed device<span class="mojikumi-line-end">、</span>data<span class="mojikumi-line-start">（</span>每个 device 有 configuration<span class="mojikumi-line-end">、</span>operational data<span class="mojikumi-line-end">、</span>device statistics<span class="mojikumi-line-end">，</span>而 managing server 有每个 device 以及整个 network 的 data<span class="mojikumi">）</span><span class="mojikumi-line-end">、</span>network management agent<span class="mojikumi-line-end">、</span>network management protocol<span class="mojikumi-line-end">。</span></p>
<p>network management 有若干方式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>CLI: error-prone<span class="mojikumi-line-end">，</span>难以 scale<span class="mojikumi-line-end">。</span></li>
<li>SNMP/MIB: 每个 device 有 management information base (MIB) objects<span class="mojikumi-line-end">，</span>可以通过 simple network management protocol (SNMP) 来获取/设置 MIB objects 中的 data<span class="mojikumi-line-end">，</span>device 也可以通过 trap message 向 managing server 通知状态变化<span class="mojikumi-line-end">。</span>SNMP/MIB 是针对单个 device 的<span class="mojikumi-line-end">，</span>也难以 scale<span class="mojikumi-line-end">。</span></li>
<li>NETCONF/YANG: NETCONF 比起 SNMP 更注重于配置管理<span class="mojikumi-line-end">，</span>可以一次性操控多个 device (atomic network management transaction)<span class="mojikumi-line-end">，</span>可以设置 constraint 检查配置的正确性<span class="mojikumi-line-end">，</span>使用 YANG 作为 data modeling language<span class="mojikumi-line-end">，</span>以 XML 格式通过 TLS 进行通信<span class="mojikumi-line-end">。</span></li>
</ul>
<section data-footnotes class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-fig-5.7-b">
<p>p393, Figure 5.7: Changes in link cost, b. <a href="#user-content-fnref-fig-5.7-b" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-saydam-1996">
<p>Saydam, T., Magedanz, T. From networks and network management into service and service management. J Netw Syst Manage 4, 345–348 (1996). <a href="https://doi.org/10.1007/BF02283158">https<wbr>://<wbr>doi<wbr>.<wbr>org<wbr>/<wbr>10<wbr>.<wbr>1007<wbr>/<wbr>BF02283158</a> <a href="#user-content-fnref-saydam-1996" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/cnatda">cnatda</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[CNATDA 第四章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/06/cnatda-4</link>
            <guid>https://ouuan.moe/post/2023/06/cnatda-4</guid>
            <pubDate>Wed, 05 Jul 2023 14:31:33 GMT</pubDate>
            <description><![CDATA[

<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第四章 <span class="mojikumi">“</span>The Network Layer: Data Plane<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[

<p><span class="mojikumi-line-start">《</span>Computer Networking: A Top-Down Approach (8th Edition)<span class="mojikumi-line-end">》</span>第四章 <span class="mojikumi">“</span>The Network Layer: Data Plane<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>

<h2 id="overview-of-network-layer" class="heading"><a href="#overview-of-network-layer" class="heading-anchor" aria-label="章节： Overview of Network Layer" tabindex="-1"></a><span>Overview of Network Layer</span></h2>
<p>Network Layer 可以被细分为 data plane 和 control plane 两部分<span class="mojikumi-line-end">。</span></p>
<p>data plane 的主要功能是 <i>forwarding</i><span class="mojikumi-line-start">（</span>也称作 <i>switching</i><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>即一个 router 将 input link 收到的数据转发到正确的 output link<span class="mojikumi-line-end">。</span></p>
<p>control plane 的主要功能是 <i>routing</i><span class="mojikumi-line-end">，</span>即决定从 sending host 到 receiving host 的路径<span class="mojikumi-line-end">。</span></p>
<p>router 中会有一个 <i>forwarding table</i><span class="mojikumi-line-end">，</span>从 packet header 中选取某些 field 用来 index forwarding table<span class="mojikumi-line-end">，</span>得到 outgoing link interface<span class="mojikumi-line-end">。</span></p>
<p>计算 forwarding table 则是 control plane 的任务<span class="mojikumi-line-end">，</span>有两种实现方式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>the traditional approach: router 之间根据 routing protocol 互相通信<span class="mojikumi-line-end">，</span>根据 routing algorithm 计算得到 forwarding table<span class="mojikumi-line-end">。</span></li>
<li>the SDN approach: router 只实现 forwarding<span class="mojikumi-line-end">，</span>而 routing 由一个 remote controller 完成<span class="mojikumi-line-end">：</span>router 向 remote controller 发送信息<span class="mojikumi-line-end">，</span>由 remote controller 计算得到 forwarding table 发给 router<span class="mojikumi-line-end">。</span>这个 remote controller 通常是由软件实现的<span class="mojikumi-line-end">，</span>所以这种方法被称作 <i>software-defined networking</i> (SDN)<span class="mojikumi-line-end">。</span></li>
</ul>
<h2 id="what’s-inside-a-router" class="heading"><a href="#what’s-inside-a-router" class="heading-anchor" aria-label="章节： What’s Inside a Router?" tabindex="-1"></a><span>What<span class="mojikumi-narrow-left">’</span>s Inside a Router?</span></h2>
<p>router 一般包含以下部分<span class="mojikumi-line-end">：</span></p>
<ul>
<li>
<p>input ports</p>
<ul>
<li>incoming link 的 physical layer 和 link layer</li>
<li>input queue</li>
<li>lookup:
<ul>
<li>从 forwarding table 查 output port</li>
<li>将 control packet<span class="mojikumi-line-start">（</span>例如包含 routing protocol information 的 packet<span class="mojikumi-line-end">）</span>forward 到 routing processor</li>
</ul>
</li>
</ul>
</li>
<li>
<p>switching fabric: 连接 input ports 和 output ports</p>
</li>
<li>
<p>output ports</p>
<ul>
<li>outgoing link 的 link layer 和 physical layer</li>
<li>output queue</li>
</ul>
</li>
<li>
<p>routing processor: 得到 forwarding table<span class="mojikumi-line-end">，</span>进行 network management</p>
<ul>
<li>traditional: 执行 routing protocol</li>
<li>SDN: 与 remote controller 通信</li>
</ul>
</li>
</ul>
<p>为了保证通信速度<span class="mojikumi-line-end">，</span>forwarding 的用时需要在 ns 级<span class="mojikumi-line-end">，</span>所以要用硬件实现<span class="mojikumi-line-end">；</span>而 control plane 的用时一般在 ms 或 s 级<span class="mojikumi-line-end">，</span>可以用软件实现<span class="mojikumi-line-end">。</span></p>
<h3 id="input-port-processing-and-destination-based-forwarding" class="heading"><a href="#input-port-processing-and-destination-based-forwarding" class="heading-anchor" aria-label="章节： Input Port Processing and Destination-Based Forwarding" tabindex="-1"></a><span>Input Port Processing and Destination-Based Forwarding</span></h3>
<p>多个 input port 可以合并到一个 line card 上<span class="mojikumi-line-end">。</span></p>
<p>forwarding table 会从 routing processor 给每个 line card 都复制一份<span class="mojikumi-line-end">，</span>从而可以在每个局部分别计算<span class="mojikumi-line-end">，</span>不需要集中计算<span class="mojikumi-line-end">。</span></p>
<p>对于 destination-based forwarding<span class="mojikumi-line-end">，</span>forwarding table 一般是 index 为 IP 地址前缀<span class="mojikumi-line-end">，</span>value 为 link interface<span class="mojikumi-line-end">，</span>采用 longest prefix matching<span class="mojikumi-line-end">。</span></p>
<p>lookup 通常要在 ns 级别的时间内完成<span class="mojikumi-line-end">，</span>而 forwarding table 很大<span class="mojikumi-line-end">，</span>不仅需要通过硬件实现<span class="mojikumi-line-end">，</span>还需要使用特殊的算法或存储器<span class="mojikumi-line-end">，</span>例如使用 TCAM<span class="mojikumi-line-end">。</span></p>
<p>input port processing 除了 lookup 还有 physical-layer 和 link-layer processing<span class="mojikumi-line-end">，</span>还需要检查/更新 packet version<span class="mojikumi-line-end">、</span>checksum<span class="mojikumi-line-end">、</span>TTL<span class="mojikumi-line-end">，</span>更新 network management 的 counter<span class="mojikumi-line-end">。</span></p>
<h3 id="switching" class="heading"><a href="#switching" class="heading-anchor" aria-label="章节： Switching" tabindex="-1"></a><span>Switching</span></h3>
<p>switching 有多种形式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>via memory: packet 从 input port 复制到 memory 再复制到 output port<span class="mojikumi-line-end">，</span>如果使用集中的 memory 而非每个 line card 分别的 memory<span class="mojikumi-line-end">，</span>则传输速率会受 memory 的速率限制<span class="mojikumi-line-end">。</span></li>
<li>via bus: 将 packet 加上一个 switch-internal label 再通过 bus 发送给所有 output port<span class="mojikumi-line-end">，</span>收到后根据 label 决定是否保留这个 packet<span class="mojikumi-line-end">，</span>传输速率会受 bus 的速率限制<span class="mojikumi-line-end">。</span></li>
<li>via interconnection network: 每个 input port 对应一个 bus<span class="mojikumi-line-end">，</span>每个 output port 对应一个 bus<span class="mojikumi-line-end">，</span>每对 input port bus 和 output port bus 之间都有 crosspoint<span class="mojikumi-line-end">，</span>通过控制 crosspoint 来控制从哪传到哪<span class="mojikumi-line-start">（</span>结构和 ROM 类似<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>这是 non-blocking 的<span class="mojikumi-line-end">，</span>只要两个 packet 的 output port 不同就可以同时传输<span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="input-queuing" class="heading"><a href="#input-queuing" class="heading-anchor" aria-label="章节： Input Queuing" tabindex="-1"></a><span>Input Queuing</span></h3>
<p>如果 switching fabric 的速率达到了所有 input port 的速率之和<span class="mojikumi-line-end">，</span>则不会发生 input queuing<span class="mojikumi-line-end">，</span>否则可能要等待其他 packet 在 switching fabric 上传输<span class="mojikumi-line-end">。</span></p>
<p>以 switching via interconnection network 为例<span class="mojikumi-line-end">，</span>只有多个 packet 传输到同一个 output port 才会发生 input queuing<span class="mojikumi-line-end">，</span>但是一个 packet 即使没有和它 output port 相同的 packet 也可能因为 input queue 中在它前面的其他 packet 而被 block<span class="mojikumi-line-end">，</span>即 HOL blocking<span class="mojikumi-line-end">。</span></p>
<h3 id="output-queuing" class="heading"><a href="#output-queuing" class="heading-anchor" aria-label="章节： Output Queuing" tabindex="-1"></a><span>Output Queuing</span></h3>
<p>如果 packet 到达 output port 的速率超过了 output line 的速率<span class="mojikumi-line-end">，</span>则会发生 output queuing<span class="mojikumi-line-end">。</span></p>
<p>若 packet 到达时 buffer 已经满了<span class="mojikumi-line-end">，</span>则需要决定 drop 哪个 packet<span class="mojikumi-line-end">。</span>在 buffer 满之前进行 packet dropping 或 marking 称作 active queue management (AQM)<span class="mojikumi-line-end">，</span>例如 <a href="/post/2023/06/cnatda-3#network-assisted-explicit-congestion-notification">ECN</a><span class="mojikumi-line-end">、</span>random early detection (RED) 等<span class="mojikumi-line-end">。</span></p>
<h3 id="how-much-buffering-is-“enough”" class="heading"><a href="#how-much-buffering-is-“enough”" class="heading-anchor" aria-label="章节： How Much Buffering Is “Enough”?" tabindex="-1"></a><span>How Much Buffering Is <span class="mojikumi">“</span>Enough<span class="mojikumi">”</span>?</span></h3>
<p>有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span></span> 个 independent TCP flow 经过一个带宽为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span></span></span></span></span> 的 link 时<span class="mojikumi-line-end">，</span>buffer 需要有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi mathvariant="normal">R</mi><mi mathvariant="normal">T</mi><mi mathvariant="normal">T</mi></mrow><mo>⋅</mo><mi>C</mi><mi mathvariant="normal">/</mi><msqrt><mi>N</mi></msqrt></mrow><annotation encoding="application/x-tex">\mathrm{RTT} \cdot C / \sqrt N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord"><span class="mord mathrm">RTT</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1767em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord">/</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9267em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;padding-left:0.833em;">N</span></span><span style="top:-2.8867em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1133em;"><span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">。</span></p>
<p>更大的 buffer 能减少 packet loss<span class="mojikumi-line-end">，</span>但可能会增加 delay<span class="mojikumi-line-end">。</span>TCP 可能会使得 buffer 一直不被清空<span class="mojikumi-line-end">，</span>从而导致 queuing delay 是 constant 且 persistent 的<span class="mojikumi-line-end">，</span>这被称作 <i>bufferbloat</i><span class="mojikumi-line-end">，</span>可以通过一些 AQM 措施来缓解<span class="mojikumi-line-end">。</span></p>
<h3 id="packet-scheduling" class="heading"><a href="#packet-scheduling" class="heading-anchor" aria-label="章节： Packet Scheduling" tabindex="-1"></a><span>Packet Scheduling</span></h3>
<ul>
<li>FIFO (FCFS)</li>
<li>priority queuing<br>
<span class="mojikumi-line-start">（</span>在 non-preemptive priority queuing 中<span class="mojikumi-line-end">，</span>如果低优先级的 packet 已经开始传输<span class="mojikumi-line-end">，</span>高优先级的 packet 再到来不会打断传输<span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></li>
<li>weighted fair queuing (WFQ): 给每种 packet 类型一个 weight<span class="mojikumi-line-end">，</span>决定选择这种类型的频率<span class="mojikumi-line-end">。</span></li>
</ul>
<p>packet scheduling 可以根据 IP datagram header 中的各种信息优先传输或 block 某一类 packet<span class="mojikumi-line-end">。</span><i>Order on Protecting and Promoting an Open Internet</i> (2015) 规定了 net neutrality 的三条原则<span class="mojikumi-line-end">：</span>no blocking<span class="mojikumi-line-end">、</span>no throttling<span class="mojikumi-line-end">、</span>no paid prioritization<span class="mojikumi-line-end">。</span>而 <i>Restoring Internet Freedom Order</i> (2017) 则收回了这些限制<span class="mojikumi-line-end">，</span>而是注重于 ISP transparency<span class="mojikumi-line-end">。</span></p>
<h2 id="the-internet-protocol-ip" class="heading"><a href="#the-internet-protocol-ip" class="heading-anchor" aria-label="章节： The Internet Protocol (IP)" tabindex="-1"></a><span>The Internet Protocol (IP)</span></h2>
<h3 id="ipv4-datagram-format" class="heading"><a href="#ipv4-datagram-format" class="heading-anchor" aria-label="章节： IPv4 Datagram Format" tabindex="-1"></a><span>IPv4 Datagram Format</span></h3>
<p>IPv4 datagram 的格式如下图所示<span class="mojikumi-line-end">：</span><sup><a href="#user-content-fn-fig-4.17" id="user-content-fnref-fig-4.17" data-footnote-ref aria-describedby="footnote-label">1</a></sup></p>
<p><picture><img type="image/webp" srcset="/assets/cnatda-fig-4.17.68bb8fa1.webp" loading="lazy" src="/assets/cnatda-fig-4.17.68bb8fa1.webp" width="757" height="553" alt="IPv4 datagram format"></picture></p>
<ul>
<li>version: 例如 IPv4<span class="mojikumi-line-end">、</span>IPv6</li>
<li>header length: 因为可能有 options<span class="mojikumi-line-end">，</span>header 是不定长的</li>
<li>type of service (TOS): 用来识别各种类型的流量<span class="mojikumi-line-end">，</span>例如 real-time datagram (对延时敏感)<span class="mojikumi-line-end">，</span>其中有 2 个 bit 用于 <a href="/post/2023/06/cnatda-3#network-assisted-explicit-congestion-notification">ECN</a></li>
<li>datagram length: header + data 的长度<span class="mojikumi-line-end">，</span>为放入 Ethernet frame<span class="mojikumi-line-end">，</span>一般不超过 1500 bytes</li>
<li>identifier<span class="mojikumi-line-end">、</span>flags<span class="mojikumi-line-end">、</span>fragmentation offset: 用于 IP fragmentation<span class="mojikumi-line-end">，</span>在 IPv6 中已被弃用</li>
<li>TTL: 为了防止死循环<span class="mojikumi-line-end">，</span>TTL 每经过一个 router 会减一<span class="mojikumi-line-end">，</span>到 0 就会被 drop</li>
<li>protocol: transport-layer protocol<span class="mojikumi-line-end">，</span>用来连接 network layer 和 transport layer</li>
<li>header checksum: 只计算 header 不计算 data<span class="mojikumi-line-end">，</span>使用 ones<span class="mojikumi-narrow-left">’</span> complement sum<span class="mojikumi-line-end">；</span>header 每经过一个 router 都会更新<span class="mojikumi-line-end">，</span>checksum 也要相应地更新</li>
<li>source and destination IP address</li>
<li>options: 由于会影响性能<span class="mojikumi-line-end">，</span>在 IPv6 中已被弃用</li>
<li>data: 一般是 transport-layer segment<span class="mojikumi-line-end">，</span>但也可能是 ICMP message 之类的其他数据</li>
</ul>
<h3 id="ipv4-addressing" class="heading"><a href="#ipv4-addressing" class="heading-anchor" aria-label="章节： IPv4 Addressing" tabindex="-1"></a><span>IPv4 Addressing</span></h3>
<p>一般来说<span class="mojikumi-line-end">，</span>每个 host 有至少一个 interface 来接入网络<span class="mojikumi-line-end">，</span>每个 router 有多个 interface 来与其他 router 或 host 连接<span class="mojikumi-line-end">。</span>每个<span class="mojikumi-line-start">（</span>接入 Internet 而不在 NAT 后的<span class="mojikumi-line-end">）</span>interface 都有一个 IP address<span class="mojikumi-line-end">。</span></p>
<p>多个 host 和 router 之间可以通过 Ethernet switch<span class="mojikumi-line-end">、</span>wireless access point 等方式互相连接<span class="mojikumi-line-end">，</span>构成一个 routerless network<span class="mojikumi-line-end">。</span>在 IP 中<span class="mojikumi-line-end">，</span>这被称作一个 <i>subnet</i><span class="mojikumi-line-end">，</span>即 interface 之间由 link 连接<span class="mojikumi-line-end">、</span>不经过 router 和 host 而构成的连通块<span class="mojikumi-line-end">。</span></p>
<p>一个 subnet 会有一个 subnet address<span class="mojikumi-line-end">，</span>例如 223.1.1.0/24<span class="mojikumi-line-end">，</span>而其中的 IP address 包括 223.1.1.1<span class="mojikumi-line-end">、</span>223.1.1.2<span class="mojikumi-line-end">、</span>223.1.1.3 等<span class="mojikumi-line-end">。</span></p>
<p>Internet 分配 IP address 的方案是 classless interdomain routing (CIDR)<span class="mojikumi-line-end">，</span>其规定了 subnet address 的格式<span class="mojikumi-line-end">，</span>例如 <code>/24</code> 表示前 24 位是这个 subnet 的地址<span class="mojikumi-line-start">（</span>network prefix<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>这个 subnet 中的 IP address 的后 8 位可以取其他值<span class="mojikumi-line-end">。</span>这样的地址分配方案和 router lookup 使用的 longest prefix matching 配合在一起可以减少 lookup table 的表项<span class="mojikumi-line-end">。</span></p>
<p>在 CIDR 之前<span class="mojikumi-line-end">，</span>曾使用过 classful addressing<span class="mojikumi-line-end">，</span>相当于是 mask length 只能是 8<span class="mojikumi-line-end">、</span>16<span class="mojikumi-line-end">、</span>24<span class="mojikumi-line-end">，</span>分别被称作 class A, B, C network<span class="mojikumi-line-end">，</span>这使得不同 class 之间的 address 数量相差过大<span class="mojikumi-line-end">，</span>难以按需选择<span class="mojikumi-line-end">，</span>容易造成浪费<span class="mojikumi-line-end">，</span>最终促成了 classless 的 CIDR<span class="mojikumi-line-end">。</span></p>
<p>longest prefix matching 也使得 address aggregation 成为可能<span class="mojikumi-line-end">：</span>可以在 lookup table 中将多个有 common prefix 的 subnet 合并为一个更大的 subnet address<span class="mojikumi-line-end">，</span>即使这些 subnet 并没有覆盖这个大的 subnet address 中的所有 address<span class="mojikumi-line-end">，</span>没覆盖到的部分还可以由更小的 subnet address<span class="mojikumi-line-start">（</span>更长的 prefix<span class="mojikumi-line-end">）</span>override<span class="mojikumi-line-end">。</span></p>
<p>255.255.255.255 是一个特殊的 IP address<span class="mojikumi-line-end">，</span>表示 broadcast<span class="mojikumi-line-end">，</span>destination address 为 broadcast address 的 datagram 会发送给整个 subnet 内的所有 host<span class="mojikumi-line-end">，</span>还有可能发送给 neighbour<span class="mojikumi-line-end">。</span></p>
<h3 id="obtaining-addresses" class="heading"><a href="#obtaining-addresses" class="heading-anchor" aria-label="章节： Obtaining Addresses" tabindex="-1"></a><span>Obtaining Addresses</span></h3>
<h4 id="obtaining-a-block-of-addresses" class="heading"><a href="#obtaining-a-block-of-addresses" class="heading-anchor" aria-label="章节： Obtaining a Block of Addresses" tabindex="-1"></a><span>Obtaining a Block of Addresses</span></h4>
<p>IP address 由 ICANN 管理<span class="mojikumi-line-end">，</span>ISP 以及 organization 可以从由 ICANN 管理的 Internet registry (Address Supporting Organization) 处获得 IP address block<span class="mojikumi-line-end">。</span></p>
<p>ISP 可以将其拥有的 IP address block 再进行细分来提供给用户<span class="mojikumi-line-end">。</span></p>
<h4 id="obtaining-a-host-address-dhcp" class="heading"><a href="#obtaining-a-host-address-dhcp" class="heading-anchor" aria-label="章节： Obtaining a Host Address: DHCP" tabindex="-1"></a><span>Obtaining a Host Address: DHCP</span></h4>
<p>router 的 IP address 一般是手动<span class="mojikumi-line-start">（</span>半自动<span class="mojikumi-line-end">）</span>配置的<span class="mojikumi-line-end">，</span>而 host 的 IP address 通常是通过 Dynamic Host Configuration Protocol (DHCP) 自动进行的<span class="mojikumi-line-end">。</span></p>
<p>使用 DHCP 能减少手动配置的工作量<span class="mojikumi-line-end">，</span>尤其是在 host 经常移动时<span class="mojikumi-line-start">（</span>例如笔记本电脑在教室和寝室之间移动<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>手动配置几乎是不可能的<span class="mojikumi-line-end">。</span></p>
<p>DHCP 可以给 host 提供一个固定或临时的 IP address<span class="mojikumi-line-end">，</span>除此之外还能提供 subnet mask<span class="mojikumi-line-end">、</span>first-hop router address (default gateway)<span class="mojikumi-line-end">、</span>local DNS server address 等信息<span class="mojikumi-line-end">。</span></p>
<p>每个 subnet 一般都会有至少一个 DHCP server<span class="mojikumi-line-end">，</span>或者一个知道 DHCP server address 的 DHCP relay agent<span class="mojikumi-line-start">（</span>一个 router<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>使用 DHCP 获取 IP address 的步骤如下<span class="mojikumi-line-end">：</span></p>
<ol>
<li>host 发送 DHCP discover message<span class="mojikumi-line-end">：</span>通过 UDP 发送到 255.255.255.255<span class="mojikumi-line-end">、</span>port 67<span class="mojikumi-line-end">，</span>包含一个 transaction ID<span class="mojikumi-line-start">（</span>由于 DHCP 使用 broadcast<span class="mojikumi-line-end">，</span>需要通过 transaction ID 区分不同 host<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>DHCP server 收到 DHCP discover message 后发送 DHCP offer message<span class="mojikumi-line-end">，</span>是一个发送到 port 68 的 broadcast<span class="mojikumi-line-end">，</span>包含 transaction ID<span class="mojikumi-line-end">、</span>proposed IP address<span class="mojikumi-line-end">、</span>IP address lease time<span class="mojikumi-line-start">（</span>proposed IP address 的有效时间<span class="mojikumi-line-end">，</span>一般是几个小时或几天<span class="mojikumi">）</span><span class="mojikumi-line-end">、</span>DHCP server address 等信息<span class="mojikumi-line-end">。</span></li>
<li>host 收到 DHCP offer message 后<span class="mojikumi-line-end">，</span>选择其中一个<span class="mojikumi-line-start">（</span>如果收到了多个<span class="mojikumi-line-end">）</span>发送 DHCP request message<span class="mojikumi-line-end">，</span>包含和 DHCP offer message 类似的信息<span class="mojikumi-line-end">，</span>也是一个 broadcast<span class="mojikumi-line-start">（</span>虽然此时已知 DHCP server address<span class="mojikumi-line-end">，</span>但可能有多个 DHCP server<span class="mojikumi-line-end">，</span>broadcast 可以让其他 server 知道可以取消 address reservation 了<sup><a href="#user-content-fn-dhcp-request-broadcast" id="user-content-fnref-dhcp-request-broadcast" data-footnote-ref aria-describedby="footnote-label">2</a></sup><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>DHCP server 收到 DHCP request message 后回应 DHCP ACK message<span class="mojikumi-line-end">。</span></li>
</ol>
<p><span class="mojikumi-line-start">（</span>实际上<span class="mojikumi-line-end">，</span>DHCP offer 和 ACK 也可能不是 broadcast<span class="mojikumi-line-end">。</span><sup><a href="#user-content-fn-dhcp-offer-ack-broadcast" id="user-content-fnref-dhcp-offer-ack-broadcast" data-footnote-ref aria-describedby="footnote-label">3</a></sup><span class="mojikumi-line-end">）</span></p>
<p>host 收到 DHCP ACK message 后就可以在 lease time 内使用这个 IP address 了<span class="mojikumi-line-end">。</span>DHCP 还提供了延长 lease time 的机制<span class="mojikumi-line-end">。</span></p>
<h3 id="network-address-translation-nat" class="heading"><a href="#network-address-translation-nat" class="heading-anchor" aria-label="章节： Network Address Translation (NAT)" tabindex="-1"></a><span>Network Address Translation (NAT)</span></h3>
<p>subnet 需要一段连续的 IP address<span class="mojikumi-line-end">，</span>如果设备数量增长超过了原来的 IP address block 大小<span class="mojikumi-line-end">，</span>新地址的分配将会变得困难<span class="mojikumi-line-end">。</span>而且<span class="mojikumi-line-end">，</span>每个设备都有一个 globally unique address 对于 IPv4 来说难以承担<span class="mojikumi-line-end">。</span>Network Address Translation (NAT) 可以解决<span class="mojikumi-line-start">（</span>缓解<span class="mojikumi-line-end">）</span>这些问题<span class="mojikumi-line-end">。</span></p>
<p>使用 NAT 时<span class="mojikumi-line-end">，</span>subnet 内使用 IP address space reserved for private network<span class="mojikumi-line-start">（</span>10.0.0.0/8<span class="mojikumi-line-end">、</span>172.16.0.0/12<span class="mojikumi-line-end">、</span>192.168.0.0/16<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>有一个 router 与外界连接并进行 NAT<span class="mojikumi-line-end">，</span>这个 router 对外界表现为 a single device with a single IP address<span class="mojikumi-line-end">，</span>通过 NAT translation table 在 private address + port 和 WAN-side address + port 之间进行转换<span class="mojikumi-line-start">（</span>使用不同的 NAT port 来区分不同的 host 以及 application port<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>这个 router 的 public address 从 ISP<span class="mojikumi-line-start">（</span>可以通过 DHCP<span class="mojikumi-line-end">）</span>获得<span class="mojikumi-line-end">，</span>而它作为 DHCP server 为 subnet 内部提供 private address<span class="mojikumi-line-end">。</span></p>
<p>NAT 一般会改变 port<span class="mojikumi-line-end">，</span>而有时需要使用特定的 port 不能改变<span class="mojikumi-line-end">，</span>可以通过 NAT traversal 来实现<span class="mojikumi-line-end">。</span><span class="heimu"><span class="mojikumi-line-start">（</span>勾起了一些远古的 MC 联机回忆<span class="mojikumi-line-end">，</span>虽然当时并没成功<span class="mojikumi-line-start">（</span></span></p>
<h3 id="ipv6" class="heading"><a href="#ipv6" class="heading-anchor" aria-label="章节： IPv6" tabindex="-1"></a><span>IPv6</span></h3>
<p>为了解决 IPv4 address 即将耗尽的问题<span class="mojikumi-line-end">，</span>IPv6 被研发了出来<span class="mojikumi-line-end">。</span>除了将 IP address 从 32 bits 扩展到 128 bits<span class="mojikumi-line-end">，</span>IPv6 还顺带解决了 IPv4 中的一些其他问题<span class="mojikumi-line-end">。</span></p>
<p>IPv6 datagram 的格式如下图所示<span class="mojikumi-line-end">：</span><sup><a href="#user-content-fn-fig-4.26" id="user-content-fnref-fig-4.26" data-footnote-ref aria-describedby="footnote-label">4</a></sup></p>
<p><picture><img type="image/webp" srcset="/assets/cnatda-fig-4.26.15f4647d.webp" loading="lazy" src="/assets/cnatda-fig-4.26.15f4647d.webp" width="755" height="419" alt="IPv6 datagram format"></picture></p>
<p>IPv6 的主要变化<span class="mojikumi-line-end">：</span></p>
<ul>
<li>在 unicast 和 broadcast 的基础上引入了 anycast<span class="mojikumi-line-end">，</span>即向多个地址之一发送信息<span class="mojikumi-line-end">，</span>例如可以用来向多个有相同内容的 server 发送 anycast 来获取其中最近的一个的 response<span class="mojikumi-line-end">。</span></li>
<li>使用定长 (40 bytes) 的 header<span class="mojikumi-line-end">。</span></li>
<li>引入了 <i>flow label</i> 使得 router 可以对 flow 进行特殊处理<span class="mojikumi-line-end">。</span></li>
<li>删除了 fragmentation 功能以提高性能<span class="mojikumi-line-end">。</span></li>
<li>删除了 checksum<span class="mojikumi-line-end">，</span>因为 transport-layer segment 一般已经有 checksum 了<span class="mojikumi-line-end">，</span>每次修改 TTL 都更新 checksum 也非常耗时<span class="mojikumi-line-end">。</span></li>
<li>删除了 options<span class="mojikumi-line-end">，</span>而 next header 不一定是 transport-layer protocol<span class="mojikumi-line-end">，</span>也可以是 option<span class="mojikumi-line-end">。</span></li>
<li>TOS 改为 traffic class<span class="mojikumi-line-end">，</span>TTL 改为 hop limit<span class="mojikumi-line-end">，</span>datagram length 改为 payload length<span class="mojikumi-line-start">（</span>不含 header length<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>protocol 改为 next header<span class="mojikumi-line-end">。</span></li>
</ul>
<p>network-layer protocol 的改动非常困难<span class="mojikumi-line-end">，</span>IPv4 到 IPv6 的转换至今仍在进行中<span class="mojikumi-line-end">。</span></p>
<p>新的设备<span class="mojikumi-line-start">（</span>router<span class="mojikumi-line-end">）</span>可以同时支持 IPv4 和 IPv6<span class="mojikumi-line-end">，</span>但旧的设备只能支持 IPv4<span class="mojikumi-line-end">，</span>为了使它们共存<span class="mojikumi-line-end">，</span>可以采用 <i>tunneling</i><span class="mojikumi-line-end">，</span>即将 IPv6 datagram 作为 IPv4 的 payload 进行传输<span class="mojikumi-line-end">，</span>两个 IPv6 router 之间的一系列 IPv4 router 被称作 <i>tunnel</i><span class="mojikumi-line-end">。</span></p>
<h3 id="generalized-forwarding-and-sdn" class="heading"><a href="#generalized-forwarding-and-sdn" class="heading-anchor" aria-label="章节： Generalized Forwarding and SDN" tabindex="-1"></a><span>Generalized Forwarding and SDN</span></h3>
<p>generalized forwarding 基于<span class="mojikumi-line-start">“</span>match-plus-action<span class="mojikumi-line-end">”</span>的原则<span class="mojikumi-line-end">，</span>比起 destination-based forwarding<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">“</span>match<span class="mojikumi-line-end">”</span>时可以考虑 IP header 中 destination 以外的其他 field<span class="mojikumi-line-end">，</span>也可以考虑 link-layer header<span class="mojikumi-line-end">、</span>transport-layer header<span class="mojikumi-line-end">、</span>ingress port 等<span class="mojikumi">；</span><wbr><span class="mojikumi-line-start">“</span>action<span class="mojikumi-line-end">”</span>除了 forward 还可以是 drop<span class="mojikumi-line-end">、</span>修改 header field 等<span class="mojikumi-line-end">。</span></p>
<p>OpenFlow 是一个 generalized forwarding 的协议<span class="mojikumi-line-end">，</span>规定了 match 时可以/不能使用哪些 field<span class="mojikumi-line-end">，</span>以及可以采取哪些 action<span class="mojikumi-line-end">。</span>设计一个 flow table<span class="mojikumi-line-end">，</span>就可以实现各种功能<span class="mojikumi-line-end">，</span>例如 forwarding<span class="mojikumi-line-end">、</span>load balancing<span class="mojikumi-line-end">、</span>NAT<span class="mojikumi-line-end">、</span>firewall 等<span class="mojikumi-line-end">。</span></p>
<p>P4 (Programming Protocol-independent Packet Processors) 是一个用来实现 generalized forwarding 的 programming language<span class="mojikumi-line-end">，</span>可以比 flow table 更加灵活<span class="mojikumi-line-end">。</span></p>
<h2 id="middleboxes" class="heading"><a href="#middleboxes" class="heading-anchor" aria-label="章节： Middleboxes" tabindex="-1"></a><span>Middleboxes</span></h2>
<p>在 network 中<span class="mojikumi-line-end">，</span>除了基础的 forwarding<span class="mojikumi-line-end">，</span>还有一些用来实现其他功能的设施<span class="mojikumi-line-end">，</span>称作 <i>middlebox</i><span class="mojikumi-line-end">：</span></p>
<ul>
<li>NAT translation</li>
<li>security services<span class="mojikumi-line-end">，</span>例如 firewall<span class="mojikumi-line-end">、</span>email filter</li>
<li>performance enhancement<span class="mojikumi-line-end">，</span>例如 Web cache<span class="mojikumi-line-end">、</span>load balancing<span class="mojikumi-line-end">、</span>TCP splitter</li>
</ul>
<p>为了降低运营维护的成本<span class="mojikumi-line-end">，</span>有的 middlebox 用软件甚至云服务代替硬件来实现<span class="mojikumi-line-end">，</span>称作 network function virtualization (NFV)<span class="mojikumi-line-end">。</span></p>
<p>middlebox 在一定程度上破坏了 network 的 layered architecture<span class="mojikumi-line-end">：</span>很多 middlebox 位于 network layer<span class="mojikumi-line-end">，</span>却依赖于 transport layer 甚至 application layer 的信息<span class="mojikumi-line-end">。</span>例如 NAT 会修改 IP address 和 port<span class="mojikumi-line-end">，</span>firewall 可能依赖于 application message 的内容<span class="mojikumi-line-end">。</span></p>
<p>Internet architecture 的基本原则是<span class="mojikumi-line-start">“</span>the goal is connectivity, the tool is the Internet Protocol, and the intelligence is end to end rather than hidden in the network<span class="mojikumi">”</span><span class="mojikumi-line-end">。</span><sup><a href="#user-content-fn-rfc-1958" id="user-content-fnref-rfc-1958" data-footnote-ref aria-describedby="footnote-label">5</a></sup>在 network layer 中只有 IP 一个 protocol<span class="mojikumi-line-end">、</span>将 complexity 放在 end system<span class="mojikumi-line-end">，</span>可以简化 network layer 的功能<span class="mojikumi-line-end">，</span>保证 connectivity<span class="mojikumi-line-end">，</span>而 middlebox 在一定程度上破坏了这样的原则<span class="mojikumi-line-end">。</span></p>
<p>尽管在架构上有些不完美<span class="mojikumi-line-end">，</span>但 middlebox 承担着非常重要的功能<span class="mojikumi-line-end">，</span>并不会消亡<span class="mojikumi-line-end">。</span></p>
<section data-footnotes class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-fig-4.17">
<p>p331, Figure 4.17: IPv4 datagram format <a href="#user-content-fnref-fig-4.17" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-dhcp-request-broadcast">
<p><a href="https://networkengineering.stackexchange.com/a/48881">Why is broadcast used at the DHCPREQUEST step? - Network Engineering Stack Exchange</a> <a href="#user-content-fnref-dhcp-request-broadcast" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-dhcp-offer-ack-broadcast">
<p><a href="https://stackoverflow.com/a/10757849">Why are DHCP Offer and Ack broadcasted? - Stack Overflow</a> <a href="#user-content-fnref-dhcp-offer-ack-broadcast" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-fig-4.26">
<p>p349, Figure 4.26: IPv6 datagram format <a href="#user-content-fnref-fig-4.26" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-rfc-1958">
<p><a href="https://datatracker.ietf.org/doc/html/rfc1958#section-2">2. Is there an Internet Architecture? - RFC1958</a> <a href="#user-content-fnref-rfc-1958" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/cnatda">cnatda</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
    </channel>
</rss>