应用层:DNS、HTTP 与一次完整上网
最后一层,也是离你最近的一层——你写的每个接口、调的每个 API 都在这层说话。四层打底铺好的管道(端口、TCP、IP、帧),这篇拿来装"内容":DNS 怎么翻译域名、HTTP 怎么组织请求、HTTPS 怎么加密,最后用"输入网址回车后发生了什么"把全区收网。
一、应用层管什么
下面四层解决了"把字节可靠送到对方进程",但字节里说什么、什么格式、什么语义——是应用层的事。两种组织模式:
| 模式 | 思路 | 例子 |
|---|---|---|
| C/S(客户/服务器) | 服务集中放,客户来请求 | 网站、App 调接口 |
| P2P(对等) | 每个节点既是客户又是服务器 | 早年 BT 下载 |
P2P 越多人下越快(人人都是源),C/S 越多人下越挤(服务器一个人扛)——这是架构设计的第一课。
二、DNS:把域名翻译成 IP
人记不住 142.250.66.14,记得住 google.com——DNS 是全互联网的电话簿。
层级结构
根(.) → 顶级域(.com/.cn/.org) → 权威域(example.com) → 主机(www.example.com)
两种查询方式(408 考点)
- 递归查询(你的电脑 → 本地 DNS):"你帮我问到底,直接给我最终答案"
- 迭代查询(本地 DNS → 根/顶级/权威):"我不替你问,我只告诉你下一站去问谁"
浏览器 → 本地 DNS(递归)
├→ 根服务器:"问 .com 的服务器"(迭代)
├→ .com 服务器:"问 example.com 的权威服务器"
└→ 权威服务器:"www.example.com = 93.184.216.34"
→ 结果缓存起来(有 TTL),下次免查
🤔 DNS 查询为什么用 UDP(53 端口)?一问一答的小包,TCP 握手三个来回太浪费;超时重发一次就行。只有响应太大(区域传送)才换 TCP。
记录类型顺带认识:A(域名→IPv4)、AAAA(→IPv6)、CNAME(别名,指向另一个域名)、MX(邮件服务器)。
三、HTTP:浏览器和服务器的话术
HTTP 是请求-响应制:客户端发请求报文,服务器回响应报文。
请求报文
GET /index.html HTTP/1.1 ← 请求行:方法 + 路径 + 版本
Host: example.com ← 请求头(一堆键值对)
User-Agent: Mozilla/5.0 ...
(请求体,GET 通常没有)
常用方法与幂等性
| 方法 | 语义 | 幂等? |
|---|---|---|
| GET | 读 | ✅ |
| POST | 建/提交 | ❌(重复提交会建两个) |
| PUT | 全量替换 | ✅ |
| DELETE | 删 | ✅ |
幂等 = 重复执行结果一样——网络重试机制全靠它兜底:不确定成功时,幂等操作敢重试,非幂等的要加防重。
状态码家族
| 家族 | 含义 | 常客 |
|---|---|---|
| 2xx | 成功 | 200 OK |
| 3xx | 重定向 | 301 永久搬家 / 304 缓存还能用 |
| 4xx | 客户端的锅 | 403 没权限 / 404 没这页 / 429 请求太频繁 |
| 5xx | 服务器的锅 | 500 内部错误 / 502 网关拿不到后端响应 / 504 网关超时 |
💡 无状态:HTTP 本身不记得"你是谁"——每个请求都是陌生人。那登录态怎么维持?看下一节。
Cookie 与 Session:给无状态打补丁
- Cookie:服务器"发给你"的工牌,浏览器存着,之后每个请求自动带上(存在客户端)
- Session:服务器侧的档案柜,Cookie 里只放柜号(session id)——数据在服务器,更安全
- 2026 年主流是 Token(JWT):把"档案"签名后直接发给客户端保存,服务器无状态可水平扩容
四、HTTPS = HTTP + TLS 加压
裸 HTTP 的问题:明文(WiFi 抓包全可见)、无认证(谁都能冒充银行官网)、无完整(半路可篡改)。HTTPS 在 HTTP 和 TCP 之间垫了一层 TLS,三个问题各给一个解法:
| 威胁 | 解法 |
|---|---|
| 偷看 → | 加密 |
| 冒充 → | 证书(CA 权威机构签字认证"这个域名确实是它的") |
| 篡改 → | 摘要(内容改一个比特,校验就崩) |
加密的两难与破局:
- 对称加密快,但钥匙怎么安全递给对方?(递钥匙的路上就被偷了)
- 非对称加密(公钥加密、私钥解密)能安全递钥匙,但慢
TLS 握手概览:用证书保护下的非对称加密交换出对称会话密钥,之后的海量数据全用对称加密跑——既安全又快。浏览器地址栏的小锁,点开能看到证书链(你的证书 ← 中级 CA ← 根 CA)。
💡 408 只考"对称/非对称 + 证书"的概念层;面试会追问 TLS 1.2 与 1.3 的握手轮次、ECDHE——到时候回来补。
五、其他协议:一句话各归其位
| 协议 | 干什么 |
|---|---|
| DHCP | 设备连网时自动发 IP/掩码/网关/DNS("上网即插即用"的后台) |
| FTP | 文件传输(老牌,明文,如今多被 HTTPS/SFTP 取代) |
| SMTP / POP3 / IMAP | 发邮件 / 收邮件(下载删)/ 收邮件(服务器同步) |
| NTP | 对时钟(全网设备的表都跟它校准) |
六、CDN:就近发货
全世界的用户都回源站(美国机房)拉视频?卡爆。CDN = 在全球部署缓存节点,静态内容提前铺到离用户最近的机房——"就近取货"。DNS 在其中扮演调度员:同一个域名,北京解析到北京节点、广州解析到广州节点。
七、大串联:输入网址回车后发生了什么
面试之王,也是全区的收网考试——每一步都对应前面一篇笔记:
① DNS 解析 浏览器缓存 → 系统缓存 → 本地 DNS(递归+迭代) → 拿到 IP [[06-应用层#二|DNS]]
② TCP 连接 和服务器 IP:443 三次握手 [[05-传输层]]
③ TLS 握手 证书验证 + 协商对称密钥(HTTPS 才有) [[06-应用层#四|HTTPS]]
④ 发 HTTP GET /index.html(装进 TCP 段 → IP 分组 → 以太网帧) [[03-数据链路层|链路]]
⑤ 路由转发 每跳路由器查路由表、TTL 减 1、ARP 找下一跳 MAC [[04-网络层]]
⑥ 服务器响应 200 OK + HTML
⑦ 浏览器渲染 解析 HTML → 拉取 CSS/JS/图片(又回到④,并发多条连接)→ 排版绘制
能脱稿讲完这条链 + 每步的协议细节,计网面试基本稳了。
八、盲点自测
- 递归和迭代查询的区别? ——递归是"你帮我问到给结果",迭代是"我只告诉你下一站问谁"。
- DNS 为什么用 UDP? ——小包一问一答,握手成本不值;超时重发兜底。
- GET 和 POST 的本质区别? ——语义:GET 读、参数在 URL、幂等;POST 提交、参数在体、非幂等。重试机制敢不敢重试就看幂等。
- 304 是什么意思? ——缓存还新鲜,直接用本地副本,不重新传(3xx 里最省钱的一个)。
- Cookie 和 Session 的分工? ——Cookie 存客户端(凭证),Session 存服务器(档案);Cookie 里放 session id 来对号。
- HTTPS 怎么同时做到安全和快? ——非对称加密(证书保护下)只用来交换对称会话密钥,数据传输用快的对称加密。
- CDN 靠什么"就近"? ——全球边缘节点缓存 + DNS 调度把同一域名解析到离用户最近的节点。
- 家里的设备为什么都是 192.168 开头还能同时上网? ——私网地址 + NAT 端口复用(网络层的魔法)。
九、动手玩一把
# 看一次 HTTP 请求的完整往返
curl -v https://example.com # -v 能看到 DNS/TLS/请求头/响应头全过程
# 手动查 DNS
nslookup baidu.com
dig baidu.com +short # 只出答案
# 浏览器 F12 → Network 面板:刷新任意网页
# 能看到每条请求的方法/状态码/大小/耗时——比抓包工具更适合入门观察
至此五层全部走通:物理层运比特、链路层送帧、网络层找路、传输层交付进程、应用层定义语义。TCP/IP 的每一环都拆开看过了。
剩下的"网络编程(socket 动手写客户端/服务器)"将放进项目实战区,和代码一起学——理论闭环,实践在代码里见。
💬 评论