TCP协议三次握手与四次挥手详解(上)

Posted kongjetlin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议三次握手与四次挥手详解(上)相关的知识,希望对你有一定的参考价值。

  在使用TCP协议进行数据的传输之前,客户端与服务器端需要建立TCP Connection,即建立连接,之后两端才能进行数据的传输。

  下面堆TCP连接“三次握手”的过程进行说明。

1、相关概念

  首先,我们需要了解TCP数据报的首部的结构(TCP数据报包括首部以及数据报部分),如下图:

     技术图片

 

 

其中需要注意的字段有:

(1)序号(sequence number):seq序号,占32位4个字节。从TCP源端向目的端发送的字节流数据,发起方发送数据报文时对每一个字节进行编号标记,每一个字节都会有一个编号(0 到 232-1)。给报文每个字节编上序号后,需要给报文指派一个序号seq,报文的第一个字节的编号值,就是这段报文TCP首部序号seq的值。

(2)确认号(acknowledgement number):ack序号,占32位4个字节。表示期待收到对方下一个报文段的第一个数据字节的序号,那么当前报文段最后一个字节的编号+1即为确认号。比如第一段报文seq=1(报文第一个字节编号1),报文长度是100,即报文最后一个字节编号为100。确认端接收到发起端发送的报文后,返回给发起端的响应TCP报文中,ACK=1,ack=101,表示发起端发送的1-100编号的字节数据已经收到,希望发起端下一个报文从101编号的字节开始发送。

  注意,只有TCP报文的ACK标志位为1时,这个报文中的确认序号字段才有效。

(3)标志位(Flags):TCP标志物有6位,具体如下图

技术图片

 

 

i)确认ACK:占1位,仅当ACK=1时,确认号字段才有效;ACK=0时,确认号无效 。

ii)同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示--这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求报文。  

iii)终止FIN:用来释放一个连接。FIN=1表示--此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

  这里需要注意2点:

1)不要混淆ACK标志位与ack确认号;

2)SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

 

2、三次握手过程

  过程如下图:

技术图片

  

  步骤如下:

1)首先发送方向接收方端发送一段TCP报文,其中标记位为SYN=1,表示“请求建立新连接”;序号为Seq=X(X一般为1),表示发送方发送给接收方的数据报文的序号是x,即数据报文的第一个字书编号为x(建立连接的报文长度一般为1);此时,发送端进入 SYNC-SENT状态:同步已发送状态。

2)接收方接收到来自发送方TCP报文之后,结束LISTEN监听阶段,进入 SYNC-RCVD 同步已接收状态。随后返回一段TCP报文,其中标志位为SYN和ACK,ACK=1 表示 “确认发送方的报文seq序号有效,接收方能正常接收发送方发送的数据”,SYN=1表示“并同意创建新连接”,即告诉发送方,接收方收到了你的数据,同意与你建立连接;ack=x+1,表示希望接收方下一次发送回来的数据包序号是 x+1,即希望接收方下一次从 x+1 开始发送数据。seq = y,接收方向发送方发送自己的数据报,序号是 y。

3)发送方接收到来自接收方的确认收到数据的TCP报文之后,明确了从发送方到接收方的数据传输是正常的,可以建立连接。那么它会进入 ESTABLISHED 建立连接阶段。并返回最后一段TCP报文,其中,标志位为ACK,表示 “确认收到接收方同意连接的信号”(即告诉接收方,我知道你收到我发的数据了);seq=x+1,表示向接收方发送序号为x+1的数据;ack=y+1,表示希望接收方下一次发送回来的数据报序号为y+1,即希望接收方下一次从编号为y+1的字节开始发送。

4)接收方在接收到发送方发送的第三次握手的数据后,也会进入 ESTABLISHED 建立连接阶段。

 

  在“三次握手”中,通过第一、第二次握手的SYN,发送方与接收方建立连接;而且通过第二、第三次握手的ACK,发送方与接收方都知道对方的ack(即希望本方发送的数据),即通过“三次握手”,发送方与接收方也同步了各自的序号。

 

3、为什么要进行“三次握手”才能建立TCP连接

  原因:避免已经失效的连接请求报文传送到接收方,导致接收方开启一些无效的连接,增加接收方开销。
  分析如下图:

技术图片

 

 

   如果是三次握手,就可以避免上面这种情况的发生,如下图:

技术图片

 

 

 4、扩展 

  在客户端与服务器端建立连接之后,在这个连接上,客户端与服务器端之间可以发送的HTTP请求数量与使用的HTTP协议的版本相关。

1)HTTP1.0版本:TCP连接是在HTTP请求创建的时候同步创建的,HTTP请求发送到服务器端,服务器端响应了之后,这个TCP连接就关闭了。即一次连接只能发送一次HTTP请求;

2)HTTP1.1版本:三次握手建立TCP连接后,以某种方式声明这个连接一直保持,后面的HTTP请求可以继续使用这个连接。

  由于在创建一个TCP连接的过程中需要“三次握手”的性能消耗。如果每次HTTP请求都要重新建立TCP连接,那么每次HTTP请求都有“三次握手”的性能消耗。如果使用HTTP1.1,只有第一次请求需要建立连接,后面的请求不需要建立连接,则只有一次“三次握手”的消耗。

以上是关于TCP协议三次握手与四次挥手详解(上)的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议三次握手与四次挥手详解(上)

TCP协议三次握手与四次挥手通俗解析

TCP三次握手与四次挥手

TCP三次握手与四次挥手

三次握手与四次挥手

TCP的三次握手与四次挥手(详解+动图)