网络原来如此
COMPUTER NETWORKS · 零基础长篇教程

互联网并不遥远,
它从一次请求开始。

从浏览器输入网址的那一刻出发,沿着数据真实经过的路径,逐层理解 IP、TCP、DNS、HTTP、HTTPS 与 SSH。

开始学习预计阅读 55 分钟
一次请求的方向
◫你的电脑192.168.1.10
01
路由器INTERNET许多网络的网络
▤服务器203.0.113.8
9核心章节
30+图解与示例
4动手实验
4综合测验
◎
怎么使用这份教程?

我写网络笔记时最常遇到的困难,是每个名词都认识,却说不清它们在一次请求里先后做了什么。先顺序读完“网页访问全程”,建立一条请求路径;再深入 TCP、HTTP、HTTPS。遇到术语时,先确认它解决的具体问题、位于哪一层,再看协议细节。每节末尾都有一个可以立刻完成的小实验。

01
FOUNDATION

网络到底是什么?

网络的本质,是让不同设备上的程序交换数据。

两台电脑直接连一根网线,可以构成最小网络;许多局域网再通过路由器相连,就形成了互联网(Internet)。它并没有一个“总控制中心”,而是由家庭网络、学校网络、公司网络、运营商网络和数据中心彼此连接而成。

终

终端设备

电脑、手机、服务器。它们是数据的产生者和最终接收者,也叫主机。

交

交换机

连接同一局域网内的设备,主要依据 MAC 地址转发以太网帧。

路

路由器

连接不同网络,依据 IP 地址和路由表决定数据包的下一站。

理解网络必须分清的 4 个量

带宽 Bandwidth一条链路单位时间最多能运多少数据,例如 500 Mbps。像公路的车道数。
时延 Latency数据从起点到终点花费的时间,例如 30 ms。像一次行程所需时间。
吞吐量 Throughput实际每秒成功传输的数据,通常小于带宽。受拥塞、协议开销等影响。
丢包率 Packet loss数据包在途中未到达的比例。拥塞、无线干扰或设备故障都可能造成丢包。
把四个量分开看

带宽是链路的理论容量;吞吐量是实际成功传输的速率;时延是一个数据单元从发送到抵达所经历的时间;丢包率是未成功抵达的数据包占已发送数据包的比例。它们相关,却不能相互替代。

先分清楚:网络的规模

个

PAN 个人局域网

覆盖一两米内的设备互连,例如蓝牙耳机连接手机。

家

LAN 局域网

覆盖一个房间或一栋楼,由交换机串起来的设备群。你家的 Wi‑Fi 就是一个 LAN。

广

WAN 广域网

覆盖城市、国家甚至全球。互联网可以看成无数个 WAN 与 LAN 互连的结果。

局域网内常见的连接方式:拓扑

设备之间如何连线,决定了网络怎么扩展、故障怎么蔓延。四种最容易遇到的拓扑:

星型 Star所有设备都接到一台交换机,家中与办公室最常见的形态,单点故障少、易于排障。
总线 Bus所有设备共用一条线缆,架设便宜,但一台设备出问题可能拖垮整段。
环型 Ring设备连成闭环,数据沿环传递,可靠性有限,如今较少见。
网状 Mesh设备彼此多路相连,互为冗余;骨干网和云数据中心常用,代价是成本高。

时延不是一种:它由四段组成

当我们说"时延 30ms",其实包含四种成分。分清它们,才能看懂"为什么跨洋 Ping 有物理下限":

成分由什么决定典型量级
处理时延路由器查表、检查校验和的速度几十微秒
排队时延在路由器出口队列中等待的时间,拥塞时激增0 ~ 数十毫秒,是网络抖动的主要来源
传输时延把整段数据推上线缆的时间 = 数据长度 ÷ 带宽1KB ÷ 100Mbps ≈ 0.08ms
传播时延信号在线缆中的物理传播时间 ≈ 距离 ÷ (2/3 光速)跨太平洋光缆单向约 60ms,几乎无从优化
用一张图记住

带宽决定"传输时延"能压多低,距离决定"传播时延"的物理上限。这就是为什么再好的宽带,跨洋访问延迟也有下限。

02
LAYERS & ENCAPSULATION

为什么网络需要分层?

每一层只解决一类问题,并向上一层隐藏细节。

浏览器不需要知道光纤怎样表示 0 和 1,网卡也不需要理解 HTTP 的状态码。分层让不同厂商、不同系统能按照共同规则协作,也让每一层都可以独立升级。

应用层用户需要什么服务?HTTP · DNS · SSH数据 Message
加入 TCP 首部 ↓
传输层送给哪一个程序?是否可靠?TCP · UDP段 Segment
加入 IP 首部 ↓
网络层目标设备在哪里?如何跨网?IP · ICMP包 Packet
加入帧头帧尾 ↓
转换成信号 ↓
物理层怎样把比特送过介质?电 · 光 · 无线电比特 Bit

封装:每一层补充本层需要的信息

发送时,应用数据从上往下经过各层,每层添加自己的控制信息(首部);接收时则从下往上逐层拆除。路由器通常只需看到链路层和网络层,不关心里面是网页还是邮件。

HTTP 数据
TCP 首部
HTTP 数据
IP 首部
TCP 首部
HTTP 数据
帧头
IP 首部
TCP
HTTP 数据
帧尾
关键记忆

MAC 管“一段链路的下一站”,IP 管“跨网络的最终目的地”,端口 管“设备里的具体程序”。

OSI 七层与“实用五层”对照

书本上常讲 OSI 七层模型,而真实互联网实际实现的是 TCP/IP 五层。两套模型职责一一对应:

OSI 七层TCP/IP 五层典型协议典型设备
应用层应用层HTTP · HTTPS · DNS · SSH · SMTP主机、浏览器、服务器
表示层加密/编码通常并入应用层实现,如 TLS
会话层连接管理由传输层承担
传输层传输层TCP · UDP操作系统
网络层网络层IP · ICMP · OSPF · BGP路由器
数据链路层链路层Ethernet · Wi‑Fi · PPP交换机、网卡、AP
物理层物理层电信号 · 光信号 · 无线电网线、光纤、集线器

每一层还要遵守“报文大小”的限制

数据不仅有格式,尺寸也有上限。链路层的 MTU(最大传输单元)决定单个数据帧最多装多少字节。以太网典型 MTU 是 1500 字节,超过它时 IP 层必须把包“分片”,到达后再重组。

常见的理解误区

小包能 Ping 通、稍大的包断断续续,往往就是 MTU 问题:分片会增加开销与丢包概率,有些防火墙还会直接丢弃含分片的包。

03
THE FULL JOURNEY

在浏览器按下回车后,发生了什么?

把后面所有知识先串成一个完整故事。

1

解析网址

浏览器拆解 https://example.com/course:协议是 HTTPS,主机名是 example.com,路径是 /course;HTTPS 默认端口为 443。

2

DNS 查询

浏览器查看缓存并询问 DNS 解析器,将域名变成例如 203.0.113.8。

3

找到本地出口

电脑发现目标不在本地子网,通过 ARP 找到默认网关的 MAC 地址,把帧交给路由器。

4

建立 TCP 连接

客户端与服务器完成三次握手,确认彼此收发能力,并协商初始序号。

5

完成 TLS 握手

浏览器验证服务器证书,双方安全地产生会话密钥。

6

发送 HTTP 请求

浏览器发送 GET /course HTTP/1.1,并携带 Host、Cookie 等请求头。

7

服务器响应

服务器返回状态码、响应头和 HTML,浏览器继续请求 CSS、JavaScript、图片。

8

渲染页面

浏览器解析文档,执行脚本,计算布局并绘制像素。你终于看到了网页。

这张地图对应本书全部章节

第 1~2 步(URL 与 DNS)→ 第 6 章;第 3 步(本机出口)→ 第 4 章;第 4 步(TCP 握手)→ 第 5 章;第 5 步(TLS)→ 第 8 章;第 6~8 步(请求、响应、渲染)→ 第 7 章。先走完这 8 步,再逐章回炉。

补充一步:局域网内如何找到“出口”

第 3 步跳过了细节:你的电脑怎么知道把包交给路由器?在以太网里,电脑先判断目的 IP 是否与自己在同一子网。目标在公网,电脑只能把帧交给“默认网关”。但要发给网关,必须先知道它的 MAC 地址,于是发起 ARP 广播:“谁知道 192.168.1.1 的 MAC?”路由器应答后,电脑才把含公网目的 IP 的帧交给它。这个“先查 MAC,再送帧”的动作发生在每一跳。

逐跳转发的关键

IP 地址标识端到端的目的主机;MAC 地址只用于当前链路上的下一跳。路由器每转发一次,都会移除旧的链路层帧并为下一条链路重新封装,因此链路层地址会变,IP 目的地址通常保持不变。

04
INTERNET LAYER

IP:全球网络的寻址系统

IP 尽力把包送到目标设备,但不承诺一定送达。

IPv4 地址由 32 位组成,通常写成四段十进制数,例如 192.168.1.10。IP 包中最重要的信息是源地址、目的地址和 TTL。每经过一个路由器,TTL 减 1;变成 0 时包会被丢弃,防止无限循环。

网络部分192.168.1
.
主机部分10
/24

/24 表示前 24 位是网络号,等价于子网掩码 255.255.255.0。

私有 IP 与公网 IP

私有地址只在局域网内使用,例如 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16;公网地址在互联网中唯一、可路由。

NAT 为什么存在?

家中多台设备共享一个公网 IP。路由器记录“内网 IP:端口 ↔ 公网端口”的映射,让返回数据找到正确设备。

家庭局域网手机
192.168.1.3:51001
电脑
192.168.1.10:51002
NAT 路由器198.51.100.7端口映射表
互联网
只看到一个公网 IP
常见误区

IP 地址不是设备永久不变的“身份证”。家庭设备的私有 IP 往往由 DHCP 动态分配,公网 IP 也可能变化。

打开一个 IP 包,看它带了什么

IPv4 首部固定 20 字节。除了收发地址,还有几个字段决定了包如何被转发与重组:

字段作用值得记住的点
版本 Version标识 IPv4 还是 IPv6值为 4 或 6
TTL每经过一台路由器减 1,归零即丢弃防路由环路,“Ping 不通”时先想想它
协议号 Protocol传输层用的是哪种协议TCP = 6 · UDP = 17 · ICMP = 1
总长度整个 IP 包的大小单包最大 65535 字节
标识/标志/片偏移分片与重组的依据D 位 = 1 表示“不许分片”
首部校验和校验 IP 首部有没有损坏每跳路由器改 TTL 后都要重算
源地址 / 目的地址32 位源与目的目的地址决定查哪条路由

子网划分:把一个大网“切成小段”

把 192.168.1.0/24 平均切成 4 个子网:需要再借 2 位主机位,前缀变成 /26。每段都遵循“网络地址 + 可用主机 + 广播地址”的固定结构:

子网网络地址可用主机范围广播地址
子网 0192.168.1.0/26192.168.1.1 – 192.168.1.62192.168.1.63
子网 1192.168.1.64/26192.168.1.65 – 192.168.1.126192.168.1.127
子网 2192.168.1.128/26192.168.1.129 – 192.168.1.190192.168.1.191
子网 3192.168.1.192/26192.168.1.193 – 192.168.1.254192.168.1.255
切分的通用公式

前缀每加 1,可用主机减半;主机数 = 2^(32 − 前缀长度) − 2(网络地址与广播地址不可作主机)。/26 即 2^6 − 2 = 62 台。

私有地址完整画像

地址段CIDR地址数量常见用途
10.0.0.0 – 10.255.255.25510.0.0.0/8约 1677 万大型企业内网、云 VPC
172.16.0.0 – 172.31.255.255172.16.0.0/12约 104 万中型网络、Docker 默认网段
192.168.0.0 – 192.168.255.255192.168.0.0/1665536家庭、办公室最常见

还有一些特殊地址值得认识:127.0.0.1(环回地址,指向本机,即 localhost)、169.254.x.x(DHCP 失败时的自动配置地址)、0.0.0.0(在本机语境表示“所有地址”)。

家里的网速背后:DHCP 自动分配

你的电脑开机时怎么知道用哪个 IP?靠 DHCP 的四个消息完成“租约”配置。整个过程约 1 秒,通常在你连接 Wi‑Fi 的瞬间悄悄发生:

1Discover广播寻找 DHCP 服务器
→
2Offer服务器提供 IP 与租期
→
3Request客户端确认接受
→
4Ack服务器最终确认并写入租约

NAT 不只是“上网共享”

最常见的 NAT(NAPT/PAT)把多个 内网 IP:端口 映射到同一个公网 IP 的不同公网端口,每条内网主动发起的连接占一行 NAT 表项。

NAT 的副作用

外网无法主动连接内网主机,除非配置“端口映射/转发”。这正是内网穿透(如 frp)要解决的问题:让一台公网服务器先“拉”一条隧道,帮你把请求送进内网。

IPv6:地址不够了,主角轮换

IPv4 地址只有约 43 亿个,早就不够全球设备分配。IPv6 把地址扩大到 128 位,写法改为 8 组十六进制,如 2001:db8:85a3::8a2e:370:7334(连续全零段可用 :: 省略)。它带来的不止是“地址多”,还让端到端直连成为常态,不再依赖 NAT。

动手实验 01查看自己的网络配置

Windows 打开终端运行 ipconfig。找到 IPv4 地址、子网掩码和默认网关。思考:你的地址属于哪个私有地址段?

05
TRANSPORT LAYER

TCP:在不可靠网络上实现可靠传输

网络会丢包、乱序、重复,TCP 把这些麻烦挡在应用程序之外。

三次握手:先确认双方都能收发

客户端CLOSED
SYN, seq=x① 请求建立连接
SYN+ACK, seq=y, ack=x+1② 同意,并确认客户端
ACK, ack=y+1③ 确认服务器
服务器LISTEN

第三次让服务器知道自己的回复已经成功到达客户端。SYN 用于同步序号,ACK 表示确认。

TCP 靠什么保证可靠?

序号

给字节编号,发现缺失、重复与乱序。

确认应答

收到数据后返回 ACK,报告下一段期望位置。

超时重传

未按时收到确认,就重新发送。

校验和

检测传输中是否发生比特错误。

流量控制

接收方用窗口限制发送量,避免被撑爆。

拥塞控制

根据网络状况调节速度,保护中间网络。

四次挥手与 TIME_WAIT

TCP 是全双工,两个方向要分别关闭。主动关闭方会短暂进入 TIME_WAIT,确保最后的 ACK 有机会重传,并让旧连接的数据包在网络中消失。

维度TCPUDP
连接

建立连接后通信

无连接,直接发送

可靠性

可靠、有序、不重复

不保证到达和顺序

开销

较高

低、延迟小

场景

网页、文件、邮件、SSH

语音、直播、游戏、DNS

TCP 段首部长什么样

应用数据被切成“段”,每段都带着至少 20 字节的 TCP 首部。这些字段相互配合,才实现了可靠传输:

字段作用例子
源端口 / 目的端口识别两台机器上的具体程序浏览器 51001 → 服务器 443
序号 Sequence本段携带的是第几个字节seq = 已发送字节数 + 1
确认号 Ack下一个期望收到的字节号ack = 已连续收到字节数 + 1
标志位SYN / ACK / PSH / RST / FIN 开关握手用 SYN,关闭用 FIN
窗口 Window接收方还能收多少,流量控制的核心64KB,随接收能力动态变化
校验和检测数据是否被破坏出错则丢弃并等待重传

握手为什么从“随机序号”开始?

seq 从随机初始序号(ISN)开始,而不是从 1 开始,是为了防止上一条连接在网络里“游荡”的迟到数据包,被误认成本条连接的数据。随机起始 + 每字节递增,让 TCP 能可靠区分新旧数据,这也是面试常问的三次握手动机之一。

丢包了怎么办:两种重传

超时重传

发送方启动计时器,RTO 到期仍没等到 ACK 就重发。RTO 会跟随实测 RTT 自适应调整,而不是写死。

快速重传

收到连续 3 个重复 ACK 就立即重传,不必等超时。重复 ACK 说明中间丢了段,但网络还活着。

选择性确认 SACK

接收方用 SACK 选项告诉发送方“我具体缺哪几段”,避免把已收好的数据也重发一遍。

拥塞控制:不只看人,还要护网络

流量控制保护“接收方”,拥塞控制保护“整张网络”。TCP 用拥塞窗口 cwnd 配合四步走,像开车一样先试探、再加速:

阶段拥塞窗口的变化它解决的问题
慢启动 Slow Startcwnd 从 1 个报文段起步,收到 ACK 后快速增长,直到 ssthresh在路径容量未知时先探测可用带宽。
拥塞避免超过 ssthresh 后改为每个 RTT 约增加 1 个报文段避免持续的指数增长压垮网络。
快速重传收到 3 个重复 ACK 后立即重传,并进入快速恢复不必等待重传超时,缩短一次丢包后的恢复时间。
快速恢复cwnd 减半后继续线性增长,而不是回到慢启动把重复 ACK 视作链路仍有数据流动的信号。
一条锯齿形曲线

没有丢包时 cwnd 一路增长;一旦发生丢包(超时或重复 ACK),cwnd 被砍掉再重新试探。速度的锯齿波动,就是 TCP 在保护网络。

用状态机读懂 netstat

TCP 是严格的状态机。用 netstat -ano 看到的每行都对应一个状态:客户端发起时走 CLOSED → SYN_SENT → ESTABLISHED,服务器走 LISTEN → SYN_RCVD → ESTABLISHED;关闭连接还会穿过 FIN_WAIT_1/2、CLOSE_WAIT、LAST_ACK、TIME_WAIT。看到大量 CLOSE_WAIT,多半是服务器程序忘了关闭 socket。

常被追问的 TIME_WAIT

主动关闭方最后停在 TIME_WAIT 约 2 × MSL(约 2 分钟),不是 bug:它要保证最后一个 ACK 丢失时可以重发,并让旧连接的数据包在网络中彻底消散。

动手实验 02感受时延与丢包

运行 ping example.com。观察往返时间 RTT 和丢包率。ping 使用 ICMP,不是 TCP,但很适合测试基础连通性。

06
NAME SYSTEM

DNS:互联网的分布式电话簿

人记域名,网络设备使用 IP 地址。

DNS 不是一台服务器。它是分层、分布式数据库。查询前会先检查本地缓存;没有结果时,递归解析器再替你逐级寻找答案。

1本地缓存以前查过吗?
→
2递归解析器替客户端找答案
→
3根服务器去问 .com
→
4顶级域服务器去问权威服务器
→
5权威服务器返回最终 IP

常见 DNS 记录

A域名 → IPv4 地址example.com → 203.0.113.8
AAAA域名 → IPv6 地址example.com → 2001:db8::8
CNAME一个域名 → 另一个域名域名别名
MX接收邮件的服务器邮件路由
TXT文本与验证信息SPF、域名验证
缓存与 TTL

每条记录都有 TTL,表示可以缓存多久。缓存减少查询时间和服务器压力,但也意味着 DNS 修改不会立刻被所有人看到。

域名本身也是分层的树

域名从右往左越读越具体。整棵域名树的形状,决定了 DNS 查询可以“逐级往下问”:

example.com 的层级
                  .          ← 根(13 组根服务器)
                   │
                 "com"        ← 顶级域 TLD
                   │
              "example"       ← 二级域(通常由你注册)
                   │
      "www" · "api" · "mail"  ← 子域 / 主机名

注意:www.example.com 不是三个“域”,而是一个完整域名(FQDN)。example.com 这个域的一切解析权,归它的权威 DNS 服务器所有。

递归查询,还是迭代查询?

上一节的 5 步流程里,客户端 → 递归解析器是递归查询(解析器替你跑完全部流程);递归解析器 → 根 / TLD / 权威是迭代查询(每一层只告诉你“去问谁”)。分清这两个词,面试和读文档都不含糊。

递归与迭代的边界

递归查询中,客户端把“得到最终答案”的责任交给递归解析器;解析器再代表客户端访问其他 DNS 服务器。迭代查询中,被问的服务器只返回自己所知的答案或下一台应查询的服务器,由查询方继续追问。二者的差别在于谁维护后续查询链路。

记录类型的完整清单

除了最常用的 A/AAAA/CNAME/MX/TXT,权威区里还有这些关键角色:

记录含义典型值
NS该域由哪个服务器负责解析ns1.cloudflare.com
SOA区域权威数据的起点:主服务器、刷新间隔、序列号每个正解区必备
A / AAAA域名 → IPv4 / IPv6 地址example.com → 203.0.113.8
CNAME别名指向另一个域名www → example.com
MX收件服务器及优先级10 mail.example.com
PTRIP 反查域名(反解)8.113.0.203.in-addr.arpa
SRV指定服务所在主机与端口_sip._tcp.example.com

域名怎么被用来做负载均衡

一个域名可以配多条 A 记录,权威服务器每次按策略返回不同 IP,把用户分摊到不同机群;CDN 更是把“离你最近的边缘节点 IP”编进回答。所以别惊讶:全球不同地点 nslookup 同一个域名,得到的结果可能不同。

动手实验 03查询域名记录

运行 nslookup example.com,观察回答服务器和解析地址。再尝试 nslookup -type=mx qq.com 查看邮件记录。

07
APPLICATION LAYER

HTTP:浏览器与服务器如何对话

HTTP 定义请求与响应的格式和语义,本身不负责寻路与可靠传输。

HTTP 请求与响应

请求报文
GET /articles/network HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: session_id=abc123

请求行 方法 + 路径 + 版本请求头 客户端与上下文空行 分隔首部与请求体
响应报文
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 2841
Cache-Control: max-age=3600
Set-Cookie: session_id=xyz789; Secure; HttpOnly

<!doctype html> ...

常用方法

GET读取资源

POST提交数据或触发处理

PUT整体替换资源

PATCH部分修改资源

DELETE删除资源

状态码家族

2xx成功:200、201

3xx重定向:301、302、304

4xx客户端问题:400、401、403、404

5xx服务器问题:500、502、503

Cookie、Session 与登录状态

HTTP 本身是无状态的。常见做法是登录后由服务器创建 Session,并通过 Set-Cookie 把随机会话标识交给浏览器。之后浏览器自动带上 Cookie,服务器据此找到登录状态。Cookie 只是浏览器保存的数据,不等于 Session 本身。

HTTP 的演进

HTTP/1.1持久连接,但并发处理受限
→
HTTP/2二进制分帧、多路复用、头部压缩
→
HTTP/3基于 QUIC/UDP,改善连接与阻塞

先看清 URL 的每个零件

网址不是一串糊在一起的字,而是明确分割的几部分。以 https://user:pass@example.com:8080/path?q=网络#sec1 为例:

部分示例作用
协议 schemehttps用什么协议访问
主机 hostexample.com哪台服务器(早期可带用户名密码,现已不提倡)
端口 port:8080可省略,http 默认 80、https 默认 443
路径 path/path服务器上的资源位置
查询 query?q=网络传给服务器的参数,也叫 query string
片段 fragment#sec1仅用于浏览器内部的定位锚点,不会发给服务器

方法语义再挖一层:幂等性

方法不只是“动作”,还约定了幂等性——同一个请求执行多次,结果是否一致。这决定了客户端能否安全地重试。

方法用途幂等?补充记忆点
GET读取资源是不应产生副作用
HEAD只要响应头,不要正文是常用于探测链接是否有效
POST提交数据否表单、创建资源的常用方法
PUT整体替换资源是语义:客户端定义完整状态
PATCH部分更新资源否增量修改,更省流量
DELETE删除资源是重复删除返回 404 也合理
OPTIONS询问服务器支持哪些能力是CORS 预检请求用的就是它

状态码别再只记 404

状态码含义典型场景
201创建成功POST 之后资源已建立,响应带 Location 指向新资源
204成功但无正文删除成功,响应体为空
301 / 302永久 / 临时重定向域名换新址;302 常见于登录后跳转
403 / 404禁止访问 / 找不到某些站点为掩盖 403 故意返回 404
405方法不允许对只读资源发 DELETE
429请求过于频繁限流触发,一般配合 Retry-After
502 / 503 / 504网关坏 / 忙 / 超时反代背后的服务挂了、过载或没响应

请求头与响应头速查

请求头

Host目标域名+端口HTTP/1.1 起必带
User-Agent客户端身份浏览器 / 爬虫标识
Accept期望的返回格式text/html · application/json
Cookie携带已有会话由服务器 Set-Cookie 种下
Authorization认证凭据Bearer token / Basic
Referer来源页面防盗链主要依据

响应头

Content-Type正文格式text/html; charset=utf-8
Content-Length正文字节数供分段接收
Cache-Control缓存策略max-age / no-store
Location重定向目标配合 3xx
Set-Cookie让浏览器种下 Cookie含过期与安全属性
Access-Control-*跨域许可CORS 核心字段族

Cookie 的安全属性才是重点

Cookie 不只是 Key‑Value 两件事,后面那串属性决定了它的生命周期与攻击面:

Expires / Max-Age

会话 Cookie 关浏览器即失效;带过期时间则会持久化保存。

HttpOnly

禁止 document.cookie 读取,断了 XSS 偷 Cookie 这条路。

Secure

只允许在 HTTPS 连接中发送,明文 HTTP 下不生效。

SameSite

限制跨站携带,是 CSRF 的第一道防线,Lax 已是常见默认。

Domain / Path

限定 Cookie 归属的域名与路径范围。

Identifier / Partitioned

补充字段:分片淘汰优先级与 CHIPS 隐私分区。

浏览器缓存是怎么“省流量”的

再次访问网页时,浏览器先看本地缓存:副本还新鲜就直接复用,根本不发请求;副本过期,就带着条件头问服务器,服务器回 304 Not Modified 表示“没变,继续用你的”。

机制客户端发出的头服务端返回的头含义
强缓存—Cache-Control: max-age=36001 小时内直接用本地副本
协商缓存·时间If-Modified-SinceLast-Modified修改时间没变 → 304
协商缓存·指纹If-None-MatchETag内容指纹没变 → 304(更精确)

三个版本不是“更快”这么简单

维度HTTP/1.1HTTP/2HTTP/3
连接方式

一条 TCP 一次只传一个请求,队头阻塞

一条 TCP 内二进制多路复用并发流

UDP 上的 QUIC,多路复用

传输格式

纯文本可读

二进制分帧

二进制分帧,0-RTT 快速建连

头部压缩

无

HPACK

QPACK

残留痛点

并发受限、头部重复浪费

TLS 三次握手 + TCP 队头阻塞仍在

丢包不阻塞其他流,适合弱网

动手实验 04亲眼看一个 HTTP 请求

打开浏览器开发者工具(F12)→ Network → 刷新页面。点击任意请求,观察 Method、Status、Request Headers、Response Headers 和 Timing。

08
SECURE WEB

HTTPS:在不可信网络中建立安全通道

HTTPS = HTTP + TLS。它解决保密、身份与完整性三件事。

◉

机密性

内容被加密,旁观者抓到数据也不能直接读懂。

◇

身份认证

证书帮助浏览器确认服务器代表目标域名。

✓

完整性

传输内容若被篡改,校验会失败。

TLS 1.3 握手的简化过程

浏览器访问 example.com

ClientHello →支持的算法 + 随机参数 + 密钥材料

← ServerHello + 证书选择算法,发回证书与密钥材料

验证域名、有效期和证书签发链

双方算出同一个会话密钥之后用高效的对称加密传输 HTTP

服务器证书绑定域名

非对称密码适合身份认证和安全协商,但成本较高;对称加密速度快,适合大量数据。TLS 将二者组合起来。现代 TLS 1.3 的密钥交换还提供前向保密。

先补齐加密的三件工具

TLS 不是一种算法,而是一套“组合拳”,用到三类密码学工具,各司其职:

工具特点在 TLS 中的角色
对称加密同一个密钥加解密,速度极快用 AES‑GCM 加密实际传输的 HTTP 数据
非对称加密公钥加密 / 私钥解密,慢,可做签名证书签名、密钥交换
哈希任意输入 → 固定长度指纹,不可逆校验完整性、证书指纹、密钥派生
TLS 为什么组合两类密码学机制

非对称密码学用于认证身份并安全协商密钥材料;协商完成后,双方使用同一份会话密钥进行对称加密。后者计算开销更低,适合持续传输的业务数据。TLS 握手与后续数据传输的职责因此不同。

浏览器怎么确认证书可信?

服务器发来的证书不是“空口无凭”,而是一张由 CA(证书颁发机构)签名的凭证。验证要过三关:

域名匹配

证书的 CN/SAN 必须包含你访问的域名,防止 A 网站的证书被用到 B 网站。

有效期

证书在 notBefore 与 notAfter 之间才有效,过期直接拦截。

签名链

证书由谁签?签发者又由谁签?一路向上,直到操作系统预置的根证书。

证书链是一棵信任树:根 CA(预置在系统里)→ 中间 CA → 你的域名证书。正因为根证书泄露会造成信任崩塌,浏览器还要求“中间 CA 不能直接签发终端用户证书”。

TLS 1.2 与 1.3:握手瘦身

对比项TLS 1.2TLS 1.3
握手往返

通常需要 2 RTT

1 RTT;会话复用时接近 0 RTT

算法选择

双方各宣告一串算法再取交集,易受降级攻击

只保留少数强算法,旧算法直接移除

密钥交换

可选 RSA 或 DH 类

只允许 ECDHE/DHE 等前向保密方案

握手加密时机

ServerHello 之后才加密

ServerHello 之后立即加密后续握手消息

前向保密:为什么 RSA 密钥交换被淘汰

早期 TLS 用服务器的 RSA 私钥参与密钥协商。代价是:只要某天私钥泄露,攻击者就能用之前录下的流量反推出当年的会话密钥,历史加密数据全部“裸奔”。改用 ECDHE(临时椭圆曲线 Diffie‑Hellman)后,每次握手的临时密钥用完即焚,即便服务器私钥日后泄露,也解密不了过去的会话。

证书从哪来

DV / OV / EV 是按验证强度划分的证书等级。个人与中小站点的现代标准做法:用 Let's Encrypt 这类免费自动化 CA 签发 DV 证书(通常 90 天 + certbot 自动续期);本地开发则可用 mkcert 给自己签发受本机信任的证书。

小锁不代表网站“绝对安全”

HTTPS 只说明你与当前域名之间的通道安全,并不保证网站内容诚信,也挡不住相似域名钓鱼。仍要检查域名。

09
SECURE SHELL

SSH:安全地控制远程计算机

SSH 默认使用 TCP 22 端口,为登录、命令执行和文件传输提供加密通道。

Terminal
$ ssh alice@203.0.113.8
The authenticity of host can't be established.
Are you sure you want to continue connecting? yes
alice@203.0.113.8's password:
Welcome to Ubuntu 24.04 LTS

SSH 连接验证两种身份

01

客户端验证服务器

首次连接显示主机指纹,确认后写入 known_hosts。以后指纹突然改变时,SSH 会警告。

02

服务器验证用户

可以用密码,更推荐密钥。私钥留在本机,公钥放进服务器的 authorized_keys。

绝不外传私钥 Private Key保存在客户端,并设置强口令
签名证明
──────→私钥本身不会发送
可以分发公钥 Public Key存放在允许登录的服务器

常用命令速查

ssh user@host登录远程服务器
ssh -p 2222 user@host连接非默认端口
ssh-keygen -t ed25519生成 Ed25519 密钥对
scp file.txt user@host:/tmp/安全复制文件到远端
sftp user@host交互式安全文件传输
ssh -L 8080:localhost:80 user@host建立本地端口转发

一次 SSH 连接的三个阶段

SSH 协议把一次连接切成三层,理解这三层就理解了 SSH 的安全模型:

1

传输层:建立加密通道

协商算法并进行密钥交换(Curve25519、DH 类),客户端先确认服务器主机密钥的指纹,此后一切通信都走对称加密——“没人能偷听”。

2

认证层:证明你是谁

通道已安全,现在验证用户身份:密码或公钥。认证通过后才进入会话。

3

连接层:复用通道

在同一条加密通道上跑多个会话:shell、SCP、端口转发。这也是 ControlMaster 复用连接的技术基础。

密钥登录到底做了什么

你执行 ssh-keygen 生成一对密钥后,把“公钥”追加到服务器的 ~/.ssh/authorized_keys。登录时服务器发起一个“挑战”:用你的公钥加密随机数,只有持有对应私钥的客户端能解密并回执。整个过程私钥从不离开你的电脑,也不会在网络上传输。

为什么推荐密钥而非密码

密码会被暴力破解、可能在输入时被偷看;密钥是 256 位随机数,破解难度远超任何人工密码,配合 ssh-agent 还能做到免密登录。

用配置文件简写常用主机

经常登录的机器写进 ~/.ssh/config,从此 ssh myserver 就能直达:

~/.ssh/config
Host myserver
    HostName 203.0.113.8
    Port 2222
    User alice
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 30

端口转发:把远程机器当“跳板”

-L 本地转发

把本机端口映射到远程能访问的地址,如 ssh -L 8080:db:3306 jump:本机 8080 → 内网 db 的 3306。

-R 远程转发

把远程端口映射回本机,常用于让外网访问家里或内网的服务。

-D 动态转发

变成 SOCKS5 代理:ssh -D 1080 host,浏览器把流量交给 1080 端口即可穿越网络边界。

给服务器上一把锁:sshd 加固要点

/etc/ssh/sshd_config(节选)
PermitRootLogin no              # 禁止 root 直接登录
PasswordAuthentication no       # 只允许密钥认证
PubkeyAuthentication yes
Port 2222                       # 换掉默认 22 端口,减少扫描噪音
AllowUsers alice                # 白名单模式
安全建议

私钥不要发给任何人;使用密钥口令;确认主机指纹;服务器应禁用弱密码与 root 直接登录。

+
TOOLBOX

网络不通时,怎样一步步排查?

1本机配置ipconfig有 IP、网关、DNS 吗?
→
2本地网关ping 网关IP局域网能通吗?
→
3外部 IPping 1.1.1.1能到互联网吗?
→
4域名解析nslookup 域名DNS 正常吗?
→
5路径与端口tracert / TNC卡在哪?端口开吗?
tracert example.com查看数据经过的路由跳数
netstat -ano查看连接、监听端口与 PID
Test-NetConnection host -Port 443测试 TCP 端口
curl -I https://example.com查看 HTTP 响应头

症状 → 命令对照表

症状先跑什么看什么
网页打不开先 nslookup 确认域名能解析,再 curl -I 看状态码DNS 挂了,还是服务端 5xx
能上微信但打不开网页ping 网关 → ping 114.114.114.114本地通而公网不通 → 运营商侧问题
网站时好时坏ping -t 观察丢包率与 RTT 抖动无线信号弱 / 线路拥塞
端口死活连不上Test-NetConnection host -Port 443防火墙挡了,还是服务没监听
怀疑被扫描netstat -ano 看已建立连接与监听端口异常外联的远程地址与对应 PID
排障口诀

本机 → 网关 → 公网 IP → DNS → 端口/路径。每步都能把范围缩小一段,快速定位“是哪一段在说谎”。

✓
FINAL CHECK

用 4 道题检验你的网络直觉

选择答案后立即获得解释。

01

路由器主要依据什么决定跨网络转发方向?

02

TCP 的接收窗口主要解决什么问题?

03

HTTPS 相比 HTTP,核心多了哪一层?

04

SSH 密钥登录时,哪一个必须保密?

已答对0 / 4
你已经拥有一张网络地图

下一步:用抓包把抽象概念变成真实数据

安装 Wireshark,抓一次 DNS 查询、TCP 三次握手和 HTTPS 连接。眼睛看到的数据包,比死记十遍更有效。

回到顶部 ↑