← 返回知识库

基础知识:计算机网络

基础知识

一、网络在解决什么问题

计算机网络让不同设备上的程序能够交换数据。一次访问网页,看起来只是点击一个链接,背后其实经历了:找到服务器、建立连接、发送请求、接收响应、把数据交给浏览器渲染。

整门学科的目标可以浓缩成一句话:让任意两台主机上的任意两个应用进程,跨越复杂的网络交换数据。这句话里有三个关键词,分别引出后续各层要解决的核心问题:

  • 应用进程 → 数据要交给哪台主机上的哪个进程?→ 传输层
  • 跨越复杂的网络 → 两台主机不在一个局域网,中间怎么寻址、怎么转发?→ 网络层
  • 交换数据 → 双方按什么格式、什么规则交换,对方才看得懂?→ 应用层

记住这个推导逻辑:网络里的协议不是知识点堆砌,而是同一个通信问题一层一层长出来的解决方案。

二、用分层理解网络

分层把复杂问题拆开:上层关心「我要什么数据」,下层关心「怎样可靠地送到对方」。如果把所有规则塞进一个大协议,任何一处变化(比如有线换无线、新增数据格式)都会牵动其他部分;拆层之后,层与层只通过约定好的接口协作,单层更换实现不影响其他层。这是软件工程里的解耦思想。

层次主要职责常见概念
应用层定义两个应用进程如何交换信息HTTP、DNS、FTP、SMTP、WebSocket
运输层在主机上的两个进程之间传递数据TCP、UDP、端口、复用/分用
网络层决定数据经过哪些异构网络到达目标主机IP、路由器、路由、ARP
数据链路层在同一段链路上把帧交给下一个设备MAC 地址、交换机、Wi-Fi、以太网
物理层把比特变成能在介质上传播的信号双绞线、光纤、编码、调制

运输层也叫传输层(Transport),数据链路层也叫链路层。

不要把它当成必须死背的五层名称。排障时只要问:问题发生在应用、连接、寻址,还是本地链路?范围会立刻缩小。

封装与分用:发送端从上到下,每过一层就加上这一层的头部(HTTP 数据 → TCP 报文段 → IP 分组 → 链路帧 → 物理信号);接收端从下到上逐层拆掉。路由器只处理到网络层,不关心进程相关的东西。

三、一次打开网页发生了什么

https://example.com 为例:

  1. DNS 查询:把域名解析成服务器 IP 地址;
  2. 建立连接:通过 TCP 三次握手与目标服务器协商连接;HTTPS 还会进行 TLS 握手;
  3. 发送 HTTP 请求:浏览器告诉服务器需要哪个资源;
  4. 接收响应:服务器返回 HTML、CSS、JavaScript、图片等数据;
  5. 继续请求依赖资源:浏览器解析页面后,再获取其中引用的资源。

其中,IP 地址帮助找到设备,端口帮助找到设备上的具体程序。比如 443 常用于 HTTPS,8000 常被本地开发服务器使用;它们和操作系统中的进程通信端口不是同一个概念。

四、入门排查顺序

网络异常时,可以按由近到远的顺序检查:

  1. 本机是否已联网,DNS 是否能解析域名;
  2. 目标 IP 是否可达;
  3. 目标端口是否开放、服务是否正在监听;
  4. 应用协议是否正确,例如 HTTPS 证书、代理配置或请求路径。

把「域名、IP、端口、协议」四个词区分清楚,就能读懂大多数开发中的网络错误信息。


五、性能指标:怎样算一个「好」网络

能通信只是底线。评价网络好不好,本质只关心两个问题,几乎所有指标都围绕它们展开:

关心的问题引出指标
单位时间能传多少数据(快不快)速率、带宽、吞吐量
一份数据从发到收要多久时延、RTT
  • 速率:单位时间传输的比特数(bit/s,小写 b 是比特,大写 B 是字节,1B = 8bit)。
  • 带宽:链路理论上能达到的最高传输速率;吞吐量是实际值。家里宽带 1000Mbps 但中间某段链路只有 100Mbps,实际吞吐量还是 100Mbps。
  • 时延 = 发送时延(分组长度 / 发送速率)+ 传播时延(链路长度 / 信号传播速度)+ 排队时延 + 处理时延。
  • RTT:往返时间。TCP 建立、HTTP 请求、可靠传输确认都要等一个 RTT,RTT 越大反复等待的开销越大。
  • 时延带宽积 = 时延 × 带宽,表示链路上同时「在路上」的比特数。它直接决定发送方要保留多少未确认数据(滑动窗口多大)才能占满链路:如果发一个等一个(停止等待),等待期间链路是空的。
  • 信道利用率:不是越高越好。长期接近满负荷会导致分组排队、丢包、重传,反而越用越慢。

关键认知:网络设计始终是多个指标之间的权衡。指标不是背公式,而是指导协议设计的准则——为什么确认协议要从停止等待演进到滑动窗口(提高吞吐量/利用率)、为什么 TCP 要做拥塞控制(避免排队丢包)、为什么 DNS 要缓存(减少 RTT)。


六、应用层

应用层解决「两个进程说什么话、消息长什么样、谁先发、收到怎么回」。

6.1 DNS:域名系统

人类好记域名,但网络层认 IP。DNS 把域名解析成 IP。它不是一张「域名→IP」的大表:全世界网站太多、名字还会变,所以把域名空间做成层次结构(根 → .com/.cn → …),查询时先问本地 DNS 服务器,有缓存直接返回(省一次往返),没有就沿层次逐级查。

DNS 本身也是 C/S 结构,有查询/响应报文,只是它服务的是其他应用而不是用户。

6.2 HTTP

浏览器发请求、服务器回响应。请求里写明要哪个资源(GET/POST),响应里带状态码(2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务端错误)。它只规定交流模式,不负责路由、不负责把比特变信号——这些交给下层。

HTTP 要求下层提供可靠、有序的传输 → TCP(默认 80 端口)。早期每个对象建一次连接,后来改进为一条连接连续请求多个对象,本质是减少不必要的等待(吞吐量/RTT 的思路)。

6.3 两种应用模型

  • C/S:能力集中在服务器,客户端主动发起请求。
  • P2P:节点既请求资源也提供资源,参与者越多能提供资源的节点越多,不必把所有数据压在中枢服务器上(但仍可能需要服务器帮助发现节点/维护索引)。

6.4 其他协议与选型

  • FTP:控制信息与数据分离,控制连接用 TCP 21 端口,数据连接另开。
  • 电子邮件:SMTP 发送、POP3/IMAP 接收。
  • 选型规律:HTTP/FTP/SMTP/POP3 要数据完整有序 → TCP;DNS 查询一次很短,每次建连接反而亏 → UDP

七、运输层

运输层往上满足应用对可靠/有序/实时的要求,往下复用网络层的「主机到主机」交付,解决进程到进程

7.1 端口与复用/分用

IP 地址找到主机,端口号找到主机上的进程。多个应用各自绑定不同端口,一起把数据交给网络层发送叫复用;操作系统查看报文段里的目的端口,把数据交给对应进程叫分用

7.2 UDP 与 TCP

UDPTCP
连接无连接,想发就发面向连接
可靠性只加端口、长度、校验和,不保证不丢不乱序可靠、有序的字节流
适用查询短小、重发便宜(DNS、音视频)需要完整有序(网页、文件、邮件)

校验和只能发现数据损坏,发现不了丢包,也不负责重传——所以有校验和≠可靠。

7.3 TCP 的连接管理

  • 三次握手(缺一不可):①客户端发 SYN 表明想建立连接(验证自己发送正常)→ ②服务器回 SYN+ACK(验证服务器接收正常)→ ③客户端回 ACK(验证客户端接收也正常)。两次握手无法确认客户端接收能力正常。
  • 四次挥手:连接要两个方向都关闭。先 FIN+ACK 关一方,另一方发完数据再 FIN+ACK 关另一方向。最后一个 ACK 后有 TIME_WAIT:如果这个 ACK 丢了,对方还能重发 FIN。

7.4 可靠传输

TCP 头部字段都是为具体问题设计的:序号/确认号管可靠传输,标志位管连接,窗口管流量控制,校验和管检错。

  • 序号 + 累积确认:确认号表示「下一个希望收到的字节序号」,意味着之前的数据都收到了。
  • 超时重传:超过时间没等到确认就重发。
  • 快重传:连续收到 3 个重复 ACK,说明中间丢了一个报文段,不等超时立即补发。

7.5 滑动窗口:GBN 与 SR

  • 停止等待:发一个等一个,链路大部分时间是空的。
  • 滑动窗口:允许多个未确认分组同时在网络中,发一个不等确认继续发,把链路占满。
  • 回退 N 帧(GBN):接收方只收按序到达的,丢了一个就把它和后面的全重传。
  • 选择重传(SR):接收方缓存乱序分组、逐个确认,发送方只重传真正丢的那个。
  • 真实 TCP 是两者结合:累积确认接近 GBN,接收方缓存乱序段并支持 SACK 又借鉴 SR。

7.6 流量控制 vs 拥塞控制(易混,务必分清)

流量控制拥塞控制
保护对象接收方(缓冲区有限,别把它压垮)中间网络(路由器队列有限,别让全网丢包)
手段接收窗口告诉发送方还剩多少空间拥塞窗口反映发送方认为网络能承受多少
限制实际发送量 = min(接收窗口, 拥塞窗口)同上

TCP 怎么感知拥塞?它看不到路由器队列,只能从丢包、重复 ACK、超时这些现象推断。所以策略是:从一个小的窗口开始试探(慢开始,指数增长尽快探测网络容量)→ 到阈值后转为拥塞避免(线性增长)→ 收到 3 个重复 ACK 用快重传补发并调窗 → 发生超时说明拥塞更严重(连对端信息都收不到),窗口要更明显地下调。

现在考研/面试的题目趋势是把可靠传输、滑动窗口、流量控制、拥塞控制全部融进一个情景里出大题,需要理解它们如何协同工作。


八、网络层

目标:把异构网络(WiFi/光纤/以太网…)连接起来,提供主机到主机的尽力而为交付。IP 本身不可靠——不承诺一定送到、不承诺按序送到、可能丢可能重复。TCP 的可靠性是在 IP 提供的基础上补的。

8.1 转发 vs 路由

  • 转发:路由器查自己的转发表,决定分组从哪个接口交给下一条(眼前这一跳怎么走)。
  • 路由:生成并维护转发表的过程(每台路由器事先知道大致往哪里走)。
  • 默认网关:本网络第一台路由器。

8.2 IP 数据报头部

不必死背字段,但要理解每个字段解决什么问题:版本号、源/目的 IP、协议字段(里面装的是 TCP 还是 UDP)、TTL(生存时间,每过一跳减一,减到 0 丢弃并通过 ICMP 报告,防止分组在网络里无限转圈)、区分服务(标记优先级,实际网络中路由器一般不真正区分对待)、首部校验和。

8.3 分片

不同链路允许的帧大小(MTU)不同(如以太网 1500 字节 vs 某链路 500 字节)。大的数据报要拆成小片:标识标记同属一个数据报,标志位 MF 表示是否还有后续片,片偏移(以 8 字节为单位)告诉接收方每片在原数据报的哪个位置。重组由目的主机完成,中间路由器只负责分片和转发,避免中间节点维护状态。

8.4 IP 地址与 CIDR

IP 地址不能每台主机随便编号,否则路由表会爆炸。它必须分层:前面是网络号,后面是主机号。现代用 CIDR172.16.32.0/20 表示前 20 位是网络前缀)+ 子网掩码(连续的 1 表示网络部分)。

  • 子网划分:在一个大网络里再借主机位细分,让内部管理更细。
  • 路由聚合:把有共同前缀的多个网络合并成一条更短前缀的路由,让外部路由表更小。
  • 最长前缀匹配:匹配到多条路由时选前缀最长(覆盖范围最小)的那条,既能压缩路由表又能保留细粒度控制。

8.5 配套协议

  • DHCP:主机入网没有 IP,广播 Discover(源 0.0.0.0 → 目的 255.255.255.255)→ Offer → Request → ACK。IP 有租期,约 0.5 租期时发 Request 续约;不用了发 Release 释放。
  • ICMP:报告 TTL 超时、目标不可达等错误;ping 用回送请求/应答测连通性,traceroute 逐跳增大 TTL 让路径上的路由器依次返回超时信息来探测路径。
  • NAT:内网多台主机共享少量公网地址(改写源/目的地址)。缓解 IPv4 不足,但代价是端到端不再直接,外部主机不能随意主动找到内网主机。
  • IPv6:128 位地址(8 组十六进制),固定 40 字节头部,取消头部校验和,中间路由器不分片(源主机用扩展首部处理),支持自动配置,有单播/组播/任播。

8.6 路由算法与协议

  • 距离向量(RIP):只维护「到各目的网络的距离 + 下一跳」,定期与邻居交换;算法简单但坏消息传播慢(链路断了要计到无穷才收敛)。RIP 用跳数,超过 15 视为不可达,适合小网络。
  • 链路状态(OSPF):每台路由器广播自己到邻居的链路代价,全网得到完整拓扑后用 Dijkstra 算最短路径。同步信息更多但收敛快,适合较大网络,可划分区域。
  • 自治系统(AS):一个学校/运营商/大公司内部网络。AS 内用 RIP/OSPF(尽快找代价合适的路径);AS 间BGP(除了可达性,还受策略、商业关系、安全影响,追求全网可接受的可控路径,而不是数学意义上的最短)。

8.7 组播与移动 IP

  • IP 组播:直播/视频会议场景,发送方只发一份,到路径分叉点路由器才复制;用 D 类地址(224 开头),配套 IGMP。介于单播(每份都发一次)和广播(所有主机都收)之间。
  • 移动 IP:主机高速移动、IP 不断变化时,用归属代理 + 外地代理 + 转交地址,归属代理截获分组并通过隧道转发到主机当前所在网络。对通信方而言移动主机的地址不变。

九、数据链路层

网络层关心「从源主机到目的主机怎么走」,数据链路层只关心这一跳怎么把帧交给下一个设备。

9.1 组帧(帧定界)

把 IP 数据报封装成帧,让接收方分清一帧从哪开始、到哪结束:

  • 字符计数法:帧头写长度,但长度字段出错会连环错位。
  • 字符填充法:用特殊字符标记起止,数据里出现特殊字符就在前面加转义字符。
  • 比特填充法(HDLC):数据里连续出现 5 个 1 就插入 0,接收方再删掉,标志字符就不会出现在数据内部。
  • 违规编码法:借用物理层「不可能出现在正常数据里」的信号组合当边界。

9.2 差错控制

链路有噪声,比特可能翻转。先分两件事:检错(发现传错了)vs 纠错(还能直接反推出原数据)。

  • CRC(循环冗余校验):只能检错,不能纠错。
  • 海明码:安排多个校验位,不同位置出错得到不同校验结果,能定位并纠正单个比特错误。

能发现/纠正比特错 ≠ 可靠传输:整帧丢了、确认丢了、接收方来不及处理,还是要靠与 TCP 同源的确认/重传/序号/窗口机制(停止等待、GBN、SR)。链路层比传输层额外关注「帧内比特有没有错」,所以要加检错/纠错。

9.3 点对点链路

两台路由器通过专线连接(广域网)。PPP:灵活,可封装多种网络层协议,用 CRC 检错但不纠错、不重传,错了直接丢,可靠性交给上层。HDLC:面向比特,控制能力更完整。

9.4 介质访问控制(重点)

多个设备共享一条信道时谁先发?三大类方法:

① 信道划分(资源分好,不会冲突,但分配固定、没人用时浪费):

  • 频分复用(FM 电台各占频道)、时分复用(各占时间片,同 CPU 调度)、波分复用(光纤不同波长,本质是频分)、码分复用(不同正交码叠加在一条链路,用向量的正交性区分)。

② 随机访问(谁有数据谁就发,冲突后再处理):

  • ALOHA → 时隙 ALOHA(只在时隙开头发,缩小冲突窗口)→ CSMA(先听信道空不空再发,但不能完全避免:相距远的设备可能互相没听到)。
  • CSMA/CD(有线以太网,半双工时代):边发边听,检测到冲突立刻停。因此要设最小帧长(与传播时延相关),保证发送完之前最远端的冲突能传回来被发现。
  • CSMA/CA(无线 WiFi / 802.11):无线网卡信号强,难以边发边听远端微弱的信号;还有隐藏站问题(B、C 互相听不到,同时发给 A 造成碰撞)。所以改为避免碰撞:发送前随机退避,并可发 RTS/CTS 预约信道(宣告一段 NAV 时间,周围设备别发)。

③ 轮询访问(令牌传递):拿到令牌的设备才能发,发完交给下一个,组成环形。不会冲突、每台设备最终都有机会,但令牌丢失或设备故障需要额外处理。

9.5 MAC 地址与 ARP

  • MAC 地址:48 位,网卡出厂全球唯一。它叫「物理地址」但是数据链路层的东西,只在当前链路有效;而 IP 地址跨网络一直不变。
  • 数据报从源到目的 IP 不变,但每经过一条链路,帧头部的源/目的 MAC 都要换成当前链路的。
  • ARP:查「下一条 IP 地址对应的 MAC」。先查缓存,没有就在本地网络广播 ARP 请求(目的 MAC 为全 F)。跨网络时只查默认网关的 MAC,ARP 广播只在当前局域网有效,路由器不转发。

9.6 网络设备

设备所在层特点
中继器 / 集线器物理层只做信号整形放大,不看内容;集线器上的设备共享一个冲突域,同一时刻只能一个设备发
交换机 / 网桥数据链路层读目的 MAC 转发;通过自学习建立 MAC 表(收到帧就记下源 MAC 对应哪个端口,查不到就泛洪);每个端口独立冲突域
路由器网络层读 IP 分组,跨网络转发

普通交换机不自动隔离广播域,要进一步隔离需要用 VLAN 或路由器。


十、物理层

把比特变成介质上能传播的信号(内容偏通信原理,简单理解即可)。

10.1 基本概念

  • 信源(产生数据)→ 信号在信道中传播 → 信宿(使用数据)。传的是数据,介质里跑的是信号,信号经过的路径叫信道。
  • 比特率 vs 波特率:一个码元(一次信号状态变化)不一定表示一个比特——如果有 4 种可区分的电平,一个码元就能表示 2 比特。波特率 = 每秒码元数,比特率 = 每秒比特数。
  • 状态分得越细,一点噪声就分不清了——这就是物理层的核心矛盾。

10.2 编码与调制

  • 编码:数字数据 → 数字信号,用不同电平/跳变表示 0 和 1(如曼彻斯特编码)。
  • 调制:把基带信号搭到载波上,调幅 / 调频 / 调相。

10.3 信道的极限

  • 奈奎斯特定理:理想无噪声信道,带宽与码元状态数决定最大传输速率。
  • 香农定理:有噪声信道的上限,取决于带宽与信噪比(S/N,dB 要换算成倍数,如 30dB = 1000)。
  • 意义:滑动窗口、缓存、路由选择能提高利用率,但突破不了物理信道在带宽和噪声下的极限——这是整个网络的天花板。

10.4 交换方式

方式做法特点
电路交换先建立端到端专用通路、预留资源时延稳定可预测,但空闲时资源浪费
报文交换整份报文存储转发能错峰,但报文大、排队久
分组交换拆成小分组独立转发互联网采用;存储转发 + 统计复用,利用率高;代价是排队时延波动、拥塞时丢包

分组交换之下还有两种组织方式:

  • 虚电路:预先建立逻辑路径,沿途路由器保存路径状态,后续分组沿路径转发。
  • 数据报(IP 采用):每个分组独立根据目的地址和当前转发表选择下一跳,可能走不同路径;中间路由器不保存连接状态。注意与 TCP 的端到端连接区分开。

10.5 介质与接口

介质主要有双绞线、同轴电缆、光纤、无线介质,了解各自的适用范围和特点即可。物理层接口特性约定「插口长什么样、引脚干什么、电压/光功率多少、速率多快、何时收发」:机械特性、电气特性、功能特性、规程特性。


十一、回顾:一条线串起来

回到最初的目标,五层各解决一段:

解决什么
应用层两个进程怎么说话
运输层数据交给哪个进程,要不要可靠、有序
网络层目的主机在哪、一路上怎么走
数据链路层这一跳怎么把帧交给下一个设备
物理层把比特真正跨过介质

顺着应用需求逐层向下,就能搭起一套完整通信系统。读网络的正确方式不是背协议名,而是面对一个通信问题,问自己:这一层在解决什么问题?它给上层提供什么服务?它和上下层怎么配合?

参考链接

  1. 计网大观:拒绝知识点罗列!从通信需求出发,推导整个网络架构——2 小时!(待转录)