一次http请求全过程

Question

Q: 一次 http 请求的过程?

得到自己的IP地址

(假设此时主机还未配置自己的 IP 地址。)

用 DHCP (Dynamic Host Configuration Protocol) 得到自己的 IP 地址。

  1. 发送 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
  2. DHCP 服务器 (连接在同一个交换机上) 就到请求后,返回一个 DHCP ACK 报文:

  • 分配给 DHCP 请求的 IP
  • DNS 服务器的 IP
  • 默认网关路由器的 IP
  • 子网掩码
  1. 交换机收到之后,缓存一下,发给主机,主机就得到这些信息

查找默认网关的MAC地址

(刚刚配置好 DHCP 需要去找到默认网关的 MAC 地址)

请求要发给默认网关的 MAC 地址,才能把请求发到局域网外部去,相当于发给默认网关路由器后,会根据 NAT 把局域网内部的 IP 地址变成局域网的 IP 地址然后发给局域网外部。

  1. 生成一个 ARP 查询报文,目标 IP 是默认网关路由器,封装成帧后是一个广播帧
  2. 路由器返回一个 ARP 应答报文给主机,包含了自己的 IP 地址

DNS

  1. 生成 DNS 查询报文
    • 应用层: 目的域名
    • 传输层: 目的端口 53
    • 数据链路层: 默认网关路由器 MAC 地址
  2. 默认网关路由器收到后,根据路由表转发
    • 内部网关协议 (RIP,OSPF)
    • 外部网关协议 (BGP)
  3. DNS 解析完了,封装成 UDP => 默认网关路由器 => 交换机 => 主机

HTTP请求

  1. 生成 TCP 套接字
  2. 3 次握手
  3. 发送 HTTP 报文
  4. 响应返回,浏览器渲染

HTTPS

有的网站是 https 的,通常会把 http 请求 301 重定向到 443 端口。

  • server 发送证书和公钥给 client
  • client 去 CA 验证安全性
  • client 用公钥加密一个随机生成的对称密钥
  • server 用私钥解密,然后之后都用这个对称密钥来加密