TCP协议
TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
三次握手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接。
TCP报文格式
TCP报文格式示意图:
上图中有几个字段需要重点介绍下:
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是:
(A)不要将确认序号ack与标志位中的ACK搞混了(为了区分,进行大小写,ack为序列号)。
(B)确认方Ack=发起方Seq+1,两端配对。
TCP三次握手过程
TCP三次握手示意图如下:
第一次握手:
客户端发送syn包 (syn=1,seq=j) 到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:
服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=1,确认序号有效ACK=1,ack=seq+ACK,seq=k),也叫syn+ack包,此时服务器进入SYN_RECV状态。
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(包括了ACK=1,ack=seq+ACK) ,此包发送完毕,服务器端收到后,确认seq值与ack=1则连接建立成功。客户端和服务器进入ESTABLISHED状态,完成三次握手,传送数据。