一、数据链路层:网络通信的"本地邮差"
1.1 数据链路层的基本职责
想象一下,数据链路层就像小区里的本地邮递员,负责在**直接相连的设备之间**传递数据包。它的工作范围很有限,但极其重要。
主要职责包括:
-
帧封装:将网络层传下来的IP数据包加上"信封"(帧头帧尾)
-
物理寻址:使用MAC地址识别同一局域网内的设备
-
差错检测:确保数据在传输过程中没有损坏
-
流量控制:调节数据传输速度,避免接收方被淹没
1.2 以太网帧结构:数据的"标准信封"
| 目标MAC地址 (6字节) | 源MAC地址 (6字节) | 类型 (2字节) | 数据 (46-1500字节) | 帧校验序列 (4字节) |
举个例子:
当你的电脑( MAC: 11:22:33:44:55:66 )想给同一局域网中的打印机( MAC: AA:BB:CC:DD:EE:FF )发送打印任务时,数据链路层会创建一个帧,目标地址填打印机的MAC,源地址填自己的MAC,然后把数据装进去。
1.3 交换机的工作原理:智能的"邮件分拣员"
交换机是数据链路层的核心设备,它有一个MAC地址表,记录着每个端口连接的设备MAC地址。
工作流程:
-
学习:收到设备A的帧时,记录"A的MAC地址 → 端口1"
-
转发:当要给A发送数据时,直接发送到端口1
-
广播:如果不知道目标在哪里,向所有端口广播(除了来源端口)
二、NAT机制:家庭的"共享电话号码"
2.1 为什么需要NAT?
IPv4地址只有约43亿个,根本不够全球设备分配。NAT(网络地址转换)让多个设备可以共享一个公网IP,就像一家人共享一个电话号码对外联系。
典型场景:
-
家庭路由器:给所有家庭设备分配私有IP(如192.168.1.x)
-
对外通信时,全部使用同一个公网IP
#2.2 NAT工作流程详解
假设家庭网络环境:
-
路由器公网IP:`203.0.113.1`
-
你的电脑私有IP:`192.168.1.100`
-
目标网站IP:`93.184.216.34`
当你访问网站时的NAT过程:
- 出发:你的电脑发送请求包
```
源IP: 192.168.1.100:54321
目标IP: 93.184.216.34:80
```
- NAT转换:路由器修改源地址
```
源IP: 203.0.113.1:12345 (路由器记住这个映射)
目标IP: 93.184.216.34:80
```
- 网站响应:网站发回响应
```
源IP: 93.184.216.34:80
目标IP: 203.0.113.1:12345
```
- 反向转换:路由器查表还原地址
```
源IP: 93.184.216.34:80
目标IP: 192.168.1.100:54321
```

2.3 NAT转换表:关键的"通讯录"
路由器维护的NAT表示例:
| 内部IP:端口 | 外部端口 | 目标服务器 |
|-------------|----------|------------|
| 192.168.1.100:54321 | 12345 | 93.184.216.34:80 |
| 192.168.1.101:6112 | 12346 | 203.0.113.5:27015 |
这样,即使多台设备同时上网,路由器也能准确地把响应数据"送回家"。
三、从输入URL到页面展示:互联网的"奇幻之旅"
3.1 第一阶段:URL解析和DNS查询
步骤分解:
-
输入URL:你在浏览器输入 `https://www.example.com`
-
解析URL:浏览器分析出
-
协议:HTTPS
-
默认路径:/ (首页)
- DNS查询 - 四步曲:
```
浏览器缓存 → 系统缓存 → 路由器缓存 → DNS服务器
```
详细查询过程:
-
浏览器检查自己的DNS缓存
-
查询操作系统缓存(如hosts文件)
-
向配置的DNS服务器(如8.8.8.8)发送查询请求
-
获得IP地址:`93.184.216.34`
3.2 第二阶段:建立连接和发送请求
- TCP三次握手:建立可靠连接
```
你: SYN (我想连接)
服务器: SYN-ACK (我准备好了)
你: ACK (好的,开始通信)
```
- TLS握手(HTTPS):建立安全通道
-
协商加密算法
-
验证证书真实性
-
生成会话密钥
- 发送HTTP请求:
```http
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0...
Accept: text/html,application/xhtml+xml
```
3.3 第三阶段:处理请求和获取响应
- 服务器处理:
-
Web服务器(如Nginx)接收请求
-
可能转发给应用服务器(如Tomcat)
-
执行后端代码,查询数据库
-
生成HTML响应
- 服务器响应:
```http
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1256
<!DOCTYPE html>
<html>
<head><title>Example Page</title></head>
<body>...</body>
</html>