在了解三握四挥之前,有必要了解TCP连接的各个状态以及标志位:TCP连接的各种状态以及标志位详解
三次握手:
假设 A 为客户端,B 为服务器端。
首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。(A:CLOSED B:LISTEN)
A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。(A:SYN_SEND B:LISTEN)
B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号(期待收到的下一个序号值)为 x+1,同时也选择一个初始的序号 y。(A:LISTEN B:SYN_RECEIVED)
A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。(A:ESTABLISHED B:SYN_RECEIVED)
B 收到 A 的确认后,连接建立。(A:ESTABLISHED B:ESTABLISHED)
四次挥手:
A 发送连接释放报文,FIN=1。(A:FIN_WAIT1 B:ESTABLISHED)
B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。(A:FIN_WAIT_2 B:CLOSED_WAIT)
当 B 不再需要连接时,发送连接释放报文,FIN=1。(A:FIN_WAIT_2 B:LAST_ACK)
A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。(A:TIME_WAIT B:LAST_ACK)
B 收到 A 的确认后释放连接。(B:CLOSED)
为什么三次握手:
防止失效的连接请求到达服务器,从而导致服务器错误的打开连接.
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
为什么四次挥手:
让服务端发送未发送完的数据.
TIME_WAIT状态:
确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
三次握手和四次挥手过程 握手为什么三次,挥手为什么是四次?
最新推荐文章于 2025-03-19 08:52:07 发布