访问网站的完整流程指南

文章目录

    • 引言
    • 一、完整流程概览
      • [8 个步骤的完整流程](#8 个步骤的完整流程)
    • 二、详细步骤解析
      • [步骤 1:获取 IP 地址(DHCP 协议)](#步骤 1:获取 IP 地址(DHCP 协议))
      • [步骤 2:找到网关(ARP 协议)](#步骤 2:找到网关(ARP 协议))
      • [步骤 3:域名解析(DNS 协议)](#步骤 3:域名解析(DNS 协议))
      • [步骤 4:路由导航(IP 协议)](#步骤 4:路由导航(IP 协议))
      • [步骤 5:建立连接(TCP 三次握手)](#步骤 5:建立连接(TCP 三次握手))
      • [步骤 6:加密协商(TLS 握手)](#步骤 6:加密协商(TLS 握手))
      • [步骤 7:发送请求(HTTP 协议)](#步骤 7:发送请求(HTTP 协议))
      • [步骤 8:关闭连接(TCP 四次挥手)](#步骤 8:关闭连接(TCP 四次挥手))
    • 三、时间线分析
    • 四、协议栈层次关系
    • [五、8 个协议速查表](#五、8 个协议速查表)
    • 六、总结

从输入网址到网页显示,8 个协议的协同工作


引言

当你在浏览器输入 www.baidu.com 并按下回车时,发生了什么?

这个过程涉及 8 个核心网络协议 ,经过 8 个关键步骤 ,总耗时约 200ms - 2s

本文将以访问百度为例,带你完整体验一次 Web 请求的历程!


一、完整流程概览

8 个步骤的完整流程

复制代码
┌─────────────────────────────────────────────────────────┐
│  步骤 1:网络初始化(DHCP)                              │
│  - 获取 IP 地址、子网掩码、网关、DNS                      │
│  - 耗时:约 100ms                                        │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 2:ARP 解析                                        │
│  - 获取网关的 MAC 地址                                   │
│  - 耗时:约 1ms                                          │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 3:DNS 解析                                        │
│  - 将 www.baidu.com 解析为 14.215.177.38                 │
│  - 耗时:约 10-100ms                                     │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 4:IP 路由                                         │
│  - 确定数据包路径,经过多个路由器                        │
│  - 耗时:取决于距离                                      │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 5:TCP 三次握手                                    │
│  - 建立可靠连接                                          │
│  - 耗时:约 1-3 个 RTT(往返时间)                        │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 6:TLS 握手(HTTPS)                               │
│  - 协商加密套件,交换密钥                                │
│  - 耗时:约 1-2 个 RTT                                    │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 7:HTTP 请求/响应                                  │
│  - 发送 GET 请求,接收 HTML 响应                          │
│  - 耗时:取决于服务器响应速度                            │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  步骤 8:TCP 四次挥手                                    │
│  - 关闭连接(或保持连接复用)                            │
│  - 耗时:约 1-2 个 RTT                                    │
└─────────────────────────────────────────────────────────┘

总耗时:约 200ms - 2s(取决于网络状况)


二、详细步骤解析

步骤 1:获取 IP 地址(DHCP 协议)

作用:你的电脑需要先有自己的 IP 地址

生活中的比喻

就像打电话前,自己得先有个电话号码。

工作过程(四步握手)

复制代码
客户端(你的电脑)              DHCP 服务器(路由器)
  |                                    |
  |--- DHCP Discover ----------------->|  广播:有 DHCP 服务器吗?
  |                                    |
  |<-- DHCP Offer --------------------|  回复:有!我给你留了个 IP
  |                                    |
  |--- DHCP Request ------------------>|  确认:好的,我就要这个 IP
  |                                    |
  |<-- DHCP ACK ----------------------|  完成:好的,这个 IP 归你了

关键知识点

  • 广播通信:Discover 和 Request 使用广播(255.255.255.255)
  • 租约期限:IP 地址不是永久的,通常有 24 小时租期
  • 续租机制:租期过半时,会自动尝试续租

实战命令

bash 复制代码
# 查看本机 IP 地址
ip addr show

# 重新获取 IP
sudo dhclient -r
sudo dhclient

步骤 2:找到网关(ARP 协议)

作用:将 IP 地址转换成 MAC 地址

生活中的比喻

你知道朋友的电话号码(IP 地址),但快递员需要实际地址(MAC 地址)才能送达。

工作过程

复制代码
客户端(你的电脑)              网关(路由器)
  |                                    |
  |--- ARP Request ------------------->|  广播:谁是 192.168.1.1?
  |                                    |
  |<-- ARP Reply ----------------------|  回复:我是!MAC 是 xx:xx:xx:xx:xx:xx

关键知识点

  • ARP 缓存:为了减少广播,操作系统会缓存 ARP 响应
  • 缓存超时:通常保留 2-10 分钟

实战命令

bash 复制代码
# 查看 ARP 缓存
ip neigh show

# 清除 ARP 缓存
sudo ip neigh flush all

步骤 3:域名解析(DNS 协议)

作用:将域名转换成 IP 地址

生活中的比喻

就像查手机通讯录,把"张三"转换成电话号码。

DNS 层次结构

复制代码
                    . (根域名)
                   / \
                  /   \
              .com     .cn  (顶级域)
               |        |
           baidu.com   tsinghua.cn (二级域)
               |        |
            www      www (子域/主机)

查询过程

复制代码
1. 检查浏览器缓存
   ↓
2. 检查操作系统缓存(/etc/hosts)
   ↓
3. 查询本地 DNS 服务器(递归查询)
   ↓(如果本地 DNS 没有缓存)
4. 查询根 DNS 服务器
   ↓
5. 根 DNS 返回 .com DNS 地址
   ↓
6. 查询 .com DNS 服务器
   ↓
7. .com DNS 返回 baidu.com 的权威 DNS 地址
   ↓
8. 查询 baidu.com 的权威 DNS 服务器
   ↓
9. 返回 www.baidu.com 的 IP 地址
   ↓
10. 本地 DNS 缓存结果并返回给你

常见 DNS 记录

记录类型 作用 示例
A 域名 → IPv4 地址 www.baidu.com → 14.215.177.38
CNAME 域名 → 另一个域名 www.baidu.comwww.a.shifen.com
MX 邮件服务器 baidu.commx.baidu.com

实战命令

bash 复制代码
# 查看 DNS 配置
cat /etc/resolv.conf

# DNS 查询
nslookup www.baidu.com
dig www.baidu.com

# 清除 DNS 缓存
sudo systemd-resolve --flush-caches

步骤 4:路由导航(IP 协议)

作用:决定数据包如何到达目标服务器

生活中的比喻

就像导航系统规划从北京到上海的路线。

路由表查看

bash 复制代码
ip route show

输出示例

复制代码
default via 192.168.1.1 dev eth0 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

追踪路径

bash 复制代码
traceroute www.baidu.com

输出示例

复制代码
 1  192.168.1.1 (192.168.1.1)  1.234 ms
 2  10.0.0.1 (10.0.0.1)  5.678 ms
 3  123.45.67.89 (123.45.67.89)  15.234 ms
 4  14.215.177.38 (14.215.177.38)  25.123 ms

关键知识点

  • NAT 转换:内网 IP ↔ 公网 IP 的转换
  • 私有 IP 范围:192.168.x.x、10.x.x.x、172.16.x.x - 172.31.x.x

步骤 5:建立连接(TCP 三次握手)

作用:建立可靠的通信连接

生活中的比喻

就像打电话前的确认过程。

三次握手过程

复制代码
客户端(你的电脑)              服务器(百度)
  |                                    |
  |--- 1. SYN ----------------------->|  我想和你建立连接
  |     (SEQ=100)                     |
  |                                    |
  |<-- 2. SYN-ACK --------------------|  好的,我同意建立连接
  |     (SEQ=200, ACK=101)            |
  |                                    |
  |--- 3. ACK ----------------------->|  好的,连接建立成功
  |     (ACK=201)                     |
  |                                    |
  |======= 连接已建立,开始传输数据 =======|

为什么需要三次握手

  • 确认双方的发送和接收能力都正常
  • 两次不够,四次太多,三次刚刚好

实战命令

bash 复制代码
# 查看 TCP 连接
ss -tn

# 测试端口连通性
nc -vz www.baidu.com 80

步骤 6:加密协商(TLS 握手)

作用:协商加密方式,保证通信安全

为什么需要 HTTPS

HTTP 的三大安全问题:

  1. 窃听风险:路由器可以看到你的请求内容
  2. 篡改风险:中间人可以修改网页内容
  3. 冒充风险:可以伪造网站

HTTPS 握手过程

复制代码
客户端(浏览器)              服务器(网站)
  |                                    |
  |--- 1. Client Hello -------------->|  支持的加密套件
  |                                    |
  |<-- 2. Server Hello ---------------|  选择的加密套件
  |     服务器证书(包含公钥)          |
  |                                    |
  |--- 3. 验证证书 ------------------>|  验证证书有效性
  |                                    |
  |--- 4. 生成随机数 ---------------->|  用公钥加密
  |     (预主密钥)                    |
  |                                    |
  |<-- 5. 双方生成会话密钥 ------------|  使用相同的算法
  |                                    |
  |======= 握手完成,开始加密通信 =======|

加密技术

  • 对称加密:加密解密速度快(如 AES)
  • 非对称加密:更安全但慢(如 RSA)
  • 混合加密:HTTPS 使用两者结合

实战命令

bash 复制代码
# 查看证书信息
openssl s_client -connect www.baidu.com:443

# 查看 HTTPS 详情
curl -v https://www.baidu.com

步骤 7:发送请求(HTTP 协议)

作用:请求网页内容

生活中的比喻

就像在餐厅点菜。

HTTP 请求格式

复制代码
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0
Accept: text/html

请求行三要素

  • 方法:GET(获取)、POST(提交)、PUT(更新)、DELETE(删除)
  • 路径:/(首页)
  • 协议版本:HTTP/1.1

HTTP 响应格式

复制代码
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 2443

<!DOCTYPE html>
<html>...</html>

常见状态码

状态码 说明 场景
200 成功 请求成功
301 永久重定向 网页已永久移动
302 临时重定向 网页临时移动
404 未找到 网页不存在
500 服务器错误 服务器内部错误

实战命令

bash 复制代码
# 获取网页
curl www.baidu.com

# 查看响应头
curl -I www.baidu.com

# 显示详细信息
curl -v www.baidu.com

# 手动发送 HTTP 请求
telnet www.baidu.com 80
# 然后输入:
# GET / HTTP/1.1
# Host: www.baidu.com
# (空行)

步骤 8:关闭连接(TCP 四次挥手)

作用:完成通信后关闭连接

生活中的比喻

就像打完电话说再见。

四次挥手过程

复制代码
客户端(你的电脑)              服务器(百度)
  |                                    |
  |--- 1. FIN ----------------------->|  我没有数据要发送了
  |                                    |
  |<-- 2. ACK ------------------------|  好的,我知道了
  |                                    |
  |        (服务器可能还有数据要发送)  |
  |                                    |
  |<-- 3. FIN ------------------------|  我也没有数据要发送了
  |                                    |
  |--- 4. ACK ----------------------->|  好的,再见
  |                                    |
  |======= 连接已关闭 =======|

为什么需要四次挥手

  • TCP 是全双工通信,两个方向的连接需要分别关闭

三、时间线分析

典型的时间分配

假设总耗时为 500ms,各阶段时间分配如下:

复制代码
0ms      15ms     45ms        89ms        120ms       500ms
 |--------|--------|----------|-----------|---------------|
   DNS      TCP      TLS           HTTP      数据传输
  解析      握手       握手           请求        和渲染
  15ms     30ms      44ms          31ms       380ms

关键观察

  • DNS 解析:15ms(本地 DNS 缓存命中)
  • TCP 握手:30ms(1 个 RTT)
  • TLS 握手:44ms(1-2 个 RTT)
  • HTTP 请求:31ms(服务器处理时间)
  • 数据传输:380ms(下载 HTML、CSS、JS、图片等)

优化建议

1. 减少 DNS 解析时间

bash 复制代码
# 使用更快的 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

2. 减少 TCP 连接时间

bash 复制代码
# 使用持久连接
curl --keepalive-time 60 https://www.baidu.com

3. 减少 TLS 握手时间

bash 复制代码
# 使用 TLS 会话复用
curl --sessionid https://www.baidu.com

4. 使用 HTTP/2

bash 复制代码
# 检查是否支持 HTTP/2
curl --http2 -I https://www.baidu.com

四、协议栈层次关系

复制代码
┌──────────────────────────────────────┐
│  应用层:HTTP/HTTPS                   │
├──────────────────────────────────────┤
│  传输层:TCP                          │
├──────────────────────────────────────┤
│  网络层:IP + 路由                     │
├──────────────────────────────────────┤
│  数据链路层:ARP                       │
├──────────────────────────────────────┤
│  物理层:网线/WiFi                      │
└──────────────────────────────────────┘

辅助协议:
- DHCP:获取网络配置
- DNS:域名解析

五、8 个协议速查表

步骤 协议 作用 关键命令 耗时
1 DHCP 获取 IP 地址 dhclient 100ms
2 ARP 解析 MAC 地址 ip neigh 1ms
3 DNS 域名转 IP nslookup 10-100ms
4 IP 路由导航 traceroute 取决于距离
5 TCP 建立连接 ss -tn 1-3 RTT
6 TLS 加密通信 openssl s_client 1-2 RTT
7 HTTP 请求网页 curl 取决于服务器
8 TCP 关闭连接 ss -tn 1-2 RTT

六、总结

核心要点

  1. 从下到上:物理连接 → 网络层 → 传输层 → 应用层
  2. 缓存优先:DNS 有多级缓存加速
  3. 可靠传输:TCP 保证数据不丢失、不重复、按序到达
  4. 加密安全:HTTPS 防止窃听、篡改和冒充

完整流程回顾

复制代码
输入网址 → DHCP → ARP → DNS → IP 路由 → TCP 握手 → TLS 握手 → HTTP 请求 → 获取网页 → TCP 挥手
相关推荐
KKKlucifer2 小时前
混合云纳管能力:国内堡垒机适配多云与异构资源的技术方案
大数据·网络·分类
Olivia051405142 小时前
Voohu:TYPE-C连接器在高速数据传输与电源管理中的选型解析
网络·机器人·信息与通信
code_li2 小时前
淘宝动效全链路解决方案:一次制作多端复用
网络·人工智能·电商·淘宝技术
dashizhi20152 小时前
如何禁止外来设备连接内网wifi、禁止外来电脑接入单位局域网?
开发语言·网络·php
KevinCyao2 小时前
彩信http接口如何接入?采用POST方式提交多媒体附件的彩信示例
网络·网络协议·http
ZeroNews内网穿透2 小时前
ZeroNews安全网关接入企业微信自建应用
网络·数据库·安全·云计算
北京耐用通信2 小时前
破局工业通讯壁垒!耐达讯自动化EtherCAT转RS232网关,老设备焕新核心桥梁
服务器·网络·人工智能·科技·物联网·网络协议·自动化
有谁看见我的剑了?3 小时前
Linux 内核参数优化
linux·网络·php
Safeploy安策数据3 小时前
以数字身份认证为盾,为企业数字化转型筑牢安全屏障
网络·安全