TCP的三次握手与四次挥手
简介
TCP是一个可靠的连接,也就是客户端与服务器双方必须感知对方的存在,需要经历一个建立连接的过程。
三次握手
建立过程
1.握手过程其实就是发送TCP报文,里面存在2个字段SYN
与 seq
- SYN=1:表示该报文不能携带数据,但是需要消耗一个SEQ(序号),对消息的编号
- seq:TCP的每个字节发送的时候都有一个序号,主要为了保证可靠性,比如服务器通过TCP报文得到N个字节需要接受,但是最后只收到N-1个,通过序号就能知道哪个没有被接收到。
- 客户端进入SYN_SENT状态,即同步已发送 2.当服务器接收到我们的握手请求,会回复一个确认报文
- SYN:表示不携带数据,同时消耗一个SEQ = y(这里的y是任意数字,可以是1,2,3,4)
- ACK:=1 表示这是一条确定报文
- ack:x+1,其中x是刚刚客户端发送过来的
- 服务器进入SYN_RECVD状态,即同步已收到 3.当服务器收到确认报文的时候,客户端需要对这个确认报文进行回复
- ACK:=1,表示这是一条确认报文
- seq:= x +1,
- ack:= y+1
为什么需要三次握手
三次握手的目的是建立可靠的通信信道,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己的与对方的发送与接收是正常的。
- 第一次握手:客户端什么都不能确认;服务端确认了对方发送正常,接收正常;
- 第二次握手:客户端确认了:自己发送、接收正常,对方发送、接收正常;服务端确认了:对方发送正常,自己接收正常;
- 第三次握手:客户端确认了:自己发送、接收正常,对方发送、接收正常;服务端确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双方收发功能都正常,缺一不可。
四次挥手
就是关闭TCP连接的过程,需要客户端与服务端发送4个包,以确定双方连接的断开
挥手过程
- 第一次挥手:客户端发送一个FIN包(FIN=1,seq=U)给服务器,用来关闭客户端到服务器端的数据传输,客户端进入FIN_WAIT_1状态(终止等待)
- 第二次挥手:服务器端收到FIN包后,发送一个ACK包(ACK=1,ack=u+1,在随机产生一个值v 给seq)给客户端,服务器进入了CLOSE_WAIT状态(关闭等待)
- 第三次挥手:服务器端发送一个FIN包(FIN=1,ACK=1,ack=u+1,在随机产生 一个w值给seq)给客户端,用来关闭服务器到客户端的数据传输,服务端进入了LAST_ACK(最后确定)状态
- 第四次挥手:客户端接收FIN包,然后进入TIME_WAIT状态,接着发送一个ACK包(ACK=1,seq=u+1, ack = w+1) 给服务端,服务端确定序号,进入CLOSe状态,完成了四次挥手。
Enjoy Reading This Article?
Here are some more articles you might like to read next: