1.重要标志位
ACK: TCP协议规定,只有ACK=1时有效,连接建立之后所有报文中ACK必须等于1;
SYN:在连接建立时用来同步序号,当SYN=1,ACK=0时,说明这是一个连接请求报文。如果服务器同意连接,那么返回的响应报文中SYN=1,ACK=1。因此如果SYN=1,就说明这是一个连接请求报文或者连接接受报文。
FIN: 终结。当FIN=1时,说明服务器没有需要发送回来的数据了。要求释放连接。
2.三次握手,四次挥手的过程:
1.三次握手:
1.建立连接。客户端发送连接请求报文,syn=1,seq(序列号)=x,之后客户端进入SYN-SEND状态,等待服务器确认。
2.服务器接收到请求报文之后,会对SYN进行确认,然后设置SYN=1, ACK=1,ack=x+1,seq=y发送报文,之后服务器进入SYN-RECV状态。
3.客户端接收到SYN+ACK报文段,向服务器发送ACK(ack=y+1)包,发送完毕,就连接成功了,完成三次握手。
2.四次挥手
1.客户端向服务器发送seq=u,fin=1报文,请求释放连接,说明客户端没有数据要发送给服务器了。之后客户端进入FIN_WAIT_1状态。
2.服务器收到客户端报文之后,返回ack=u+1,seq=w报文,表示同意关闭连接,之后服务器进入CLOSE_WAIT状态。
3.客户端接收到消息后,进入FIN_WAIT_2状态。之后服务器会发送fin=1,ack=u+1,seq=y报文,向客户端请求关闭连接。然后服务器进入LAST_ACK最后确认状态。
4.客户端收到消息后,就发送ack=y+1,seq=u+1报文,之后进入TIME_WAIT状态,并等待2msl,服务器收到确认消息立马关闭。2msl后客户端还是没有收到消息,说明服务器已经正常关闭,自然自己也立马关闭了。
“三次握手”:确保服务器可以收到请求,并作出正确应答。(第一次和第二次握手)。确保客户端可以收到信息,并作出正确应答。(第二次和第三次握手)。
“四次挥手”:因为TCP是全双工模式。收到FIN说明不会再有数据发过来,但是还是可以把数据发过去。
3.为什么握手是三次,而挥手是四次?
因为建立连接的时候,服务器收到请求之后,可以把SYN和ACK报文一起发送给客户端。但是断开连接时,服务器接收到请求后,不会马上返回FIN,而是先发送一个ACK,告诉客户端,我同意了。但是我要先处理完事情,才会发送FIN。
参考文章:https://juejin.im/post/5e5b50eb6fb9a07cae136773#heading-31