TCP协议三次握手

TCP 传输控制协议,是一个面向连接的协议。在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。

所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。

三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

 

1. TCP 报文格式

(1)序号:用来标识数据包,发起方发送数据时对此进行标记。

(2)确认号:Ack序号,只有ACK标志位为1时,确认号字段才有效,Ack = Seq+1。

(3)标志位:共6个,即SYN、ACK、PSH、RST、URG、FIN,每一个标志位表示一个控制功能。

1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

5)SYN:同步序号,用于建立连接过程。在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

 

2. TCP 三次握手

1) 第一次握手

客户端发送一个 TCP 标志位 SYN=1,ACK=0 的数据包给服务端,并随机会产生一个 Seq=J。

当服务端接收到这个数据后,服务端由 SYN=1 可知客户端是想要建立连接。

2) 第二次握手

服务端要对客户端的联机请求进行确认,向客户端发送应答号 ACK=1、SYN=1、确认号 Ack=J+1,此值是客户端的序列号加 1。

另外,还会产生一个随机的序列号 Seq=K,这样就告诉客户端可以进行连接。

3) 第三次握手

客户端收到数据后检查 Ack 是否为 J+1,以及标志位 ACK 的值是否为 1。

ACK 的值若为 1,则会发送 ACK=1、确认号码 Ack=K+1。告诉服务端,请求连接被确认,连接可以建立,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手。

随后Client与Server之间可以开始传输数据了。

 

3. 为什么需要三次握手

TCP 三次握手是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

TCP 三次握手是在安全可靠的基础上,握手次数最少的方案。

两次握手并不能保证可靠性,四次握手又浪费了效率。