写在前面:应用层是离我们最近的网络层,也是面试里问得最多的层。说实话,我见过太多人学了四年计算机,连HTTP和HTTPS的区别都说不清楚,更别提DNS解析过程了。今天这篇文章,我把应用层所有核心协议一次性讲透。不管你是准备面试还是想真正理解"上网"这件事,这篇都值得你认真看完。建议收藏,因为你会发现它早晚用得上。

文章目录
-
- 一、应用层概述
-
- [C/S架构 vs P2P架构](#C/S架构 vs P2P架构)
- 二、HTTP协议详解
-
- [2.0 HTTP是什么?------餐厅点餐类比](#2.0 HTTP是什么?——餐厅点餐类比)
- [2.1 HTTP请求方法](#2.1 HTTP请求方法)
- [GET vs POST 详细对比------查快递 vs 寄快递](#GET vs POST 详细对比——查快递 vs 寄快递)
- [2.2 HTTP状态码速查](#2.2 HTTP状态码速查)
- HTTP状态码的餐厅场景映射
- [2.3 HTTP版本演进](#2.3 HTTP版本演进)
- [2.4 HTTP报文格式](#2.4 HTTP报文格式)
- [2.5 Cookie与Session机制](#2.5 Cookie与Session机制)
- [2.6 HTTPS与SSL/TLS握手](#2.6 HTTPS与SSL/TLS握手)
- 三、DNS域名系统
-
- DNS解析的查电话簿类比
- [3.1 域名层次结构](#3.1 域名层次结构)
- [3.2 递归查询 vs 迭代查询](#3.2 递归查询 vs 迭代查询)
- [3.3 DNS记录类型](#3.3 DNS记录类型)
- [3.4 DNS解析完整过程](#3.4 DNS解析完整过程)
- 四、DHCP协议
-
- DHCP的自动分配宿舍类比
- [4.1 DHCP四步交互流程](#4.1 DHCP四步交互流程)
- [4.2 DHCP中继代理](#4.2 DHCP中继代理)
- [4.3 租约机制](#4.3 租约机制)
- 五、FTP协议
-
- [5.1 双TCP连接](#5.1 双TCP连接)
- [5.2 主动模式 vs 被动模式](#5.2 主动模式 vs 被动模式)
- 六、邮件协议对比
- 七、SSH与MQTT协议
-
- [7.1 SSH协议](#7.1 SSH协议)
- [7.2 MQTT协议](#7.2 MQTT协议)
- 八、新手常见误区
- 九、问题与解答
- 十、面试高频考点汇总
- 十一、模拟测试题
-
- [1. HTTP状态码304表示什么含义?](#1. HTTP状态码304表示什么含义?)
- [2. DNS查询中,主机向本地DNS服务器发出的查询属于什么类型?](#2. DNS查询中,主机向本地DNS服务器发出的查询属于什么类型?)
- [3. DHCP的四步交互流程依次是?](#3. DHCP的四步交互流程依次是?)
- [4. FTP协议使用几个TCP连接?数据连接默认端口是?](#4. FTP协议使用几个TCP连接?数据连接默认端口是?)
- [5. 以下哪个协议用于接收电子邮件?](#5. 以下哪个协议用于接收电子邮件?)
- 参考答案
- 十二、互动话题
- 参考资料
一、应用层概述
应用层是OSI参考模型的第七层,也是TCP/IP模型的最上层。我们平时接触到的所有网络应用------浏览器、邮件客户端、FTP工具、即时通讯------全部都在这一层。
说白了,下层所有协议(物理层、数据链路层、网络层、传输层)辛辛苦苦搭建的通信管道,最终都是为了给应用层服务的。没有应用层,网络就只是一堆冷冰冰的管道。
C/S架构 vs P2P架构
| 对比维度 | C/S架构(客户端/服务器) | P2P架构(对等网络) |
|---|---|---|
| 核心特点 | 服务器集中提供服务,客户端请求 | 每个节点既是客户端也是服务器 |
| 典型应用 | Web浏览、电子邮件、数据库 | BitTorrent、区块链、Skype |
| 可扩展性 | 服务器是瓶颈,扩展成本高 | 节点越多性能越好 |
| 可靠性 | 依赖服务器,单点故障风险 | 去中心化,抗故障能力强 |
| 管理难度 | 集中管理,方便维护 | 分布式管理,难以控制 |
踩坑提醒:面试时别把P2P说成"点对点协议"(Point-to-Point Protocol),那是数据链路层的PPP协议。P2P在这里是Peer-to-Peer,指的是架构模式,不是某个具体协议。
二、HTTP协议详解
HTTP(HyperText Transfer Protocol,超文本传输协议)是万维网数据通信的基础。这个协议几乎每个程序员天天都在用,但真正理解它的人不多。
2.0 HTTP是什么?------餐厅点餐类比
新手理解HTTP,最好的方式是把它想象成餐厅点餐的过程:
| HTTP概念 | 餐厅类比 | 说明 |
|---|---|---|
| URL | 菜单上的菜品编号 | www.example.com/index.html 就像菜单上的"A12号套餐",告诉服务员你要点什么 |
| HTTP请求 | 你写的点餐单 | 你填好"要什么菜、有什么特殊要求",交给服务员 |
| HTTP响应 | 服务员端来的菜 | 厨房做好后,服务员把菜端给你 |
| 状态码 | 服务员的回复 | "菜来了"、"这道菜没有"、"厨房着火了"... |
举个例子:
- 你说:"我要A12号套餐"(GET请求)
- 服务员说:"好的,200,菜马上来"(200 OK)
- 服务员说:"抱歉,404,这道菜我们没有"(404 Not Found)
- 服务员说:"不好意思,500,厨房着火了"(500 Internal Server Error)
踩坑提醒:很多新手以为HTTP就是"上网",其实HTTP只是浏览器和服务器之间"对话的规则"。就像餐厅点餐有规矩一样,HTTP规定了"怎么问"和"怎么答"。
2.1 HTTP请求方法
HTTP定义了一组请求方法,用来告诉服务器你想干什么。
| 方法 | 作用 | 是否有请求体 | 幂等性 | 典型场景 |
|---|---|---|---|---|
| GET | 获取资源 | 否 | 是 | 浏览网页、下载文件 |
| POST | 提交数据 | 是 | 否 | 表单提交、文件上传 |
| PUT | 替换资源 | 是 | 是 | 更新用户信息 |
| DELETE | 删除资源 | 否 | 是 | 删除指定资源 |
| HEAD | 获取响应头 | 否 | 是 | 检查资源是否存在 |
| OPTIONS | 获取支持方法 | 否 | 是 | CORS预检请求 |
踩坑提醒:很多人以为GET不能传参数,其实GET可以通过URL的query string传参。区别在于GET的参数在URL里,POST的参数在请求体里。另外,GET请求可以被缓存、被收藏为书签,POST不行。
GET vs POST 详细对比------查快递 vs 寄快递
| 对比维度 | GET(查快递) | POST(寄快递) |
|---|---|---|
| 类比 | 去快递点查包裹,报单号就行 | 去快递点寄包裹,要填单子、装东西 |
| 数据位置 | 信息在URL里(单号贴在额头上) | 信息在请求体里(东西装在包裹里) |
| 可见性 | URL所有人都能看到 | 请求体不会直接显示在地址栏 |
| 数据大小 | 受URL长度限制(约2KB) | 理论上无限制 |
| 安全性 | 低(别在URL里放密码!) | 相对高(但也不是绝对安全) |
| 幂等性 | 是(查一次和查十次结果一样) | 否(寄两次就是两个包裹) |
| 缓存 | 可以被浏览器缓存 | 通常不被缓存 |
| 书签 | 可以收藏为书签 | 不能收藏为书签 |
生活场景:
- GET :你在淘宝搜索"运动鞋",URL变成
taobao.com/search?q=运动鞋。你可以把这个链接发给朋友,他打开看到的一样。 - POST:你提交订单,填写收货地址、支付方式。这些信息不会显示在URL里,刷新页面浏览器还会警告你是否要重新提交。
踩坑提醒:GET请求千万别用来提交密码、银行卡号等敏感信息!因为URL会记录在浏览器历史、服务器日志里,谁都能看到。
2.2 HTTP状态码速查
状态码是服务器告诉客户端"你的请求处理得怎么样了"的简短回答。
| 状态码范围 | 含义 | 常见状态码 |
|---|---|---|
| 2xx | 成功 | 200 OK、201 Created、204 No Content |
| 3xx | 重定向 | 301 永久重定向、302 临时重定向、304 未修改 |
| 4xx | 客户端错误 | 400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found |
| 5xx | 服务器错误 | 500 Internal Server Error、502 Bad Gateway、503 Service Unavailable |
HTTP状态码的餐厅场景映射
用餐厅点餐来理解常见状态码:
| 状态码 | 餐厅场景 | 实际含义 |
|---|---|---|
| 200 | "菜来了,请慢用" | 请求成功,服务器正常返回数据 |
| 301 | "这道菜换到3号桌了" | 资源永久移动到新的URL |
| 302 | "这道菜暂时在3号桌" | 资源临时移动到新的URL |
| 304 | "菜没变化,吃你碗里的" | 资源未修改,用本地缓存 |
| 400 | "你点的这是什么?我没听懂" | 请求语法错误,服务器无法理解 |
| 401 | "请出示会员卡" | 未授权,需要身份验证 |
| 403 | "你有会员卡,但这道菜你不能点" | 禁止访问,权限不足 |
| 404 | "抱歉,菜单上没有这道菜" | 请求的资源不存在 |
| 500 | "厨房着火了!" | 服务器内部错误 |
| 502 | "厨房服务员和厨师吵架了" | 网关错误,上游服务器无响应 |
| 503 | "餐厅爆满,暂时不接客" | 服务不可用,服务器过载 |
踩坑提醒:401和403的区别经常被问。401是"你没登录",403是"你登录了但没权限"。另外304不是错误,它表示资源未修改,客户端可以用缓存。
2.3 HTTP版本演进
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 连接方式 | 短连接 | 长连接(keep-alive) | 多路复用 | 多路复用 |
| 传输协议 | TCP | TCP | TCP | QUIC(基于UDP) |
| 多路复用 | 不支持 | 不支持(管线化有限) | 支持 | 支持 |
| 头部压缩 | 无 | 无 | HPACK算法 | QPACK算法 |
| 服务器推送 | 不支持 | 不支持 | 支持 | 支持 |
| 队头阻塞 | 存在 | 存在 | TCP层面仍有 | 彻底解决 |
HTTP/3用QUIC替代TCP,解决了TCP层面的队头阻塞问题。这个点面试经常问,一定要记住。
2.4 HTTP报文格式
HTTP请求报文示例:
http
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: session_id=abc123
HTTP响应报文示例:
http
HTTP/1.1 200 OK
Server: nginx/1.24.0
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Set-Cookie: session_id=abc123; Path=/; HttpOnly
Cache-Control: max-age=3600
<!DOCTYPE html>
<html>
<head><title>Example</title></head>
<body>Hello World</body>
</html>
报文结构其实很简单:请求行/状态行 + 头部字段 + 空行 + 请求体/响应体。空行是必须的,它标志着头部结束。
2.5 Cookie与Session机制
| 对比维度 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端浏览器 | 服务器端内存/数据库 |
| 存储容量 | 最大4KB | 理论上无限制 |
| 安全性 | 相对较低(可被篡改) | 相对较高 |
| 生命周期 | 可设置过期时间 | 默认浏览器关闭即失效 |
| 跨域支持 | 受同源策略限制 | 通过URL重写可跨域 |
Cookie和Session的会员卡类比
理解Cookie和Session,可以想象成餐厅会员卡系统:
| 概念 | 类比 | 说明 |
|---|---|---|
| Cookie | 你手里的会员卡 | 存储在你的钱包(浏览器)里,上面有你的会员号 |
| Session | 餐厅后台的会员档案 | 存储在餐厅(服务器)的档案柜里,记录你的消费记录、积分 |
| Session ID | 会员卡上的卡号 | 唯一标识,餐厅靠这个号找到你的档案 |
去餐厅吃饭的过程:
- 你第一次来餐厅,没有会员卡(首次访问网站)
- 服务员给你办了一张会员卡,写上卡号"A12345"(服务器创建Session,生成Session ID)
- 你把会员卡放钱包里(浏览器把Session ID存到Cookie里)
- 下次你来,出示会员卡"A12345"(浏览器自动携带Cookie)
- 服务员根据卡号找到你的档案(服务器根据Session ID找到Session)
如果丢了会员卡怎么办?
- 如果Cookie被清除了,你就没有会员卡了,餐厅会给你办一张新的(重新创建Session)
- 如果餐厅档案柜满了,你的档案可能被清理(Session过期失效)
工作流程:
- 客户端首次请求服务器
- 服务器创建Session,生成Session ID
- 服务器通过
Set-Cookie响应头将Session ID返回 - 客户端后续请求自动携带Cookie中的Session ID
- 服务器通过Session ID找到对应Session
踩坑提醒:Session的本质还是依赖Cookie来传递Session ID。如果用户禁用了Cookie,就需要用URL重写(把Session ID附在URL后面)来传递。这个细节面试官偶尔会追问。
2.6 HTTPS与SSL/TLS握手
HTTPS = HTTP + SSL/TLS加密。它在HTTP的基础上加了一层安全传输。
TLS握手过程(简化版):
客户端 服务器
| |
| 1. ClientHello(支持的加密套件列表、随机数) |
| --------------------------------------------> |
| |
| 2. ServerHello(选定加密套件、随机数)+ 证书 |
| <-------------------------------------------- |
| |
| 3. 验证证书,生成预主密钥(Pre-Master Secret) |
| 4. 用服务器公钥加密预主密钥并发送 |
| --------------------------------------------> |
| |
| 5. 服务器用私钥解密,得到预主密钥 |
| 6. 双方用预主密钥+随机数生成会话密钥 |
| 7. 通知客户端准备加密通信 |
| <-------------------------------------------- |
| |
| 8. 加密通信开始 |
| <===========================================> |
踩坑提醒:HTTPS不是绝对安全的。证书被伪造、算法被破解、或者用户主动忽略证书警告,都会导致HTTPS失效。HTTPS解决的是传输安全,不是应用安全。
三、DNS域名系统
DNS(Domain Name System,域名系统)是互联网的"电话簿"。你输入www.baidu.com,DNS帮你把它翻译成110.242.68.66这样的IP地址。
DNS解析的查电话簿类比
把DNS解析过程想象成查一个电话号的过程:
| DNS组件 | 电话簿类比 | 说明 |
|---|---|---|
| 浏览器缓存 | 你的手机通讯录 | 你最近打过的人,直接就能找到 |
| hosts文件 | 你手写的电话本 | 你自己记在小本子上的号码,优先级最高 |
| 本地DNS服务器 | 114查号台 | 你打电话去问,它帮你查 |
| 根DNS服务器 | 总机 | "你要查哪个地区的?我转接过去" |
| 顶级DNS服务器 | 地区分机 | "你要查哪家公司?我转接过去" |
| 权威DNS服务器 | 具体公司前台 | "张三的电话是123456789" |
完整的查号过程:
- 你先翻手机通讯录(浏览器缓存)------没有
- 再翻手写的电话本(hosts文件)------没有
- 打114查号台(本地DNS服务器)------查号台也不知道,但知道去问总机
- 总机(根DNS)说:"这是.com的,我转接.com地区分机"
- .com地区分机(顶级DNS)说:"这是baidu.com的,我转接baidu公司前台"
- baidu公司前台(权威DNS)说:"www.baidu.com的电话是110.242.68.66"
- 114查号台记住这个号码,然后告诉你
踩坑提醒 :DNS解析涉及多级缓存,修改DNS记录后可能不会立即生效。因为每一级都可能缓存了旧记录,需要等TTL(缓存时间)过期。排查问题时记得先清浏览器缓存、刷新DNS缓存(Windows用
ipconfig /flushdns)。
3.1 域名层次结构
DNS采用树形层次结构,从上到下分为:
根域(.)
├── 顶级域(TLD)
│ ├── 国家/地区域:.cn、.us、.jp、.uk
│ ├── 通用域:.com、.org、.net、.edu、.gov
│ └── 新通用域:.app、.dev、.cloud
│ └── 二级域
│ ├── baidu.com
│ ├── google.com
│ └── tsinghua.edu.cn
│ └── 三级域/子域
│ ├── www.tsinghua.edu.cn
│ └── mail.tsinghua.edu.cn
3.2 递归查询 vs 迭代查询
| 对比维度 | 递归查询 | 迭代查询 |
|---|---|---|
| 查询方式 | 客户端问一次,服务器负责查到底 | 客户端反复问,服务器每次给一个线索 |
| 负担分配 | 被查询的服务器负担重 | 客户端(或本地DNS)负担重 |
| 实际场景 | 主机→本地DNS服务器 | 本地DNS→根/顶级/权威DNS |
DNS查询流程图解:
你的电脑 本地DNS服务器 根DNS .com DNS 权威DNS
| | | | |
| 1. 递归查询 | | | |
| www.baidu.com? | | | |
| --------------------> | | | |
| | 2. 迭代查询 | | |
| | www.baidu.com? | | |
| | ------------------> | | |
| | | | |
| | 3. 我不知道,去问 | | |
| | .com DNS | | |
| | <------------------ | | |
| | | | |
| | 4. 迭代查询 | | |
| | www.baidu.com? | | |
| | ------------------- | --------------> | |
| | | | |
| | 5. 去问baidu的权威DNS | |
| | <------------------ | <-------------- | |
| | | | |
| | 6. 迭代查询 | | |
| | www.baidu.com? | | |
| | ------------------- | --------------- | --------------> |
| | | | |
| | 7. 110.242.68.66 | | |
| | <------------------ | <-------------- | <--------------- |
| 8. 110.242.68.66 | | | |
| <-------------------- | | | |
3.3 DNS记录类型
| 记录类型 | 全称 | 作用 | 示例 |
|---|---|---|---|
| A | Address | 域名→IPv4地址 | example.com → 93.184.216.34 |
| AAAA | IPv6 Address | 域名→IPv6地址 | example.com → 2606:2800:220:1:: |
| CNAME | Canonical Name | 域名别名 | www.example.com → example.com |
| MX | Mail Exchange | 邮件服务器 | example.com → mail.example.com |
| NS | Name Server | 域名DNS服务器 | example.com → ns1.example.com |
3.4 DNS解析完整过程
从浏览器输入URL到页面显示,完整过程如下:
- 浏览器检查缓存:先看浏览器自身的DNS缓存有没有记录
- 操作系统检查缓存:查看hosts文件和操作系统DNS缓存
- 本地DNS服务器查询:向配置的DNS服务器发起递归查询
- 递归/迭代查询:本地DNS依次查询根DNS→顶级DNS→权威DNS
- 获取IP地址:最终得到目标服务器的IP地址
- 发起TCP连接:三次握手建立连接
- 发送HTTP请求:构建请求报文并发送
- 服务器处理请求:返回HTML/CSS/JS等资源
- 浏览器渲染页面:解析HTML→构建DOM树→渲染→显示
踩坑提醒:DNS解析涉及多级缓存(浏览器缓存→OS缓存→路由器缓存→ISP缓存→权威DNS),缓存时间由TTL(Time To Live)值控制。修改DNS记录后可能需要等待TTL过期才能生效,这个坑我踩过,排查了半天才想起来清缓存。
四、DHCP协议
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)让你不用手动配置IP地址就能上网。连上WiFi就能用,背后就是DHCP在干活。
DHCP的自动分配宿舍类比
把DHCP想象成学校宿舍管理系统:
| DHCP步骤 | 宿舍管理类比 | 说明 |
|---|---|---|
| DHCP Discover | 新生入住,问"哪里有空宿舍?" | 新来的学生(设备)还没地方住,广播问谁有宿舍 |
| DHCP Offer | 宿管说"3号楼201还空着" | 宿舍管理系统(DHCP服务器)回复一个可用的宿舍号 |
| DHCP Request | 新生说"我要住3号楼201" | 学生确认要这个宿舍 |
| DHCP ACK | 宿管给钥匙,说"可以入住了,住一年" | 确认分配,发放钥匙(IP地址),告知租期 |
完整的新生入住过程:
- 你拖着行李到学校,不知道住哪(设备连上网络,没有IP)
- 你在大喊:"我是新生,哪里有空宿舍?"(DHCP Discover广播)
- 宿管阿姨听到后说:"3号楼201空着,给你留着"(DHCP Offer)
- 你说:"好的,我要住3号楼201"(DHCP Request)
- 宿管阿姨给你钥匙,说:"住一年,到期前记得续住"(DHCP ACK,分配IP+租期)
踩坑提醒:DHCP的前两步用的是广播,不是单播。因为客户端此时还没有IP地址,根本不知道该发给谁。这个细节面试经常考。
4.1 DHCP四步交互流程
DHCP采用经典的DORA四步流程:
客户端(没有IP) DHCP服务器
| |
| 1. DHCP Discover(广播) |
| "谁有IP地址可以给我?" |
| --------------------------------> |
| |
| 2. DHCP Offer(广播/单播) |
| "我可以给你 192.168.1.100" |
| <-------------------------------- |
| |
| 3. DHCP Request(广播) |
| "我要 192.168.1.100" |
| --------------------------------> |
| |
| 4. DHCP ACK(广播/单播) |
| "确认,给你用,租期24小时" |
| <-------------------------------- |
| |
踩坑提醒:DHCP的前两步用的是广播,不是单播。因为客户端此时还没有IP地址,根本不知道该发给谁。这个细节面试经常考。
4.2 DHCP中继代理
当DHCP客户端和服务器不在同一个网段时,需要DHCP中继代理来转发DHCP消息。
路由器通常充当DHCP中继代理的角色,它收到客户端的广播DHCP请求后,以单播方式转发给另一个网段的DHCP服务器。
4.3 租约机制
DHCP分配的IP地址是有租期的,不是永久给你的。
- 租期默认:通常为24小时(可配置)
- 续租时机:租期过半(50%)时开始尝试续租
- 续租流程:客户端发送DHCP Request请求续租
- 续租失败:租期到87.5%时再次尝试,到期后释放IP
五、FTP协议
FTP(File Transfer Protocol,文件传输协议)是互联网上最早的文件传输协议之一,至今仍在广泛使用。
5.1 双TCP连接
FTP最大的特点是使用两个TCP连接:
| 连接类型 | 端口号 | 作用 | 生命周期 |
|---|---|---|---|
| 控制连接 | 21 | 传输FTP命令和响应 | 整个FTP会话期间保持 |
| 数据连接 | 20(主动模式) | 传输文件内容 | 每次文件传输时建立,传完关闭 |
5.2 主动模式 vs 被动模式
| 对比维度 | 主动模式(PORT) | 被动模式(PASV) |
|---|---|---|
| 连接发起方 | 服务器主动连接客户端 | 客户端主动连接服务器 |
| 数据端口 | 服务器用20端口连接客户端随机端口 | 服务器开放随机端口,等待客户端连接 |
| 防火墙友好性 | 差(服务器连客户端容易被挡) | 好(客户端连服务器,通常允许) |
| 使用场景 | 内网环境 | 互联网环境(推荐) |
FTP主动/被动模式的送货类比
把FTP的数据传输想象成快递送货:
主动模式 = 快递员主动上门送货
- 你在网上买了东西(客户端请求文件)
- 快递员(服务器)主动敲门送到你家(服务器主动连接客户端的数据端口)
- 问题:你家小区有保安(防火墙),不认识这个快递员,不让他进!
- 结果:文件传不过来,连接失败
被动模式 = 你去快递点自提
- 你在网上买了东西(客户端请求文件)
- 快递员说:"你来XX快递点取吧"(服务器告诉客户端一个端口)
- 你主动出门去快递点取(客户端主动连接服务器的随机端口)
- 保安不会拦你,因为是你主动出去的
- 结果:文件顺利拿到
踩坑提醒:现在互联网环境下基本都用被动模式。如果你用主动模式连FTP发现连不上,大概率是防火墙把服务器主动发起的连接给挡了。这个坑我踩过,折腾了好一阵。
六、邮件协议对比
| 协议 | 全称 | 端口号 | 作用 | 特点 |
|---|---|---|---|---|
| SMTP | Simple Mail Transfer Protocol | 25/465/587 | 发送邮件 | 推协议,只能推不能拉 |
| POP3 | Post Office Protocol v3 | 110/995 | 接收邮件 | 下载到本地,可删除服务器副本 |
| IMAP | Internet Message Access Protocol | 143/993 | 接收邮件 | 服务器上管理,多设备同步 |
简单理解:
- SMTP是"寄信"的邮筒
- POP3是"取信后销毁"的取信方式
- IMAP是"在邮局看信"的取信方式
邮件协议的邮局类比
把邮件系统想象成现实中的邮局:
| 协议 | 邮局类比 | 生活场景 |
|---|---|---|
| SMTP | 街边的邮筒 | 你把信投进邮筒,邮局负责帮你寄出去。SMTP只管"寄",不管"收" |
| POP3 | 取信后撕掉原件 | 你去邮局取信,看完把原件撕了扔垃圾桶。下次来,这封信就没了。信只在你手里有 |
| IMAP | 在邮局阅览室看信 | 你去邮局看信,但信还留在邮局。你用手机看、用电脑看,看到的都是同一批信 |
场景对比:
- POP3:你在公司电脑上用Outlook收邮件,邮件下载到本地。回家用笔记本登录,发现邮箱是空的------因为邮件已经被公司电脑"取走"了。
- IMAP:你在公司电脑、家里笔记本、手机上登录邮箱,看到的邮件完全一样。你在手机上删了一封邮件,公司电脑上也会消失。
踩坑提醒:SMTP只能用于发送邮件,不能接收。很多人以为SMTP既能发又能收,这是错的。接收邮件用的是POP3或IMAP。
七、SSH与MQTT协议
7.1 SSH协议
SSH(Secure Shell)是加密的远程登录协议,替代了早期不安全的Telnet。
- 端口:22
- 加密方式:对称加密传输数据,非对称加密交换密钥
- 认证方式:密码认证、公钥认证
- 常用功能:远程登录、文件传输(SCP/SFTP)、端口转发
bash
# SSH远程登录
ssh user@192.168.1.100
# SCP文件传输
scp file.txt user@192.168.1.100:/home/user/
# SFTP交互式传输
sftp user@192.168.1.100
7.2 MQTT协议
MQTT(Message Queuing Telemetry Transport)是物联网领域最流行的通信协议。
| 特性 | 说明 |
|---|---|
| 传输协议 | 基于TCP |
| 设计目标 | 轻量级、低带宽、高延迟环境 |
| 消息模式 | 发布/订阅(Pub/Sub) |
| QoS级别 | 0(最多一次)、1(至少一次)、2(恰好一次) |
| 典型场景 | 智能家居、车联网、工业物联网 |
MQTT的核心思想是发布/订阅模式:设备发布消息到某个主题(Topic),订阅了该主题的其他设备就能收到消息。这种解耦设计特别适合设备数量多、网络不稳定的环境。
八、新手常见误区
以下是新手最容易搞混的几个概念,建议反复看:
误区1:HTTP和HTTPS是两种不同的"网"
错误理解:"我访问HTTP网站和HTTPS网站,是上了两个不同的互联网。"
正确理解:HTTP和HTTPS用的是同一个互联网,只是HTTPS在HTTP外面加了一层"加密外套"。就像寄明信片(HTTP,所有人都能看到内容)和寄信封(HTTPS,内容被密封),走的是同一条邮路。
误区2:GET请求不能传参数
错误理解:"GET只能获取数据,不能带参数,带参数必须用POST。"
正确理解 :GET完全可以传参数,只是参数放在URL里。www.example.com/search?q=hello 这个q=hello就是参数。POST的参数放在请求体里,不在URL上显示。
误区3:Cookie和Session是同一个东西
错误理解:"Cookie就是Session,Session就是Cookie。"
正确理解:Cookie存在你的浏览器里,Session存在服务器上。Session ID通过Cookie传递,但两者不是一回事。就像"会员卡"(Cookie)和"会员档案"(Session),卡上有卡号,档案在餐厅里。
误区4:DNS就是"域名"
错误理解:"我买了域名,就等于有了DNS。"
正确理解:域名是你注册的"名字",DNS是负责把名字翻译成IP地址的"系统"。你买了域名后,还需要配置DNS记录(A记录、CNAME等),告诉别人这个域名对应哪个IP地址。
九、问题与解答
Q1:HTTP和HTTPS有什么区别?
A:HTTPS在HTTP的基础上加了SSL/TLS加密层。HTTP是明文传输,数据容易被窃听和篡改;HTTPS对传输内容进行加密,安全性更高。HTTPS默认端口443,HTTP默认端口80。HTTPS需要CA证书,部署成本更高。
Q2:DNS为什么用UDP而不是TCP?
A:DNS查询通常数据量很小(请求和响应都不到512字节),UDP速度快、开销小,非常适合这种轻量级查询。但当DNS响应超过512字节时(比如DNSSEC),会自动切换到TCP。另外,DNS区域传输(主从DNS同步)也用TCP。
Q3:为什么DHCP Discover要用广播而不是单播?
A:因为客户端此时还没有IP地址,不知道DHCP服务器的地址,也没有配置网关信息,无法发送单播。所以只能用广播(目标地址255.255.255.255)来寻找网络中的DHCP服务器。
十、面试高频考点汇总
面试题1:浏览器输入URL到页面显示的完整过程
参考答案:
- DNS解析:浏览器缓存→OS缓存→本地DNS→根DNS→顶级DNS→权威DNS,获取目标IP
- TCP连接:与服务器进行三次握手建立TCP连接
- TLS握手(如果是HTTPS):协商加密参数,建立安全通道
- 发送HTTP请求:构建请求报文(方法、URL、头部、Cookie等)
- 服务器处理:接收请求,调用后端服务,生成响应
- 返回响应:状态码+响应头+HTML内容
- 浏览器解析:解析HTML构建DOM树,解析CSS构建CSSOM树
- 渲染页面:合并DOM和CSSOM生成渲染树,布局→绘制→合成
- 执行JS :遇到
<script>标签时执行JavaScript - 建立WebSocket等长连接(如有)
面试题2:HTTP/1.1、HTTP/2、HTTP/3的核心区别
参考答案:
HTTP/1.1引入了长连接和管线化,但管线化存在队头阻塞问题。HTTP/2通过多路复用解决了HTTP层面的队头阻塞,所有请求共用一个TCP连接,但TCP层面的队头阻塞仍然存在(一个丢包,所有流都等)。HTTP/3用QUIC(基于UDP)替代了TCP,彻底解决了队头阻塞问题,同时0-RTT连接建立也比HTTP/2的握手更快。
面试题3:Cookie和Session的区别
参考答案:
Cookie存储在客户端,Session存储在服务端。Cookie有大小限制(4KB),Session理论上无限制。Cookie安全性较低(可被XSS攻击窃取),Session更安全。Session依赖Cookie传递Session ID,如果Cookie被禁用,需要用URL重写。分布式环境下Session需要做共享(如Redis Session),Cookie天然支持分布式。
面试题4:DNS递归查询和迭代查询的区别
参考答案:
递归查询是"你帮我查,查到告诉我结果",客户端只问一次,DNS服务器负责一路查到底返回最终结果。迭代查询是"你告诉我下一步该问谁",客户端(或本地DNS服务器)需要多次查询,每次得到一个指引。实际中,主机到本地DNS是递归查询,本地DNS到其他DNS服务器是迭代查询。
面试题5:HTTPS的TLS握手过程
参考答案:
- 客户端发送ClientHello(支持的加密套件、随机数、TLS版本)
- 服务器发送ServerHello(选定加密套件、随机数)和数字证书
- 客户端验证证书合法性(CA签名、域名匹配、有效期)
- 客户端生成预主密钥,用服务器公钥加密后发送
- 服务器用私钥解密得到预主密钥
- 双方基于预主密钥和两个随机数生成会话密钥(对称密钥)
- 后续通信使用会话密钥进行对称加密
十一、模拟测试题
1. HTTP状态码304表示什么含义?
A. 请求成功
B. 页面永久跳转
C. 资源未修改,使用缓存
D. 服务器内部错误
2. DNS查询中,主机向本地DNS服务器发出的查询属于什么类型?
A. 迭代查询
B. 递归查询
C. 反向查询
D. 缓存查询
3. DHCP的四步交互流程依次是?
A. Discover→Request→Offer→Ack
B. Discover→Offer→Request→Ack
C. Offer→Discover→Request→Ack
D. Request→Discover→Offer→Ack
4. FTP协议使用几个TCP连接?数据连接默认端口是?
A. 1个,端口21
B. 2个,端口20
C. 2个,端口21
D. 1个,端口20
5. 以下哪个协议用于接收电子邮件?
A. SMTP
B. FTP
C. IMAP
D. DHCP
参考答案
- C。304 Not Found表示资源未修改,客户端可使用本地缓存。
- B。主机到本地DNS服务器是递归查询,本地DNS到其他DNS是迭代查询。
- B。DHCP采用DORA流程:Discover→Offer→Request→Ack。
- B。FTP使用控制连接(端口21)和数据连接(端口20)两个TCP连接。
- C。IMAP用于接收和管理邮件,SMTP用于发送邮件。
十二、互动话题
你在实际开发中遇到过哪些HTTP相关的问题?比如跨域、缓存策略、HTTPS证书配置等。欢迎在评论区分享你的踩坑经历,大家一起交流学习。