一般流程

  • 发送 http 请求之前,需要客户端和服务端建立一条 TCP 连接
    • 如果用浏览器代指客户端,那么浏览器在发送 http 请求之前,需要知道服务端的 ip
      • 会根据域名向 DNS 发送一个请求获取该域名对应的 ip
      • 然后根据 URL 地址知道要访问的 端口 (tcp协议是端对端通信)
    • 然后会tcp 三次握手 建立一条 tcp 连接,然后客户端和服务端可以进行通信
    • 浏览器根据 http 协议,根据需要封装一个 http 请求报文
      • 请求报文的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
      • 该 http 请求报文会封装到 tcp 报文,tcp 报文会封装到 ip 报文,ip 报文会封装成为 以太网数据包
      • 如果数据包过大,可能会拆成几个以太网数据包
    • 以太网数据包会通过交换机广播到网关,网关会将该这些数据包转发到另一台网关,直到找到服务端的子网
      • 然后再广播到该子网上,服务端匹配到该数据包
    • 服务端的会组合拆分这些以太网数据包,拿到 http 请求报文,然后进行处理
    • 服务端也会根据 http 协议封装 http 响应报文,最后封装为以太网数据包通过交换机和网关将该响应返回到浏览器上
      • 其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
    • 浏览器拿到以太网数据包,再层层拆解,拿到 http 响应报文,解析后渲染到页面上/进行其他处理
    • 然后四次回收断开连接

**

协议区别

  • 上面的流程中其实是 http 1.0 的协议,即客户端和服务端通过 tcp 三次握手建立连接后,交互了一次数据,就四次挥手断开连接
    • 如果一个页面中有大量的 js、css请求,都是向同一个服务端请求资源,那么上面创建销毁连接的过程会十分频繁,消耗资源和浪费时间
    • 即 http1.0 是短连接
  • http 1.1 会在创建 tcp 连接后保持该连接一段实践,即长连接
    • 后面的 http 请求都走同一条连接
    • 避免频繁的创建销毁 tcp 连接
  • http 2.0 支持多路复用,基于一个tcp连接并行发送多个请求以及接收响应,解决了http 1.1对同一时间同一个域名的请求有限制的问题。二进制分帧,将传输数据拆分为更小的帧(数据包),frame(数据包,帧),提高了性能,实现低延迟高吞吐。

长连接/短连接

  • 应该说是 http 协议底层的 tcp 连接是长连接还是短连接
  • 其他看前面的协议