参考: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连接。长连接适用于操作频繁,点对点通信,且连接数不太多的情况;短连接适用于银行,因为它管理起来比较简单,存在的连接都是合理的连接。

  

  

TCP/IP知识总结(TCP/IP协议族读书笔记四)的更多相关文章

  1. TCP/IP知识总结(TCP/IP协议族读书笔记二)

    接下来,总结一下网络层的协议,IP,ARP,RARP,ICMP,IGMP.当我们在网络传输的过程中,把分组交付到主机或路由器需要两级地址:物理地址和逻辑地址.而且我们需要能够把物理地址映射成为相应的逻 ...

  2. TCP/IP知识总结(TCP/IP协议族读书笔记一)

    一.简述TCP/IP协议 Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/互联网互联协议,又名网络通信协议.是Internet最基 ...

  3. 『TCP/IP详解——卷一:协议』读书笔记——01

    从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...

  4. 『TCP/IP详解——卷一:协议』读书笔记——07

    2013-08-20 17:51:49 第三章 IP:网际协议 3.1 引言 IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP和IGMP数据都以IP数据报格式传输.再来看一下图 ...

  5. 『TCP/IP详解——卷一:协议』读书笔记——06

    2013-08-20 14:41:01 2.8 最大传输单元MTU MTU,最大传输单元:以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节.这个不同网络对应的传输上限 ...

  6. 『TCP/IP详解——卷一:协议』读书笔记——03

    2013-08-17 17:31:49 1.7 分用 分用(Demultiplexing):这是一个过程——当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议上的报文首 ...

  7. 《TCP/IP详解 卷1:协议》读书笔记

    第一章 概述 协议栈 应用层 HTTP,FTP   运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层   帧(Frame) 物理 ...

  8. 『TCP/IP详解——卷一:协议』读书笔记——17

    2013-08-27 15:37:42 6.5 ICMP端口不可达差错 端口不可达报文是ICMP差错报文的一种,它是ICMP不可达报文中的一种,以此来看一看ICMP差错报文中所附加的信息.使用UDP来 ...

  9. 『TCP/IP详解——卷一:协议』读书笔记——15

    2013-08-25 13:39:40 第6章 ICMP:Internet控制报文协议 6.1 引言 ICMP经常被认为是IP层的一个组成部分.它传递差错报文以及其他需要注意的信息.ICMP报文同通常 ...

随机推荐

  1. hadoop之 参数调优

    一. hdfs-site.xml 配置文件 1. dfs.blocksize 参数:hadoop文件块大小描述:新文件的默认块大小,以字节为单位,默认 134217728 字节.可以使用以下后缀(大小 ...

  2. RAC5——11gR2以后GI进程的变化

    参考文档: 11gR2 Clusterware and Grid Home - What You Need to Know (Doc ID 1053147.1)诊断 Grid Infrastructu ...

  3. vue-cli 打包报错:Unexpected token: punc (()

    vue-cli 打包报错: ERROR in static/js/vendor.ed7d2353f79d28a69f3d.js from UglifyJs Unexpected token: punc ...

  4. spring 使用 maven profile

    先看看 maven 定义 profile 的写法 <!-- profiles --> <profiles> <profile> <activation> ...

  5. jenkins进阶-集成钉钉机器人(6)

    最早做Jenkins发布完成以后通过邮件发送信息通知相关的联系人,发现邮件会受限于大家接收的设置,导致不能及时的看到相关的发布内容,公司使用钉钉做为公司内部的通讯工具,所以想通过Jenkins发布完成 ...

  6. docker 里面的supervisord不断killed

    这个原因就一般是百度上大家说的,内存不足啦 但是死也得死个明白 用这个命令 dmesg | egrep -i -B100 'killed process' 看一下就知道了 我的是docker限制了内存 ...

  7. 织梦SQL标签的使用

    (>=DedeCMS 3,DedeCMS 4,DedeCMS 5) 名称:sql 功能:用于获取MySQL数据库内容的标签 语法: 1 2 3 {dede:sql sql='' appname= ...

  8. bzoj4918: 回文数对

    Description 给定区间[L,R],请统计有多少对整数A,B(L<=A,B<=R)满足A xor B的值在二进制表示下,去掉所有前导0后是回文串 Input 第一行包含一个正整数T ...

  9. maven学习(4)-Maven 构建Web 项目

    紧接着上一节(3),现在maven新建web项目,user-web.模拟一个用户登录的需求: 工程结构: pom.xml: <project xmlns="http://maven.a ...

  10. sed简单用法

    参数说明: -e 以指定的script来处理输入的文本文件 -f 以指定的script文件来处理输入的文本文件 -h 显示帮助 -n 仅显示script处理后的结果 -V 显示版本信息 -v 反选 动 ...