sisterAn / JavaScript-Algorithms

基础理论+JS框架应用+实践,从0到1构建整个前端算法体系
5.45k stars 626 forks source link

TCP的握手、挥手。为什么是三次握手而不是两次?为什么是四次挥手而不是三次 #158

Open sisterAn opened 3 years ago

xdyz commented 3 years ago

握手三次 确保通信双方的接收和发送能力都是正常的

Upting commented 3 years ago

三次握手 确保客户端和服务端都有接受数据和发送数据的能力。 四次挥手 确保服务端把客户端请求的数据资源全部处理完毕再关闭连接。

huangchucai commented 3 years ago

由于tcp是双工连接,三次握手保证了双方的接受和发送能力,四次挥手是因为在客户端发送资源完成给服务端后,服务端必须返回ack确认,但是服务端关闭资源处理需要时间,所以会再次发送关闭。

xiuyuan66 commented 3 years ago

三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。 四次挥手这是因为 TCP 不允许连接处于半打开状态时就单向传输数据,所以在三次握手建立连接时,服务器会把 ACK 和 SYN 放在一起发给客户端,其中,ACK 用来打开客户端的发送通道,SYN 用来打开服务器的发送通道。这样,原本的四次握手就降为三次握手了。 但是当连接处于半关闭状态时,TCP 是允许单向传输数据的。为便于理解,我们把先关闭连接的一方叫做主动方,后关闭连接的一方叫做被动方。当主动方关闭连接时,被动方仍然可以在不调用 close 函数的状态下,长时间发送数据,此时连接处于半关闭状态。这一特性是 TCP 的双向通道互相独立所致,却也使得关闭连接必须通过四次挥手才能做到。