zoukankan      html  css  js  c++  java
  • TCP/IP知识总结(TCP/IP协议族读书笔记四)

      参考:http://blog.chinaunix.net/uid-26275986-id-4109679.html

      继续!TCP的流量控制和拥塞控制。

      TCP相对UDP可靠的地方在于它的拥塞控制、流量控制。

    一.流量控制

      如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是把发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。主要的方式就是返回ACK中会包含自己的接受窗口的大小,并且利用大小来控制发送方的数据发送。

      滑动窗口协议:TCP是全双工协议,发送方和接收方各自控制自己的缓冲区。发送放成功发送了数据,只有得到接收方的确认之后,才会移动滑动窗口离开已发送的数据;同时接收方则确认连续的数据分组,对于乱序的分组则先接收下来,避免网络重复传递

      停止等待协议:发送方和接收方都使用了大小为1的滑动窗口。发送方一次发送一个分组,然后在发送下一个分组之前要先等待一个确认。它是面向连接的,提供流量控制和差错控制。所需要的缓冲存储空间最小,缺点是信道效率很低。在任何时候信道中都只有一个分组和一个确认。流量控制是通过迫使发送方等待确认来实现,差错控制是通过丢弃损坏的分组并让发送方在计时器超市后重传未确认的分组来实现。

      返回N协议:为了提高传输的效率,在发送方等待确认时应当有多个分组正在传送中。也就是我们应当让多个分组处于等待确认的状态,以便发送方在等待确认的同时,信道也能保持忙绿的状态。GBN的关键是我们在收到确认之前能够发送多个分组,但接收方只能缓存一个分组。发送方为发送出去的分组保存副本直到确认到达。发送窗口必须小于2^m。(发送方不用等待接收方的应答,持续的发送多个帧,假如发现已发送的帧中有错误发生,那么从那个发生错误的帧开始及其之后所有的帧全部再重新发送。)复杂度低,但是不必要的帧会再重发,所以大幅度范围内使用的话效率是不高的。

      

      

      流量控制

      

    二.拥塞控制

      网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。常用的方法就是:
    1. 慢开始、拥塞控制
    2. 快重传、快恢复
         一切的基础还是慢开始,这种方法的思路是这样的:
    -1. 发送方维持一个叫做“拥塞窗口”的变量,该变量和接收端口共同决定了发送者的发送窗口;
    -2. 当主机开始发送数据时,避免一下子将大量字节注入到网络,造成或者增加拥塞,选择发送一个1字节的试探报文;
    -3. 当收到第一个字节的数据的确认后,就发送2个字节的报文;
    -4. 若再次收到2个字节的确认,则发送4个字节,依次递增2的指数级;
    -5. 最后会达到一个提前预设的“慢开始门限”,比如24,即一次发送了24个分组,此时遵循下面的条件判定:
      *1. cwnd < ssthresh, 继续使用慢开始算法;
      *2. cwnd > ssthresh,停止使用慢开始算法,改用拥塞避免算法;
      *3. cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
    -6. 所谓拥塞避免算法就是:每经过一个往返时间RTT就把发送方的拥塞窗口+1,即让拥塞窗口缓慢地增大,按照线性规律增长;
    -7. 当出现网络拥塞,比如丢包时,将慢开始门限设为原先的一半,然后将cwnd设为1,执行慢开始算法(较低的起点,指数级增长);

         上述方法的目的是在拥塞发生时循序减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。慢开始和拥塞控制算法常常作为一个整体使用,而快重传和快恢复则是为了减少因为拥塞导致的数据包丢失带来的重传时间,从而避免传递无用的数据到网络。快重传的机制是:
    -1. 接收方建立这样的机制,如果一个包丢失,则对后续的包继续发送针对该包的重传请求;
    -2. 一旦发送方接收到三个一样的确认,就知道该包之后出现了错误,立刻重传该包;
    -3. 此时发送方开始执行“快恢复”算法:
      *1. 慢开始门限减半;
      *2. cwnd设为慢开始门限减半后的数值;
      *3. 执行拥塞避免算法(高起点,线性增长);

    QUIZ:

      TCP连接建立后,是通过什么保持的呢?

    ANSWER:

      网络中接收和发送数据都是通过SOCKET实现的。但是如果套接字断开,那发送数据和接收数据就一定会出现问题。如何判断套接字是否可用呢?也就是如何保持长连接呢?TCP为我们设置了一个叫心跳的机制,如果设置了心跳,那么TCP就会在一定的时间内发送你设置的次数的心跳,并且此信息不会影响协议,让对方知道自己“还活着”,确保连接的有效性。

    QUIZ:

      什么是长连接?什么是短连接?

    ANSWER:

      长连接指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方检测包以维持此连接;短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。长连接适用于操作频繁,点对点通信,且连接数不太多的情况;短连接适用于银行,因为它管理起来比较简单,存在的连接都是合理的连接。

      

      

  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/jose1125/p/5261627.html
Copyright © 2011-2022 走看看