序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号
确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
FIN:结束标志,用于释放连接,为1表示关闭本方数据流
一.3次握手
第一次:客户端向服务端发送请求
syn=1 seq=x
第二次:服务端回应客户端请求
syn=1 ACK=1 ack=x+1 seq=y
第三次:客户端确认连接服务器
syn=1 ACK=1 ack=y+1 seq=x+1
二.4次分手
第一次:客户端向服务端发送分手请求
Fin=1 seq=x
第二次:服务器回应分手请求
ACK=1 ack=x+1 seq=y
第三次:服务器处理完剩余数据回应分手请求
FIN =1 ACK=1 ack=x+1 seq=z
第四次:客户端确认分手
FIN=1 ACK=1 ack=z+1 seq=x+1
为什么“握手”是三次,“挥手”却要四次?
TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。
即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。
TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?
建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。
所以是“三次握手”,“四次挥手”。