# 生成 HTTP 请求消息

  1. 输入网址

  2. 浏览器解析 URL

  3. 生成 HTTP 请求信息

  4. 收到响应

    状态码 含义
    1** 告知请求的处理进度和情况
    2** 成功
    3** 表示需要进一步操作
    4** 客户端错误
    5** 服务端错误

# 向 DNS 服务器查询 Web 服务器的 IP 地址

  1. Socket 库提供查询 IP 地址的功能
  2. 通过解析器向 DNS 服务器发出查询

# 全世界 DNS 服务器的大接力

  1. 寻找相应的 DNS 服务器并获取 IP 地址
  2. 通过缓存加快 DNS 服务器的响应

# 委托协议栈发送消息

协议栈通过 TCP 协议收发数据的操作

# 创建套接字

  • 浏览器,邮件等一般的应用程序收发数据时用 TCP
  • DNS 查询等手法较短的控制数据时用 UDP

# 连接服务器

浏览器调用 Socket.connect

  • 在 TCP 模块处创建表示连接控制信息的头部
  • 通过 TCP 头部中的发送方和接收方端口号找到要连接的套接字

# 收发数据

浏览器调用 Socket.write

  • 将 HTTP 请求消息交给协议栈

  • 对焦的数据进行拆分,拆分的每一块数据加上 TCP 头,由 IP 模块来发送

  • 使用 ACK 号确认网络包已收到

  • 根据网络包平均往返时间调整 ACK 号等待时间

  • 使用窗口有效管理 ACK 号

  • ACK 和窗口合并

  • 接收 HTTP 响应消息

# 断开管道并删除套接字

浏览器调用 Socket.close

  • 数据发送完毕后断开连接

  • 删除套接字

    1. 客户端发送 FIN
    2. 服务端返回 ACK 号
    3. 服务端发送 FIN
    4. 客户端返回 ACK 号