zoukankan      html  css  js  c++  java
  • Tcp协议细节(三次握手,四次握手)

    利用滑动窗口实现流量控制(让发送方的发送速率不要太快,让接收方来得及接收)

    (发送窗口的发送窗口不能超过接收方给出的接收窗口的数值)

    拥塞控制

    拥塞:在某段时间,对网络中某一资源的需求超过了该资源所能提供的可用部分

    首先发送方维持一个叫做拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化,发送方让自的发送窗口等于拥塞窗口。如果考虑到接收方的接受能力,那么发送窗口还可能小于拥塞窗口。

    发送方控制拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去,制药网络出现拥塞,拥塞窗口就减小一些,以减小注入到网络中的分组数。

    几种解决拥塞控制的方法:慢开始,拥塞避免,快重传,快恢复

    慢开始:

    当主机开始发送数据时,如果立即把大量数据字节注入到网络中,可能引起网络的负荷情况,经验证明,较好的方式是先探测一下,由小到大逐渐增大发送窗口

    举一个例子:

    在一开始,发送方先设置cwnd=1,发送第一个报文段M1,接收方收到后确认M1。发送方收到对M1的确认后,把cwnd从1增大到2,于是发送方接着发送M2和M3两个报文段,接收方接收到后发回对M2和M3的确认。此时cwnd从2变化到4,然后发送M4到M7,以后每次都是呈倍数增长。

    拥塞避免算法:

    让拥塞窗口cwnd缓慢增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,拥塞窗口cwnd是按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率慢很多。

    快重传:

    要求接收方每收到一个失序报文立即发送重复确认。以图为例:

    解释:

    1.当发送方发送M3给接收方,在传送过程中发生丢包,

    2.发送方维持的拥塞窗口中的数据包还在传送,而每一次传送到接收方,接收方都发送一个重复确认M2给发送方

    3.只要发送方接收到3个重复确认时,不用等到M3设置的超时重传计时器到期,就自动重传M3

    快恢复:

    1.当发送方连续接收到3个重复确认时,就执行“乘法减小”算法,把慢开始门限减小,为了预防网络发生拥塞,但接下去不执行慢开始算法

    2.由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重的拥塞,就不会一连有好几个报文段连续到达接收方,也就不会导致接收方连续发送重复确认),故与慢开始不同之处在于现在不执行满开始算法,而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢的线性增大

    首先tcp的运输连接有3个阶段:连接建立,数据传送,连接释放

    三次握手:

    主要用于tcp的连接建立阶段,引用《计算机网络第6版》中的图加以说明:

     

    首先,发起请求的一方成为客户端,故上图客户端是A,被动等待连接的一方是服务器端,故为B

    分析三次握手过程:

    • A首先向B发起请求,此时的SYN(同步,在连接建立时用来同步序号)。当SYN=1,而ACK=0,这是一个连接请求报文段,此时A设置一个随机序列号,向B发起请求
    • B收到请求后,向A回复一个SYN=1,ACK=1(确认号为1),表示这是一个同意建立连接的报文段。此时ack必须为seq+1,同时也为自己设置一个seq=y,
    • A收到B的确认后,向B发送一个ACK=1,并且将ack设置为y+1,seq(字节编号),Tcp的标准规定,ACK报文可以携带数据,但是如果不携带数据则不消耗序号。

    为何A还要发送一次确认,主要是为了防止已经失效的链接请求报文段突然又传到了B,因而产生错误

    TCP的连接释放:(4次握手)

    • A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,A把连接释放报文段首部的终止控制位FIN置为1(FIN字段用来释放一个连接),其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1
    • b收到连接后,发出ACK=1,并ack=u+1,且设置自己的seq=v,此时的tcp处于半关闭状态,a收到确认后,进入等待状态,等待b发出的连接释放报文段
    • 若b没有要向a发送的数据,其应用进程就通知TCP释放连接,这是b发出的连接释放报文段必须使FIN=1,并设置自己的seq=w,且b必须重复上次已发送过的确认号ack=u+1,并且设置ACK=1
    • a收到b的连接释放报文段后,必须对此发出确认,在确认报文中把ACK置为1,确认号ack=w+1,而自己的序号是seq=u+1

    为何A在time-wait状态必须等待2MSL的时间呢?

    1,确保a发送的最后一个ack报文段能够到达b

    2,防止之前提到的“已失效的连接请求报文段”出现在本连接中

  • 相关阅读:
    第四部分 | 第19章 —— Cocos2d-HTML5
    第四部分 | 第18章 —— 可视化开发
    第四部分 | 第17章 —— 多平台下的Cocos2d
    第三部分 | 第16章 —— 并发编程
    第三部分 | 第15章 —— 缓存与池
    第三部分 | 第14章 —— 网络
    第三部分 | 第13章 —— 数据持久化
    第二部分 | 第12章 —— 物理引擎
    ASA failover配置(A/S)
    深信服AF ipsec ikev2 新版本尝鲜(对接Azure)
  • 原文地址:https://www.cnblogs.com/yuan233/p/10453342.html
Copyright © 2011-2022 走看看