12 TCP:传输控制协议(初步)

12.1 引言

​ 以太网上的很多协议自身不包含可靠传输机制,他们可能会使用一种类似于校验和或者CRC这样的数学函数来检测接收到的数据是否包含差错,但是他们不会去尝试纠正差错。尤其对于IP协议和UDP协议,根本没有实现差错纠正功能。虽然一些基于IP协议或者UDP协议的上层协议会提供一定次数的重传机制,但是如果不成功依然会放弃重传。

​ 通讯媒介可能会丢失或者改变被传递的信息。目前有两种主要的手段来尽量避免信息在传输过程中的出错:

  • 差错校验码: (基本上是添加一些荣誉的比特,使得即使某些比特被修改,真实的信息也能被恢复出来),使用差错校正码来纠正通讯问题是除了差错的一种非常重要的方法。

  • ARQ: (Automatic Repeat Request), 这种方法简称自动重复请求,它构成了很多协议的基础,其中便包括TCP协议。

12.1.1 ARQ和重传

​ 在讨论IP数据包时经常遇到的几个问题:分组重新排序、分组复制、分组丢失。一个直接处理分组丢失的方法是重新发送分组知道它被正确的接收。这需要一种方法来判断:

1) 接收方是否受到分组 ?

2) 接收方接收到的分组是否和发送方发的数据完全一样 ?

​ 接收到通过给发送方发送信号来确定自己已经收到一个分组,这种方法称为 确认(acknowledagment)或者ACK

最基本的形式应该是:

i. 发送方发送一个分组,然后等待一个ACK。

ii. 当接收到收到这个分组后,应该发送对应的ACK;

iii. 发送方接收到这个ACK, 他再发送另外一个分组报文。之后一直重复这样的流程

但是这里有引入另外的问题:

(1) 发送方对一个分组的ACK应该等待多长时间 ?

(2) 如果ACK报文丢失了怎么办 ?

(3) 如果分组被接收到,但是里面包含错误信息怎么办 ?

答案是:

(1) 第一个问题比较深奥。决定等待多长时间与发送发期待(expect)为一个ack等待的时间有关。后续讨论

(2) 第二个问题比较容易: 如果一个ACK丢失了,发送方不能轻易的将这种情况与原分组丢失的情况区分开,因此它简单的再次发送原分组即可。 这样的话,接收方可能会接收到多个重复的副本,因此接受方必须处理这种情况。

(3) 第三个问题:我们使用校验和的形式来检测分组中是否包含差错,如果包含差错,则不回复相应的ACK报文,这样发送方会重新发送该分组。

当目前为止,即使最简单的应用场景也会遇到一个问题:接收方可能会接收到多个重复的副本

解决这个问题需要使用序列号(sequence number)来处理。接收方通过报文分组中的序列号来判断当前的报文是否已经接收到。如果是,则将该分组丢弃。

​ 到目前为止介绍的协议虽然是可靠的,但是效率低,吞吐量小。因为每次发送一个分组都需要**“停止和等待”**。对于不会损坏和丢失太多分组的网络,低吞吐量的原因在于网络经常处于闲暇的状态-----如果我们允许多个分组同时进入网络,就可以使它“更繁忙”,从而提高网络吞吐量。

​ 很明显,允许多个分组同时进入网络中,会是事情变得更加复杂:

  • 发送方

(1)我们不仅要决定什么时间将分组注入网络,还要决定注入多少个分组;

(2)并且必须指出等待ACK时,怎样维持计时器;

(3)同时还需要保存每一个尚未确认分组的副本以防重传。

  • 接收方

(1)接收方需要更为复杂的ACK确认机制:可以区分哪些分组已经接收到,哪些分组尚未接收;

(2)此外接收方还需要更复杂的缓存机制:允许维护“次序杂乱”的分组

  • 其他

(1)接收方和发送方速率不匹配该怎么处理 ?,例如发送的快,接收速率慢。

12.1.2 分组窗口和滑动窗口

​ 为了解决所有这些问题,我们假设每一个分组有一个序列号开始。我们定义一个分组窗口(window)作为已被发送方发送但是尚未完成确认的分组集合,我们把这个窗口中的分组数量称为窗口大小(window size)。

​ 上图显示了当前三个分组的窗口,整个窗口大小为3。

1) 3号分组已经被发送并且收到对方的ACK确认报文,因此发送方保存的副本可以被释放。

2) 7号分组已经准备好,但尚未被发送。因为它尚未进入“窗口”中。

​ 现在我们想象数据从发送方流向接收方,ACK从相反的方向流动,发送方可能下一步接收到分组4的ACK报文。当这种情况发生时,窗口向右边滑动一个分组,分组4的副本可以被释放,而分组7可以被发送。窗口的这种滑动给这种类型的协议增加了一个名字:“滑动窗口”(sliding window)协议

​ 采用“滑动窗口”的方法可以对付目前为止表述过的许多问题。一般说来,这个窗口结构在发送方和接收方都会存在:

  • 发送方

    记录哪些分组可以被释放、哪些分组已经发送正等待确认、哪些分组不可以被发送。

  • 接收方

    记录哪些分组已经被接收确认、哪些分组是下一步期望的(包括已经分配多少内存来保存他们)、哪些分组即使被接受也会被丢弃。

尽管窗口结构便于记录在发送方和接收方之间流动的数据,但是关于窗口应该有多大,或者接收方处理不过来发送的数据时会发生什么,它都没有提供相应的方法

12.1.3 变量窗口:流量控制和拥塞控制


​ 如上图所示,三者的速率为q>m>n时,网络的瓶颈在于接收方。当接收方相对于发送方处理出具太慢时会出现问题。我们常用的方法是:强迫发送方慢下来,这被称为流量控制(flow control)。常见的流量控制有两种方式:

  • 基于速率(speed-based)

    他是给发送方指定某个速率,同时确保发送的数据永远不会超过这个速率。这种类型的流量控制比较适合应用程序,可用于组播或者广播的发现。

  • 基于窗口(window-based)

    它是基于滑动窗口的方式,在这种情况下,窗口大小是随着时间大小可变的。接收方用来通知发送方窗口大小的报文成为窗口通告(window advertisement)或者窗口更新(window update)。 逻辑上将虽然窗口更新和ACK报文是分离的,但是实际上窗口更新和ACK经常由同一个分组携带,意味着发送方往往会在它的窗口滑动到右边时同时调整它的窗口的大小


​ 如上图所示,三者的速率为m>n>q时,网络的瓶颈在于中间的网络设备。此时如果发送方和接收方采用超过中间网络设备能够处理的最大速率同样会造成数据的丢失。这种情况称为拥塞控制(congestion control)。拥塞控制主要指的是发送方的速率大于中间某一路由器设备的速率时,我们需要采取措施,不至于压垮其与接收方之间的网络。

12.1.4 变量窗口:设置重传超时

​ 这个值不确定,是一个基于大量的数据统计结果。

整理自《TCPIP详解 卷1》

TCP超时重传、序列号、滑动窗口简介的更多相关文章

  1. TCP超时重传、滑动窗口、拥塞控制、快重传和快恢复

    TCP超时重传 原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 影响超时重传机制协议效率的一个关键参数是重传超时时 ...

  2. 【编程之美】超时重传,滑动窗口,可靠性传输原理C语言实现

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/128003 ...

  3. tcp的精髓:滑动窗口

    TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议 关于这部分自己不晓得怎么叙述才好,因为理解的部分更多, ...

  4. TCP面试题之滑动窗口原理

    TCP 滑动窗口 作用: 1. 提供TCP可靠性:对发送的数据进行确认 2. 流量控制:窗口大小随链路变化 一.TCP窗口机制 TCP中窗口大小是指tcp协议一次传输多少个数据.因为TCP是一个面向连 ...

  5. 【原创】TCP超时重传机制探索

    TCP超时重传机制探索 作者:tll (360电商技术) 1)通信模型 TCP(Transmission Control Protocol)是一种可靠传输协议.在传输过程中当发送方(sender)向接 ...

  6. TCP超时重传时间的选择

    一---导读 TCP超时重传时间的选择是计算机网络中较复杂的问题之一,但幸好前辈们都把路铺好了,我们只需要学习并且遵循这些规则,有能力的话去进一步改正. 二---必知的一些专业术语 A--RTT( r ...

  7. 【图解】你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了

    每日一句英语学习,每天进步一点点: 前言 前一篇「硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题」得到了很多读者的认可,在此特别感谢你们的认可,大家都暖暖的. 来了,今 ...

  8. 面试之路(29)-TCP流量控制和拥塞控制-滑动窗口协议详解

    拥塞: 拥塞发生的主要原因在于网络能够提供的资源不足以满足用户的需求,这些资源包括缓存空间.链路带宽容量和中间节点的处理能力.由于互联网的设计机制导致其缺乏"接纳控制"能力,因此在 ...

  9. TCP状态转换图、滑动窗口、半连接状态、2MSL

    一.TCP状态转换图 下图对排除和定位网络或系统故障时大有帮助,也帮助我们更好的编写Linux程序,对嵌入式开发也有指导意义.    先回顾一下TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 ...

随机推荐

  1. Synology群晖100TB万兆文件云服务器NAS存储池类别 RAID 6 (有数据保护)2021年7月29日 - Copy

    Synology群晖100TB万兆文件云服务器NAS存储池类别 RAID 6 (有数据保护)2021年7月29日 - Copy https://www.autoahk.com/archives/367 ...

  2. vue 快速入门 系列 —— vue-cli 上

    其他章节请看: vue 快速入门 系列 Vue CLI 4.x 上 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...

  3. IDE快捷键的使用

    ctrl+ait+l,整理代码 ctrl+atl+v,生成等号左边的类型和变量 shift+方向键,选择内容 ctrl+方向键,自己领悟.常常与shift同时使用 ctrl+alt+方向键,光标前进或 ...

  4. windows10右键我的电脑,点击管理,提示该文件没有与之关联的应用来执行该操作,请安装应用,若已经安装应用,请在默认应用设置页面中创建关联……

    方法一 1.按WIN+R 调出运行对话框,然后输入bai gpedit.msc 回车:2.展开"计du算机配置"zhi-"Windows设置"-"安全 ...

  5. WebAPI中controller添加[AllowAnonymous]无效的解决方法

    对于Methods添加[AllowAnonymous]可以进行匿名访问,但是对于Controller添加时无效 public class AuthAttribute : AuthorizationFi ...

  6. ArcGIS图层添加字段出现:“定义了过多字段”

    首先,我图层数据格式为mdb,也就是Access数据库 Access一个表最大支持255个字段,可是我的才添加第一个字段就出现"定义了过多字段"的错误 打开ArcMap添加字段也是 ...

  7. list切片

    对list进行切片 取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] 取前3个元素 ...

  8. 默认标签的解析过程(三)parseDefaultElement

    private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { if (delegate. ...

  9. OJ 注意事项

    1,检查指针是否有效,即是否为NULL 1 void OutputMaxAndMin(int * pInputInteger, int InputNum, int * pMaxValue, int * ...

  10. 使用HttpURLConnection多线程下载

    1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.RandomAccessFile; 4 imp ...