名词解析
- seq:序号(sequence number),占32位,用来标记从传输端到目的端发送的字节流,发送方发送数据时对此进行标记。
- ack:确认号(acknowledgement number),占32位,只有 ack 标志位为1时,确认号字段才有效,ack=seq+1。
- flag:标志位,总共有六个。
- URG:紧急指针有效。
- ACK:确认序列号有效。
- PSH:接收方应该尽快
- RST:重置连接。
- SYN:发起一个新的连接。
- FIN:释放一个连接。
三次握手
- 客户端向服务端发送一段 TCP 报文
SYN=1,seq=x
,SYN=1
表示请求建立新的连接,seq=x
表示序号为x
,随后客户端进入同步发送状态。 - 服务端收到报文后,发送一段 TCP 报文
SYN=1,ACK=1,seq=y,ack=x+1
给客户端。标志位SYN=1,ACK=1
表示确认收到客户端的报文 seq 序号有效,服务器能正常接收到客户端发送的数据,并同意建立连接。seq=y,ack=x+1
表示发送一个y
的序号给客户端,并且将客户端发送的seq+1
作为确认号发送给客户端。 - 客户端收到服务端返回的报文后,发送报文
ACK=1,seq=x+1,ack=y+1
给服务器,告诉服务器自己收到的序号有效,并且继续从x+1
处发送报文,确认号是服务器返回的seq+1
。
四次挥手
挥手阶段是指一方主动要求断开连接。这里以客户端主动要求断开连接为例进行说明。
- 客户端发送报文
FIN=1,seq=u
给服务端,FIN=1
表示要断开连接,序号是seq=u
。 - 服务端收到报文后,回复报文
ACK=1,seq=v,ack=u+1
给客户端,ACK=1
表示请求断开连接的序列号有效,服务端发送的数据到v
了,确认号是u+1
。然后服务端继续向客户端发送数据。 - 当服务端的数据发送完成之后,服务端发送报文
FIN=1,ACK=1,seq=w,ack=u+1
给客户端,告诉客户端服务端的数据以及发送完成了,这个确认号ack=u+1
是客户端上次请求断开连接的序号。 - 客户端收到服务端发送的报文后,发送报文
ACK=1,seq=u+1,ack=w+1
给服务端,告诉服务端自己已经收到了断开连接的请求,接下来彼此不在进行数据交换了。然后客户端进入时间等待状态,这个状态必不可少,因为如果第四次挥手服务端没有接收到,会无法完成断开连接,这个阶段是为了接收服务端的再一次第三次挥手。