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)复用连接以提升效率。

OSI七层模型

TCP协议
TCP:传输控制协议(Transmission Control Protocol)是一种面向连接的,可靠的,基于字节流的传输层通信协议
简单说就是,TCP协议可以控制数据包在传输过程中的规范格式。
TCP/IP的三次握手,四次挥手

三次握手:TCP协议中建立连接的过程,其核心目的是确保通信双方的发送和接收能力都正常,同时协商初始通信参数(如序列号)。
- 三次握手:
- 客户端发送请求:发出第一个数据包,告诉服务器“我要建立连接”。
- 服务器回应确认:服务器回复第二个数据包,表示“我收到了,可以建立连接”。
- 客户端最终确认:客户端再发第三个数据包,告诉服务器“好的,连接确认”。
- 三次握手:
**四次挥手:**TCP协议中用于断开连接的过程,其核心目的是确保双方的资源能够正确释放并终止通信。其本质是双方独立关闭自己的数据传输通道,因为TCP连接是全双工的,双方的发送和接收通道需要单独关闭。
- 四次挥手:
- 第一次挥手(FIN)
- 客户端:发送一个带有FIN(Finish)标志的数据包,表示“我已经发送完数据了,不再发送数据,但还可以接收数据”。
- 客户端进入FIN_WAIT_1状态。
- 第二次挥手(ACK)
- 服务器:收到FIN后,发送一个ACK(Acknowledgment)数据包,表示“我知道了,你不再发送数据了”。
- 服务器此时仍可以继续发送数据。
- 客户端进入FIN_WAIT_2状态。
- 第三次挥手(FIN)
- 服务器:确认自己也发送完数据后,发送一个带有FIN标志的数据包,表示“我也不再发送数据了”。
- 服务器进入LAST_ACK状态,等待客户端的确认。
- 第四次挥手(ACK)
- 客户端:收到服务器的FIN后,发送一个ACK数据包,表示“我知道了”。
- 客户端进入TIME_WAIT状态,等待一段时间(一般为2倍的最大报文生存时间,2MSL),确保服务器收到ACK并正确关闭连接。
- 服务器收到ACK后进入CLOSED状态,连接断开。
- 第一次挥手(FIN)
- 四次挥手:
常见端口号

什么是Socket套接字
任何两个机器的连接:本质上是两个Socket的通信
在网络通信中,TCP/IP协议提供了可靠的连接方式,而实际通信是通过**Socket(套接字)**来实现的。
Socket可以看作是网络通信的端点,由IP地址和端口号唯一标识。
- Socket:是IP地址与端口号的组合,例如
10.0.0.7:80
,用于定位一个具体的服务或应用。
举个例子:通过浏览器访问Nginx服务
- 部署Nginx服务:
- 服务监听在
10.0.0.7:80
,即服务端Socket为10.0.0.7:80
。
- 服务监听在
- 客户端访问服务:
- 浏览器随机分配一个端口(如
50923
),创建一个客户端Socket(如192.168.1.5:50923
)。
- 浏览器随机分配一个端口(如
- 数据传输:
- 客户端Socket与服务端Socket建立连接,通过HTTP协议传输请求与响应数据。
- 断开连接:
- 数据传输完成后,客户端和服务端释放各自的Socket资源。
HTTP协议
HTTP无状态
HTTP协议是无状态的协议,这意味着每次客户端和服务器之间的请求与响应都是独立的,服务器不会自动记录之前的请求信息。
为了解决HTTP无状态的问题,服务器通常会为每个访问的客户端生成一个Cookie,并通过这个Cookie实现标识客户端的功能,从而间接地保持会话状态。
HTTP请求方法
- GET:请求从服务器获取资源。
- 数据附加在URL中,参数通过
?
和&
拼接。 - 用于只读取数据,不对服务器状态产生副作用。
- 不适合传递敏感信息(URL会暴露数据)。
- 数据附加在URL中,参数通过
- POST:向服务器提交数据或表单,用于创建资源或执行操作。
- 数据包含在请求体中,适合传递大量或敏感数据。
- 通常会对服务器产生副作用(如创建资源)。
HTTP响应状态码
- 2xx - 成功响应
- 3xx - 重定向
- 4xx - 客户端错误
- 5xx - 服务器错误