Skip to content

Web通信流程

当客户端(如浏览器或应用)点击一个URL并显示出内容时,这一简单的操作背后涉及了一系列复杂的通信过程:

1. 浏览器发起DNS解析

  • 浏览器作为客户端,当用户输入URL后,首先会请求DNS(域名系统)服务器,将URL中的域名解析为对应的IP地址。
  • 通过解析结果,浏览器获取到目标服务器的IP地址。

2. 与服务器通过TCP/IP协议建立TCP/IP连接

  • 浏览器使用获取的IP地址找到目标服务器,并建立一个TCP连接。
  • 注意:TCP连接是用于传输数据的可靠通道,但它本身不定义数据的格式和规则。

3. 基于HTTP协议传输数据

  • 在TCP连接建立后,浏览器通过封装HTTP协议向服务器发送一个HTTP请求(HTTP Request),请求内容通常包括资源路径、方法(如GET、POST)、请求头等信息。
  • 服务器接收到请求后进行处理,并通过HTTP协议返回一个HTTP响应(HTTP Response),通常包括状态码、响应头和数据(如HTML、CSS、JavaScript等)。

4. 浏览器解析并渲染网页

  • 浏览器收到服务器的响应包后,解析其中的数据(如HTML结构、CSS样式、JavaScript代码等),并将其渲染为用户可见的网页。
  • 如果页面中包含其他资源(如图片、视频、字体等),浏览器会根据响应中的内容,继续发起新的HTTP请求以获取这些资源。

5. 关闭TCP连接

  • 当所有数据传输完成后,客户端和服务器断开TCP连接。
  • 注意:对于现代Web应用,可能会通过长连接(如HTTP/1.1的Keep-Alive或HTTP/2)复用连接以提升效率。
image-20241209174736703

OSI七层模型

image-20241209181904358

TCP协议

TCP:传输控制协议(Transmission Control Protocol)是一种面向连接的,可靠的,基于字节流的传输层通信协议

简单说就是,TCP协议可以控制数据包在传输过程中的规范格式。

TCP/IP的三次握手,四次挥手

image-20241209182125389
  • 三次握手:TCP协议中建立连接的过程,其核心目的是确保通信双方的发送和接收能力都正常,同时协商初始通信参数(如序列号)。

    • 三次握手:
      1. 客户端发送请求:发出第一个数据包,告诉服务器“我要建立连接”。
      2. 服务器回应确认:服务器回复第二个数据包,表示“我收到了,可以建立连接”。
      3. 客户端最终确认:客户端再发第三个数据包,告诉服务器“好的,连接确认”。
  • **四次挥手:**TCP协议中用于断开连接的过程,其核心目的是确保双方的资源能够正确释放并终止通信。其本质是双方独立关闭自己的数据传输通道,因为TCP连接是全双工的,双方的发送和接收通道需要单独关闭。

    • 四次挥手
      1. 第一次挥手(FIN)
        • 客户端:发送一个带有FIN(Finish)标志的数据包,表示“我已经发送完数据了,不再发送数据,但还可以接收数据”。
        • 客户端进入FIN_WAIT_1状态。
      2. 第二次挥手(ACK)
        • 服务器:收到FIN后,发送一个ACK(Acknowledgment)数据包,表示“我知道了,你不再发送数据了”。
        • 服务器此时仍可以继续发送数据。
        • 客户端进入FIN_WAIT_2状态。
      3. 第三次挥手(FIN)
        • 服务器:确认自己也发送完数据后,发送一个带有FIN标志的数据包,表示“我也不再发送数据了”。
        • 服务器进入LAST_ACK状态,等待客户端的确认。
      4. 第四次挥手(ACK)
        • 客户端:收到服务器的FIN后,发送一个ACK数据包,表示“我知道了”。
        • 客户端进入TIME_WAIT状态,等待一段时间(一般为2倍的最大报文生存时间,2MSL),确保服务器收到ACK并正确关闭连接。
        • 服务器收到ACK后进入CLOSED状态,连接断开。

常见端口号

image-20241209183149210

什么是Socket套接字

任何两个机器的连接:本质上是两个Socket的通信

在网络通信中,TCP/IP协议提供了可靠的连接方式,而实际通信是通过**Socket(套接字)**来实现的。

Socket可以看作是网络通信的端点,由IP地址端口号唯一标识。

  • Socket:是IP地址与端口号的组合,例如10.0.0.7:80,用于定位一个具体的服务或应用。

举个例子:通过浏览器访问Nginx服务

  1. 部署Nginx服务
    • 服务监听在10.0.0.7:80,即服务端Socket为10.0.0.7:80
  2. 客户端访问服务
    • 浏览器随机分配一个端口(如50923),创建一个客户端Socket(如192.168.1.5:50923)。
  3. 数据传输
    • 客户端Socket与服务端Socket建立连接,通过HTTP协议传输请求与响应数据。
  4. 断开连接
    • 数据传输完成后,客户端和服务端释放各自的Socket资源。

HTTP协议

HTTP无状态

HTTP协议是无状态的协议,这意味着每次客户端和服务器之间的请求与响应都是独立的,服务器不会自动记录之前的请求信息。

为了解决HTTP无状态的问题,服务器通常会为每个访问的客户端生成一个Cookie,并通过这个Cookie实现标识客户端的功能,从而间接地保持会话状态。

HTTP请求方法

  • GET:请求从服务器获取资源。
    • 数据附加在URL中,参数通过?&拼接。
    • 用于只读取数据,不对服务器状态产生副作用。
    • 不适合传递敏感信息(URL会暴露数据)。
  • POST:向服务器提交数据或表单,用于创建资源或执行操作。
    • 数据包含在请求体中,适合传递大量或敏感数据。
    • 通常会对服务器产生副作用(如创建资源)。

HTTP响应状态码

  • 2xx - 成功响应
  • 3xx - 重定向
  • 4xx - 客户端错误
  • 5xx - 服务器错误