三次握手
三次握手是建立连接的过程
图示
在建立连接之前: 服务器处于 LISTEN 状态,客户端处于 CLOSED 状态。
第一次握手: 客户端给服务器发送一个同步报文段 SYN,并指定客户端的初始序列号 ISN,此时客户端处于 SYN_SENT 状态。
首部的同步位 SYN=1(SYN只是一个标志位,0表示不是SYN,1表示是SYN),初始序列号 seq=x 。SYN=1 的报文段不能携带任何的数据,但要指定序号。
第二次握手: 服务器接收到来自客户端的同步报文段 SYN 后,会以自己的 SYN 报文作为应答,并且也指定了自己的初始序列号 ISN,同时会把客户端的 seq+1 作为确认序列号 ack 的值,表示自己已经收到了客户端的同步报文段 SYN,此时服务器处于 SYN_RCVD 的状态。
确认报文段中 SYN=1,ACK=1(ACK也只是一个标志位,0表示不是ACK,1表示是ACK),初始序列号 seq=y ,确认序列号 ack=x+1
第三次握手: 客户端收到来自服务器的同步报文段 SYN 之后,会发送一个确认报文段 ACK,以服务器的 seq+1 作为 ack 的值 ,表明自己已经收到来自服务器的同步报文段 SYN。客户端进入 ESTABLISHED 状态,服务器确认报文段 ACK 之后,也会进入 ESTABLISHED 状态。
确认报文段中 ACK=1,序列号 seq=x+1,确认序列号 ack=y+1
至此,双方已经建立起连接,可以正常的发送数据。
三次握手为什么是三次?
三次握手才能确认双方都准备好了
第一次握手:客户端什么都不能确认,服务器确认了:对方发送正常,自己接收正常
第二次握手:客户端确认了:自己发送正常接收正常,对方发送正常接收正常;服务器确认了:对方发送正常,自己接收正常
第三次握手:客户端确认了:自己发送正常接收正常,对方发送正常接收正常;服务器确认了:对方发送正常接收正常,自己发送正常接收正常。
四次挥手
四次挥手是断开连接的过程
图示
客户端和服务器都可以主动关闭连接,只有率先请求关闭的一方才会进入TIME_WAIT状态
在断开连接之前: 客户端和服务器都处于 ESTABLISHED 状态,双方都可以主动断开连接,以客户端主动断开连接为优。
第一次挥手:客户端打算断开连接,向服务器发送 FIN 报文,FIN 报文中会指定一个序列号,之后客户端进入 FIN_WAIT_1 状态。
也就是客户端发出连接释放报文段 FIN=1,指定序列号 seq=u,主动关闭TCP连接,等待服务器的确认。
第二次挥手: 服务器收到 FIN 报文后,就向客户端发送 ACK 应答报文,以客户端的 FIN 报文的序列号 seq+1 作为 ACK 应答报文段的确认序列号 ack=u+1,指定序列号 seq=v。
接着服务器进入 CLOSE_WAIT 状态,此时的TCP处于半关闭状态,客户端到服务器的连接释放。客户端收到来自服务器的 ACK 应答报文段后,进入 FIN_WAIT_2 状态。
第三次挥手: 服务器也打算断开连接,向客户端发送 FIN 报文,之后服务器进入 LAST_ACK 状态,等待客户端的确认。
服务器的连接释放报文段中 FIN=1,ACK=1,序列号 seq=w,确认序列号 ack=u+1。
第四次挥手: 客户端收到来自服务器的 FIN 报文段后,会向服务器发送一个 ACK 应答报文段,以 FIN 报文段的确认序号 ack 作为 ACK 应答报文段的序列号 seq,以FIN报文段的序列号 seq+1作为确认序号ack。
之后客户端进入 TIME_WAIT 状态,服务器收到 ACK 应答报文段后,服务器就进入 CLOSED 状态,至此,服务器的连接已经完成关闭。
客户端处于 TIME_WAIT 状态时,此时的 TCP 还未释放掉,需要等待 2MSL 后,客户端才进入 CLOSED 状态。