# 《网络是怎样连接的》知识点全解 > AI生成|2026年10月29日|codebuddy|原书:户根勤《网络是怎样连接的》,人民邮电出版社,2017-01-01 > **我的阅读**:进度 100%|累计 5小时48分钟|开始 2020-06-27|最近 2020-07-23|读完 2020-06-30 ## 一句话总结 它把"在浏览器里敲下网址、按下回车"到"页面显示出来"之间的几秒钟,拆成一条可以逐段走访的物理与软件链路——浏览器、协议栈、网卡、交换机、路由器、接入网、运营商、防火墙、服务器——让你知道每一步是谁在做、依据什么信息做、失败了该去查谁。 ## 适合谁 / 前置知识 **适合**:写 Web 后端/前端但说不清"一个请求到底经过了什么"的开发者;准备面试网络部分、需要把零散名词串成流程的人;运维、测试、安全入门者;非科班转行、被"三次握手/四次挥手"卡住的人。 **不适合**:想做协议实现或内核调优的人(本书不讲代码级实现,也不深入 TCP 拥塞控制的算法细节);想学网络安全攻防的人(防火墙只讲到包过滤这一层)。 **前置知识**:会用一个浏览器、知道 IP 和域名大概是什么就够了。二进制、进制换算、MTU 这些概念书里都是现讲的,不需要提前准备。 ## 一、全书地图 全书是一条单向的时间线,章节顺序 = 一个请求的实际行进顺序,读的时候不要跳章,否则会丢失"上一章的输出是下一章的输入"这层关系。 | 章 | 主题 | 在旅程中的位置 | 核心问题 | 与前后章的关系 | |---|---|---|---|---| | 第1章 | 浏览器生成消息 | 起点:应用层 | 网址怎么变成一条 HTTP 请求?域名怎么变成 IP? | 产出"请求消息 + 目标 IP + 端口",交给第2章 | | 第2章 | 用电信号传输 TCP/IP | 本机内部:协议栈与网卡 | 数据怎么变成可靠的字节流,再怎么变成电信号? | 接收第1章的委托,产出以太网帧,交给第3章 | | 第3章 | 从网络到网络设备 | 局域网内 | 集线器、交换机、路由器各自看什么、转发给谁? | 把帧送出本子网,交给第4章 | | 第4章 | 通过接入网进入互联网 | 家/公司 → 运营商 | ADSL、光纤、PPP、隧道怎么把包送进运营商?运营商之间怎么互联? | 跨越广域网,抵达对方机房入口,交给第5章 | | 第5章 | 服务器端的局域网 | 机房内部 | 防火墙怎么放行?多台服务器怎么分担?缓存和 CDN 怎么减少回源? | 把包安全、均衡地送到某台 Web 服务器,交给第6章 | | 第6章 | 请求到达 Web 服务器,响应返回浏览器 | 终点与回程 | 服务器怎么收、怎么处理、响应怎么回去、浏览器怎么渲染? | 闭环,回程基本是去程的逆序 | **逻辑主线可以压成一句话**:应用层只负责"说什么",传输层负责"可靠地送到哪个程序",网络层负责"送到哪台机器、走哪条路",链路层负责"交给下一个物理邻居"。每一层都只解决自己那一小段,然后把剩下的活连同收件人地址一起交给下一层——这就是"委托"。 **一个容易忽略的结构特点**:第6章的响应回程并不是新知识,而是第1—5章的逆序复用。所以真正需要精读的是第1—4章,第6章主要是补上"服务器内部"和"浏览器渲染"这两个此前没打开的盒子。 ## 二、核心知识点 ### 1. 分层与"委托链":网络是一个接力赛,不是一条专线 **是什么**:浏览器不负责发信号,网卡不负责重传,路由器不关心 HTTP 内容。每一层把上层交来的数据加上自己的头部,打包成自己能处理的单位,再交给下一层。 **为什么重要**:这是全书的总纲。理解了委托,你才能解释"为什么改一个 DNS 就能让服务切走""为什么网线断了但 TCP 还显示 ESTABLISHED 一小会儿""为什么抓包看到的是三段而不是一段"。 **怎么用**:排查问题时先定位层级。浏览器报 `ERR_NAME_NOT_RESOLVED` 是 DNS(第1章);`ping` 通但端口连不上是传输层或防火墙(第2、5章);能连上但很慢,多半在链路或拥塞(第2、3章)。 **常见误区**:以为"网络分层"是物理上分开的模块。实际是同一台机器里几个软件依次处理同一个缓冲区,加头、剥头而已。 ### 2. URL 解析与 HTTP 请求消息的生成 **是什么**:浏览器先拆 URL:协议(http/https)、主机名、端口(省略时 http 默认 80、https 默认 443)、路径、查询参数。然后按 HTTP 版本生成请求行、消息头、消息体。 **为什么重要**:请求消息是整条链路上唯一"由人决定内容"的部分,后面的所有设备都只是搬运它。URL 拆错,后面全错。 **怎么用**:`GET /index.html HTTP/1.1` 加 `Host: example.com`——注意 Host 头是 HTTP/1.1 的必需项,因为同一台 IP 上可能挂多个站点(虚拟主机)。POST 才带消息体;GET 的参数在 URL 里。 **常见误区**:以为"输入网址"和"点击链接"发的请求一样。实际上浏览器会补全协议、可能先发 `OPTIONS` 预检(跨域)、会带 `Cookie`、`Referer`、`User-Agent` 等一堆头;图片、CSS、JS 是**另外的请求**,不是主文档的一部分。 ### 3. DNS:把域名翻译成 IP 的分布式数据库 **是什么**:浏览器先查本机缓存和 hosts,再问 DNS 服务器。DNS 服务器从根域开始,逐级向顶级域、权威域名服务器查询,最后把 A 记录(IPv4)或 AAAA 记录(IPv6)返回。 **为什么重要**:DNS 是整条链路上第一个"可能出错且不在你控制范围内"的环节,也是流量调度(CDN、灰度、故障切换)最常用的抓手。 **怎么用**:`dig example.com +trace` 可以看到完整的逐级查询过程;`nslookup` 看默认服务器返回。理解"递归查询"(我替你跑完全程)与"迭代查询"(你告诉我下一站去哪)的区别,就能看懂 DNS 服务器之间的分工。 **常见误区**:以为全世界只有一台 DNS 服务器;以为 DNS 结果永远不变(有 TTL,改解析要等缓存过期);以为 DNS 只用来查网页(MX 管邮件、CNAME 做别名、TXT 做验证)。 ### 4. 套接字与 TCP 连接:三次握手、四次挥手 **是什么**:协议栈用"套接字"(socket)这一数据结构记录通信双方 IP、端口、状态。建立连接时三次握手:客户端 SYN → 服务端 SYN+ACK → 客户端 ACK。断开时四次挥手:FIN、ACK、FIN、ACK,因为两个方向要各自关闭。 **为什么重要**:连接是"双方共同维护的状态",不是一根物理线。所有"连不上/连接被重置/大量 TIME_WAIT"的问题都从这里解释。 **怎么用**:`netstat -an` 或 `ss -tan` 看状态。服务端 SYN_RECV 堆积说明握手没走完(多半是 SYN Flood 或回程丢包);客户端大量 TIME_WAIT 说明短连接太多,考虑连接池。主动关闭方进入 TIME_WAIT 并等 2MSL,是为了让最后的 ACK 有机会重发、并让旧连接的残余包在网络中消失。 **常见误区**:以为"三次"是为了安全或加密(不是,是为了确认双方的收发能力都正常、并同步初始序号);以为挥手也必须三次(服务端可能还有数据没发完,ACK 和 FIN 不能合并)。 ### 5. TCP 的可靠传输:序号、确认、窗口、重传 **是什么**:TCP 把应用层的字节流切成段,每段带序号;接收方回 ACK 确认;发送方根据窗口大小控制一次能发多少;超时或收到重复 ACK 就重传。 **为什么重要**:IP 层是"尽力而为",会丢包、会乱序、会重复。可靠性完全由 TCP 在两端补出来,这也是它比 UDP 慢的根本原因。 **怎么用**:理解"滑动窗口"就能解释为什么大文件传输一开始慢、后来快(慢启动 + 窗口增长);理解"累计确认"就能解释为什么丢一个包会导致后面一片被重传。 **常见误区**:以为 TCP 保证"消息边界"(不保证,是字节流,粘包要应用层自己定长度或分隔符);以为重传一定说明网络坏了(偶尔丢包是正常的,重传率才是指标)。 ### 6. 包的结构与封装/解封装 **是什么**:应用数据 → 加 TCP 头(源/目的端口、序号、校验和)→ 加 IP 头(源/目的 IP、TTL、协议号)→ 加以太网头(源/目的 MAC、类型)→ 加帧校验 → 变成电/光信号。 **为什么重要**:抓包看到的每一层头部,都是某一台设备"只看得懂的那部分"。交换机只看以太网头,路由器看到 IP 头就够,防火墙可能看到 TCP 头,代理才看 HTTP。 **怎么用**:用 Wireshark 抓一个请求,逐层展开,对照"这一层是谁加的、谁会读、谁会用完就扔"。这是把本书知识固化成直觉的最有效练习。 **常见误区**:以为 MTU 是 TCP 的概念(是链路层的,以太网常见 1500 字节);以为分片很常见(IPv4 可以分片,但现代网络多靠 TCP 的 MSS 协商避免);把"包"和"帧"混用(帧是链路层单位,包偏网络层)。 ### 7. IP 地址、子网掩码与路由表 **是什么**:IP 地址标识"哪台机器",子网掩码划分"哪些地址在同一个子网内",路由表决定"这个目的地址该从哪个网卡、发给哪个下一跳"。 **为什么重要**:判断"要不要经过路由器"完全靠掩码运算,而不是靠"是不是外网"。这是很多人配错网络的第一步。 **怎么用**:拿到 `192.168.1.10/24`,网关 `192.168.1.1`:目的地址与掩码相与,结果等于本网段就直接 ARP 找对方 MAC;不等就发给默认网关。`ip route` / `route print` 看表,最长前缀匹配优先。 **常见误区**:以为 IP 地址是设备天生固有的(是配置/分配出来的,可以变);以为同一个 IP 只能在一处出现(NAT 之后就打破了);以为默认网关可以随便填(必须和本机同网段且真的会转发)。 ### 8. ARP 与 MAC 地址:同一网段内的"喊名字" **是什么**:知道对方 IP 但不知道 MAC 时,主机广播 ARP 请求"谁是 192.168.1.1",对方单播回应自己的 MAC。结果缓存在 ARP 表里。 **为什么重要**:IP 包最终必须装进以太网帧才能发出去,而帧只认 MAC。跨网段时,ARP 解析的是**网关**的 MAC,不是最终目标的 MAC——这一点是理解"包怎么一跳一跳走"的关键。 **怎么用**:`arp -a` 看缓存;怀疑 IP 冲突或中间人攻击时看 MAC 是否异常变化;虚拟机/容器网络不通时先确认 ARP 能不能通。 **常见误区**:以为跨网段通信需要知道对方 MAC(不需要,只需要网关 MAC);以为 MAC 地址全球唯一且不可改(可以伪造,所以它不能当身份凭证)。 ### 9. 网卡、双绞线与集线器/交换机 **是什么**:网卡把帧变成电信号;双绞线用差分信号抗干扰;集线器是物理层设备,把信号广播到所有端口,所有端口共享一个冲突域;交换机是链路层设备,根据 MAC 地址表把帧只转发到对应端口。 **为什么重要**:这是"共享"到"独享"的分水岭。交换机之所以能全双工、不冲突,是因为它做了端口隔离和定向转发。 **怎么用**:看交换机 MAC 表(`show mac address-table`)判断某台设备挂在哪個端口;怀疑环路时看广播风暴;网线质量差表现为 CRC 错误、重传升高,而不是"完全不通"。 **常见误区**:以为交换机认识 IP(不,只认 MAC,除非是三层交换机);以为集线器已经绝迹(在廉价设备和某些工业环境还在);以为网线越长越好(双绞线有 100 米左右的长度限制)。 ### 10. 路由器:按 IP 转发、逐跳改变链路 **是什么**:路由器收到帧后剥掉以太网头,看 IP 头里的目的地址,查路由表决定下一跳,再用出接口的链路层重新封装(新的源/目的 MAC),TTL 减一。 **为什么重要**:路由器是"不同网络之间的翻译官",每一跳的 MAC 都会变,但源/目的 IP 全程不变(NAT 除外)。这解释了"为什么 tracert 能看到每一跳"。 **怎么用**:`tracerert`/`tracert` 利用 TTL 逐跳耗尽来探测路径;`ping` 不通时对比"能到网关"和"能到目标",快速切分故障域。 **常见误区**:以为路由器转发时会保留原来的 MAC(会重写);以为路由表里必须有明细条目(默认路由 0.0.0.0/0 兜底);把"路由"和"交换"混为一谈。 ### 11. NAT/NAPT:让私有地址上网 **是什么**:路由器把内网源 IP(和端口)替换成公网 IP(和端口),维护一张转换表,回程再改回来。NAPT 靠端口区分不同内网主机。 **为什么重要**:这是 IPv4 地址不够用的主要续命手段,也解释了"为什么家里没有公网 IP 也能上网""为什么外面不能主动连进来"。 **怎么用**:做端口映射(DNAT)让外网访问内网服务;排查"能出不能进"时先想到 NAT;P2P、VoIP 需要打洞也是因为 NAT。 **常见误区**:以为 NAT 是安全机制(它顺带挡住了入站,但不是防火墙);以为 NAT 后仍能保留端到端语义(破坏了对等性,应用层要额外处理)。 ### 12. 接入网:ADSL、FTTH、PPP 与隧道 **是什么**:ADSL 利用电话线的高频段,用分离器把语音和数据分开;FTTH 用光纤,经光分路器和 OLT 到运营商;PPPoE 把 PPP 帧装进以太网帧,用于认证和分配 IP;隧道是把一种协议整个装进另一种协议里传。 **为什么重要**:这一段是"家庭网络"和"互联网"的边界,也是很多"拨号失败/网速不达标"问题的所在地。 **怎么用**:看光猫的 PON 灯和 LOS 灯区分"光纤断"和"认证失败";PPPoE 拨号失败先查账号、VLAN、MTU;理解隧道就能看懂 VPN、GRE、IPsec 的基本形态。 **常见误区**:以为"光纤入户"就等于独享带宽(PON 是共享的,分路比影响高峰期速度);以为 PPPoE 只是"拨号"(它还承载认证、LCP 协商、IP 分配)。 ### 13. 运营商网络与运营商互联 **是什么**:运营商内部由大量路由器和传输设备组成,通过 IXP(互联网交换中心)或直连互联,用 BGP 交换路由可达信息。 **为什么重要**:跨运营商访问慢,往往不是你的问题,而是互联带宽和路由策略的问题。理解了这一点,才知道"换线路""上 CDN"为什么有效。 **怎么用**:多线机房、BGP 多线、CDN 就近接入,本质都是在绕开互联瓶颈;排查跨网慢时对比不同运营商的探测结果。 **常见误区**:以为"互联网是一张网"(是很多张网互连);以为路由总是走"最短路径"(走的是策略路径,可能绕远)。 ### 14. 防火墙、负载均衡与缓存/CDN **是什么**:防火墙按规则检查包的源/目的 IP、端口、状态,决定放行或丢弃,常把对外服务器放在 DMZ;负载均衡把请求分到多台服务器(轮询、最少连接、按来源哈希);缓存服务器保存响应副本,CDN 把缓存节点铺到离用户近的地方。 **为什么重要**:这是服务端"能不能扛住"的三件套:安全边界、横向扩展、减少回源。 **怎么用**:只对外开放必要端口;用健康检查剔除故障节点;给静态资源设 `Cache-Control`,给动态内容用 `ETag`/条件请求;CDN 回源失败时先查缓存键和 TTL。 **常见误区**:以为防火墙能查杀病毒(包过滤只看头部);以为加了负载均衡就自动高可用(会话保持、数据一致性要另外解决);以为 CDN 只是"加速"(它同时是抗流量冲击的第一层)。 ### 15. 服务器接收、处理与响应 **是什么**:网卡收帧 → 协议栈按端口交给监听进程 → Web 服务器(如 Nginx/Apache)解析 HTTP、可能转发给应用服务器 → 生成响应 → 反向按 TCP/IP 分包发回 → 浏览器解析 HTML、请求子资源、布局渲染。 **为什么重要**:闭环。理解了接收路径,才能解释"为什么 backlog 满了会拒绝连接""为什么 keep-alive 能省掉握手"。 **怎么用**:看 `listen` 的 backlog、worker 数量、连接数上限;静态资源交给 Nginx、动态请求转后端;浏览器端关注关键渲染路径(CSS 阻塞、JS 阻塞)。 **常见误区**:以为"服务器处理慢"一定是代码问题(可能是握手、TLS、队列、磁盘);以为浏览器收到 HTML 就显示完了(还要发几十个请求拿资源)。 ## 三、关键概念速查表 | 概念 | 一句话解释 | 用在哪儿 | |---|---|---| | HTTP | 浏览器和服务器之间"要什么、给什么"的文本协议 | 第1章生成请求、第6章生成响应 | | URL | 协议 + 主机 + 端口 + 路径 + 参数 | 拆出 Host、端口、资源路径 | | DNS | 域名到 IP 的分布式查询系统 | 拿到目标服务器 IP | | 套接字 | 记录双方 IP、端口、状态的通信端点 | 协议栈收发数据的抓手 | | TCP | 面向连接、可靠、字节流的传输协议 | 网页、文件传输等要可靠性的场景 | | UDP | 无连接、不保证送达、开销小 | DNS 查询、音视频、游戏 | | 端口号 | 同一台机器上区分不同程序的编号 | 找到该把数据交给哪个进程 | | IP 地址 | 标识网络中的一台主机/接口 | 跨网段寻址 | | 子网掩码 | 划分网络号与主机号 | 判断目的地是否同网段 | | 默认网关 | 本网段出口的路由器地址 | 非本网段流量的第一跳 | | ARP | 由 IP 求同一网段内 MAC 的协议 | 封装以太网帧前解析下一跳 | | MAC 地址 | 链路层标识,逐跳变化 | 交换机转发、网卡过滤 | | 以太网帧 | 链路层的传输单位 | 网线/光纤上的实际承载 | | MTU/MSS | 链路最大传输单元 / TCP 最大段长 | 避免分片、调优传输 | | 交换机 | 按 MAC 表在局域网内定向转发 | 组建局域网、隔离冲突 | | 路由器 | 按 IP 路由表跨网络转发 | 连接不同网段与运营商 | | 路由表 | 目的网段 → 下一跳/出接口 | 决定包往哪走 | | NAT/NAPT | 私网地址与公网地址的转换 | 家庭/公司共享上网 | | PPPoE | 在以太网上承载 PPP,用于认证与分配 IP | 宽带拨号 | | 隧道 | 把一种协议封装进另一种协议传输 | VPN、专线、过渡技术 | | BGP | 运营商之间交换路由的协议 | 跨网互联、多线接入 | | DMZ | 介于内外网之间、对外提供服务的安全区 | 放置 Web/邮件服务器 | | 负载均衡 | 把请求分发到多台服务器 | 横向扩容、故障转移 | | 缓存/CDN | 保存响应副本、就近提供 | 降低回源、加速静态资源 | | keep-alive | 复用同一条 TCP 连接发多个请求 | 减少握手开销 | ## 四、可复用的方法/框架 ### 框架 A:一次请求的"五段定位法" 遇到"打不开/很慢/时好时坏",不要从代码开始猜,按链路顺序切分: 1. **名字**:域名解析出来了吗?`dig`/`nslookup` 对比多个 DNS。 2. **连接**:能建立 TCP 吗?`telnet host port` 或 `nc -vz`。 3. **路径**:包能过去吗?`ping` 网关、`traceroute` 看在哪一跳断。 4. **应用**:HTTP 状态码是什么?看响应头、看服务端日志。 5. **回程**:请求到了但响应回不来?查 NAT、防火墙状态表、MTU。 每一段只问一个问题,能把"网络问题"这个模糊说法压缩成一个具体环节。 ### 框架 B:读一个协议/设备的"三问" 1. 它**看得懂哪一层头部**?(决定它能做什么判断) 2. 它**依据什么表/状态**做决定?(MAC 表、路由表、ARP 缓存、连接表、规则表) 3. 它**改变了包的什么**?(MAC 会变、TTL 会减、IP 可能被 NAT、端口可能被改) 这三问可以套在集线器、交换机、路由器、防火墙、NAT、代理上,答案一出来,设备的行为就不用背了。 ### 框架 C:封装/解封装对照法 抓一个包,从外到内逐层写下:这一层的头部是谁加的、哪台设备会读、读完是丢弃还是保留。做完一次,你对"为什么抓包软件能同时显示以太网/IP/TCP/HTTP"就不会再困惑。 ### 判断清单:这次慢,慢在哪一层? - [ ] DNS 查询耗时是否异常(对比首次与二次访问) - [ ] TCP 握手耗时是否异常(看 SYN→SYN+ACK 间隔) - [ ] 是否有大量重传(`netstat -s` 看重传计数) - [ ] 是否跨运营商(对比不同线路探测) - [ ] 服务端队列是否打满(backlog、worker 饱和) - [ ] 是否回源(缓存命中率、CDN 日志) ## 五、我的阅读轨迹 | 项目 | 数据 | |---|---| | 进度 | 100% | | 累计阅读 | 5小时48分钟 | | 开始阅读 | 2020-06-27 | | 最近阅读 | 2020-07-23 | | 读完时间 | 2020-06-30 | **复习建议**:全书已读完,且首读与读完只隔 3 天,说明当时是集中通读,印象完整但细节容易流失。建议按"每季度一次、每次 40 分钟"的节奏做主题回看: - **第一优先(结构骨架)**:第1章 1.2/1.3(DNS)、第2章 2.1—2.3(套接字、握手、收发)。这三块是面试与排障的高频区,也最容易记混。 - **第二优先(最易忘)**:第3章 3.2/3.3(交换机与路由器的转发差异)、第4章 4.3(PPP 与隧道)。这两处概念密度最高,隔久了只剩名词。 - **第三优先(当索引读)**:第5、6章,用到时再翻,不必背。 - **复读方法**:合上书,自己在纸上画"浏览器→协议栈→网卡→交换机→路由器→接入网→ISP→防火墙→服务器"的链路,每画一个节点写出"它看哪层头、查哪张表、改什么"。画不出来的地方就是下次要读的章节。 ## 六、行动清单 1. 用 Wireshark 抓一次自己访问任意网站的全过程,逐层展开一个 HTTP 请求,标注每层头部由谁添加。 2. 用 `dig +trace` 完整跑一次域名解析,记录根、顶级域、权威服务器各返回了什么。 3. 在自己机器上执行 `ss -tan`,找出 TIME_WAIT 和 ESTABLISHED 的连接,解释它们分别处于什么阶段。 4. 画一张自己所在网络拓扑图:本机 IP/掩码、网关、DNS、光猫/路由器、出口运营商,标出 NAT 发生在哪。 5. 用 `traceroute` 跟踪到三个不同运营商的目标,观察路径在第几跳分叉、哪里开始绕远。 6. 给一台内网服务做端口映射,从外网验证;再关掉映射,确认"不能主动连入"是 NAT 还是防火墙造成的。 7. 为一个静态站点配置 `Cache-Control` 与 `ETag`,用浏览器开发者工具验证 200 与 304 的差别。 8. 把本文"五段定位法"抄成一张卡片,下次遇到"网站打不开"时按顺序走一遍,不要跳步。 ## 七、延伸阅读 1. **《TCP/IP详解 卷1:协议》**(Stevens)——本书是"流程导游",这本是"协议字典"。先读本书建立链路感,再按需查卷1的对应章节,顺序不要颠倒,否则容易陷进头部字段出不来。 2. **《HTTP权威指南》**(Gourley 等)——补上本书讲得最浅的应用层:缓存语义、连接管理、代理、认证。读完本书第1、6章后接这本,衔接最顺。 3. **《计算机网络:自顶向下方法》**(Kurose & Ross)——体系化教材,适合把本书的"旅程叙事"升级为"分层理论 + 习题训练"。建议放在最后,用于查漏和建立完整知识框架。 **读法建议**:本书负责"通",三本延伸负责"深"。先用本书把一条链路走通,再挑一个你最常出问题的环节(多数人是 DNS 或 TCP)深入一本,不要三本同时开。