三次握手四次挥手

Posted wangjingguan

tags:

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

知识热身

介绍tcp协议的三次握手四次挥手之前,首先我们来看一下tcp协议数据报文的组成,这样方便我们更好的理解下面将要介绍的三次握手四次挥手的过程,tcp协议报文如下图:
技术图片

三次握手

1、以下介绍三次握手用到的TCP头部几个重要的字段标识

  • seq:序列号,占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随即产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
  • ack : 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
  • ACK :占一位,表示验证字段,仅当ACK=1时,确认号字段才有效。ACk=0时,确认号无效。
  • SYN:表示建立TCP连接。当SYN=1,ACK=0时:这是一个连接请求报文段。若同意连接,则在响应报文段中置SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN标志位只有在TCP建立连接时才会置为1,握手完成后SYN标志位被置0.
  • FIN:FIN=1表示断开TCP连接

三次握手过程

想必看到这篇博客的你也应该到了适婚的年龄了,如果你没有男朋友或女朋友,我想也该买包辣条找一个了。下面我们就以"谈恋爱"这个话题来介绍一下三次握手的过程吧。
技术图片
上图过程说明:

  • 1、有客户端发送建立TCP连接的请求报文,其中报文中含seq序列号,是有发送端随即生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值)
  • 2、有服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由服务端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知道自己的TCP建立请求已经得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack+1可以理解为是确认和谁建立连接。
  • 3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1,并再次回复ACK验证请求,在服务端放过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)

四次挥手

过了段时间,你们两个相处的久了,或许你喜欢上其TA女生了,你狠心的抛弃了你当初追求过的女孩,于是,你随便编出了一个理由,才有了你俩以后老死不相往来的演出:
技术图片
四次挥手过程说明:

  • 1、客户端发送断开TCP连接请求的报文,其中报文中含有seq序列号,是有发送端随即生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x有客户端随机生成)
  • 2、服务端会回复客户端发送的TCP断开请求报文,其中包含seq序列号,是有回复端随机生成的,而且会产生ACK字段,ACK字段数字是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y有服务端随机生成)
  • 3、 服务端在回复客户端的TCP断开请求后,不会马上就行TCP连接的断开,服务端会先确保断开前,所有传输到客户端的数据是否已经传输完毕,一旦确认传输完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z有服务器端随机生成)
  • 4 、客户端收到服务器端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq的基础上+1,从而完成服务端请求的验证回复、(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
    至此,TCP断开完成即四次挥手过程结束

三次握手四次挥手过程中的11中状态

三次握手

技术图片

  • 1、刚开始,连接建立之前,客户端和服务器端的状态都为CLOSED;
  • 2、服务器端创建socket后开始监听,变为Listen状态;
  • 3、客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT;
  • 4、服务器端收到客户端的报文后向客户端发送向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD;
  • 5、然后客户端收到ACK、SYN,就像服务器发送ACK,客户端状态变为ESTABLISHED;
  • 6、服务器端收到客户端的ACK后变为ESTABLISHED。此时3次握手完成,连接建立!

四次挥手

技术图片
由于TCP连接时全双工的,断开连接会比建立连接麻烦一点点

  • 1、客户端向服务器发送FIN报文,请求断开连接,其状态未FIN_WAIT1;
  • 2、服务器收到FIN后向客户端发送ACK,服务器的状态为CLOSE_WAIT
  • 3、客户端收到ACK后就进入FIN_WAIT2状态,此时连接已经断开了一半了,如果数据还有要发送给客户端,就会继续发送;
  • 4、直到发完数据,就会发送FIN报文,此时服务器进入LAST_ACK状态;
  • 5、客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态;
  • 6、再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。自此,还有一个状态没有出来:CLOSING状态。CLOSING状态表示:客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN,这种情况发生在服务器发送ACK丢包的时候,因为网络传输有时会有意外。
LISTEN:等待从任何远端TCP 和端口的连接请求。

SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。

SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。

ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。

FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。

FIN_WAIT_2:等待远端TCP 的连接终止请求。

CLOSE_WAIT:等待本地用户的连接终止请求。

CLOSING:等待远端TCP 的连接终止请求确认。

LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)

TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由:
          1.可靠的实现tcp全双工连接的终止;
          2.允许老的重复分节在网络中消逝。

CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)

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

网络 之 三次握手&四次挥手 介绍

为啥是四次挥手而不是三次

TCP三次握手和四次挥手

一文搞懂TCP的三次握手和四次挥手

三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)

三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)