{
    "version": "https://jsonfeed.org/version/1",
    "title": "路漫漫其修远兮，吾将上下而求索",
    "description": "记录编程与学习笔记",
    "home_page_url": "https://yyboom.me",
    "items": [
        {
            "id": "https://yyboom.me/2026/11/12/computer-network-tcp-ip-notes/",
            "url": "https://yyboom.me/2026/11/12/computer-network-tcp-ip-notes/",
            "title": "计算机网络基础笔记：局域网、TCP/IP、HTTPS 与路由原理",
            "date_published": "2026-11-11T16:00:00.000Z",
            "content_html": "<p>计算机网络要解决的是不同设备如何寻址、互联、可靠地交换数据，以及网络故障如何定位的问题。本文根据一次循序渐进的学习讨论，整理家庭局域网、地址与路由、TCP/UDP、DNS/NAT、HTTP/HTTPS、网络分层、VLAN 以及 OSPF/BGP 等知识，重点保留自己的理解与容易混淆的地方，供复习和后续实践使用。</p>\n<h2 id=\"一-从家庭网络理解局域网与互联网\"><a class=\"anchor\" href=\"#一-从家庭网络理解局域网与互联网\">#</a> 一、从家庭网络理解局域网与互联网</h2>\n<h3 id=\"11-lan-wan-和互联网\"><a class=\"anchor\" href=\"#11-lan-wan-和互联网\">#</a> 1.1 LAN、WAN 和互联网</h3>\n<ul>\n<li><strong>局域网（LAN，Local Area Network）</strong>：通常在家庭、办公室、实验室等较小范围内，由一个组织或家庭管理。局域网设备可以在不连接互联网时相互通信。</li>\n<li><strong>广域网（WAN，Wide Area Network）</strong>：连接较大地理范围内的网络，例如不同城市的企业网络或运营商骨干网络。</li>\n<li><strong>互联网（Internet）</strong>：由多个网络通过 IP 协议体系互联组成的全球网络，不是某一台路由器或某一个局域网。</li>\n</ul>\n<p>家庭上网的简化路径：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>手机 / 电脑 ── Wi-Fi 或网线 ── 家庭路由器 ── 运营商网络 ── 互联网 ── 网站服务器</span></span>\n<span class=\"line\"><span>                  │</span></span>\n<span class=\"line\"><span>             家庭局域网（LAN）</span></span></code></pre>\n<p><strong>我的理解：</strong> 家里的设备先加入同一个家庭网络，再通过路由器与外部网络通信。这个基本框架是正确的。需要补充的是，家庭无线路由器往往集成了无线 AP、以太网交换功能、路由和防火墙等功能。</p>\n<h3 id=\"12-交换机-路由器与无线-ap\"><a class=\"anchor\" href=\"#12-交换机-路由器与无线-ap\">#</a> 1.2 交换机、路由器与无线 AP</h3>\n<table>\n<thead>\n<tr>\n<th>设备</th>\n<th>主要关注</th>\n<th>典型作用</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>二层交换机</td>\n<td>MAC 地址、交换机端口</td>\n<td>在同一 VLAN 内转发以太网帧</td>\n</tr>\n<tr>\n<td>路由器</td>\n<td>目的 IP、路由表</td>\n<td>在不同 IP 网络之间转发数据包</td>\n</tr>\n<tr>\n<td>无线 AP</td>\n<td>Wi-Fi 接入与二层帧</td>\n<td>让无线终端接入局域网</td>\n</tr>\n</tbody>\n</table>\n<p>注意：“交换机处于链路层、路由器处于网络层”适用于<strong>典型二层交换机</strong>与路由器。三层交换机也能执行 IP 路由。</p>\n<h2 id=\"二-ip-mac-子网和默认网关\"><a class=\"anchor\" href=\"#二-ip-mac-子网和默认网关\">#</a> 二、IP、MAC、子网和默认网关</h2>\n<h3 id=\"21-ip-地址与-mac-地址的分工\"><a class=\"anchor\" href=\"#21-ip-地址与-mac-地址的分工\">#</a> 2.1 IP 地址与 MAC 地址的分工</h3>\n<ul>\n<li><strong>IP 地址</strong>：用于网络层寻址，例如 <code>192.168.1.10</code>。它告诉网络数据包的源端与目的端在哪里。</li>\n<li><strong>MAC 地址</strong>：用于以太网等链路层的本地帧交付，例如 <code>A4:5E:60:12:34:56</code>。</li>\n<li><strong>端口号</strong>：TCP/UDP 用于区分主机上的网络通信端点，例如 <code>192.168.1.10:50000</code>。</li>\n</ul>\n<p>记忆：<strong>IP 决定发往哪个主机或网络；MAC 决定当前链路这一跳交给谁；端口号帮助找到哪个应用端点。</strong></p>\n<h4 id=\"容易弄错mac-的长度与能否修改\"><a class=\"anchor\" href=\"#容易弄错mac-的长度与能否修改\">#</a> 容易弄错：MAC 的长度与能否修改</h4>\n<p>我的早期理解中，把 MAC 地址说成“16 位”，这是错误的。常见以太网 MAC 地址是 <strong>48 位（6 字节）</strong>，通常用 <strong>12 个十六进制数字</strong>表示。</p>\n<p>典型 MA-L 分配方式是前 24 位组织标识（OUI）、后 24 位由组织分配，但 MAC 地址方案并非都必须按这一种方式理解。MAC 通常具有唯一性，却不是绝对不会重复，也可以被软件随机化或修改。修改对外呈现的 MAC <strong>不等于硬件变成一块新网卡</strong>，更不必然需要烧录固件。</p>\n<h3 id=\"22-子网掩码\"><a class=\"anchor\" href=\"#22-子网掩码\">#</a> 2.2 子网掩码</h3>\n<p>IPv4 地址有 32 位，子网掩码用于区分网络部分与主机部分。</p>\n<p><strong>示例配置（非实测）：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>电脑 A：192.168.1.10/24</span></span>\n<span class=\"line\"><span>电脑 B：192.168.1.20/24</span></span>\n<span class=\"line\"><span>电脑 C：192.168.2.10/24</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/24 = 255.255.255.0</span></span></code></pre>\n<p>网络地址的计算方式：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>网络地址 = IP 地址 按位与 子网掩码</span></span></code></pre>\n<p>A 和 B 的网络地址都是 <code>192.168.1.0</code>，C 的网络地址是 <code>192.168.2.0</code>。在普通网络规划中，A 和 B 可通过同一二层网络直接通信；C 通常需要路由器或三层交换机进行跨子网转发。</p>\n<p><strong>易混点：</strong> 不能永远只看 IP 前三组是否一致。比如 <code>/25</code>、<code>/26</code> 会在同一个 <code>192.168.1.x</code> 范围中划分更小的子网。还要考虑 VLAN、设备隔离和防火墙规则。</p>\n<h3 id=\"23-默认网关\"><a class=\"anchor\" href=\"#23-默认网关\">#</a> 2.3 默认网关</h3>\n<p>默认网关是目标网络没有更具体匹配路由时，设备通常选用的下一跳路由器。</p>\n<p>假设电脑配置：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>IP：192.168.1.10</span></span>\n<span class=\"line\"><span>掩码：255.255.255.0</span></span>\n<span class=\"line\"><span>默认网关：192.168.1.1</span></span></code></pre>\n<p>访问 <code>8.8.8.8</code> 时，电脑发现目的地址不在本地子网，于是按路由表把 IP 包交给 <code>192.168.1.1</code>。</p>\n<p>需要区分两种地址：</p>\n<ul>\n<li><strong>IP 包的目的 IP</strong>：仍然是 <code>8.8.8.8</code>。</li>\n<li><strong>第一跳以太网帧的目的 MAC</strong>：是默认网关对应的 MAC，而不是远端 <code>8.8.8.8</code> 的 MAC。</li>\n</ul>\n<h2 id=\"三-dhcp-与-arp\"><a class=\"anchor\" href=\"#三-dhcp-与-arp\">#</a> 三、DHCP 与 ARP</h2>\n<h3 id=\"31-dhcp自动获取网络参数\"><a class=\"anchor\" href=\"#31-dhcp自动获取网络参数\">#</a> 3.1 DHCP：自动获取网络参数</h3>\n<p>DHCP（动态主机配置协议）通常提供 IP、掩码、默认网关、DNS 等配置。常见首次获取地址的过程简称 DORA：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Discover → Offer → Request → ACK</span></span></code></pre>\n<p><strong>我的理解与修正：</strong> 重新加入同一个网络时，设备可能尝试请求之前使用的 IP；但地址能否继续使用，取决于租约状态、服务器分配策略等，并不是“申请这个 IP 的永久权限”。</p>\n<h3 id=\"32-arp已知-ipv4获取本地下一跳-mac\"><a class=\"anchor\" href=\"#32-arp已知-ipv4获取本地下一跳-mac\">#</a> 3.2 ARP：已知 IPv4，获取本地下一跳 MAC</h3>\n<p>同一二层网络中，如果 A 已经知道 B 的 IPv4 地址，却不知道 MAC，可广播 ARP 请求：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>A：谁拥有 192.168.1.20？</span></span>\n<span class=\"line\"><span>B：我拥有该 IP，我的 MAC 是 BB:BB:BB:BB:BB:BB。</span></span>\n<span class=\"line\"><span>A：将这条 IP → MAC 映射加入 ARP 缓存。</span></span></code></pre>\n<p>ARP 广播的范围是<strong>同一个二层广播域</strong>。访问外部 IP 时，主机通常 ARP 查询<strong>网关</strong>的 MAC，而不是远端服务器的 MAC。</p>\n<h3 id=\"33-arp-欺骗为什么麻烦\"><a class=\"anchor\" href=\"#33-arp-欺骗为什么麻烦\">#</a> 3.3 ARP 欺骗为什么麻烦</h3>\n<p>ARP 欺骗利用传统 ARP 缺乏原生身份认证的特点，发送伪造 ARP 信息使其他设备缓存错误映射。例如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>正确：192.168.1.1 → 路由器真实 MAC</span></span>\n<span class=\"line\"><span>错误：192.168.1.1 → 攻击者 MAC</span></span></code></pre>\n<p>后续发送给网关的二层帧可能被引导至攻击者，造成中间人攻击或网络中断。攻击既可以借助伪造应答，也可能使用免费 ARP，<strong>不限定只有一种报文形式</strong>。</p>\n<p>难以处理的原因在于：清掉缓存只是修复表面状态；如果攻击源持续发送虚假映射，缓存就可能再次被污染。某些设备还缺乏 DAI（动态 ARP 检测）、DHCP Snooping 等防护能力。</p>\n<p>常见防护思路：管理设备接入、限制广播域、在支持的交换机上正确配置 DAI/DHCP Snooping、对固定节点进行适当绑定。MAC 变化不一定是攻击，还可能来自网关切换或设备更换。</p>\n<h2 id=\"四-交换机-mac-表-arp-表与路由表\"><a class=\"anchor\" href=\"#四-交换机-mac-表-arp-表与路由表\">#</a> 四、交换机 MAC 表、ARP 表与路由表</h2>\n<table>\n<thead>\n<tr>\n<th>表</th>\n<th>通常由谁维护</th>\n<th>根据什么查</th>\n<th>得到什么</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>MAC 地址表</td>\n<td>二层交换机</td>\n<td>目的 MAC，结合 VLAN</td>\n<td>出端口</td>\n</tr>\n<tr>\n<td>ARP 缓存表</td>\n<td>IPv4 主机、路由器</td>\n<td>下一跳 IPv4 地址</td>\n<td>下一跳 MAC</td>\n</tr>\n<tr>\n<td>路由表</td>\n<td>主机、路由器、三层交换机</td>\n<td>目的 IP 地址</td>\n<td>下一跳、出接口等</td>\n</tr>\n</tbody>\n</table>\n<p>一个同子网通信的典型过程是：</p>\n<ol>\n<li>主机先通过路由表确定目标属于本地直连网络。</li>\n<li>通过 ARP 缓存或 ARP 请求获得目标 MAC。</li>\n<li>主机封装以太网帧，交换机按 MAC 地址表转发。</li>\n<li>接收端按协议逐层处理数据。</li>\n</ol>\n<p>跨网段通信时，ARP 解析的是<strong>下一跳网关的 MAC</strong>。这也解释了为什么 ARP 欺骗时，路由表本身可能完全正常，但数据仍被送到了错误的二层目的地。</p>\n<h2 id=\"五-tcpip-与-osi-网络分层\"><a class=\"anchor\" href=\"#五-tcpip-与-osi-网络分层\">#</a> 五、TCP/IP 与 OSI 网络分层</h2>\n<table>\n<thead>\n<tr>\n<th>教学五层模型</th>\n<th>主要职责</th>\n<th>示例协议或技术</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>应用层</td>\n<td>应用通信规则</td>\n<td>HTTP、DNS、DHCP、SMTP</td>\n</tr>\n<tr>\n<td>传输层</td>\n<td>进程通信、端口、可靠性机制</td>\n<td>TCP、UDP</td>\n</tr>\n<tr>\n<td>网络层</td>\n<td>IP 寻址、路由、诊断</td>\n<td>IPv4、IPv6、ICMP</td>\n</tr>\n<tr>\n<td>数据链路层</td>\n<td>本地链路帧交付</td>\n<td>以太网、VLAN</td>\n</tr>\n<tr>\n<td>物理层</td>\n<td>电、光、无线信号传输</td>\n<td>网线、光纤、无线介质</td>\n</tr>\n</tbody>\n</table>\n<p>正式的 <strong>TCP/IP 四层模型</strong> 通常将链路层与物理层合并为“网络接口层”；<strong>OSI 七层</strong> 还在应用层以下单列表示层、会话层。实际互联网协议不一定严格一对一对应 OSI 每一层。</p>\n<h3 id=\"51-封装与解封装\"><a class=\"anchor\" href=\"#51-封装与解封装\">#</a> 5.1 封装与解封装</h3>\n<p>以基于 TCP 的 HTTPS 为例，逻辑封装过程是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>应用层 HTTP 请求</span></span>\n<span class=\"line\"><span>       ↓ TLS 加密保护</span></span>\n<span class=\"line\"><span>TCP 首部 + TLS 数据</span></span>\n<span class=\"line\"><span>       ↓</span></span>\n<span class=\"line\"><span>IP 首部 + TCP 报文段</span></span>\n<span class=\"line\"><span>       ↓</span></span>\n<span class=\"line\"><span>以太网帧首部 + IP 数据包 + 帧校验序列</span></span>\n<span class=\"line\"><span>       ↓</span></span>\n<span class=\"line\"><span>电信号 / 光信号 / 无线信号</span></span></code></pre>\n<p>接收方按反方向逐层处理，即解封装。路由器转发时通常重新封装链路层帧、递减 IPv4 TTL；如果不存在 NAT 等额外处理，普通转发不会自动改变源、目的 IP。</p>\n<h2 id=\"六-tcp-与-udp\"><a class=\"anchor\" href=\"#六-tcp-与-udp\">#</a> 六、TCP 与 UDP</h2>\n<h3 id=\"61-tcp面向连接的可靠字节流\"><a class=\"anchor\" href=\"#61-tcp面向连接的可靠字节流\">#</a> 6.1 TCP：面向连接的可靠字节流</h3>\n<p>TCP 的主要能力：建立连接、按序交付、确认与重传、滑动窗口、流量控制、拥塞控制。</p>\n<p><strong>三次握手（简化）：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>客户端                       服务器</span></span>\n<span class=\"line\"><span>  SYN       ───────────────→</span></span>\n<span class=\"line\"><span>            ←─────────────── SYN + ACK</span></span>\n<span class=\"line\"><span>  ACK       ───────────────→</span></span>\n<span class=\"line\"><span>          建立连接</span></span></code></pre>\n<p><strong>典型四次挥手（简化）：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>主动关闭方                   被动关闭方</span></span>\n<span class=\"line\"><span>  FIN       ───────────────→</span></span>\n<span class=\"line\"><span>            ←─────────────── ACK</span></span>\n<span class=\"line\"><span>            ←─────────────── FIN</span></span>\n<span class=\"line\"><span>  ACK       ───────────────→</span></span></code></pre>\n<p>TCP 是全双工的，两个方向的关闭可以分开进行。在一些情况下，最后的 ACK 与 FIN 报文也可合并，因此“四次挥手”是典型过程，不是所有连接都严格呈现四个独立报文。</p>\n<p><strong>TCP 是字节流</strong>：调用两次 <code>send()</code>，接收端不一定对应两次 <code>recv()</code>，应用需要自行定义消息边界。</p>\n<h3 id=\"62-udp无连接的数据报\"><a class=\"anchor\" href=\"#62-udp无连接的数据报\">#</a> 6.2 UDP：无连接的数据报</h3>\n<p>UDP 不需要 TCP 式的三次握手，默认不保证可靠到达和顺序，保留数据报边界，首部仅 8 字节。</p>\n<p>“无连接”不等于“只要知道 MAC 和 IP 即可发送”。UDP 仍然依赖 IP 寻址、链路层传输，并使用源端口与目的端口。UDP 上层也可以自行设计可靠传输机制，QUIC 就是一个典型例子。</p>\n<table>\n<thead>\n<tr>\n<th>比较</th>\n<th>TCP</th>\n<th>UDP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>连接</td>\n<td>面向连接</td>\n<td>无连接</td>\n</tr>\n<tr>\n<td>数据单位</td>\n<td>字节流</td>\n<td>数据报</td>\n</tr>\n<tr>\n<td>可靠和按序交付</td>\n<td>协议内置</td>\n<td>不保证</td>\n</tr>\n<tr>\n<td>首部</td>\n<td>最小 20 字节</td>\n<td>8 字节</td>\n</tr>\n<tr>\n<td>常见用途</td>\n<td>文件传输、数据库、Web</td>\n<td>实时音视频、游戏、部分 DNS</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"63-滑动窗口-流量控制与拥塞控制\"><a class=\"anchor\" href=\"#63-滑动窗口-流量控制与拥塞控制\">#</a> 6.3 滑动窗口、流量控制与拥塞控制</h3>\n<p><strong>滑动窗口</strong>：让发送方能维持多个未确认的字节，不必逐个数据段停止等待。TCP 的 ACK 确认号通常表示下一个期望按序收到的<strong>字节序列号</strong>，不是“第几个包”。</p>\n<ul>\n<li><strong>流量控制</strong>：主要保护接收端，接收方通告 <code>rwnd</code>（接收窗口）。</li>\n<li><strong>拥塞控制</strong>：主要根据网络反馈控制在途数据量，发送方维护 <code>cwnd</code>（拥塞窗口）。</li>\n</ul>\n<p>简化关系：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>可容纳的最大在途数据量 ≤ min(rwnd, cwnd)</span></span></code></pre>\n<p>如果已有数据未确认，还能继续发送的新数据量会进一步减少。经典拥塞控制包括慢启动和拥塞避免，但现代系统可能使用 CUBIC、BBR 等不同算法。</p>\n<h2 id=\"七-ip-数据包-ttl-mtu-和-ipv6\"><a class=\"anchor\" href=\"#七-ip-数据包-ttl-mtu-和-ipv6\">#</a> 七、IP 数据包、TTL、MTU 和 IPv6</h2>\n<h3 id=\"71-ipv4-数据包\"><a class=\"anchor\" href=\"#71-ipv4-数据包\">#</a> 7.1 IPv4 数据包</h3>\n<p>IPv4 数据包由首部与载荷组成。基本首部 20 字节，存在选项时可更长。重要字段有：</p>\n<table>\n<thead>\n<tr>\n<th>字段</th>\n<th>作用</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>源 IP / 目的 IP</td>\n<td>寻址与转发</td>\n</tr>\n<tr>\n<td>TTL</td>\n<td>限制逐跳转发次数</td>\n</tr>\n<tr>\n<td>Protocol</td>\n<td>标识上层协议</td>\n</tr>\n<tr>\n<td>Total Length</td>\n<td>整个 IPv4 数据包长度</td>\n</tr>\n<tr>\n<td>Identification / Flags / Fragment Offset</td>\n<td>IPv4 分片控制与重组</td>\n</tr>\n<tr>\n<td>Header Checksum</td>\n<td>IPv4 首部校验</td>\n</tr>\n</tbody>\n</table>\n<p>常见 IPv4 <code>Protocol</code> 数值：ICMP = <code>1</code>、TCP = <code>6</code>、UDP = <code>17</code>、OSPF = <code>89</code>。</p>\n<h3 id=\"72-ttl防止无限路由环路\"><a class=\"anchor\" href=\"#72-ttl防止无限路由环路\">#</a> 7.2 TTL：防止无限路由环路</h3>\n<p>TTL（Time To Live）虽然名字有“时间”，但在现代 IPv4 转发中实际主要充当跳数限制。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>发送端：TTL = 64</span></span>\n<span class=\"line\"><span>经过第一台路由器：TTL = 63</span></span>\n<span class=\"line\"><span>经过第二台路由器：TTL = 62</span></span>\n<span class=\"line\"><span>……</span></span></code></pre>\n<p>TTL 耗尽时，路由器丢弃数据包，通常发送 ICMP Time Exceeded。Windows 的 <code>tracert</code> 就利用逐渐增加的 TTL 探测沿途部分路由节点。</p>\n<h3 id=\"73-mtu-与分片\"><a class=\"anchor\" href=\"#73-mtu-与分片\">#</a> 7.3 MTU 与分片</h3>\n<p>MTU（Maximum Transmission Unit）表示链路所能承载的最大网络层数据包大小。普通以太网常用 MTU 为 1500 字节。</p>\n<p>当 IPv4 数据包超过下一跳 MTU 时：</p>\n<ul>\n<li><strong>允许分片</strong>：可能被拆成多个 IP 分片，接收端负责重组。</li>\n<li><strong>DF（Don't Fragment）置位</strong>：不能被中间路由器分片，通常丢弃并返回 ICMP 错误。</li>\n</ul>\n<p>分片增加额外首部开销；某片丢失还可能导致原数据报无法重组，因此网络通常会尽量避免不必要的分片。</p>\n<h3 id=\"74-ipv4-与-ipv6\"><a class=\"anchor\" href=\"#74-ipv4-与-ipv6\">#</a> 7.4 IPv4 与 IPv6</h3>\n<table>\n<thead>\n<tr>\n<th>项目</th>\n<th>IPv4</th>\n<th>IPv6</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>地址长度</td>\n<td>32 位</td>\n<td>128 位</td>\n</tr>\n<tr>\n<td>示例</td>\n<td><code>192.168.1.10</code></td>\n<td><code>2001:db8:1234::10</code></td>\n</tr>\n<tr>\n<td>基本首部</td>\n<td>最小 20 字节</td>\n<td>固定 40 字节</td>\n</tr>\n<tr>\n<td>地址解析</td>\n<td>ARP</td>\n<td>基于 ICMPv6 的 NDP</td>\n</tr>\n<tr>\n<td>跳数限制</td>\n<td>TTL</td>\n<td>Hop Limit</td>\n</tr>\n<tr>\n<td>中间路由器分片</td>\n<td>条件允许时支持</td>\n<td>不执行分片</td>\n</tr>\n<tr>\n<td>广播</td>\n<td>支持</td>\n<td>不使用广播</td>\n</tr>\n</tbody>\n</table>\n<p>IPv6 地址空间更大，一般无需像家用 IPv4 一样依靠 NAPT 共享公网地址；但仍需要防火墙，且某些场景仍会使用 NAT64 等转换技术。</p>\n<h2 id=\"八-icmp-ping-与-tracert\"><a class=\"anchor\" href=\"#八-icmp-ping-与-tracert\">#</a> 八、ICMP、ping 与 tracert</h2>\n<p>ICMP 主要用于 IP 网络中的错误报告与诊断，<strong>不是</strong> TCP 或 UDP 的一个端口服务。</p>\n<ul>\n<li><code>ping</code> 通常通过 ICMP Echo Request / Echo Reply 测试可达性，并测量 RTT（往返时间）。</li>\n<li><code>tracert</code> 利用不同 TTL 对中间路由器进行逐跳探测。</li>\n</ul>\n<p><strong>示例命令（未在本文执行，不代表实测结果）：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-powershell\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ping </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">192.168</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1.1</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ping </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">tracert </span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">d </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span></span></code></pre>\n<h3 id=\"81-8888-为什么可以-ping-通\"><a class=\"anchor\" href=\"#81-8888-为什么可以-ping-通\">#</a> 8.1 8.8.8.8 为什么可以 ping 通</h3>\n<p><code>8.8.8.8</code> 是 Google Public DNS 提供服务的公网 IPv4 地址。电脑不需要与该地址处于同一子网；经默认网关、运营商网络及互联网路由转发，就可以到达提供该地址服务的网络节点。</p>\n<p>能 ping 通只表示 ICMP 探测收到了响应，<strong>不表示当前一定在使用 Google DNS，也不代表 DNS、HTTPS 等所有业务都正常</strong>。Google 公共 DNS 使用 Anycast 等机制部署，不能简单理解为全世界都在 ping 同一台物理计算机。</p>\n<p><code>tracert</code> 某一跳出现 <code>* * *</code> 也不必然意味着故障：路由器可能限制 ICMP 回复，但仍正常转发业务数据。</p>\n<h2 id=\"九-dns-与-nat\"><a class=\"anchor\" href=\"#九-dns-与-nat\">#</a> 九、DNS 与 NAT</h2>\n<h3 id=\"91-dns域名解析\"><a class=\"anchor\" href=\"#91-dns域名解析\">#</a> 9.1 DNS：域名解析</h3>\n<p>DNS（Domain Name System）用于查询域名对应的记录，例如 A（IPv4）、AAAA（IPv6）、CNAME（别名）、MX（邮件服务器）、NS（权威名称服务器）等。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>www.example.com ── DNS 查询 ──→ 对应的 IP 地址记录</span></span></code></pre>\n<p>递归解析器可能直接命中缓存，也可能依次联系根服务器、顶级域服务器和权威服务器。DNS 可以使用 UDP、TCP，以及 DoH/DoT 等加密传输方案。</p>\n<h3 id=\"92-nat地址转换\"><a class=\"anchor\" href=\"#92-nat地址转换\">#</a> 9.2 NAT：地址转换</h3>\n<p>NAT（Network Address Translation）改变数据包中的网络地址。家庭 IPv4 网络常见的是 NAPT/PAT，会利用端口映射让多个私有地址设备共享一个公网 IPv4 地址。</p>\n<p><strong>示例映射（非实测）：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>192.168.1.10:50001 ──→ 公网 IP:40001</span></span>\n<span class=\"line\"><span>192.168.1.20:50002 ──→ 公网 IP:40002</span></span></code></pre>\n<p>路由器记录转换关系，以便把返回数据送回正确的内部终端。NAT 不等于防火墙；外部能否主动访问内部设备，还与 NAT 映射、端口转发、防火墙策略等有关。</p>\n<p><strong>容易混淆：DNS 解决“域名查 IP”；NAT 解决“地址和端口如何转换”。</strong></p>\n<h2 id=\"十-http-https-cookie-session-与-token\"><a class=\"anchor\" href=\"#十-http-https-cookie-session-与-token\">#</a> 十、HTTP、HTTPS、Cookie、Session 与 Token</h2>\n<h3 id=\"101-http请求与响应\"><a class=\"anchor\" href=\"#101-http请求与响应\">#</a> 10.1 HTTP：请求与响应</h3>\n<p>HTTP 是应用层协议，定义客户端向服务器发送请求、服务器返回响应的规则。</p>\n<p><strong>示例 HTTP 请求（非抓包结果）：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-http\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">GET</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> /index.html </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">HTTP</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1.1</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">Host:</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> example.com</span></span></code></pre>\n<p>常见方法有 GET、POST、PUT、PATCH、DELETE。常见状态码：</p>\n<table>\n<thead>\n<tr>\n<th>状态码</th>\n<th>含义</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>成功</td>\n</tr>\n<tr>\n<td>301</td>\n<td>永久重定向</td>\n</tr>\n<tr>\n<td>400</td>\n<td>请求错误</td>\n</tr>\n<tr>\n<td>401</td>\n<td>未通过认证</td>\n</tr>\n<tr>\n<td>403</td>\n<td>拒绝访问</td>\n</tr>\n<tr>\n<td>404</td>\n<td>资源不存在</td>\n</tr>\n<tr>\n<td>500</td>\n<td>服务端内部错误</td>\n</tr>\n<tr>\n<td>502</td>\n<td>网关收到无效上游响应</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"102-https用-tls-保护-http\"><a class=\"anchor\" href=\"#102-https用-tls-保护-http\">#</a> 10.2 HTTPS：用 TLS 保护 HTTP</h3>\n<p>HTTP 本身不提供传输加密和服务器身份认证。HTTPS 通过 TLS 提供通信机密性、完整性保护及证书身份验证。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>HTTP/1.1 或 HTTP/2</span></span>\n<span class=\"line\"><span>       ↓</span></span>\n<span class=\"line\"><span>      TLS</span></span>\n<span class=\"line\"><span>       ↓</span></span>\n<span class=\"line\"><span>      TCP</span></span>\n<span class=\"line\"><span>       ↓</span></span>\n<span class=\"line\"><span>       IP</span></span></code></pre>\n<p>HTTP/3 是重要例外：它通过基于 UDP 的 QUIC 传输，并集成 TLS 1.3 握手机制。</p>\n<p>数字证书通常包含域名、公钥、有效期和签名等信息；浏览器通过可信 CA 链及域名检查来验证服务器身份。<strong>HTTPS 不能证明网站内容本身值得信任</strong>。</p>\n<h3 id=\"103-http-无状态与会话维持\"><a class=\"anchor\" href=\"#103-http-无状态与会话维持\">#</a> 10.3 HTTP 无状态与会话维持</h3>\n<p>HTTP 本身不会自动保存跨请求的用户登录身份，网站通常借助额外的会话或凭证机制。</p>\n<table>\n<thead>\n<tr>\n<th>概念</th>\n<th>本质</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Cookie</td>\n<td>浏览器保存并按规则携带的数据</td>\n</tr>\n<tr>\n<td>Session</td>\n<td>服务端或应用维护的会话状态</td>\n</tr>\n<tr>\n<td>Token</td>\n<td>可供服务器验证的凭证</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>一种结构化令牌格式，通常可通过签名验证</td>\n</tr>\n</tbody>\n</table>\n<p>典型 Cookie + Session 流程：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>用户登录 → 服务端验证 → 创建会话</span></span>\n<span class=\"line\"><span>       → 浏览器保存 Session ID Cookie</span></span>\n<span class=\"line\"><span>       → 后续请求携带 Cookie</span></span>\n<span class=\"line\"><span>       → 服务端根据 Session ID 查询会话</span></span></code></pre>\n<p>Token 也可以放在 Cookie 中，不是只能放在 HTTP <code>Authorization</code> 头。普通签名 JWT 的 Payload <strong>不是加密数据</strong>，不要在其中直接放密码、密钥等敏感信息。</p>\n<h2 id=\"十一-vlan-trunk-与-stp\"><a class=\"anchor\" href=\"#十一-vlan-trunk-与-stp\">#</a> 十一、VLAN、Trunk 与 STP</h2>\n<h3 id=\"111-vlan划分二层广播域\"><a class=\"anchor\" href=\"#111-vlan划分二层广播域\">#</a> 11.1 VLAN：划分二层广播域</h3>\n<p>VLAN（虚拟局域网）使同一套物理交换设备能够划分不同二层广播域。例如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>VLAN 10 → 研发部门 → 192.168.10.0/24</span></span>\n<span class=\"line\"><span>VLAN 20 → 财务部门 → 192.168.20.0/24</span></span>\n<span class=\"line\"><span>VLAN 30 → 访客网络 → 192.168.30.0/24</span></span></code></pre>\n<p>一个 VLAN 配一个 IP 子网是常见设计，<strong>但 VLAN 与子网不是同一个概念，也不强制严格一一对应</strong>。</p>\n<p>即使两台电脑都配置 <code>192.168.1.x/24</code>，如果它们位于隔离的 VLAN，也不能仅靠普通二层广播和 ARP 直接互通。不同 VLAN 间通信通常需要三层交换机或路由器，并受到 ACL/防火墙等策略约束。</p>\n<h3 id=\"112-access-和-trunk\"><a class=\"anchor\" href=\"#112-access-和-trunk\">#</a> 11.2 Access 和 Trunk</h3>\n<ul>\n<li><strong>Access 端口</strong>：典型情况下连接普通终端，收发不带 VLAN 标签的帧。</li>\n<li><strong>Trunk 端口</strong>：通常在网络设备之间携带多个 VLAN，可借助 IEEE 802.1Q 标签区分。</li>\n</ul>\n<p>VLAN 不是加密机制，它只能隔离二层广播域，不能单独替代防火墙。</p>\n<h3 id=\"113-stp避免二层交换环路\"><a class=\"anchor\" href=\"#113-stp避免二层交换环路\">#</a> 11.3 STP：避免二层交换环路</h3>\n<p>STP（生成树协议）通过逻辑阻塞部分冗余链路，避免二层环路及广播风暴。以太网二层广播帧不像 IPv4 包那样依靠 TTL 终止，因此交换环路需要特别处理。</p>\n<h2 id=\"十二-静态路由-动态路由-ospf-与-bgp\"><a class=\"anchor\" href=\"#十二-静态路由-动态路由-ospf-与-bgp\">#</a> 十二、静态路由、动态路由、OSPF 与 BGP</h2>\n<h3 id=\"121-路由表与路由协议\"><a class=\"anchor\" href=\"#121-路由表与路由协议\">#</a> 12.1 路由表与路由协议</h3>\n<ul>\n<li><strong>路由表/转发表</strong>：用于实际选择目的网络的下一跳和出接口。</li>\n<li><strong>路由协议</strong>：帮助设备交换可达性信息、计算并维护路由。</li>\n</ul>\n<p>家庭路由器常通过默认路由将未知外部目的地的流量交给运营商，不需要持有互联网全量路由信息。</p>\n<h3 id=\"122-静态路由与动态路由\"><a class=\"anchor\" href=\"#122-静态路由与动态路由\">#</a> 12.2 静态路由与动态路由</h3>\n<table>\n<thead>\n<tr>\n<th>项目</th>\n<th>静态路由</th>\n<th>动态路由</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>配置来源</td>\n<td>管理员手工设置</td>\n<td>协议自动学习</td>\n</tr>\n<tr>\n<td>适用范围</td>\n<td>小型、稳定网络</td>\n<td>网络规模较大、拓扑变化较多</td>\n</tr>\n<tr>\n<td>链路变化</td>\n<td>通常需额外处理</td>\n<td>协议可重新收敛</td>\n</tr>\n<tr>\n<td>开销</td>\n<td>通常较低</td>\n<td>需要交换控制信息与计算</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"123-ospf自治系统内部的链路状态路由\"><a class=\"anchor\" href=\"#123-ospf自治系统内部的链路状态路由\">#</a> 12.3 OSPF：自治系统内部的链路状态路由</h3>\n<p>OSPF 通过 Hello 维护邻居关系、交换 LSA 链路状态通告、维护 LSDB，并通过 SPF（最短路径优先）算法根据 Cost 计算路径。这里“最短”是<strong>协议度量开销较小</strong>，不一定表示地理距离短。</p>\n<p>OSPF 直接封装在 IP 中，协议号为 <code>89</code>，不通过 TCP/UDP 端口。</p>\n<h3 id=\"124-bgp自治系统之间的路由策略\"><a class=\"anchor\" href=\"#124-bgp自治系统之间的路由策略\">#</a> 12.4 BGP：自治系统之间的路由策略</h3>\n<p>BGP 是路径向量路由协议，广泛用于自治系统（AS）之间交换网络前缀可达性信息，也存在 iBGP 在 AS 内传播 BGP 路由的场景。</p>\n<p>BGP 根据本地策略及路由属性选路，<code>AS_PATH</code> 是其中一个重要属性，但<strong>BGP 不保证总选择 AS_PATH 最短的路线</strong>。BGP 使用 TCP 端口 <code>179</code>。</p>\n<table>\n<thead>\n<tr>\n<th>项目</th>\n<th>OSPF</th>\n<th>BGP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>典型用途</td>\n<td>AS 内部路由</td>\n<td>AS 之间路由交换与策略控制</td>\n</tr>\n<tr>\n<td>协议类别</td>\n<td>链路状态</td>\n<td>路径向量</td>\n</tr>\n<tr>\n<td>主要依据</td>\n<td>链路状态、Cost</td>\n<td>策略和路由属性</td>\n</tr>\n<tr>\n<td>传输</td>\n<td>IP 协议号 89</td>\n<td>TCP 179</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"十三-一次-https-访问如何串起全部知识\"><a class=\"anchor\" href=\"#十三-一次-https-访问如何串起全部知识\">#</a> 十三、一次 HTTPS 访问如何串起全部知识</h2>\n<p>假设电脑已经通过 DHCP 得到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>IPv4：192.168.1.10/24</span></span>\n<span class=\"line\"><span>默认网关：192.168.1.1</span></span></code></pre>\n<p>访问 <code>https://www.example.com</code> 时，可以从逻辑上理解为：</p>\n<ol>\n<li><strong>DNS</strong> 查询域名对应的 IP（或命中缓存）。</li>\n<li><strong>路由表</strong> 选择目标 IP 的下一跳，通常是默认网关。</li>\n<li><strong>ARP</strong> 取得本地下一跳 MAC（如果缓存中没有）。</li>\n<li><strong>TCP</strong> 建立连接（这里以基于 TCP 的 HTTPS 为例）。</li>\n<li><strong>TLS</strong> 进行密钥协商和服务器身份验证。</li>\n<li><strong>HTTP</strong> 生成请求，经 TLS、TCP、IP、链路层逐层封装后发送。</li>\n<li>家庭路由器转发并可能执行 <strong>NAT/PAT</strong>；互联网中的路由器继续按目的 IP 转发。</li>\n<li>服务器处理请求并返回响应；客户端逐层解封装、解密并显示网页。</li>\n</ol>\n<p>这不是严格单线发生的时间顺序：<strong>DNS 请求、TCP 握手、TLS 握手本身也都要依靠 IP 和链路层传输，NAT 发生于相应的数据包经过网关时</strong>。</p>\n<h2 id=\"十四-windows-网络命令备忘\"><a class=\"anchor\" href=\"#十四-windows-网络命令备忘\">#</a> 十四、Windows 网络命令备忘</h2>\n<p>以下命令仅为学习和排查用例，<strong>不是本次学习中提供的实际运行记录</strong>。其中示例网关应按实际网络配置修改。</p>\n<p><strong>命令：查看本机配置及缓存</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-powershell\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ipconfig </span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">all</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">arp </span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">a</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">route print </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">-4</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">getmac </span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">v</span></span></code></pre>\n<p><strong>命令：测试连通性与路由路径</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-powershell\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ping </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">127.0</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0.1</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ping </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">192.168</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1.1</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ping </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">tracert </span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">d </span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span></span></code></pre>\n<p><strong>命令：查看 DNS 与连接</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-powershell\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">nslookup </span><span style=\"color:#998418;--shiki-dark:#B8A965\">www.baidu.com</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">nslookup </span><span style=\"color:#998418;--shiki-dark:#B8A965\">www.baidu.com</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 8.8</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8.8</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">netstat </span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ano</span></span></code></pre>\n<p>排查时可以从本机配置、到网关、到外部 IP、DNS、TCP/HTTPS 应用逐步定位。需要注意：ping 被拦截、tracert 不回复中间节点，都不等于实际数据业务一定中断。</p>\n<h2 id=\"十五-易混点速查\"><a class=\"anchor\" href=\"#十五-易混点速查\">#</a> 十五、易混点速查</h2>\n<table>\n<thead>\n<tr>\n<th>易混之处</th>\n<th>正确记法</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>同一个局域网 = 互联网</td>\n<td>错，LAN 内通信可以独立于互联网</td>\n</tr>\n<tr>\n<td>MAC 地址 16 位</td>\n<td>错，常见以太网 MAC 是 48 位</td>\n</tr>\n<tr>\n<td>修改 MAC = 换了一块网卡</td>\n<td>错，软件修改不改变网卡硬件</td>\n</tr>\n<tr>\n<td>DHCP 重新连接一定分配原 IP</td>\n<td>错，取决于租约和服务器策略</td>\n</tr>\n<tr>\n<td>同一子网 IP 就一定能通信</td>\n<td>不一定，还要有二层连通性与允许的访问策略</td>\n</tr>\n<tr>\n<td>ARP 可以查询远端公网服务器 MAC</td>\n<td>通常不会，先查询本地下一跳 MAC</td>\n</tr>\n<tr>\n<td>UDP 无连接 = 不需要端口</td>\n<td>错，UDP 同样使用端口号</td>\n</tr>\n<tr>\n<td>MAC 表 = ARP 表 = 路由表</td>\n<td>三者分别解决端口、地址映射、路由下一跳</td>\n</tr>\n<tr>\n<td>ping 通 8.8.8.8 = DNS 正常</td>\n<td>错，ping 主要测试 ICMP 连通性</td>\n</tr>\n<tr>\n<td>TCP 流量控制 = 拥塞控制</td>\n<td>前者关注接收方，后者关注网络</td>\n</tr>\n<tr>\n<td>HTTPS = 网站一定安全</td>\n<td>错，TLS 保护通信并验证连接身份，不保证内容可信</td>\n</tr>\n<tr>\n<td>VLAN = 子网</td>\n<td>错，VLAN 在二层，IP 子网在三层</td>\n</tr>\n<tr>\n<td>BGP 总选最短 AS_PATH</td>\n<td>错，选路受策略和多种路由属性影响</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"十六-总结与后续练习\"><a class=\"anchor\" href=\"#十六-总结与后续练习\">#</a> 十六、总结与后续练习</h2>\n<p>目前已经建立起一条比较完整的理解链条：<strong>DHCP 提供网络配置 → DNS 解析域名 → 路由表决定下一跳 → ARP 获得链路层地址 → 交换机按 MAC 转发 → IP 跨网转发 → TCP/UDP 提供进程间传输 → HTTP/HTTPS 等应用协议交换数据</strong>。</p>\n<p>本文以概念学习和命令示例为主，尚未提供 Wireshark 抓包、路由器配置截图或真实故障排查结果，不能把上述示例当成实测结论。适合下一阶段动手验证的内容有：</p>\n<ol>\n<li>使用 Wireshark 观察 ARP 请求应答、DNS 解析、TCP 三次握手。</li>\n<li>对照 <code>arp -a</code>、<code>route print -4</code> 和 <code>ipconfig /all</code>，解释一条实际上网连接的下一跳。</li>\n<li>在可控实验网络中配置两个 VLAN，观察跨 VLAN 通信与三层路由。</li>\n<li>阅读一次 <code>tracert</code> 输出，区分“节点不回复 ICMP”和“路由转发真的失败”。</li>\n</ol>\n<p><strong>最终记忆：MAC 解决当前链路的交付，IP 解决跨网络的寻址与转发，TCP/UDP 解决应用进程间的数据传输；其余协议和机制围绕地址分配、解析、安全、管理及路径维护相互配合。</strong></p>\n",
            "tags": [
                "计算机网络",
                "TCP/IP",
                "网络基础",
                "网络协议"
            ]
        },
        {
            "id": "https://yyboom.me/2026/11/10/servlet-notes/",
            "url": "https://yyboom.me/2026/11/10/servlet-notes/",
            "title": "Servlet 学习笔记",
            "date_published": "2026-11-10T16:00:00.000Z",
            "content_html": "<h2 id=\"servletserver-applet\"><a class=\"anchor\" href=\"#servletserver-applet\">#</a> Servlet（Server Applet）：</h2>\n<p>java编写的服务端程序，主要功能用于交互式浏览和修改数据。狭义的Servlet是指Java语言实现的一个接口，广义的Servlet是指任何实现了这个Servlet接口的类，一般情况下，人们将Servlet理解为后者。Servlet可以响应任何类型的请求,但是大多数情况只用于扩展基于Http协议的服务器。</p>\n<blockquote>\n<p>目前的Servlet已经内嵌在tomocat中</p>\n</blockquote>\n<h2 id=\"servlet-工作模式\"><a class=\"anchor\" href=\"#servlet-工作模式\">#</a> Servlet 工作模式：</h2>\n<ol>\n<li>客户端发送请求至服务器</li>\n<li>服务器启动并调用Servlet,Servlet根据客户请求生成响应内容传回服务器</li>\n<li>服务器将响应返回给客户端</li>\n</ol>\n<h2 id=\"servlet-api\"><a class=\"anchor\" href=\"#servlet-api\">#</a> Servlet Api：</h2>\n<pre><code>Servlet API 包含以下4个Java包：\n</code></pre>\n<ol>\n<li>\n<p>javax.servlet   其中包含定义servlet和servlet容器之间契约的类和接口。</p>\n</li>\n<li>\n<p>javax.servlet.http   其中包含定义HTTP Servlet 和Servlet容器之间的关系。</p>\n</li>\n<li>\n<p>javax.servlet.annotation   其中包含标注servlet，Filter,Listener的标注。它还为被标注元件定义元数据。</p>\n</li>\n<li>\n<p>javax.servlet.descriptor，其中包含提供程序化登录Web应用程序的配置信息的类型。</p>\n</li>\n</ol>\n<h2 id=\"servlet-工作原理\"><a class=\"anchor\" href=\"#servlet-工作原理\">#</a> Servlet 工作原理：</h2>\n<p>Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是：Servlet容器将Servlet类载入内存，并产生Servlet实例和调用它具体的方法。但是要注意的是，在一个应用程序中，每种Servlet类型只能有一个实例。</p>\n<p>用户请求致使Servlet容器调用Servlet的Service（）方法，并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器（例如TomCat）封装好的，并不需要程序员去实现，程序员可以直接使用这两个对象。</p>\n<p>ServletRequest中封装了当前的Http请求，因此，开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应，程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。</p>\n<p>对于每一个应用程序，<strong>Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文（应用程序）的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。</strong></p>\n",
            "tags": [
                "Java",
                "Servlet"
            ]
        },
        {
            "id": "https://yyboom.me/2026/03/31/JWT%E4%BB%A4%E7%89%8C/",
            "url": "https://yyboom.me/2026/03/31/JWT%E4%BB%A4%E7%89%8C/",
            "title": "JWT令牌",
            "date_published": "2026-03-31T10:21:58.000Z",
            "content_html": "<h1 id=\"jwt令牌\"><a class=\"anchor\" href=\"#jwt令牌\">#</a> JWT令牌</h1>\n<h2 id=\"1简述\"><a class=\"anchor\" href=\"#1简述\">#</a> 1.简述</h2>\n<p>JWT全称为JSON Web Token，是一种用于身份验证的开放标准。它是一个基于JSON格式的安全令牌，主要用于在网络上传输声明或者用户身份信息。JWT通常被用作API的认证方式，以及跨域身份验证。</p>\n<p>JWT令牌由三部分组成，分别是头部（Header）、载荷（Payload）和签名（Signature）。头部包含了令牌使用的加密算法信息，载荷包含了所需传输的用户信息，签名用于保证令牌的完整性和真实性，防止令牌被篡改。</p>\n<h2 id=\"2jwt特点\"><a class=\"anchor\" href=\"#2jwt特点\">#</a> 2.JWT特点</h2>\n<ul>\n<li>可以跨语言、跨平台使用，因为它是基于JSON标准的。</li>\n<li>可以直接嵌入到HTTP请求头中，方便传输和验证。</li>\n<li>令牌的有效期可以通过设置过期时间来进行控制，提高了安全性。</li>\n<li>由于令牌中包含了用户信息，因此可以避免频繁查询数据库的情况出现，提高了系统的性能。</li>\n</ul>\n<h2 id=\"3使用流程\"><a class=\"anchor\" href=\"#3使用流程\">#</a> 3.使用流程</h2>\n<ol>\n<li>\n<p>用户认证请求<br />\n客户端（如浏览器、App）向服务器发送认证请求，通常是提交用户名和密码等凭证。</p>\n</li>\n<li>\n<p>服务器验证与生成Token<br />\n服务器收到请求后，验证凭证是否正确。若验证通过，服务器会生成一个JWT Token，该Token包含用户身份信息（如用户ID、角色等）的JSON数据，并使用密钥进行签名（确保Token的完整性和真实性）。</p>\n</li>\n<li>\n<p>服务器返回Token给客户端<br />\n服务器将生成的JWT Token返回给客户端，通常是通过HTTP响应的头部（如Authorization字段）或响应体返回。</p>\n</li>\n<li>\n<p>客户端存储Token<br />\n客户端收到Token后，将其存储在本地，常见的存储方式有浏览器的本地存储（localStorage/sessionStorage）或移动端的本地数据库。</p>\n</li>\n<li>\n<p>客户端携带Token发送请求<br />\n后续客户端在访问需要认证的资源时，会在HTTP请求的头部（如Authorization字段）中携带JWT Token。</p>\n</li>\n<li>\n<p>服务器验证Token<br />\n服务器收到请求后，会检查请求头中的Token。首先验证Token的签名是否有效（确保Token未被篡改），然后解析Token中的信息，确认用户身份和权限。</p>\n</li>\n<li>\n<p>服务器处理请求并返回响应<br />\n若Token验证通过，服务器会根据请求处理业务逻辑，并返回相应的结果给客户端；若验证失败，服务器会返回错误信息（如401 Unauthorized）。</p>\n</li>\n</ol>\n<p>**总结：**简单来说，JWT的使用流程就是客户端通过认证获取Token，然后在后续请求中携带Token，服务器通过验证Token来确认用户身份和权限，从而实现身份认证和授权的功能。</p>\n<blockquote>\n<p>首次访问通过认证获取Token，后续用Token替代重复认证，既保证安全又提升效率。同一个用户端首次通过登录注册拿到token后，后续访问只需在请求头带上token，服务器验证通过就能正常访问资源，无需重复登录。</p>\n<p><span class=\"text-emphasis\">JWT Token存储在HTTP的泄露风险</span>：</p>\n<ol>\n<li>\n<p>网络传输风险<br />\n中间人攻击：Token在HTTP请求头中以明文（或Base64编码）传输，若网络环境不安全（如公共WiFi），攻击者可通过抓包工具获取Token，进而利用其伪造身份访问资源。</p>\n</li>\n<li>\n<p>存储安全问题<br />\n本地存储漏洞：客户端将Token存储在localStorage/sessionStorage或本地数据库，若设备被恶意软件感染，Token可能被窃取，导致账户被盗用。</p>\n</li>\n<li>\n<p>服务器端隐患<br />\n日志泄露：服务器日志若记录了完整请求信息，Token会被存储在日志中，若日志管理不善，可能被内部人员或攻击者获取。<br />\n风险规避建议<br />\n使用&lt;u&gt;<strong>HTTPS</strong>&lt;/u&gt;：强制所有请求通过HTTPS传输，利用SSL/TLS加密协议保护Token安全。<br />\n短期Token有效期：设置Token的过期时间（如1小时），到期后需重新认证，降低Token被盗用的风险。<br />\n存储优化：移动端可使用更安全的存储方式（如iOS的Keychain、Android的Keystore），浏览器端避免将敏感信息存入localStorage。</p>\n</li>\n</ol>\n<p>注解：&lt;u&gt;<strong>HTTPS</strong>&lt;/u&gt;通过SSL/TLS加密协议保护Token的核心原理是加密传输和身份验证，具体如下：</p>\n<ol>\n<li>建立安全连接<br />\n握手阶段：客户端与服务器通过SSL/TLS协议进行“握手”，协商加密算法（如AES、RSA）和会话密钥。此过程中，服务器会发送证书（含公钥），客户端验证证书有效性，确保连接到合法服务器。</li>\n<li>加密Token传输<br />\n对称加密：握手完成后，双方使用协商好的会话密钥对HTTP请求/响应进行加密。Token作为请求头的一部分（如Authorization字段），会被加密后传输，即使数据被拦截，攻击者也无法获取Token明文。</li>\n<li>身份验证与完整性保护<br />\n数字签名：服务器证书包含数字签名，客户端可通过CA机构验证其真实性，防止中间人伪造服务器身份窃取Token。同时，TLS协议通过哈希算法（如SHA-256）确保数据完整性，若Token在传输中被篡改，客户端可检测到并拒绝接收。</li>\n<li>会话管理<br />\nSSL/TLS会话机制：通过会话ID和加密上下文，确保Token仅在安全会话中有效。一旦会话结束，Token的传输安全性将依赖于客户端的存储保护，因此建议结合短期Token有效期和安全存储方式（如Keychain、Keystore）进一步增强安全性。<br />\n简单来说，SSL/TLS为Token传输构建了“加密隧道”，从传输安全、身份验证到数据完整性全方位保护，降低Token泄露风险。</li>\n</ol>\n</blockquote>\n",
            "tags": [
                "JWT",
                "身份验证"
            ]
        },
        {
            "id": "https://yyboom.me/2026/03/31/MongoDB/",
            "url": "https://yyboom.me/2026/03/31/MongoDB/",
            "title": "MongoDB",
            "date_published": "2026-03-31T10:21:58.000Z",
            "content_html": "<h1 id=\"mongodb\"><a class=\"anchor\" href=\"#mongodb\">#</a> MongoDB</h1>\n<h2 id=\"1简介\"><a class=\"anchor\" href=\"#1简介\">#</a> 1.简介</h2>\n<p>MongoDB是一种高性能、开源的，面向文档的NoSQL数据库，使用<span class=\"text-emphasis\">JSON风格</span>的文档存储数据。以其灵活的数据模型和强大的扩展性而闻名。与传统的关系型数据库（如MySQL）不同，MongoDB使用文档存储数据，更适合处理<span class=\"text-emphasis\">非结构化或半结构化</span>的数据。它支持动态模式，允许不同文档具有不同的字段结构。MongoDB的设计目标是提供高性能、高可用性和易于扩展的数据库解决方案。</p>\n<h3 id=\"特点\"><a class=\"anchor\" href=\"#特点\">#</a> 特点：</h3>\n<ol>\n<li>\n<p>灵活的文档模型：数据以文档形式存储，支持嵌套结构，适合复杂数据类型。</p>\n</li>\n<li>\n<p>高性能：支持内存中的数据存储，提供高性能的读写操作。</p>\n</li>\n<li>\n<p>水平扩展：通过分片（Sharding）支持水平扩展，适合大规模数据集。</p>\n</li>\n<li>\n<p>丰富的查询语言：支持复杂的查询操作，包括聚合、索引和全文搜索。</p>\n</li>\n<li>\n<p>跨平台：支持Linux、Windows和macOS等多种操作系统。</p>\n</li>\n</ol>\n",
            "tags": [
                "MongoDB",
                "NoSQL"
            ]
        },
        {
            "id": "https://yyboom.me/2026/03/31/Nginx/",
            "url": "https://yyboom.me/2026/03/31/Nginx/",
            "title": "Nginx",
            "date_published": "2026-03-31T10:21:58.000Z",
            "content_html": "<h1 id=\"nginx\"><a class=\"anchor\" href=\"#nginx\">#</a> Nginx</h1>\n<h2 id=\"1介绍\"><a class=\"anchor\" href=\"#1介绍\">#</a> 1.介绍：</h2>\n<p>Nginx是十分轻量级的HTTP服务器。Nginx，它的发音为“engine X”，是一个<strong>高性能的HTTP</strong>和<strong>反向代理服务器</strong>，同时也是一个<strong>IMAP/POP3/SMTP 代理服务器</strong>。</p>\n<blockquote>\n<ul>\n<li><strong>Web服务器</strong>：它的本职工作是将你电脑上的网页文件（HTML， CSS， 图片）发送给用户的浏览器。</li>\n<li><strong>反向代理服务器</strong>：这是它更强大、更常用的角色。它接收客户端的请求，然后代表客户端去向后端的多个服务器索取资源，最后将整合好的结果返回给客户端。客户端并不知道后端的具体情况。</li>\n<li><strong>邮件代理服务器</strong>：它也能处理邮件相关的协议。</li>\n</ul>\n</blockquote>\n<h3 id=\"核心优势\"><a class=\"anchor\" href=\"#核心优势\">#</a> 核心优势：</h3>\n<h4 id=\"1-高性能-高并发\"><a class=\"anchor\" href=\"#1-高性能-高并发\">#</a> 1. **高性能、高并发 **</h4>\n<blockquote>\n<ul>\n<li><strong>传统服务器的&quot;一人一岗&quot;模型</strong>：像Apache的旧模式，每个用户连接都会创建一个新的操作系统进程或线程。当连接数达到几千时，服务器就会因为进程/线程的创建和切换开销而变得非常缓慢。</li>\n<li><strong>Nginx的&quot;事件驱动&quot;异步模型</strong>：Nginx使用一个（或少数几个）主进程来管理多个工作进程。每个工作进程都是&quot;事件驱动&quot;的，能够同时处理数千个连接。它不会为一个连接等待，而是当某个连接有&quot;事件&quot;（比如数据可读了）时才去处理它。这就像餐厅经理同时监听很多张桌子的呼叫铃，而不是一直站在一张桌子前等待。</li>\n</ul>\n</blockquote>\n<p><strong>结果</strong>：Nginx可以用很少的系统资源（CPU和内存）处理海量的并发连接。这是它能成为当今互联网顶流的核心原因。</p>\n<h4 id=\"2-反向代理与负载均衡\"><a class=\"anchor\" href=\"#2-反向代理与负载均衡\">#</a> 2. <strong>反向代理与负载均衡</strong></h4>\n<p>这是Nginx最常用的场景之一。</p>\n<ul>\n<li>\n<p><strong>负载均衡</strong>：当你的网站流量很大时，一台服务器肯定不够。你会有多台应用服务器。Nginx可以站在它们前面，像交通警察一样，把用户的请求按照一定策略（轮询、权重、最少连接等）分发给这些服务器，防止任何一台服务器过载。</p>\n<p>nginx</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 示例配置：定义一个名为 \"myapp\" 的后端服务器组</span></span>\n<span class=\"line\"><span>upstream myapp {</span></span>\n<span class=\"line\"><span>    server 192.168.1.10:8080 weight=3; # 这台机器性能好，给它3个权重</span></span>\n<span class=\"line\"><span>    server 192.168.1.11:8080;          # 这台性能一般，默认权重1</span></span>\n<span class=\"line\"><span>}</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>server {</span></span>\n<span class=\"line\"><span>    listen 80;</span></span>\n<span class=\"line\"><span>    location / {</span></span>\n<span class=\"line\"><span>        proxy_pass http://myapp; # 将所有请求转发给 myapp 组</span></span>\n<span class=\"line\"><span>    }</span></span>\n<span class=\"line\"><span>}</span></span></code></pre>\n</li>\n</ul>\n<h4 id=\"3-静态内容服务-快如闪电\"><a class=\"anchor\" href=\"#3-静态内容服务-快如闪电\">#</a> 3. <strong>静态内容服务 - 快如闪电</strong></h4>\n<p>Nginx处理静态文件（图片、CSS、JavaScript、HTML）的能力极强。通常，我们会让Nginx直接处理这些请求，而将动态请求（需要程序处理的）转发给后端的应用服务器（如Tomcat, Django, Node.js）。这种&quot;动静分离&quot;的策略极大地提升了网站的整体性能。</p>\n<h4 id=\"4-ssltls终端\"><a class=\"anchor\" href=\"#4-ssltls终端\">#</a> 4. <strong>SSL/TLS终端</strong></h4>\n<p>当你的网站使用HTTPS时，需要进行加密和解密操作，这很消耗CPU。Nginx可以承担这个工作，它负责与客户端完成SSL握手和解密，然后将明文的请求转发给后端服务器。这样后端服务器就不用操心加密的事了，可以专注于业务逻辑。</p>\n<h4 id=\"5-缓存\"><a class=\"anchor\" href=\"#5-缓存\">#</a> 5. <strong>缓存</strong></h4>\n<p>Nginx可以缓存从后端应用服务器返回的响应。如果下一个用户请求相同的资源，Nginx可以直接从缓存里返回，而不用再去麻烦后端服务器。这极大地减少了响应时间和后端压力。</p>\n<h4 id=\"6-高可靠性和稳定性\"><a class=\"anchor\" href=\"#6-高可靠性和稳定性\">#</a> 6. <strong>高可靠性和稳定性</strong></h4>\n<p>Nginx以稳定著称，可以7x24小时不间断运行。即使后端某个应用服务器宕机了，Nginx也能检测到并将其从负载均衡组中移除，保证大部分用户不受影响。</p>\n<h3 id=\"一个典型的工作流程从输入网址到看到网页\"><a class=\"anchor\" href=\"#一个典型的工作流程从输入网址到看到网页\">#</a> <strong>一个典型的工作流程（从输入网址到看到网页）</strong></h3>\n<p>假设你访问 <code>https://www.example.com/shop/product/123</code></p>\n<ol>\n<li>\n<p>你的浏览器向 <code>www.example.com</code> 的443端口（HTTPS）发起请求。</p>\n</li>\n<li>\n<p>请求到达托管 <code>example.com</code> 的服务器，Nginx正在监听443端口。</p>\n</li>\n<li>\n<p>Nginx接收到请求，首先完成SSL握手。</p>\n</li>\n<li>\n<p>Nginx查看请求的路径 <code>/shop/product/123</code>。</p>\n</li>\n<li>\n<p>根据预设的规则（<code>location</code> 指令），Nginx判断这是一个动态请求，需要由后端的Java应用处理。</p>\n<p>nginx</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>server {</span></span>\n<span class=\"line\"><span>    listen 443 ssl;</span></span>\n<span class=\"line\"><span>    server_name www.example.com;</span></span>\n<span class=\"line\"><span>    # ... SSL配置 ...</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    location /static/ { # 静态文件直接由Nginx处理</span></span>\n<span class=\"line\"><span>        root /var/www/html;</span></span>\n<span class=\"line\"><span>    }</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    location /shop/ { # 动态请求转发给后端</span></span>\n<span class=\"line\"><span>        proxy_pass http://backend_java_app;</span></span>\n<span class=\"line\"><span>    }</span></span>\n<span class=\"line\"><span>}</span></span></code></pre>\n</li>\n<li>\n<p>Nginx将请求转发给 <code>backend_java_app</code> 定义的一组Java应用服务器中的一台。</p>\n</li>\n<li>\n<p>Java服务器处理请求，从数据库查出产品123的信息，生成HTML页面，返回给Nginx。</p>\n</li>\n<li>\n<p>Nginx将这个响应返回给你的浏览器。</p>\n</li>\n<li>\n<p>浏览器解析HTML，发现里面还有CSS和图片链接（如 <code>/static/css/style.css</code>），于是又向同一个Nginx发起新的请求。</p>\n</li>\n<li>\n<p>这次，Nginx看到是 <code>/static/</code> 路径，直接从服务器的硬盘上读取 <code>style.css</code> 文件，并以极快的速度发送给浏览器。</p>\n</li>\n</ol>\n<h3 id=\"nginx-vs-apache另一个著名的web服务器\"><a class=\"anchor\" href=\"#nginx-vs-apache另一个著名的web服务器\">#</a> <strong>Nginx vs. Apache（另一个著名的Web服务器）</strong></h3>\n<p>这是一个经典的对比，能帮你更好地理解Nginx的定位：</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">特性</th>\n<th style=\"text-align:left\">Nginx</th>\n<th style=\"text-align:left\">Apache</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\"><strong>架构模型</strong></td>\n<td style=\"text-align:left\"><strong>事件驱动</strong>，异步非阻塞</td>\n<td style=\"text-align:left\"><strong>进程/线程驱动</strong>（传统模式），一个连接一个进程</td>\n</tr>\n<tr>\n<td style=\"text-align:left\"><strong>资源消耗</strong></td>\n<td style=\"text-align:left\">低，尤其在高并发下</td>\n<td style=\"text-align:left\">高，并发连接数增多时资源消耗剧增</td>\n</tr>\n<tr>\n<td style=\"text-align:left\"><strong>静态内容</strong></td>\n<td style=\"text-align:left\"><strong>性能极高</strong></td>\n<td style=\"text-align:left\">性能很好</td>\n</tr>\n<tr>\n<td style=\"text-align:left\"><strong>动态内容</strong></td>\n<td style=\"text-align:left\">通常需要转发给后端处理器（如PHP-FPM）</td>\n<td style=\"text-align:left\">可以通过模块（如mod_php）在内部直接处理</td>\n</tr>\n<tr>\n<td style=\"text-align:left\"><strong>配置语法</strong></td>\n<td style=\"text-align:left\">简洁、直观</td>\n<td style=\"text-align:left\">更灵活、功能强大，但也更复杂</td>\n</tr>\n<tr>\n<td style=\"text-align:left\"><strong>主要用途</strong></td>\n<td style=\"text-align:left\"><strong>反向代理、负载均衡、静态服务</strong></td>\n<td style=\"text-align:left\">传统的全能Web服务器，特别适合共享主机</td>\n</tr>\n</tbody>\n</table>\n<p><strong>简单总结</strong>：Nginx更擅长处理高并发连接和充当&quot;交通指挥&quot;，而Apache传统上更擅长在单个服务器内深度处理动态请求。现代架构中，它们常常协同工作：Nginx在前端做反向代理和静态处理，Apache在后端处理动态内容。</p>\n",
            "tags": [
                "Nginx",
                "Web 服务器",
                "反向代理"
            ]
        }
    ]
}