📖 名词溯源:MAC 与 IP MAC 是 Media Access Control(介质访问控制)的缩写,管的是「在这条物理线路上怎么标识你」;IP 是 Internet Protocol(网际协议)的缩写,管的是「在整个互联网上怎么定位你」。一个管「近处」,一个管「远处」。
🎯 本章学习目标
- 理解网络是「多台计算机交换信息」的系统。
- 掌握 MAC 地址与 IP 地址的区别。
- 理解「分层」思想:TCP/IP 各层各司其职。
- 理解路由如何让数据包找到路,DNS 如何把域名变成 IP。
15.1网络:让计算机「对话」
网络(network)的本质,就是把多台计算机连起来,让它们交换信息。网络里流动的信息,最终也都是一串串 0 和 1——只是它们不再只在一台机器内部流动,而是通过网线、光纤、无线电波,跑到另一台机器上。
为了让「对话」成为可能,网络必须解决三个核心问题:
- 谁是谁?——每台机器要有唯一标识(地址)。
- 怎么传?——数据如何可靠地、完整地送到(协议)。
- 路在哪?——跨越无数中转设备,怎么找到目的地(路由)。
核心思想 网络 = 地址(谁)+ 协议(怎么传)+ 路由(走哪)。记住这三问,整章就拎起来了。
深化:一根线上的「说话秩序」
最早的以太网,是一根同轴电缆在楼里穿来穿去,所有机器都「挂」在这根线上听。问题立刻来了:两台机器同时说话,电信号在线上叠加成乱码——这叫冲突(collision)。那时的规矩是「先听,线路上有人讲就等;说完若发现撞了,各自退避一段随机时间再重试」。集线器(hub)出现后问题依旧:它只是把收到的信号向所有端口广播,等于把一根线换成了「一根更粗的线」,冲突域不减反增。真正终结这场混乱的是交换机(switch):它记下每个端口后面连着哪台机器(MAC 表),帧只送往对应端口,不再全场广播——每台机器独享自己的口子,冲突被结构性地消灭。今天的 WiFi 反而是「共享介质」的活化石:同一信道的设备轮流说话,还发展出「说话前先预约、等确认」的规矩——无线的天空天然是共享的,只能靠秩序取胜。
「延迟」也值得拆开看。一笔数据从 A 到 B 的总耗时,由四部分组成:发送时延(把数据全部推上链路的时间 = 数据量 ÷ 带宽)、传播时延(信号跑完物理距离的时间,光在光纤中约每秒 20 万公里)、排队时延(在路由器里排队等转发)、处理时延(路由器查表改包)。注意一个关键结论:升级带宽只能压缩发送时延,而传播时延卡在光速上——这是物理极限,任何技术都救不了。
那「协议」到底是什么?就是双方事先约好的规矩:谁先开口、说什么格式、对方怎么回应、出错怎么办。没有协议,两台机器就算线接通了也只能鸡同鸭讲。协议的标准化让不同厂商、不同年代、不同国家的机器互相听得懂——这正是 15.3 节「分层」要展开的主菜。
📐 例题 1 带宽与延迟:两个独立的指标
A、B 两城相距 2000km,光纤链路带宽 100Mbps,光在光纤中传播速度约 2×108 m/s。(a) 单程传播延迟是多少?(b) 传完一个 10MB 的文件最少多久(忽略协议开销与排队)?(c) 升级到 1Gbps 后,(a)、(b) 各变成多少?
思路 传播延迟 = 距离 ÷ 速度,与带宽无关;总时间 ≈ 传播延迟 + 发送时延。
解 2000km ÷ (2×108 m/s) = 10ms。 10MB = 80Mbit,发送时延 = 80 ÷ 100 = 0.8s,合计 ≈ 0.81s。 升级后:传播延迟不变,仍是 10ms;发送时延 = 80 ÷ 1000 = 0.08s,合计 0.09s。
答:10ms;约 0.81s;1Gbps 下传播仍 10ms、总约 0.09s。 ⚠ 易错点:以为带宽升级能把一切变快——传播延迟纹丝不动。下载大文件吃的是带宽;视频通话、在线对战吃的是延迟。两码事,别混。
趁热补一个单位陷阱:网络世界的速率几乎全用「比特每秒」(bps)计——Mbps 是兆比特每秒,而不是兆字节。1 字节 = 8 比特,所以「百兆宽带」的理论下载速度是 100Mbps ÷ 8 ≈ 12.5MB/s——装机后发现「跑不满 100MB/s」的困惑,十有八九是栽在这个换算上。往后看例题 3、例题 6 时,请保持这个警惕。
工程中的它
算一笔「物理极限账」:同步通信卫星悬在赤道上空约 36000km,无线电单程就要约 120ms,往返 240ms 起步——卫星电话那句著名的「慢半拍回声」不是设备差,是光速给的硬约束。在线协作系统会把端到端延迟预算压在 150ms 内,超过这个数,人就开始感到「不跟手」。设计任何实时系统前,先拿传播延迟这笔账算一算,能省掉大量不切实际的方案。
顺带把单位这个坑填了:网络带宽习惯用比特每秒(bit/s,小写 b),下载软件显示的是字节每秒(B/s,大写 B),一字节 = 8 比特。「我办的千兆宽带,下载怎么才 125MB/s?」——1000Mbps ÷ 8 = 125MB/s,不多不少,正是满速。从今往后,看到 Mbps 先除以 8,再谈 MB。
辨析 带宽 vs 延迟 vs 吞吐量:带宽是「水管粗细」(理想流速),延迟是「水管长度」(水从这头到那头的时间),吞吐量是「实际流出来多少」——它受沿途最细一段和最堵一处的双重限制。下载报的是吞吐量,游戏怕的是延迟。三个指标相互独立,评价一条网络必须三个一起看。
🧠 一句话记忆 网络三问:谁是谁(地址)、怎么传(协议)、走哪条路(路由)。
15.2地址:MAC 与 IP
网络里有两种「身份标识」,层次不同:
- MAC 地址:网卡出厂时就「焊死」的物理地址,全球唯一,像你的身份证号。它用在本地网络内部(同一个局域网里,靠 MAC 找到具体那台机器)。
- IP 地址:逻辑地址,可以按网络位置分配和变化,像你的「邮寄地址」。它用在跨网络的定位上(数据要跨山跨海,得先靠 IP 找到大方向)。
| 维度 | MAC 地址 | IP 地址 |
|---|---|---|
| 性质 | 物理地址(网卡固定) | 逻辑地址(可变化) |
| 唯一性 | 全球唯一 | 在各自网络内唯一 |
| 作用范围 | 局域网内部 | 跨网络定位 |
| 类比 | 身份证号 | 邮寄地址 |
深化:为什么一种地址不够用
先看两种地址的长相。MAC 地址 48bit = 6 字节,习惯写成六组十六进制(如 00:1A:2B:3C:4D:5E):前三字节是厂商标识(OUI,谁造的这块卡),后三字节是流水号——「姓 + 名」,出厂即定。IPv4 地址 32bit = 4 字节,写成点分十进制(如 142.250.72.14)。长相不同的背后是任务不同:MAC 只求「全球唯一」,而 IP 还要「自带位置」——它的前缀编码「你在哪张网」,后缀编码「网内哪一台」。
为什么位置必须编进 IP?想象路由器若不认识位置,就只能在表里存下「全球每台机器各自走哪条路」——几十亿条记录,任何设备都装不下。而把位置编进前缀后,路由器只需记住「某一段地址走某个方向」——一条表项代表成千上万台机器,全球核心路由表才压缩到几十万条的量级。15.2 的「逻辑地址」之「逻辑」,本质就是:地址不再只是名字,而是可聚合的位置编码。
「前缀多长」由子网掩码(subnet mask)说了算:32bit 的掩码,写成二进制时开头连续的 1 表示网络位。比如 192.168.10.0/24 表示前 24bit 是网络号、后 8bit 是主机号,可容纳 28 − 2 = 254 台主机(主机位全 0 表示「网络本身」,全 1 表示「本网广播」,都不可分配)。判断两个 IP 是否同一网段:各与掩码做按位与,比较结果。要跨网段?把包交给网关——守在网段门口的那台路由器。
还差一块拼图:局域网内帧是按 MAC 交付的,「下一跳的 IP」怎么变成「下一跳的 MAC」?靠 ARP(Address Resolution Protocol,地址解析协议)——在局域网里广播喊一嗓子:「谁是 192.168.1.1?请把你的 MAC 告诉我!」对应机器单播应答,结果存入缓存,下次直接用。这个不起眼的小协议,是 15.4 一切转发行为的前置条件;它靠「喊话」工作,也就有了软肋——若有设备谎报应答(ARP 欺骗),流量会被引到错误门口,所以关键内网常把重要「IP→MAC」绑定固定,防止冒名顶替。
📐 例题 2 子网划分:把 /24 拆成四份
某单位分到 192.168.10.0/24。(a) 直接使用可容纳多少台主机?(b) 现要划分成 4 个等大小子网,掩码是多少?每个子网可用主机数?(c) 192.168.10.100 与 192.168.10.200 划入 /26 后是否同一子网?
思路 要 4 个子网就从主机位借 2bit(22 = 4);可用主机数 = 2剩余主机位 − 2;同网段判断用「IP AND 掩码」比较。
解 原本主机位 8bit,可用 = 28 − 2 = 254 台。 借 2bit → 掩码 24+2 = 26,即 255.255.255.192,每个子网主机位 6bit,可用 26 − 2 = 62 台;四个子网的起点为 .0、.64、.128、.192。 100 AND 192 = 64(落在 64~127 段),200 AND 192 = 192(落在 192~255 段)——不同子网,通信须经路由器。
答:254 台;/26(255.255.255.192),每子网 62 台;100 与 200 分属 64 号与 192 号子网,不同网段。 ⚠ 易错点:可用主机数要 −2(网络地址与广播地址);判断同网段别靠「前三位数字像不像」,要老老实实做与运算。
工程中的它
子网划分是网络规划的基本功:一个复杂的内部网常按「功能」切段——把核心控制设备、办公终端、访客与娱乐流量放进不同子网。好处有二:一是广播隔离(广播只在自己的网段里闹,不会波及关键设备);二是故障圈定与访问控制(子网之间必须经路由器,策略想拦谁就拦谁)。家庭路由器里的「访客网络」开关,正是这个思想的最小落地。
还有个日常疑问也在这节解决:IP 地址是谁配的?手工配置(改一行网络设置)早就跟不上设备数量了,现实里靠 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议):设备接入后广播喊「我要地址!」,DHCP 服务器回一个「租约」——分配 IP、掩码、网关、DNS 四件套,附上租期;到期前设备再续租。这就是你连上任意一个 WiFi 都「即插即用」的原因。地址不够时,家里路由器就当起了小 DHCP,给每台接入设备发 192.168.x.x 的内网地址。
辨析 IPv4 vs IPv6 与 NAT:IPv4 只有约 43 亿个地址,早已不敷使用。补丁叫 NAT(网络地址转换):家用路由器把内网的私有地址(10.x、172.16.x、192.168.x)「藏」在一个公网 IP 后面,靠改写端口号区分内部设备——你家手机、电脑、电视共享一个出口地址。根治方案是 IPv6:地址 128bit,「给地球上每粒沙子分一个 IP」也绰绰有余。于是如今一台设备常有「三层身份」:MAC(物理名)、内网 IP(网内门牌)、公网出口 IP(对世界的门牌)——分清这三层,网络故障排查就清晰一半。
🧠 一句话记忆 MAC = 身份证(网卡焊死、局域内用);IP = 邮寄地址(可变化、跨网络用)。
15.3分层:把复杂问题拆开(TCP/IP)
网络通信太复杂了:又要管物理信号、又要管丢包重传、又要管应用程序怎么对话。工程师没有「一口吃成胖子」,而是用了分层(layering)——这个思想你在操作系统、编译里都见过了:把大问题拆成几个小层,每层只负责一件事,对上层隐藏细节。
最常用的模型是 TCP/IP 四层模型(自下而上):
| 层 | 作用 | 类比 |
|---|---|---|
| 应用层 | 具体应用如何用网络(网页、邮件) | 写信的内容 |
| 传输层 | 把数据可靠地送到(TCP/UDP) | 挂号信 vs 明信片 |
| 网络层 | 寻址与路由(IP) | 写地址、找路 |
| 链路层 | 物理传输(MAC、网线/无线) | 邮政货车运信 |
核心思想 分层 = 每层只干一件事、只和相邻层打交道。数据在发送端从上往下层层「包壳」,在接收端从下往上层层「拆壳」。这和第 12 章的「抽象」是同一个思想。
深化:封装——信封套信封
「打包/拆包」具体是怎么打的?发送端的动作是层层加头:应用层产出数据(信纸)→ 传输层在前面加 TCP 头,记上源端口、目的端口、序号(挂号信单据)→ 网络层再加 IP 头,记上源 IP、目的 IP、TTL(面单)→ 链路层再加帧头帧尾,记上源 MAC、目的 MAC(本段交接卡)。接收端反着来,逐层拆头、层层上交。每种「头」就是那一层的快递单:只写本层关心的信息,别的层一概不看。信封套信封看似啰嗦,实则是分层的精髓——任何一层想换掉自己的实现,别的层毫不察觉。
这里必须补一个关键词:端口号(port)。IP 负责找到机器,但机器里同时跑着浏览器、视频通话、游戏好几个程序,数据到了门口该交给谁?端口就是机器内部的「门牌号」(0~65535 的数字),几个常用号有约定俗成:80/443 是网页,53 是 DNS。于是「IP + 端口」才唯一定位一次对话的双方,正如「楼栋 + 门牌」才定位一户人家。
深化:TCP 的可靠——三次握手
传输层的两大主角,性格迥异。UDP(用户数据报协议)只管「扔出去」,不确认不重传——晚到的数据不如直接丢掉,直播和游戏语音偏爱它;TCP(传输控制协议)则把可靠性焊死在协议里,靠三件宝:序号(数据第几字节,丢了能发现、乱了能重排)、确认(每收到就回执)、超时重传(等不到回执就再发一次)。网页、文件、转账,全部走 TCP。
TCP 通信前要「建连」,即著名的三次握手(three-way handshake):① 客户端发 SYN:「我想通话,我的数据从序号 x 开始」;② 服务器回 SYN+ACK:「好,我从 y 开始,你从 x+1 继续发」;③ 客户端回 ACK:「收到,你从 y+1 继续」。为什么两次不行?两个致命场景:其一,若一次「陈旧的 SYN」(很久前发出、堵在网络某处的重发请求)迟到抵达,两次握手下服务器单方面宣布建连并傻等数据——白白占用资源,这就是「历史连接误建立」;其二,两次握手里服务器自己的初始序号 y 得不到对方的确认——服务器无从确信「我发的东西你能从正确位置开始收」。三次的本质:双方各自的「我能听、你能说」都被对方应答过一遍,加上双方的起始序号都拿到了回执。断开则要「四次挥手」——因为 TCP 允许半关闭,一方说完了另一方可能还有话,得两个方向分别告别。
深化:行李转运类比,再深一层
把一次跨国寄件完整展开,你会看到分层模型严丝合缝:你写信,是应用层的内容;快递揽收时给你单号、到站逐段扫描签收,是传输层的确认与重传(包裹丢了凭单号补寄);分拣中心看「省市区」决定发往哪个下一站,是网络层的路由;每一段用卡车/飞机运输、扫码交接,是链路层的搬运。妙处在于:分拣员不看信的内容,快递员不关心包裹最终去哪个省——每层只读自己那层的单据,这正是封装的用处。更妙的是:面单上的目的地全程不变(目的 IP 不变),而每一站的司机和车都在换——这句话里藏着 15.4 的主角,卖个关子,往下看。
另外注意,几乎每一层的头部都带校验和:发送方对内容算出一串「指纹」附在头里,接收方重算一遍比对——对不上就当坏包就地丢弃,绝不将错就错。这正是第 14 章讲过的「数字量阈值再生」在网络上的延续:坏掉的数据宁可扔掉重传,也不让错误往下传。层层校验、层层把关,才有了「不可靠物理线路上的可靠通信」。
📐 例题 3 MTU 分片:装不进就拆开
以太网规定一帧最多携带 1500 字节(MTU);IP 头 20 字节、TCP 头 20 字节。某已建连的 TCP 连接要发送一段 4000 字节的应用数据(忽略一切可选头部)。(a) 到达 IP 层时的 TCP 段共多大?(b) 需要拆成几片?各片装载多少数据?(c) 由谁重组?
思路 每片能装的数据 = MTU − IP 头 = 1480 字节;拆 TCP 段(含 TCP 头)总长 4020 字节。
解 TCP 段 = 4000 + 20 = 4020 字节。 4020 ÷ 1480 = 2.72 → 3 片:前两片各装 1480(整帧恰 1500 字节),第三片装 4020 − 2×1480 = 1060(整帧 1080 字节)。 各片由 IP 层打上「片偏移」,到达后由接收方的 IP 层按偏移拼回完整段,再交给 TCP。
答:4020 字节;3 片(1480 + 1480 + 1060);IP 层重组。 ⚠ 易错点:先算「TCP 段总长」再除以每片容量,别只用 4000;分片与重组都是 IP 层的职责。现实工程里 TCP 会主动探测路径最小 MTU、提前把数据切小——因为中途分片一旦丢一片,整段全部重传,代价太大。
工程中的它
工程师调试网络最常用的「听诊器」是抓包工具(如 Wireshark):把线上跑的帧原样抓下来,逐层拆开展示——应用层看得见请求原文,传输层看得见端口与序号,链路层看得见 MAC。你的屏幕就是那台「快递透视仪」。而在航空领域,机载以太网在标准分层栈的最底层做加固(双路冗余、时间保障),让「尽力而为」的网络也能承载关键数据——分层的思想不动摇,需要多硬就往底层加多硬。
辨析 TCP vs UDP:一个可靠的「挂号信」,一个快速的「明信片」。要一字不差(网页、文件、转账)选 TCP;要宁丢不等(直播、语音、遥测心跳)选 UDP。另一个容易被低估的红利是可替换性:笔记本从 WiFi 切到有线、再到手机热点,物理层整个换了三轮,你的浏览器和网页应用毫无察觉——这就是分层的「黑盒」收益。
🧠 一句话记忆 分层 = 各管一段;发送逐层打包,接收逐层拆包。
15.4路由:数据包如何找到路
互联网由无数网络和 路由器(router)互联而成。你要发的数据被切成一个个 数据包(packet),每个包都带着「目的地 IP」这个地址标签,像一封封信件。
路由器的工作,就像邮局分拣员:收到一个包,看一眼目的 IP,查自己的「路由表」,判断该把包转交给下一站哪个路由器。就这样一棒接一棒、一跳接一跳(hop),包最终抵达目的地。
深化:路由表——只认前缀的「活地图」
路由器查的「路由表」,条目不是「某台机器 → 某条路」,而是「某段前缀 → 下一跳」。查表时若多条都匹配,选掩码最长的那条(越具体越优先);一条都不匹配,就走默认路由 0.0.0.0/0——「其余的都往这走」。你家路由器表里通常就几条:本地网段直连,剩下全交给运营商——这叫「默认路由指向上游」。而 15.2 那个设计在此刻兑现红利:因为位置编进了前缀,一条核心路由条目能代表数百万个地址,全球核心路由表只需几十万条,而不是几十亿条。
两个配套机制让「逐跳」变得可靠。其一,TTL(Time To Live,生存时间):IP 头里这个数字每过一台路由器减 1,减到 0 就地丢弃并回报告——万一哪台路由器配置出错形成环路,包最多转一圈 TTL 烧完就消失,不会在网里永世漂流。其二,逐跳独立决策:没有谁掌握全程路径,每台路由器只负责「下一棒」。妙用是 traceroute 诊断工具:故意发 TTL=1、2、3……的探测包,逼沿途每台路由器回一句「我这跳不动了」,于是你能在屏幕上看到去往某网站的每一站地址与耗时——网络版的「逐站打卡」。
那路由表本身又是谁写的?答案是路由器之间靠路由协议互相通报:发现好路就记下来并转告邻居(一个机构内部常用 OSPF 这类协议自动算最短路;跨运营商之间则用 BGP 互相「宣告」各自负责的前缀)。于是没有任何人坐在中央画图,秩序从千万台机器的互相通报中涌现——和 DNS 的分层授权一样,互联网又一次展示了「无中心的秩序」如何可能。
📐 例题 4 逐跳转发:什么变、什么不变
主机 A(IP 192.168.1.10,MAC-A)要访问远程服务器 B(IP 10.2.0.5,MAC-B),途经一台路由器 R(内网口 MAC-R1、外网口 MAC-R2),A 的默认网关就是 R。请给出两段传输中帧与 IP 头的关键字段,并回答:(d) 若 A 误把目的 MAC 直接写成 MAC-B,会发生什么?
| 阶段 | 源 MAC | 目的 MAC | 源 IP | 目的 IP | TTL |
|---|---|---|---|---|---|
| A → R(局域网内) | MAC-A | MAC-R1 | 192.168.1.10 | 10.2.0.5 | 64 |
| R → B(跨网段后) | MAC-R2 | MAC-B | 192.168.1.10 | 10.2.0.5 | 63 |
解 对照表格:帧的目的 MAC 每一跳都换——因为 MAC 只标识「本段交接的两端」;而目的 IP 全程不变——它是「最终收件人」,写在面单上不许改;源 IP 也不变(回信要靠它);TTL 每过一台路由器减 1。
答:MAC 逐跳换、IP 不变、TTL 递减。(d) 第一段是按 MAC 交付的:交换机在局域网里找不到 MAC-B(B 根本不在本网),包石沉大海。A 该填的是下一跳(网关 R1)的 MAC——这正是 ARP 存在的意义。 ⚠ 易错点:跨网通信时,目的 MAC 永远写网关,不是远端主机——「MAC 管这一棒,IP 管到终点」。
工程中的它
逐跳独立决策换来的,是整个互联网的自愈能力:某台核心路由器宕机,邻居们重新计算、包自动绕行,全球用户最多感到几秒闪断。代价是路径不可预测、包到达顺序可能乱(所以 TCP 要靠序号重排)。而某些关键场合——例如飞行器内部的设备联网——偏偏要确定性:关键数据的每一跳、每一微秒都要算得出来,绝不容许「尽力而为」。于是工程界发展出「预先规划路径 + 双路冗余」的专用网络方案。你看,「尽力而为」与「确定性」是两种各有疆域的哲学,选哪种,取决于你的系统输得起什么。
辨析 路由器 vs 交换机:交换机工作在链路层,读 MAC,负责「网内交接」;路由器工作在网络层,读 IP,负责「跨网指路」。家用「路由器」其实是路由器 + 交换机 + 无线接入点的三合一。再对比电话时代的电路交换:先占好全程线路再通话,独占资源、顺序天然保证,但浪费严重;IP 的分组交换让每个包独立寻路,不保证顺序(TCP 补锅),换来共享与健壮——这一进一退,是通信史最重要的一次转身。
🧠 一句话记忆 数据切包 + 逐跳转发;路由器像邮局,看地址、查路由表、交下一站。
15.5DNS:把域名翻译成 IP
IP 地址是一串数字(如 142.250.72.14),人记不住。于是有了域名(如 google.com)。但网络只认 IP,谁来把「好记的名字」翻译成「机器认的数字」?靠 DNS(Domain Name System,域名系统)。
DNS 就像互联网的「电话簿」:
- 你在浏览器输入域名
google.com。 - 电脑去问 DNS 服务器:「google.com 的 IP 是多少?」
- DNS 服务器查表,返回 IP 地址。
- 电脑再拿这个 IP 去发起真正的连接。
📖 名词溯源:DNS Domain(域)指互联网上划分出的「名字空间」,Name System 就是「命名系统」。整个 DNS 是一套全球分布式的翻译体系——没有单一机构存下全部映射,而是层层授权、分工协作,所以既庞大又高效。
深化:没有「总机」的电话簿
DNS 最了不起的设计,是它没有中央总表。任何一台存着「全球所有域名」的服务器,都扛不住数十亿设备的查询,也承受不起一次宕机。DNS 的答案是分层授权:根服务器只记「.com 归谁管」;.com 的顶级域服务器只记「example.com 的权威在哪」;example.com 自己的权威服务器才存真正的记录。层层指路,没有任何一台机器掌握全部——和 15.3 的分层、15.4 的逐跳如出一辙:互联网哲学从来如此,不把鸡蛋放进一个篮子。
分工也很讲究:你的电脑只问本地递归服务器(运营商或公司自建),这叫递归查询——「你帮我查到底」;递归服务器替你一站站去问根、问顶级域、问权威,这叫迭代查询——「你只告诉我下一步问谁」。答案到手存入缓存:每条 DNS 记录自带 TTL(有效期),期内同样的询问直接从缓存秒回。浏览器、操作系统、路由器、运营商递归服务器,四级缓存层层兜底——全部命中时,你根本感觉不到 DNS 的存在。
域名的读法也值得注意:www.example.com 其实是 www.example.com.——末尾那个常常被省略的「.」代表根。从右往左读,范围逐级收窄:根 → .com → example → www,与 IP 地址「越靠前范围越大」方向恰好相反,初学最容易在这两个方向上打架。
📐 例题 5 DNS 的耗时账:缓存值多少钱
你的电脑与本地递归服务器往返 10ms;递归服务器与根、与 .com 顶级域、与目标权威服务器的往返各 40ms。某网页共引用 30 个不同域名。(a) 全部未命中缓存时,DNS 环节共耗时多少?(b) 全部命中本地缓存呢?
思路 单个未命中 = 你与递归服务器 1 次往返 + 递归服务器三站各 1 次往返。
解 单个域名 = 10 + 3 × 40 = 130ms;30 个域名 = 30 × 130 = 3900ms = 3.9s。 全部命中缓存:每个域名由本地递归服务器直接回答,≈ 0ms(只剩你与递归服务器的一次往返,通常不足 1ms 量级的差异忽略不计)。
答:未命中共约 3.9 秒;命中则近乎为零——差出的这几秒就是缓存的价值。 ⚠ 易错点:三站跑腿是「递归服务器」在跑,不是你的电脑挨个去问;现代浏览器会「预解析」页面里的域名、并发发起查询,也是在跟这笔账较劲。
工程中的它
DNS 早已不只是「翻译」,还能调度:CDN(内容分发网络)在各地部署镜像服务器,DNS 把你的查询「就近」解析到离你最近的那台——同一域名,不同城市解析出不同 IP,内容却一模一样。这叫「DNS 智能解析」,是全网加速的第一跳。它也带来一个经典运维困惑:改了解析为什么不立即生效?因为各级缓存里还存着旧记录,得等 TTL 到期逐层刷新——工程上改 DNS 前会先把 TTL 调短,就是这个道理。
顺便认识一下 DNS 的「老祖宗」:hosts 文件。互联网早期机器不多,每台电脑里放一个文本文件,一行一条「域名 IP 地址」,人工维护、全球同步——后来机器爆炸式增长才被迫发明了 DNS。这个文件今天还活着:操作系统查询 DNS 之前总要先看它一眼,所以往里写一条域名指向「本地回环」,就能把某个域名在自家电脑上「屏蔽」掉。理解了 DNS 的来龙去脉,hosts 这个小文件就不再是玄学。
辨析 域名 vs URL:https://example.com/path/page.html 里,example.com 只是域名;URL = 协议(https)+ 域名 + 路径,是「完整地址」。另一个安全常识:DNS 查询默认不加密,早期很容易被「半路劫持」改答案(把你导向假网站),现代的加密 DNS(DoH/DoT)就是为堵这个漏洞而生——名字服务越重要,越要防「指错路」。
🧠 一句话记忆 DNS = 互联网电话簿:域名 → IP 地址。
15.6客户端与服务器
网络应用普遍采用 客户端/服务器(client/server)模型,分工明确:
- 客户端(client):发起请求的一方,比如你的浏览器。
- 服务器(server):提供服务、响应请求的一方,比如存着网页的那台机器。
你打开一个网页,背后发生的事,正是本章所有知识的总合:客户端查 DNS 得到 IP → 用 IP 路由到服务器 → 通过分层协议可靠地传输 → 服务器响应 → 数据原路返回,浏览器渲染成页面。
收官之思 恭喜你走完了 15 章。回头看:从一个电子的开关,到 bit,到逻辑门,到加法器,到CPU,到操作系统、编程语言、网络——你已亲手把「0 和 1」垒成了整个数字世界。你输入的这个网址,正是这一整套机制,此刻正在为你运转。
深化:HTTP——应用层的「点单规矩」
应用层最常见的协议是 HTTP(超文本传输协议),规矩很朴素:客户端发「方法 + 路径 + 头部」,服务器回「状态码 + 内容」。状态码是个值得记住的家族:2xx 成功(200 OK)、3xx 重定向(302:内容搬走了,去新地址拿)、4xx 客户端错(404:没这页,你输错了)、5xx 服务器错(500:我这边坏了)。HTTP 天生无状态——服务器不记得你上次来过,每次都当初次见面;要「记住你」得靠 Cookie(服务器发给你的会员卡,之后每次请求你都自动带上)或服务器端的会话。至于地址栏那把小锁,是 HTTPS:在 TCP 与 HTTP 之间垫一层加密,防窃听防篡改。
📐 例题 6 敲下回车之后:343ms 都花在哪
浏览器访问一个网站:DNS 解析 50ms;客户端与服务器往返时间(RTT)50ms;服务器处理请求 40ms;页面 HTML 共 100KB,下载带宽 100Mbps;浏览器渲染 120ms。请求建立 TCP 连接(三次握手)、随后一次 HTTP 请求往返。求从敲回车到页面呈现的总耗时。
思路 把耗时拆成段:DNS(15.5)→ 三次握手 = 1.5 × RTT(15.3)→ 请求+响应 = 1 × RTT + 服务器处理(15.6)→ 传输 HTML(15.1 的发送时延)→ 渲染(14.4)。
解 DNS = 50ms;握手 = 1.5 × 50 = 75ms(第三个 ACK 不必等回应,可与请求同发);请求往返 = 50ms,加处理 40ms = 90ms;传输 = 100KB × 8 ÷ 100Mbps = 8ms;渲染 = 120ms。合计 50 + 75 + 90 + 8 + 120 = 343ms。
答:约 343ms。 ⚠ 易错点:三次握手按 1.5 × RTT 计而不是 2 ×(第三个 ACK 不等回应);每个加数都能对上一章知识——这道题就是全章的合影。真实的网页还要加载图片、脚本,耗时翻几倍很正常。
这 343ms 还能反过来读:想优化首屏速度,工程师能动的从来不是渲染(浏览器极限)和传播(光速极限),而是等待的次数——HTTP/2 允许一个连接并行跑多个请求、HTTP/3 干脆把 TCP 换成 UDP 之上的新传输层以省掉握手等待,万变不离其宗:「少等几个来回」。看懂了 343ms 的构成,你也就看懂了半个网络优化行业。
收官:十五级台阶,你已登顶
这是全册最后一节,值得把来路完整铺开。从第 1 章到第 15 章,你其实只在做一件事:把「开关」一级级垒成「世界」。下面这张表,是整条登山路:
| 章 | 主题 | 你带走的一句话 |
|---|---|---|
| 1 | 计算机的本质 | 自动执行指令的电子机器 |
| 2 | 二进制 | 0 和 1,是数也是码,一切的字典 |
| 3 | 半导体与晶体管 | 把「开关」做到肉眼看不见的小 |
| 4 | 逻辑门 | 电路学会说「与、或、非」 |
| 5 | 组合逻辑 | 电路学会「算」 |
| 6 | 时序逻辑 | 电路学会「记」 |
| 7 | 冯诺依曼结构 | 程序也不过是数据,装进内存一起算 |
| 8 | CPU 内部原理 | 取指、译码、执行,节拍器永不停 |
| 9 | 内存的原理 | 快而贵的临时军师 |
| 10 | 存储的原理 | 慢而久的忠实档案 |
| 11 | 指令与机器语言 | 机器的母语,几字节定乾坤 |
| 12 | 操作系统 | 管好 CPU、内存、设备的总管家 |
| 13 | 编程语言与编译 | 人与机器之间的翻译官 |
| 14 | 输入输出设备 | 模拟世界与数字世界的海关 |
| 15 | 网络基础 | 从一台机器,到整个世界 |
知识去向:下一站去哪
这 15 章是「地图」,后续每一门课都是某片区域的「深度游」:计算机组成原理深挖第 7~11 章(流水线、缓存层级、中断细节);操作系统展开第 12 章(进程调度、虚拟内存、文件系统);计算机网络展开本章(TCP 拥塞控制、路由算法、网络安全);嵌入式系统落地第 3~6 章(单片机、总线、实时性);数据结构与算法则是编程课的地基——怎么把步骤组织得又快又省。带着这份地图去,任何一门都不会迷路。
最后,回到你自己的职业现场想一想:现代飞行器本质上是一台「会飞的计算平台」——成百上千个传感器经 ADC(第 14 章)把物理世界数字化,飞控计算机(第 8 章)按毫秒级节拍运算,各设备经总线和网络(本章、第 14 章)交换信息,显示与告警(第 14 章)再把结果还给人。理解了从 0/1 到系统的整条链路,你再看任何一台智能设备、一张系统架构图,都拥有了「透视」的底气——这种通透,正是工程判断力最坚实的地基。
合上书之前,给你三个巩固的建议。其一,对着上面的 15 章表格凭记忆复述——每章只要求说出一句话,说不出的那格就是该回去翻的那章;其二,动手拆一次:找一台旧键盘、旧鼠标或旧电脑,对照第 10~14 章认一认里面的存储芯片、电容和接口;其三,抓一次包:装个抓包工具,看自己打开一个网页时 DNS、TCP、HTTP 轮番登场——把 343ms 亲眼拆开。知识只有被使用过一次,才真正属于你。
🧠 一句话记忆 客户端发起、服务器响应;一次网页请求,是全书所有知识的合体。
本章小结
- 网络解决三问:谁是谁(地址)、怎么传(协议)、走哪(路由)。
- MAC 是网卡焊死的物理地址(局域网内用),IP 是可变的逻辑地址(跨网络用)。
- TCP/IP 分层让每层各司其职:应用、传输、网络、链路;发送逐层打包、接收逐层拆包。
- 路由靠路由器查表「逐跳转发」数据包;DNS 把域名翻译成 IP。
- 网络应用多为客户端/服务器模型。
- 子网掩码划分网络位与主机位,可用主机数 = 2主机位 − 2;ARP 把下一跳 IP 翻译成 MAC。
- 三次握手让双方初始序号互相确认、防止历史连接误建立;TCP 靠「序号 + 确认 + 超时重传」保可靠。
- 逐跳转发中:目的 IP 全程不变,帧的 MAC 每跳更换,TTL 逐跳递减。
- DNS 分层授权 + 多级缓存;CDN 借 DNS 把用户「就近调度」到最近的服务器。
读完本章,你应该能……
- 说出网络通信需要解决的三个核心问题。
- 区分 MAC 地址与 IP 地址,并用「身份证/邮寄地址」类比。
- 列出 TCP/IP 四层并说出每层的作用。
- 解释路由如何「逐跳转发」数据包。
- 解释 DNS 的作用,以及一次网页请求的完整链路。
- 算出一个 /N 子网的可用主机数,并判断两个地址是否同网段。
- 解释三次握手为什么不能省成两次。
- 说出数据包逐跳转发中 MAC、IP、TTL 各自的变化规律。
- 把一次网页请求的耗时拆段估算,并说出每段对应哪章知识。
思考题
1. 网络通信要解决哪三个核心问题?
提示:谁是谁(地址)、怎么传(协议)、走哪条路(路由)。
2. MAC 地址和 IP 地址各是什么?为什么需要两种?
提示:MAC=物理地址(局域内),IP=逻辑地址(跨网络);一个管近处、一个管远处。
3. 用「打包/拆包」解释 TCP/IP 分层。
提示:发送端数据从上往下层层加壳,接收端从下往上层层拆壳,每层各司其职。
4. 你在浏览器输入域名到看到网页,经历了哪些关键步骤?
提示:DNS 解析域名→IP,路由逐跳转发,分层传输,服务器响应返回。
5. TCP 握手为什么必须是三次,两次为什么不行?
提示:其一,陈旧 SYN 迟到会让两次握手「误建连接」白占资源;其二,服务器的初始序号在两次握手中得不到客户端确认。
6. 一个 /26 子网最多容纳多少台可用主机?写出算法。
提示:/26 留 6 位主机号 → 2⁶ − 2 = 62(全 0 是网络地址、全 1 是广播地址)。
7. 数据包跨多个路由器转发时,帧的 MAC、IP 头的目的地址、TTL 各怎么变化?
提示:MAC 每跳换「下一棒」,目的 IP 全程不变,TTL 每过一台路由器减 1。