终端设备
电脑、手机、服务器。它们是数据的产生者和最终接收者,也叫主机。
从浏览器输入网址的那一刻出发,沿着数据真实经过的路径,逐层理解 IP、TCP、DNS、HTTP、HTTPS 与 SSH。
我写网络笔记时最常遇到的困难,是每个名词都认识,却说不清它们在一次请求里先后做了什么。先顺序读完“网页访问全程”,建立一条请求路径;再深入 TCP、HTTP、HTTPS。遇到术语时,先确认它解决的具体问题、位于哪一层,再看协议细节。每节末尾都有一个可以立刻完成的小实验。
网络的本质,是让不同设备上的程序交换数据。
两台电脑直接连一根网线,可以构成最小网络;许多局域网再通过路由器相连,就形成了互联网(Internet)。它并没有一个“总控制中心”,而是由家庭网络、学校网络、公司网络、运营商网络和数据中心彼此连接而成。
电脑、手机、服务器。它们是数据的产生者和最终接收者,也叫主机。
连接同一局域网内的设备,主要依据 MAC 地址转发以太网帧。
连接不同网络,依据 IP 地址和路由表决定数据包的下一站。
带宽是链路的理论容量;吞吐量是实际成功传输的速率;时延是一个数据单元从发送到抵达所经历的时间;丢包率是未成功抵达的数据包占已发送数据包的比例。它们相关,却不能相互替代。
覆盖一两米内的设备互连,例如蓝牙耳机连接手机。
覆盖一个房间或一栋楼,由交换机串起来的设备群。你家的 Wi‑Fi 就是一个 LAN。
覆盖城市、国家甚至全球。互联网可以看成无数个 WAN 与 LAN 互连的结果。
设备之间如何连线,决定了网络怎么扩展、故障怎么蔓延。四种最容易遇到的拓扑:
当我们说"时延 30ms",其实包含四种成分。分清它们,才能看懂"为什么跨洋 Ping 有物理下限":
| 成分 | 由什么决定 | 典型量级 |
|---|---|---|
| 处理时延 | 路由器查表、检查校验和的速度 | 几十微秒 |
| 排队时延 | 在路由器出口队列中等待的时间,拥塞时激增 | 0 ~ 数十毫秒,是网络抖动的主要来源 |
| 传输时延 | 把整段数据推上线缆的时间 = 数据长度 ÷ 带宽 | 1KB ÷ 100Mbps ≈ 0.08ms |
| 传播时延 | 信号在线缆中的物理传播时间 ≈ 距离 ÷ (2/3 光速) | 跨太平洋光缆单向约 60ms,几乎无从优化 |
带宽决定"传输时延"能压多低,距离决定"传播时延"的物理上限。这就是为什么再好的宽带,跨洋访问延迟也有下限。
每一层只解决一类问题,并向上一层隐藏细节。
浏览器不需要知道光纤怎样表示 0 和 1,网卡也不需要理解 HTTP 的状态码。分层让不同厂商、不同系统能按照共同规则协作,也让每一层都可以独立升级。
HTTP · DNS · SSH数据 MessageTCP · UDP段 SegmentIP · ICMP包 PacketEthernet · Wi‑Fi帧 Frame电 · 光 · 无线电比特 Bit发送时,应用数据从上往下经过各层,每层添加自己的控制信息(首部);接收时则从下往上逐层拆除。路由器通常只需看到链路层和网络层,不关心里面是网页还是邮件。
MAC 管“一段链路的下一站”,IP 管“跨网络的最终目的地”,端口 管“设备里的具体程序”。
书本上常讲 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 问题:分片会增加开销与丢包概率,有些防火墙还会直接丢弃含分片的包。
把后面所有知识先串成一个完整故事。
浏览器拆解 https://example.com/course:协议是 HTTPS,主机名是 example.com,路径是 /course;HTTPS 默认端口为 443。
浏览器查看缓存并询问 DNS 解析器,将域名变成例如 203.0.113.8。
电脑发现目标不在本地子网,通过 ARP 找到默认网关的 MAC 地址,把帧交给路由器。
客户端与服务器完成三次握手,确认彼此收发能力,并协商初始序号。
浏览器验证服务器证书,双方安全地产生会话密钥。
浏览器发送 GET /course HTTP/1.1,并携带 Host、Cookie 等请求头。
服务器返回状态码、响应头和 HTML,浏览器继续请求 CSS、JavaScript、图片。
浏览器解析文档,执行脚本,计算布局并绘制像素。你终于看到了网页。
第 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 目的地址通常保持不变。
IP 尽力把包送到目标设备,但不承诺一定送达。
IPv4 地址由 32 位组成,通常写成四段十进制数,例如 192.168.1.10。IP 包中最重要的信息是源地址、目的地址和 TTL。每经过一个路由器,TTL 减 1;变成 0 时包会被丢弃,防止无限循环。
/24 表示前 24 位是网络号,等价于子网掩码 255.255.255.0。
私有地址只在局域网内使用,例如 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16;公网地址在互联网中唯一、可路由。
家中多台设备共享一个公网 IP。路由器记录“内网 IP:端口 ↔ 公网端口”的映射,让返回数据找到正确设备。
192.168.1.3:51001电脑192.168.1.10:51002IP 地址不是设备永久不变的“身份证”。家庭设备的私有 IP 往往由 DHCP 动态分配,公网 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。每段都遵循“网络地址 + 可用主机 + 广播地址”的固定结构:
| 子网 | 网络地址 | 可用主机范围 | 广播地址 |
|---|---|---|---|
| 子网 0 | 192.168.1.0/26 | 192.168.1.1 – 192.168.1.62 | 192.168.1.63 |
| 子网 1 | 192.168.1.64/26 | 192.168.1.65 – 192.168.1.126 | 192.168.1.127 |
| 子网 2 | 192.168.1.128/26 | 192.168.1.129 – 192.168.1.190 | 192.168.1.191 |
| 子网 3 | 192.168.1.192/26 | 192.168.1.193 – 192.168.1.254 | 192.168.1.255 |
前缀每加 1,可用主机减半;主机数 = 2^(32 − 前缀长度) − 2(网络地址与广播地址不可作主机)。/26 即 2^6 − 2 = 62 台。
| 地址段 | CIDR | 地址数量 | 常见用途 |
|---|---|---|---|
| 10.0.0.0 – 10.255.255.255 | 10.0.0.0/8 | 约 1677 万 | 大型企业内网、云 VPC |
| 172.16.0.0 – 172.31.255.255 | 172.16.0.0/12 | 约 104 万 | 中型网络、Docker 默认网段 |
| 192.168.0.0 – 192.168.255.255 | 192.168.0.0/16 | 65536 | 家庭、办公室最常见 |
还有一些特殊地址值得认识:127.0.0.1(环回地址,指向本机,即 localhost)、169.254.x.x(DHCP 失败时的自动配置地址)、0.0.0.0(在本机语境表示“所有地址”)。
你的电脑开机时怎么知道用哪个 IP?靠 DHCP 的四个消息完成“租约”配置。整个过程约 1 秒,通常在你连接 Wi‑Fi 的瞬间悄悄发生:
最常见的 NAT(NAPT/PAT)把多个 内网 IP:端口 映射到同一个公网 IP 的不同公网端口,每条内网主动发起的连接占一行 NAT 表项。
外网无法主动连接内网主机,除非配置“端口映射/转发”。这正是内网穿透(如 frp)要解决的问题:让一台公网服务器先“拉”一条隧道,帮你把请求送进内网。
IPv4 地址只有约 43 亿个,早就不够全球设备分配。IPv6 把地址扩大到 128 位,写法改为 8 组十六进制,如 2001:db8:85a3::8a2e:370:7334(连续全零段可用 :: 省略)。它带来的不止是“地址多”,还让端到端直连成为常态,不再依赖 NAT。
Windows 打开终端运行 ipconfig。找到 IPv4 地址、子网掩码和默认网关。思考:你的地址属于哪个私有地址段?
网络会丢包、乱序、重复,TCP 把这些麻烦挡在应用程序之外。
SYN, seq=x① 请求建立连接SYN+ACK, seq=y, ack=x+1② 同意,并确认客户端ACK, ack=y+1③ 确认服务器第三次让服务器知道自己的回复已经成功到达客户端。SYN 用于同步序号,ACK 表示确认。
给字节编号,发现缺失、重复与乱序。
收到数据后返回 ACK,报告下一段期望位置。
未按时收到确认,就重新发送。
检测传输中是否发生比特错误。
接收方用窗口限制发送量,避免被撑爆。
根据网络状况调节速度,保护中间网络。
TCP 是全双工,两个方向要分别关闭。主动关闭方会短暂进入 TIME_WAIT,确保最后的 ACK 有机会重传,并让旧连接的数据包在网络中消失。
建立连接后通信
无连接,直接发送
可靠、有序、不重复
不保证到达和顺序
较高
低、延迟小
网页、文件、邮件、SSH
语音、直播、游戏、DNS
应用数据被切成“段”,每段都带着至少 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 选项告诉发送方“我具体缺哪几段”,避免把已收好的数据也重发一遍。
流量控制保护“接收方”,拥塞控制保护“整张网络”。TCP 用拥塞窗口 cwnd 配合四步走,像开车一样先试探、再加速:
| 阶段 | 拥塞窗口的变化 | 它解决的问题 |
|---|---|---|
| 慢启动 Slow Start | cwnd 从 1 个报文段起步,收到 ACK 后快速增长,直到 ssthresh | 在路径容量未知时先探测可用带宽。 |
| 拥塞避免 | 超过 ssthresh 后改为每个 RTT 约增加 1 个报文段 | 避免持续的指数增长压垮网络。 |
| 快速重传 | 收到 3 个重复 ACK 后立即重传,并进入快速恢复 | 不必等待重传超时,缩短一次丢包后的恢复时间。 |
| 快速恢复 | cwnd 减半后继续线性增长,而不是回到慢启动 | 把重复 ACK 视作链路仍有数据流动的信号。 |
没有丢包时 cwnd 一路增长;一旦发生丢包(超时或重复 ACK),cwnd 被砍掉再重新试探。速度的锯齿波动,就是 TCP 在保护网络。
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 约 2 × MSL(约 2 分钟),不是 bug:它要保证最后一个 ACK 丢失时可以重发,并让旧连接的数据包在网络中彻底消散。
运行 ping example.com。观察往返时间 RTT 和丢包率。ping 使用 ICMP,不是 TCP,但很适合测试基础连通性。
人记域名,网络设备使用 IP 地址。
DNS 不是一台服务器。它是分层、分布式数据库。查询前会先检查本地缓存;没有结果时,递归解析器再替你逐级寻找答案。
A域名 → IPv4 地址example.com → 203.0.113.8AAAA域名 → IPv6 地址example.com → 2001:db8::8CNAME一个域名 → 另一个域名域名别名MX接收邮件的服务器邮件路由TXT文本与验证信息SPF、域名验证每条记录都有 TTL,表示可以缓存多久。缓存减少查询时间和服务器压力,但也意味着 DNS 修改不会立刻被所有人看到。
域名从右往左越读越具体。整棵域名树的形状,决定了 DNS 查询可以“逐级往下问”:
. ← 根(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 |
PTR | IP 反查域名(反解) | 8.113.0.203.in-addr.arpa |
SRV | 指定服务所在主机与端口 | _sip._tcp.example.com |
一个域名可以配多条 A 记录,权威服务器每次按策略返回不同 IP,把用户分摊到不同机群;CDN 更是把“离你最近的边缘节点 IP”编进回答。所以别惊讶:全球不同地点 nslookup 同一个域名,得到的结果可能不同。
运行 nslookup example.com,观察回答服务器和解析地址。再尝试 nslookup -type=mx qq.com 查看邮件记录。
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
HTTP 本身是无状态的。常见做法是登录后由服务器创建 Session,并通过 Set-Cookie 把随机会话标识交给浏览器。之后浏览器自动带上 Cookie,服务器据此找到登录状态。Cookie 只是浏览器保存的数据,不等于 Session 本身。
网址不是一串糊在一起的字,而是明确分割的几部分。以 https://user:pass@example.com:8080/path?q=网络#sec1 为例:
| 部分 | 示例 | 作用 |
|---|---|---|
| 协议 scheme | https | 用什么协议访问 |
| 主机 host | example.com | 哪台服务器(早期可带用户名密码,现已不提倡) |
| 端口 port | :8080 | 可省略,http 默认 80、https 默认 443 |
| 路径 path | /path | 服务器上的资源位置 |
| 查询 query | ?q=网络 | 传给服务器的参数,也叫 query string |
| 片段 fragment | #sec1 | 仅用于浏览器内部的定位锚点,不会发给服务器 |
方法不只是“动作”,还约定了幂等性——同一个请求执行多次,结果是否一致。这决定了客户端能否安全地重试。
| 方法 | 用途 | 幂等? | 补充记忆点 |
|---|---|---|---|
| GET | 读取资源 | 是 | 不应产生副作用 |
| HEAD | 只要响应头,不要正文 | 是 | 常用于探测链接是否有效 |
| POST | 提交数据 | 否 | 表单、创建资源的常用方法 |
| PUT | 整体替换资源 | 是 | 语义:客户端定义完整状态 |
| PATCH | 部分更新资源 | 否 | 增量修改,更省流量 |
| DELETE | 删除资源 | 是 | 重复删除返回 404 也合理 |
| OPTIONS | 询问服务器支持哪些能力 | 是 | CORS 预检请求用的就是它 |
| 状态码 | 含义 | 典型场景 |
|---|---|---|
| 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/jsonCookie携带已有会话由服务器 Set-Cookie 种下Authorization认证凭据Bearer token / BasicReferer来源页面防盗链主要依据Content-Type正文格式text/html; charset=utf-8Content-Length正文字节数供分段接收Cache-Control缓存策略max-age / no-storeLocation重定向目标配合 3xxSet-Cookie让浏览器种下 Cookie含过期与安全属性Access-Control-*跨域许可CORS 核心字段族Cookie 不只是 Key‑Value 两件事,后面那串属性决定了它的生命周期与攻击面:
会话 Cookie 关浏览器即失效;带过期时间则会持久化保存。
禁止 document.cookie 读取,断了 XSS 偷 Cookie 这条路。
只允许在 HTTPS 连接中发送,明文 HTTP 下不生效。
限制跨站携带,是 CSRF 的第一道防线,Lax 已是常见默认。
限定 Cookie 归属的域名与路径范围。
补充字段:分片淘汰优先级与 CHIPS 隐私分区。
再次访问网页时,浏览器先看本地缓存:副本还新鲜就直接复用,根本不发请求;副本过期,就带着条件头问服务器,服务器回 304 Not Modified 表示“没变,继续用你的”。
| 机制 | 客户端发出的头 | 服务端返回的头 | 含义 |
|---|---|---|---|
| 强缓存 | — | Cache-Control: max-age=3600 | 1 小时内直接用本地副本 |
| 协商缓存·时间 | If-Modified-Since | Last-Modified | 修改时间没变 → 304 |
| 协商缓存·指纹 | If-None-Match | ETag | 内容指纹没变 → 304(更精确) |
一条 TCP 一次只传一个请求,队头阻塞
一条 TCP 内二进制多路复用并发流
UDP 上的 QUIC,多路复用
纯文本可读
二进制分帧
二进制分帧,0-RTT 快速建连
无
HPACK
QPACK
并发受限、头部重复浪费
TLS 三次握手 + TCP 队头阻塞仍在
丢包不阻塞其他流,适合弱网
打开浏览器开发者工具(F12)→ Network → 刷新页面。点击任意请求,观察 Method、Status、Request Headers、Response Headers 和 Timing。
HTTPS = HTTP + TLS。它解决保密、身份与完整性三件事。
内容被加密,旁观者抓到数据也不能直接读懂。
证书帮助浏览器确认服务器代表目标域名。
传输内容若被篡改,校验会失败。
ClientHello →支持的算法 + 随机参数 + 密钥材料
← ServerHello + 证书选择算法,发回证书与密钥材料
验证域名、有效期和证书签发链
双方算出同一个会话密钥之后用高效的对称加密传输 HTTP
非对称密码适合身份认证和安全协商,但成本较高;对称加密速度快,适合大量数据。TLS 将二者组合起来。现代 TLS 1.3 的密钥交换还提供前向保密。
TLS 不是一种算法,而是一套“组合拳”,用到三类密码学工具,各司其职:
| 工具 | 特点 | 在 TLS 中的角色 |
|---|---|---|
| 对称加密 | 同一个密钥加解密,速度极快 | 用 AES‑GCM 加密实际传输的 HTTP 数据 |
| 非对称加密 | 公钥加密 / 私钥解密,慢,可做签名 | 证书签名、密钥交换 |
| 哈希 | 任意输入 → 固定长度指纹,不可逆 | 校验完整性、证书指纹、密钥派生 |
非对称密码学用于认证身份并安全协商密钥材料;协商完成后,双方使用同一份会话密钥进行对称加密。后者计算开销更低,适合持续传输的业务数据。TLS 握手与后续数据传输的职责因此不同。
服务器发来的证书不是“空口无凭”,而是一张由 CA(证书颁发机构)签名的凭证。验证要过三关:
证书的 CN/SAN 必须包含你访问的域名,防止 A 网站的证书被用到 B 网站。
证书在 notBefore 与 notAfter 之间才有效,过期直接拦截。
证书由谁签?签发者又由谁签?一路向上,直到操作系统预置的根证书。
证书链是一棵信任树:根 CA(预置在系统里)→ 中间 CA → 你的域名证书。正因为根证书泄露会造成信任崩塌,浏览器还要求“中间 CA 不能直接签发终端用户证书”。
通常需要 2 RTT
1 RTT;会话复用时接近 0 RTT
双方各宣告一串算法再取交集,易受降级攻击
只保留少数强算法,旧算法直接移除
可选 RSA 或 DH 类
只允许 ECDHE/DHE 等前向保密方案
ServerHello 之后才加密
ServerHello 之后立即加密后续握手消息
早期 TLS 用服务器的 RSA 私钥参与密钥协商。代价是:只要某天私钥泄露,攻击者就能用之前录下的流量反推出当年的会话密钥,历史加密数据全部“裸奔”。改用 ECDHE(临时椭圆曲线 Diffie‑Hellman)后,每次握手的临时密钥用完即焚,即便服务器私钥日后泄露,也解密不了过去的会话。
DV / OV / EV 是按验证强度划分的证书等级。个人与中小站点的现代标准做法:用 Let's Encrypt 这类免费自动化 CA 签发 DV 证书(通常 90 天 + certbot 自动续期);本地开发则可用 mkcert 给自己签发受本机信任的证书。
HTTPS 只说明你与当前域名之间的通道安全,并不保证网站内容诚信,也挡不住相似域名钓鱼。仍要检查域名。
SSH 默认使用 TCP 22 端口,为登录、命令执行和文件传输提供加密通道。
$ 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首次连接显示主机指纹,确认后写入 known_hosts。以后指纹突然改变时,SSH 会警告。
可以用密码,更推荐密钥。私钥留在本机,公钥放进服务器的 authorized_keys。
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 的安全模型:
协商算法并进行密钥交换(Curve25519、DH 类),客户端先确认服务器主机密钥的指纹,此后一切通信都走对称加密——“没人能偷听”。
通道已安全,现在验证用户身份:密码或公钥。认证通过后才进入会话。
在同一条加密通道上跑多个会话:shell、SCP、端口转发。这也是 ControlMaster 复用连接的技术基础。
你执行 ssh-keygen 生成一对密钥后,把“公钥”追加到服务器的 ~/.ssh/authorized_keys。登录时服务器发起一个“挑战”:用你的公钥加密随机数,只有持有对应私钥的客户端能解密并回执。整个过程私钥从不离开你的电脑,也不会在网络上传输。
密码会被暴力破解、可能在输入时被偷看;密钥是 256 位随机数,破解难度远超任何人工密码,配合 ssh-agent 还能做到免密登录。
经常登录的机器写进 ~/.ssh/config,从此 ssh myserver 就能直达:
Host myserver
HostName 203.0.113.8
Port 2222
User alice
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 30把本机端口映射到远程能访问的地址,如 ssh -L 8080:db:3306 jump:本机 8080 → 内网 db 的 3306。
把远程端口映射回本机,常用于让外网访问家里或内网的服务。
变成 SOCKS5 代理:ssh -D 1080 host,浏览器把流量交给 1080 端口即可穿越网络边界。
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 只允许密钥认证
PubkeyAuthentication yes
Port 2222 # 换掉默认 22 端口,减少扫描噪音
AllowUsers alice # 白名单模式私钥不要发给任何人;使用密钥口令;确认主机指纹;服务器应禁用弱密码与 root 直接登录。
ipconfig有 IP、网关、DNS 吗?ping 网关IP局域网能通吗?ping 1.1.1.1能到互联网吗?nslookup 域名DNS 正常吗?tracert / TNC卡在哪?端口开吗?tracert example.com查看数据经过的路由跳数netstat -ano查看连接、监听端口与 PIDTest-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 → 端口/路径。每步都能把范围缩小一段,快速定位“是哪一段在说谎”。
选择答案后立即获得解释。