http请求实际上是 TCP连接。
是的,HTTP请求实际上是通过TCP(传输控制协议)连接来传输的。HTTP(超文本传输协议)是一种应用层协议,它定义了客户端(如浏览器)和服务器之间交换数据的格式。然而,HTTP本身并不直接处理网络连接的建立和维持,这是由TCP协议来完成的。
以下是HTTP请求通过TCP连接传输的基本步骤:
1. **三次握手**:客户端和服务器通过TCP协议进行三次握手来建立连接。这个过程包括以下步骤:
- 客户端发送一个SYN(同步序列编号)包到服务器,并进入SYN_SENT状态。
- 服务器收到SYN包,发送一个SYN+ACK(同步序列编号+确认)包作为响应,并进入SYN_RECEIVED状态。
- 客户端收到SYN+ACK包后,发送一个ACK(确认)包,并进入ESTABLISHED状态。服务器收到ACK包后也进入ESTABLISHED状态,此时连接建立完成。(三次互通之后才建立起连接传输数据)
问:为什么是三次握手?不是两次、四次?
答:
三次握手的原因:
三次握手才可以阻止重复历史连接的初始化(主要原因);
三次握手才可以同步双方的初始序列号;
三次握手才可以避免资源浪费;
如果是两次握手连接,就无法阻止历史连接,浪费了服务端的资源。
可以看到,如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。
因此,要解决这种现象,最好就是在服务端发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手。(即多建立了一个没用的连接)
所以,TCP 使用三次握手建立连接的最主要原因是防止「历史连接」初始化了连接。
四次的话没必要。因为2、3次可以合成为一次。变为3次即可。
问:TCP报文失败重传?TCP如何实现可靠传输和流量控制?
答:
以字节为单位的滑动窗口技术(主要解决流量控制);
重传机制;
2. **发送HTTP请求**:一旦TCP连接建立,客户端就可以发送HTTP请求到服务器。
3. **服务器响应**:服务器接收到HTTP请求后,处理请求并返回HTTP响应。
4. **四次挥手**:当数据交换完成后,客户端和服务器需要通过四次挥手来关闭连接。这个过程包括以下步骤:
- 客户端发送一个FIN(结束)包,并进入FIN_WAIT_1状态。
- 服务器收到FIN包后,发送一个ACK包,并进入CLOSE_WAIT状态。
- 服务器发送一个FIN包,并进入LAST_ACK状态。
- 客户端收到FIN包后,发送一个ACK包,并进入TIME_WAIT状态。服务器收到ACK包后,进入CLOSED状态,客户端在等待一段时间后也进入CLOSED状态。
通过这种方式,HTTP请求可以在TCP连接的保障下安全、可靠地传输。
参考文章:TCP 三次握手与四次挥手深入探究