美文网首页
http 三(TCP)

http 三(TCP)

作者: 昵称是乱起的 | 来源:发表于2019-02-08 23:11 被阅读17次

    传输控制协议TCP的特点

    1.面向连接

    数据传输之前,必须先建立连接


    image.png

    三次握手的目的:当发送的SYN请求报文在网络中滞留了,客户端会启用超时重传策略,重新发送一个SYN请求报文,server端收到SYN报文后会回复一个SYN,ACK的确认报文,然后建立了连接,传送完数据后断开了连接,此时如果突然收到了滞留的那个SYN请求报文,server端会误以为客户端又要建立连接,如果是2次握手的话,server回复完就建立了连接,此时可能就会发生异常。


    image.png
    四次挥手是因为TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
    2.可靠传输

    通过TCP连接发送的数据,无差错、不丢失、不重复、按序到达
    可靠传输的工作原理:停止等待协议,分为无差错情况、出现差错、确认丢失、确认迟到


    image.png
    image.png
    3.面向字节流

    TCP中的“流”( stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等), 但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。

    image.png
    连续ARQ(自动重传请求)协议工作原理
    image.png
    发送方每收到一个确认,就把滑动窗口向前滑动一个分组的位置。接收方一般都是采用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。
    TCP报文段的首部格式
    image.png
    4.流量控制

    利用滑动窗口实现流量控制,一般说来,我们总是希望数据传输得更快一些,但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

    image.png
    发送方的发送窗口不能超过接收方给出的接收窗口的数值,TCP窗口的单位是字节,不是报文段
    image.png
    在图中,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd=400的报文段。然而这个报文段在传送过程中丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。如果没有其他措施,这种互相等待的死锁局面将一直延续下去。为了解决这个问题,TCP为每一个连接设有一个持续计时器( persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然是零,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是零,那么死锁的僵局就可以打破了。
    5.拥塞控制

    慢开始、拥塞避免、快重传、快恢复:

    发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就可以再增大些,以便把更多的分组发送出去,这样就可以提高网络的利用率。但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

    慢开始算法的思路是这样的:当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引起网络发生拥塞。经验证明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。

    image.png

    横坐标代表传输轮次
    1.当TCP连接进行初始化的时候,把拥塞窗口的值置为1(为了便于理解,窗口单位不使用字节,而使用报文段的个数),慢开始的门限初始值ssthresh设置为16。在执行慢开始算法的时候,发送方每收到新报文段的一次确认ACK,就会把拥塞窗口值cwnd加1,然后开始下一轮的传输,因此拥塞窗口值随着传输轮次呈现指数增长。
    2.当拥塞窗口的值增长到门限初始值的时候就开始执行拥塞避免算法,拥塞窗口值按线性规律增长。
    3.当拥塞窗口值等于24的时候,超时发送方判断发生网络拥塞。调整门限值为ssthresh = cwnd / 2 = 12,设置拥塞窗口cwnd = 1,进入慢开始阶段。
    4.当拥塞窗口值16的时候,发送方连续三次收到对同一个报文的重复确认。有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。快重传算法规定,发送方只要一连收到3个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。使用快重传可以使整个网络的吞吐量提高约20%。
    5.发送方知道只是丢了个别报文段,于是不启动慢开始,而是执行快恢复算法,调整门限值为ssthresh = cwnd / 2 = 8,设置拥塞窗口cwnd = ssthresh = 8,开始执行拥塞避免算法。
    下面的拥塞控制流程图更加清晰:

    image.png
    如果把拥塞控制跟接收方对发送方的的流量控制一起考虑,发送窗口的的上限值应该取两者较小的一个。

    相关文章

      网友评论

          本文标题:http 三(TCP)

          本文链接:https://www.haomeiwen.com/subject/gtgwsqtx.html