谈谈TCP三次握手

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KentZhang_/article/details/50488746

      TCP协议是一个面向连接的,可靠的传输协议,两台计算机进行网络通信之前,需要进行TCP连接,其中连接发起方发包2次,连接接收方发包1次,这就是著名的TCP三次握手。

一、TCP首部

      上层的数据传到TCP层,会用TCP首部封装数据,TCP首部至少20字节,有关TCP首部的字段组成及其含义,网络上很多说明,本文不详述,请参见有关TCP首部的文章http://blog.chinaunix.net/uid-26413668-id-3408115.html


二、三次握手过程

       第一次握手:主机A发状态码syn=1,ack=0,seq number=x(x是一个随机数)的数据包到主机B,主机B由SYN=1知道,A要求建立联机;

      第二次握手:主机B收到请求后要确认联机信息,向A发送状态码ack number=x+1,syn=1,ack=1,随机产生seq number=y(y也是一个随机数)的包;

      第三次握手:主机A收到后检查ack number是否正确,即是否等于x+1,以及状态码ack是否为1,若正确,主机A会再发送ack number=y+1,ack=1,syn=0,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,建立通信。

过程分析:

     第一次握手syn=1,ack=0,表示这是一个请求连接的包,seq number表示发包数据字节序号,由于下层的IP层可能会对TCP的数据拆包,因此IP层会对每个字节编号,但是这是建立连接期间,根本没有数据,发送只是只有首部的空包,因此seq number 是一个随机数,这个随机数是有用处的,用来作为认证标记。

     第二次握手syn=1,ack=1,表示这是一个接受连接的包,seq number=y(同理y也是一个随机数),ack number=x+1,ack number 表示期望下一次接受到的包的起始序号,尽管没有收到应用数据,但是TCP规定,一次连接请求包要消耗一个seq number,因此ack number=x+1,必须等于x+1。

     第三次握手ack=1,syn=0,ack number=y+1,seq number=x+1。

为什么要三次握手?

      既然TCP是面向连接的可靠协议,那么怎么样才能叫可靠连接呢?我个人理解,即在一次有效连接中,双方都必须确定对方能收到自己的信息,这样连接才真正可靠

      第一次握手,A发包出去,此时A不能确定B有没有收到自己的消息,A发的包中seq number=x,是一个随机数,可以理解为是“认证密码”。第二次握手,A收到syn=1,ack=1,seq number=y,ack number=x+1,A通过检测ack number等于x+1,可知道B收到了自己数据,此时可以A能确定B能接收到自己的数据 ,但是对于B,它并不能确定A能否收到自己的数据,因为B只是接受一次A的包,然后发送给A一次包,它并不知道A是否收到自己的包。因此需要第三次握手,过程与第二次类似,B要确认A是否收到了自己的数据。                                                                                   

      由以上分析可知,双方确定对方能收到自己的消息,必须3次握手,其实严格的说是至少3次握手,但是这三次握手必须发生在一次有效的连接中,比如A第一次发包,由于网络延迟没有及时到达B,于是A重发,但是之前的那个包B又接受到了,此时A和B的连接已经不是同一次连接了,这种情况肯定经常发生,但是TCP协议本身就很好地解决了这个问题,那就是seq number  ack number 认证机制,由于seq这个数是随机数,三次握手都要用到,可保证三次握手是一次有效连接。                                                                                                                             



猜你喜欢

转载自blog.csdn.net/KentZhang_/article/details/50488746