TCP三次握手
TCP(Transmission Control Protocol) 传输控制协议
TCP是端到端的传输控制协议,提供可靠的连接服务,采用三次握手方式来建立连接。
要理解三次握手流程,需要先了解TCP协议格式,因为在三次握手过程中,发送的都是没有数据,只有报头信息的TCP报文,通过报头中某些字段值的不同含义从而实现连接的建立。TCP报文格式如下:

上述的TCP报文格式中每个字段意义已经描述得很清楚,现针对三次握手中要用到的字段再做简单描述,
TCP报文格式中有6位的tcp标志位,每个标志位对应着TCP连接的不同状态,完整的6个标志位组成了TCP连接的完整状态。
具体每个标志位的含义如下:
- URG (urgent 紧急 =1时表示Urgent Pointer字段值有效)
- ACK (acknowledgement 确认 =1表示Acknowledgement number字段值有效)
- PSH (push =1时表示传送数据)
- RST (reset =1时表示连接需要复位)
- SYN( synchronous =1时表示建立连接,序号同步)
- FIN (finish 结束 =1时表示终止连接)
三次连接具体过程描述:

第一次握手:Client端发送标志位SYN=1,随机产生Seq number=8000的SYN包到Server,此时Client进入SYN_SEND状态。Server根据SYN=1知道Client要求建立TCP连接
第二次握手:Server收到SYN请求后如果允许建立连接,就向Client发送Ack number=8001 (Client的Seq Number+1),随机产生Seq Number=15000,状态标志位,SYN=1,ACK=1的SYN+ACK包,此时Server进入SYN_RECV状态。
第三次握手:Client收到SYN+ACK包后检查Ack number是否正确,是否等于第一次握手中发送的Seq number+1,同时检查标志位ACK是否为1,若两项检查都正确,Client会再次发送Ack number=15001(Server的Seq Number+1),ACK=1的ACK包,Server收到后检查Ack number值与ACK=1无误后则连接建立成功, 此时Client和Server均进入ESTABLISHED状态。
完成三次握手后Client与Server开始传送数据。
三次握手过程中报头信息的变化
第一次握手
SYN包没有携带任何数据,使用了报头中SYN标志位和Seq number字段,其中SYN=1标志请求建立一个连接
第二次握手
SYN+ACK包也没有携带任何数据,使用了报头中的SYN和ACK标志位,以及Seq Number 和 Ack Number字段,
其中SYN=1标志Server端同步初始顺序号,以便Server向Client发送信息。
ACK=1标志已确认收到SYN包,同时给出期望从Client端收到的下一个序号。
需要注意的是在第二次握手中还定义了动态窗口大小。
第三次握手
ACK包没有携带任何数据,使用标志位ACK=1以及Seq Number和Ack Number字段。
|