关于三挥手四握手的介绍及tcp协议可靠机制说明

TCP是一个可靠的、面向连接的、基于字节流的服务。

1.确保TCP可靠连接机制

  •  超时重传

   TCP协议在发送数据后,每一个报文段有一个定时器,若在定时器指定时间内接收端对这个报文段的确认报文没有到达,则会在发一次,而且这次的时间是上次时间的两倍。

  • 滑动窗口:

  TCP流量控制的一种手段。这里的窗口指的是接受通告窗口(Receiver Window,RWND)。他会告诉对方本端的TCP接收缓冲区还能容纳多少个字节,对方可控制发送数据的速度.对于流量控制.

  • 拥塞控制:

    TCP模块为了提高网络利用效率、降低丢包率,并办证网络资源对每条数据流的公平性而采取的控制手段。

   主要依赖拥塞窗口(cwnd)控制.窗口的大小代表能发送出去的但还没有接收到ACK的最大数据报文段.窗口越大发送数据速度越快,但可能会造成拥塞.若窗口值为1,可看成一个停等协议,每发送一个数据,都要等到对方确认后才能发送第二个数据,效率低.

  由于要考虑流量控制和拥塞控制,TCP真正的发送窗口=min(rwnd,cwnd).而rwnd是对端决定的,网络环境对他无影响,所以不考虑他.对于cwnd,在TCP中以自己为单位,cwnd每次传输按照MSS大小发送数据,所以也可认为cwnd按照数据包个数做单位.cwnd+1c相当于字节数增加1个MSS大小.

   拥塞控制包含慢启动、拥塞避免、快速重传、快速恢复四个部分。

  1.   慢启动:网络开始传输时,并不知道网络的实际情况,采取一种试探性的方式控制数据发送的速率。在慢启动阶段 ,数       据的发送率以指数的方式增长(拥塞窗口的增长方式是2的n次方增长)。因为它的增长方式很快,所以设置了一个门           限,当到达门限时,就进入拥塞避免阶段。
  2. 拥塞避免:当窗口的大小采用慢启动方式增长都门限时,进入拥塞避免状态。拥塞避免的增长方式不再是指数形式增长,而是经过每一个往返时间RTT就将发送方的拥塞窗口+1,增长速度缓慢。若发生网络拥塞时,就将门限设置为原来的一半,拥塞窗口置1,执行慢启动算法。(较低的起点,指数级增长)
  3. 快速重传:假设发送方发送报文段:A1、A2、A3、A4、A5,当接收方收到A1、A2后,A3丢失,接下来收到的A4、A5不作处理,而是没接到一个报文段对A2反复确认,发送方接收到重复的三次报文确认段,就对其后的报文段重新发送,不需要等待超时时间到达。快速重传后,立即进入快速恢复状态。
  4. 快速恢复:将慢启动门限设为原来的一半,将拥塞窗口设置为现在慢启动的门限值,不再执行慢启动算法,直接进入拥塞避免阶段。是发送窗口以线性方式增长。
  • 应答确认

   2.TCP建立连接的过程(三次握手)

     1). 首先TCP建立连接过程图如下:

                                 

     在最开始的时候,客户端和服务器处于关闭(CLOSED)状态.A打开连接后,B被动的打开连接.

  •     服务器打开后创建TCB(传输控制快),准备接受客户端连接请求.然后服务器处于listen状态.若有连接请求,立刻做出回应.
  •     客户端A创建TCB模块,向B发出连接请求报文段,首部中的同步位SYN=1,选取初始序列号seq=x.SYN报文段不能携带数据,但要消耗掉一个序列号.客户端进入SYN-SENT(同步已发送)状态.
  •    服务器收到连接请求报文后,如若同意建立连接,向A发送确认信息.在确认报文段应把SYN、ACK置1,确认号ack+1,同时也为自己选一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗一个序号。服务器进入SYN-SENT(同步已发送)状态.
  •    客户端收到服务器确认后,还要给服务器确认信息,确认报文段ACK=1,确认号ack=y+1,自己的序列号seq=x+1.这时候ACK报文段可携带数据。若不携带数据则不需要消耗序列号。下一个数据报文段的序列号seq=x+1.TCP连接已成功建立,服务器进入ESTABLISHED(已建立连接)状态。

 2).*****为什么不是两次握手而是三次??(A为什么再发一次确认信息)

   目的:为了防止已失效的连接请求报文段突然又突然传到了服务器。

    客户端向服务器发送了一个链接请求A,但因为链接请求A丢失服务器未得到确认信息。然后服务器再发送一次链接请求B,后来收到确认号建立连接。数据传输完后,释放了链接。客户端发送了两次链接请求,第一个丢失,第二个到了服务器端。

   现在设定第一个报文段A没有丢失,可能因为某些原因耽搁了,延误了到达服务器端的时间。现在他到了服务器端,但他应该是失效的报文段。现在服务器收到了该失效连接请求,而服务器认为这是客户端再次发出的链接请求,然后向服务器发出确认报文段建立链接。假设没有三次握手,只有服务器端发送确认信息,新的链接有建立了。

   服务器端并没有建立链接的请求,不会理会服务器的确认信息,更不会向服务器发送确认信息。而服务器认为连接已经建立,一直等待客户端发数据,白白浪费资源。

  有了三次握手机制可防止现象发生。若有上述情况,客户端不会向服务器发送确认信息,服务器没有收到确认信息,就知道客户端不需要建立连接。

3).三次握手哪个阶段容易受到攻击

  比较典型的是SYN泛洪攻击,又称SYN溢出攻击。

  出现在第二阶段,若客户机伪造大量第一次sys同步报文,服务端就会消耗很多资源保护客户端信息,并确认,但确认结果是失败的,但这需要消耗一段时间。因为服务器会连续多次进行第二次握手确认才认定失败。在短时间大量syn同步报文涌现服务端,服务器资源可能被耗尽,就可能导致正常客户端得不到响应失败。

4).哪个阶段容易出现异常

   第二阶段。如果服务器相应的端口未打开,会恢复RST复位报文,握手失败。此外,listen创建的listen达到监听上限,也有可能失败。

5).作用

  •   使通讯双方做好发送准备;
  •   告诉对端通信所选用的报文标识号;
  •   防止已失效的连接请求报文段又突然传到了服务器,产生错误;

3.TCP断开连接过程(四次挥手)

   1).四次挥手过程图

                          

        在数据传送完毕后,通信双方都可以开始释放连接。客户端和服务器端进入ESTABLLISHED状态。

       客户端向服务器发送断开链接请求报文段,并停止发送数据,主动关闭链接。客户端把链接释放报文段FIN置1,给序列号    seq=u(相当于前面已传送过得数据的最后一个字节的序号+1)。这是客户端进入FIN_WAIT-1(终止等待1)状态,等待服务器B的确认。这是FIN不携带数据,需要消耗一个序列号。

      服务器接收到释放链接请求后,向客户端发送确认信息,表示我已经收到了。确认后ack=u+1。然后申请一个序列号seq=v(相当于前面已传送过得数据的最后一个字节的序号+1),服务器进入CLOSED_WAIT(关闭等待)状态。服务器到客户端的连接并没有关闭(客户端没有数据要发送,若服务器发送数据,客户端仍要接收)。

   客户端表示我已经收到来自服务器的确认信息后,就进入FIN_WAIT-2(终止等待2)状态,等待服务器发出的链接报文段。

  若服务器没有向服务器发送数据,应用进程通知TCP释放连接。服务器发出的链接释放报文必须FIN=1.假设服务器的序列号seq=w(在半关闭状态服务器可能发送了数据),。服务器必须确认上次已发送过得确认后ack=u+1,服务器进入LAST_ACK(最后确认)状态。等待客户端的确认。

   客户端收到服务器的链接释放报文段后,必须发出确认信息,在确认报文段中把ACk=1,确认后ack=w+1,z自己的确认号seq=u+1(前面发送过的FIN报文段需消耗一个序列号),进入TIME-WAIT时间等待状态。现在TCP连接还没断掉。必须经过时间等待计时器(TIME_WAIT timer)设置的时间2MLS后,客户端进入CLOSED状态。

      说明:时间MSL为最长报文段寿命,TCP允许不同实现根据自己情况设定MSL值。客户端进入TIME_WAIT状态后,要经过4分钟进入CLOSED状态。

2.为什么客户端在TIME-WAIT状态必须等到2MSL???

  TIME-WAIT:主动断开链接的一端收到对端的FIN报文并把确认报文ACK发出的一种状态。

  •   为了保证服务器发送的最后一个ACK报文段能到达服务器。若ACK报文段有可能丢失,在TIME-WAIT状态本端还可以接收到对端重传的FIN报文段并重新发送ACK,所以存在的时间为2MSL.(保证可靠的终止TCP链接)
  • 防止已失效的链接请求报文段出现在本连接中。客户端在发送完最后一个ACK报文段后,在经过2MSL,就可以使本地连接持续的时间内产生的所有报文段从网络中消失,就可以使下一连接不会出现旧的链接请求报文段。只要服务器收到来自客户端的确认信息,就进入CLOSED状态。服务器结束连接的速度要比客户端快。(保证迟来的报文段能被识别并丢弃)。

 3.TIME_WAIT和CLOSED_WAIT区别

      CLOSED_WAIT是被动关闭的一端收到对端关闭请求(FIN报文段)并且将ACK确认报文段发出去后所处的状态。这种状态   表示:收到了对端请求,但本端还未完成工作,还未关闭。

      TIME-WAIT:主动断开链接的一端在本段已关闭的前提下,收到对端的关闭请求(FIN报文段)并将ACK报文段发出去所处的状态。这种状态:双方都已经完成工作,只是为了确保迟来的数据报能被识别并丢弃,可靠的终止的TCP连接。

4.查看TCP连接状态

  使用netstat或ss命令。

 netstat:执行结果中State一列表示的是TCP连接状态。

       

 ss:第一行为TCP连接状态。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值