TCP的连接建立——三报文握手(旧称三次握手)

首先了解几个概念:

同步位SYN(SYNchronization)
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。若对方同意建立连接,则应在响应的报文段中是SYN=1和ACK=1.

确认位ACK(ACknowledgment)
仅当确认位ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1.

确认号
占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号=N,则表明:到序号N-1为止的所有数据都已经正确收到。

连接过程:

首先TCP服务器(B)进程处于LISTEN(收听)状态,等待客户端(A)的连接请求。

  1. A首先向B发出连接请求报文段,此时首部中的同步位SYN=1,初始序号seq=x,A进入SYN-SENT(同步已发送)状态。
  2. B如果同意建立连接,则向A发送确认。在确认报文段中把SYN位和ACK位都置为1,确认号ack=x+1,同时B自己也选择一个初始序号seq=y。B进入SYN-RCVD(同步收到)状态。
  3. A收到B的确认后,向B给出确认。确认报文段中ACK=1,确认号ack=y+1,而自己的序号seq=x+1,此时TCP连接建立,A进入ESTABLISHED(已建立连接)状态.。当B收到A的确认后,也进入ESTABLISHED状态。

图解:

TCP的连接建立——三报文握手(旧称三次握手)_第1张图片

为什么TCP连接要三次握手?为什么不是两次?

以下摘自谢希仁《计算机网络》(第五版)

为什么A还要发送一次确认呢?这主要是为了防止已失效连接请求报文突然又传送到了B,因而产生错误。
所谓“已失效的连接请求报文段”是这样产生的。……
现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的请求报文段后,就误以为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样被白白浪费了。
采用三次握手的办法可以防止上述现象的发生……

你可能感兴趣的:(计算机网络)