一次http请求全过程
Question
Q: 一次 http 请求的过程?
得到自己的IP地址
(假设此时主机还未配置自己的 IP 地址。)
用 DHCP (Dynamic Host Configuration Protocol) 得到自己的 IP 地址。
发送 DHCP 请求
- 应用层: 生成一个 DHCP 请求报文
- 传输层: 加上一个 UDP 头
- 源端口 68
- 目标端口 67
- 网络层: 加上一个 IP 头
- 源IP: 0.0.0.0
- 目标IP: 255.255.255.255
- 数据链路层: 封装成帧
- 源MAC: 自己的 MAC
- 目标MAC: FF:FF:FF:FF:FF:FF
DHCP 服务器 (连接在同一个交换机上) 就到请求后,返回一个 DHCP ACK 报文:
- 分配给 DHCP 请求的 IP
- DNS 服务器的 IP
- 默认网关路由器的 IP
- 子网掩码
- 交换机收到之后,缓存一下,发给主机,主机就得到这些信息
查找默认网关的MAC地址
(刚刚配置好 DHCP 需要去找到默认网关的 MAC 地址)
请求要发给默认网关的 MAC 地址,才能把请求发到局域网外部去,相当于发给默认网关路由器后,会根据 NAT 把局域网内部的 IP 地址变成局域网的 IP 地址然后发给局域网外部。
- 生成一个 ARP 查询报文,目标 IP 是默认网关路由器,封装成帧后是一个广播帧
- 路由器返回一个 ARP 应答报文给主机,包含了自己的 IP 地址
DNS
- 生成 DNS 查询报文
- 应用层: 目的域名
- 传输层: 目的端口 53
- 数据链路层: 默认网关路由器 MAC 地址
- 默认网关路由器收到后,根据路由表转发
- 内部网关协议 (RIP,OSPF)
- 外部网关协议 (BGP)
- DNS 解析完了,封装成 UDP => 默认网关路由器 => 交换机 => 主机
HTTP请求
- 生成 TCP 套接字
- 3 次握手
- 发送 HTTP 报文
- 响应返回,浏览器渲染
HTTPS
有的网站是 https 的,通常会把 http 请求 301 重定向到 443 端口。
- server 发送证书和公钥给 client
- client 去 CA 验证安全性
- client 用公钥加密一个随机生成的对称密钥
- server 用私钥解密,然后之后都用这个对称密钥来加密