Skip to content

第五章 应用层:DNS、HTTP 与常用协议


1. 应用层在协议栈里的角色

下面四层解决的是"怎么把数据从一个进程送到另一个进程",应用层解决的是"送到之后,双方说什么、按什么格式说"。每个应用层协议本质上是一份双方程序共同遵守的对话剧本:请求长什么样、响应长什么样、先说什么后说什么。

理解应用层协议时,抓三个问题即可:它解决什么问题?它底下用 TCP 还是 UDP?它的对话流程是什么样?

1.1 C/S 模式与 P2P 模式

应用程序的组织结构有两大类:

维度C/S(客户/服务器)P2P(对等网络)
角色服务器常驻等待,客户端主动发起每个节点既是客户又是服务器
资源位置集中在服务器分散在所有节点
扩展性用户越多服务器压力越大用户越多可用资源反而越多
管理与安全集中管理,容易控制难以集中管理
典型应用网页、邮件、数据库BT 下载、区块链

一句大白话点透:C/S 是"所有人去餐厅吃饭",P2P 是"百家宴,人人带一个菜"。浏览网页是典型 C/S;迅雷、BT 这类"下载的人越多速度越快"的应用是典型 P2P。

2. DNS:把域名翻译成 IP 地址

网络层认的是 IP 地址,人记的是 www.example.com 这样的域名。**DNS(域名系统)**就是全球分布式的"翻译电话簿"。它默认使用 UDP 的 53 端口(一问一答,量小,建 TCP 连接不划算)。

2.1 层级结构:为什么不搞一个全球大表

全世界几亿个域名,如果放在一台服务器上:单点故障、访问拥堵、更新困难,全都是灾难。DNS 的设计是按域名的层级把权威数据分散出去

  1. 根域名服务器:只回答"负责 .com 的服务器在哪"。
  2. 顶级域服务器:如 .com 服务器,回答"负责 example.com 的服务器在哪"。
  3. 权威域名服务器:真正存着 www.example.com 记录的服务器,由域名持有者管理。

域名本身就体现层级,从右往左读:www.example.com 中 com 是顶级域,example 是二级域,www 是主机名。每一级只需要知道下一级去哪问,就像问路问到街道办,街道办不知道你家门牌,但知道该问哪个居委会。

2.2 递归查询与迭代查询

客户端通常把查询全权委托给本地域名服务器(运营商或公司提供),本地服务器再替你跑腿:

两种查询方式的区别在"被问的人负不负责跑腿":

  1. 递归查询:被问方必须给出最终答案,自己去追查——主机对本地服务器的查询是递归的("你必须给我结果")。
  2. 迭代查询:被问方只给一条线索"去问谁",追查由提问方继续——本地服务器对根、顶级、权威服务器的查询通常是迭代的。

缓存是 DNS 高效的关键:本地服务器和操作系统都会把查到的结果缓存一段时间(由 TTL 控制),绝大多数查询根本到不了根服务器。

2.3 常见的 DNS 记录类型

DNS 电话簿里不只有"域名到 IPv4"一种条目,考试偶尔点名:

记录类型存的是什么白话
A域名对应的 IPv4 地址最常用的"查号"
AAAA域名对应的 IPv6 地址四个 A,因为 128 位是 32 位的四倍
CNAME域名的别名指向"此名转接到另一个名字"
MX该域名收邮件的服务器发邮件前先查它,才知道信投到哪
NS负责该域的权威服务器层级结构里"下一级去问谁"的指路牌

3. HTTP:万维网的对话规则

HTTP(超文本传输协议)规定浏览器与网站服务器之间怎么请求和响应,基于 TCP 的 80 端口(HTTPS 为 443)。

先澄清一组常被混用的概念:互联网(Internet)是全球互联的网络基础设施;万维网(WWW)只是运行在互联网之上的一种应用——用 HTTP 传输、用 HTML 描述、用 URL 定位的超文本系统。邮件、网游、视频通话都跑在互联网上,但都不属于万维网。"互联网就是 WWW"是错误表述。

3.1 请求与响应的格式

一次 HTTP 对话就是一去一回两段结构化文本:

请求 = 请求行(方法 路径 版本)+ 请求头 + 空行 + 请求体
GET /index.html HTTP/1.1
Host: www.example.com

响应 = 状态行(版本 状态码 短语)+ 响应头 + 空行 + 响应体
HTTP/1.1 200 OK
Content-Type: text/html

<html>……</html>

3.2 常见方法与状态码

方法语义
GET获取资源,参数在 URL 里,可被缓存
POST提交数据,参数在请求体里
PUT更新(整体替换)资源
DELETE删除资源
HEAD只要响应头不要正文,常用于探测

状态码按首位数字分五类,"1 信息、2 成功、3 重定向、4 客户端错、5 服务器错":

状态码含义白话
200OK成功
301 / 302永久 / 临时重定向搬家了,去新地址
304Not Modified没变,用你的缓存
403Forbidden认识你,但不让你看
404Not Found没这个东西
500Internal Server Error服务器自己出错了
502 / 503网关错误 / 服务不可用后端挂了 / 忙不过来

区分 403 与 404、404 与 500 的责任方(4 开头怪客户端请求,5 开头怪服务器)是选择题常客。

HTTP 是无状态协议:每个请求独立处理,服务器不记得你上一次来过——这让服务器实现简单、容易横向扩展。但购物车、登录态需要"记住你",于是打补丁:

  1. Cookie:服务器发响应时塞给浏览器一小段数据,浏览器以后每次请求自动带上——把记忆存在客户端
  2. Session:服务器把用户状态存在自己这边,只给浏览器一个入场券号码(Session ID,通常放在 Cookie 里传递)——把记忆存在服务端,客户端只拿号

一句大白话点透:Cookie 是"会员卡信息写在卡上",Session 是"卡上只有卡号,信息在店里的登记簿上"。

3.4 HTTP/1.1、/2、/3 演进一段话

HTTP/1.1 用持久连接解决了每个请求都要重新握手的浪费,但同一连接上请求必须排队,队头一个慢全体等(队头阻塞);HTTP/2 引入二进制分帧和多路复用,多个请求在一条 TCP 连接上交错并行,但 TCP 层丢一个包仍会卡住所有流;HTTP/3 干脆抛弃 TCP,改用基于 UDP 的 QUIC 协议,在应用层自己实现可靠传输和加密,各流独立互不牵连,连接建立更快。演进主线就一句话:一直在跟"排队等待"作斗争

3.5 静态页面与动态页面

另一组基础概念:静态页面是服务器上现成的 HTML 文件,谁来访问都返回同一份,像印好的传单;动态页面由服务器程序在收到请求时现场生成(查数据库、填模板),不同用户、不同时刻内容不同,像现点现做的菜。判断标准看"服务器是否在请求时执行程序生成内容",而不是看页面上有没有动画——一张带轮播图的纯 HTML 仍是静态页面,动画是浏览器里 JS 的事。

4. 其他常用协议:各自解决什么问题

协议解决什么问题传输层端口备注
FTP文件上传下载TCP21 控制 / 20 数据控制与数据双连接是其特色
SMTP发送邮件、邮件服务器间投递TCP25只管"寄",不管"取"
POP3从邮箱服务器收取邮件TCP110通常下载到本地即从服务器删除
IMAP收取并同步管理邮件TCP143邮件留在服务器,多设备状态一致
Telnet远程登录TCP23明文传输,已被淘汰
SSH加密的远程登录TCP22Telnet 的安全替代品
DHCP自动分配 IP、掩码、网关、DNSUDP67/68新设备入网的"发牌员"
DNS域名解析UDP 为主53大响应与区域传送用 TCP

三个易混点专门说清:

  1. 邮件三兄弟:SMTP 负责"发"(用户发给自己邮箱服务器 + 服务器投递给对方服务器),POP3/IMAP 负责"收"(从自己邮箱服务器取信)。一封邮件的完整旅程要用到两类协议。POP3 与 IMAP 的差别是"取走"与"同步":POP3 像取信后信箱清空,IMAP 像网盘,手机电脑看到同一份。
  2. Telnet 与 SSH:功能相同(远程登录),差别只在是否加密。看到"Telnet 安全"直接判错。
  3. DHCP:设备刚入网时连 IP 都没有,用广播找 DHCP 服务器讨要配置,因此必须基于 UDP。第七章会看它的完整流程。

一封邮件的完整旅程

把邮件流程画出来,SMTP 与 POP3/IMAP 的分工一目了然——这张图能直接对付"发件到收件各环节用什么协议"的考题:

注意两个细节:前两段"上行提交"和"服务器互递"用的都是 SMTP;只有最后"收件人取信"这一段才轮到 POP3 或 IMAP。所以"整个邮件过程只用一种协议"必错,"SMTP 出现两次"却是对的。

5. URL 结构拆解

URL(统一资源定位符)是资源在互联网上的"完整地址",以 https://www.example.com:443/news/list.html?page=2#top 为例:

片段名称作用
https协议(方案)用什么协议访问
www.example.com主机(域名)资源在哪台服务器,经 DNS 转成 IP
443端口服务器上哪个进程;省略时用协议默认值
/news/list.html路径服务器上的哪个资源
page=2查询参数附加条件,问号开头,多个用与号连接
top片段(锚点)页面内定位,不发给服务器

注意两点:端口省略时按协议取默认(HTTP 80、HTTPS 443);锚点只在浏览器本地起作用。

本章要点回顾

知识点一句话结论
C/S vs P2P集中服务 vs 人人皆服务器;P2P 用户越多资源越多
DNS 结构根—顶级—权威三级分工,每级只指路给下一级
递归 vs 迭代递归"给我最终答案",迭代"我给你下一条线索"
DNS 传输层默认 UDP 53,缓存让多数查询不出本地
DNS 记录A 记 IPv4、AAAA 记 IPv6、CNAME 别名、MX 收邮件
静态 vs 动态页面看服务器是否在请求时执行程序生成内容,与动画无关
HTTP 格式请求行/状态行 + 头部 + 空行 + 正文
状态码分类2 成功、3 重定向、4 客户端错、5 服务器错
WWW 与互联网万维网只是互联网上的一种应用,二者不能画等号
无状态补丁Cookie 存客户端,Session 存服务端发号
邮件旅程提交与投递两段用 SMTP,最后取信才用 POP3/IMAP
HTTP 演进1.1 持久连接、2 多路复用、3 基于 UDP 的 QUIC
邮件协议SMTP 只管发,POP3 取走,IMAP 同步
远程登录Telnet 明文已淘汰,SSH 加密
URL协议://主机:端口/路径?参数#锚点

做题提醒

  1. DNS 默认用 UDP(53 端口),不是 TCP;但"DNS 只能用 UDP"也是错的——区域传送和大响应用 TCP。
  2. 主机到本地域名服务器是递归查询,本地服务器往上(根/顶级/权威)通常是迭代查询,方向别答反。
  3. SMTP 只用于发送邮件,收邮件用 POP3 或 IMAP;"用 SMTP 收取邮件"是典型错误选项。
  4. 状态码归属:404 是客户端一侧的请求问题(资源不存在),500 是服务器内部错误;403 是"有此资源但拒绝访问"。
  5. HTTP 无状态指"服务器不保留请求之间的上下文",不等于"不能实现登录"——Cookie/Session 就是补状态的机制。
  6. 端口配对题必背:FTP 21、SSH 22、Telnet 23、SMTP 25、DNS 53、HTTP 80、POP3 110、HTTPS 443。
  7. GET 与 POST 的规范区别在语义(获取 vs 提交)和参数位置(URL vs 请求体);"GET 绝对不能携带任何数据"过于绝对。
  8. URL 中省略端口时按协议取默认值(HTTP 80、HTTPS 443);锚点部分不会发送给服务器。
  9. "万维网就是互联网"混淆了应用与基础设施:WWW 只是互联网上众多应用之一,邮件、即时通信并不属于 WWW。