TCP学习(2)--TCP连接的建立(三次握手)

一.TCP的连接建立

   TCP的建立连接的过程如下图所示。假设客户端A运行的是TCP客户程序,而服务器B运行的是TCP服务器程序。最初两端的TCP进程都处于CLOSED状态。
   B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,然后服务器进行就处于LISTEN状态,等待客户端的连接请求。
TCP学习(2)--TCP连接的建立(三次握手)_第1张图片
    
    TCP连接的建立过程如下:
(1).客户端A发起连接请求,发送一个SYN=1,ACK=0,seq=x的报文段给服务器B,并进入SYN-SENT状态;
(2).服务器B收到连接请求报文之后,如果同意建立连接,那么则向A发送一个SYN=1,ACK=1,seq=y,ack=x+1的连接确认报文段,并进入SYN-RCVD状态;
(3).客户端A收到连接确认报文段之后,发送一个ACK=1,seq=x+1,ack=y+1的确认报文段给服务器A,并进入ESTABLISHED状态,服务器B在收到确认报文段之后,也进入ESTABLISHED状态。

    由于TCP建立连接的过程需要发送三个报文段,因此,上面的过程也称为“三次握手”。

    

二.为什么A还要发送一次确认?(为啥会有第三次握手)

    这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
    所谓的“已失效的连接请求报文段”是这样产生的。考虑一种正常情况:A发出连接请求,但因为连接请求报文丢失而未收到确认。于是A再重新发送一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A一共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。
    现假定出现一种异常情况,即A发出的第一个连接请求报文段并没丢失,而是在某个网络结点长时间滞留了,以致延误到连接释放以后的某个时间才达到B。本来这是一个早已失效的报文段,但B收到此失效报文段后,就误认为A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,B就进入连接建立状态。由于A并没有发出连接请求,因此,会忽略B的连接确认报文段,也不会向B发送数据,但是B却一直处于连接建立状态,一直在等待A发送数据,这样导致B的资源被白白浪费。
    采用三次握手可以防止上述现象的发生,例如在上述情况下,由于A并没有发出连接请求,因此,并不会发出确认信号,而B没有收到确认报文段,也就不会进入连接建立状态,这样就能避免A没有进入连接建立状态,而B处于连接建立状态的情况。














参考文献
谢希仁, 计算机网络(第五版): 电子工业出版社, 2007.
   


版权所有,欢迎转载,转载请注明出处,谢谢微笑


你可能感兴趣的:(tcp,网络)