简述TCP协议的六个标志位和三次握手与四次挥手的过程及原理

简述TCP协议的三次握手与四次挥手的过程及原理

       今天,我们来分享一下TCP协议的六个标志位和三次握手与四次挥手的过程及原理。

       先介绍一下TCP中的六个控制位,

         SYN表示建立连接;

         FIN表示关闭连接;

         ACK表示响应;

         PSH表示有 DATA数据传输;

         RST表示连接重置;

         URG表明紧急指针有效.

       URG标志表明紧急数据之后正常数据的起始位置,URG的序列号到紧急指针之间的数据为紧急数据,而紧急指针开始的数据才是正常数据。当URG=1时,表示分段中有紧急数据应当加速传送。

       PSH标志 PSH 紧急位。当PSH=1时,要求发送方马上发送该分段,而接收方尽快的将报文交给应用层,不做队列处理。

       URG=1,表示紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据),不进入接收缓冲,直接交给上层进程,而余下的数据都是要进入接收缓冲的。

      而一般情况下,TCP是要等到整个缓存都填满了后再向上交付,但是如果PSH=1的话,就不用等到整个缓存都填满,直接交付,但是这里的交付仍然是从缓冲区中交付的。

       所以PSH要经过缓冲区而URG不需要,千万要记住哦!

       其次,SYN和FIN不能同时有效,当出现SYN和FIN同时有效的数据包时,可能有人在恶意攻击你的网络,要多多注意,并采取响应措施。

       而RST用于异常终止一个链接,RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接,并通知应用层连接复位。另外就是RST用于检测半打开连接,即一方已经关闭或异常终止连接而另一方却还不知道,并且只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。此时,TCP的处理原则是接收方以复位作为应答方式。其他的应该就不用解释了吧!

      

       TCP协议服务器和客户端建立连接的过程被称为三次握手,而TCP协议服务器和客户端断开连接的过程被称为四次挥手。在连接之前和断开连接之后,服务器和客户端之间是不能传输数据的,

       三次握手:

First:客户端向服务器发送连接的请求(SYN),并等待服务器应答。

Second:服务器应答(ACK)客户端的连接请求,并向客户端发送连接请求(SYN),等待服务器应答。

Third:客户端应答(ACK)服务器的连接请求,客户端和服务器连接完成,可以相互进行数据传输。

       分析:

       如果第二步失败,客户端会不断等待然后重新发送连接请求,直到得到服务器端应答为止。

       如果第三步失败,服务器端会先等待然后重新发送连接请求,在一定时间内得不到客户端的应答,为避免服务器受到DOC攻击,服务器端有权断开它与此客户端的连接。

       所以不管是哪一步失败,都尽量不影响服务器的正常运行,并且在不占用大量系统资源的情况下,完成TCP服务器和客户端之间的连接。

       四次挥手:

First:客户端完成数据接收任务,并不打算再向服务器传送数据时,向服务器的发送断开连接的请求(FIN),并等待服务器应答。

Second:服务器应答(ACK)客户端的断开连接请求。

Third:服务器完成数据接收任务,并不打算再向服务器传送数据时,向客户端的发送断开连接的请求(FIN),并等待客户端应答。

Fourth:客户端应答(ACK)服务器的断开连接请求。

       此时,客服端与服务端的连接才算断开。

注:first、second与third、fourth可以交换先后顺序,因为已建立连接的双方都可以先提出断开连接的请求。

        分析:

       连接是为了传输数据,断开是双方暂时不再传输数据,为了不占用系统资源而断开。所以断开前,双方必须确定不需要再传输数据并且接收数据完毕,由于双方收发数据速度不同,为确定数据接收的完整性,响应另一方断开请求的一方,不一定都能在响应断开请求的同时也能发起断开请求,所以至少挥手四次才能完成断开服务器和客户端的连接的功能。

       图解三次握手和四次握手如下:

 

       三次握手其中客户端要主动请求,如上图所示至少通过3次才能建立服务器和客户端之间的连接,此时即将进入ESTABLISHED状态。

       而四次挥手双方都可以先提出,但是只有都经过双方的同意而断开连接,才算真正的断开了连接。由于双方接收数据的速度可能存在不一致的问题,在保证数据被接受并且都经过双方的同意而断开连接的前提,至少通过四次来完成断开连接的过程。只有一方断开连接时,此时处于TIME_WAIT状态,而服务器为了减少TIME_WAIT状态造成的资源浪费,在可能的情况下,尽量不主动断开连接。所以一般都是客户端主动断开连接。

      下面简要解释一下ESTABLISHED状态和TIME_WAIT状态。

       ESTABLISHED状态:建立连接,两台机器正在通信。

       TIME_WAIT状态:我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分 段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

       目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。该怎么避免TIME_WAIT状态,达到减少资源浪费,在接下来的博客会有介绍。

      分享如上,如有错误,望斧正!愿大家学习有进步!

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值