Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCP 的三次握手与四次挥手 #28

Open
cnwutianhao opened this issue Mar 9, 2024 · 0 comments
Open

TCP 的三次握手与四次挥手 #28

cnwutianhao opened this issue Mar 9, 2024 · 0 comments
Labels

Comments

@cnwutianhao
Copy link
Owner

通常我们进行 HTTP 连接网络的时候会进行 TCP 的三次握手,然后传输数据,之后再释放连接。

TCP 传输如图1所示:

图1 TCP 传输

TCP三次握手的过程如下:

  • 第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 设置为 1、Sequence Number(seq)为 x;接下来客户端进入 SYN_SENT 状态,等待服务端的确认。

  • 第二次握手:服务器收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置 Acknowledgment Number(ACK)为 x+1(seq + 1);同时自己还要发送 SYN 请求信息,将 SYN 设置为 1、seq 为 y。服务端将上述所有信息放到 SYN + ACK 报文段中,一并发送给客户端,此时服务端进入 SYN_RCVD 状态。

  • 第三次握手:客户端收到服务端的 SYN + ACK 报文段;然后将 ACK 设置为 y + 1,向服务端发送 ACK 报文段,这个报文段发送完毕后,客户端和服务端都进入 ESTABLISHED (TCP 连接成功)状态,完成 TCP 的三次握手。

当客户端和服务端通过三次握手建立了 TCP 连接以后,当数据传送完毕,断开连接时就需要进行 TCP 的四次挥手。其四次挥手如下所示:

  • 第一次挥手:客户端设置 seq 和 ACK,向服务端发送一个 FIN 报文段。此时,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了。

  • 第二次挥手:服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。

  • 第三次挥手:服务端向客户端发送 FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。

  • 第四次挥手:客户端收到服务端发送的 FIN 报文段,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待 2MSL(最大报文段生存时间)后依然没有收到回复,则说明服务端已正常关闭,这样客户端也可以关闭连接了。

现在看图2来加强一下理解:

图2 三次握手与四次挥手

如果有大量的连接,每次在连接、关闭时都要经历三次握手、四次挥手,这很显然会造成性能低下。因此,HTTP 有一种叫作 keepalive connections 的机制,它可以在传输数据后仍然保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无须再次握手,如图3所示:

图3 连接复用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant