停止等待协议

“停止等待”就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送。

超时重传

发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有送达,从而重新发送分组。

TCP通过以下的方式实现超时重传:

  • 超时计时器:每发送完一个分组后,tcp都会设置一个超时计时器。超时计时器的超时时间往往要大于报文的平均往返时间。
  • 分组副本:发送分组后,tcp会保留分组的副本,只有收到分组的确认后才会清除
  • 分组编号:TCP会对每一个分组编号,确认分组和发送的分组编号对应。

连续ARQ协议

如果TCP每发送一个分组就要等待的话,势必会浪费大量的时间,使得网络利用率降低。所以TCP采用了连续ARQ的方式,也就是每次发送多个分组,然后使用累积确认的方式确认。

  • 累积确认:接收方只对按序到达的最后一个分组发送确认。

假如发送方一次性发送了[1,2,3,4,5]五个分组,接收方只接受到了[1,2,4,5]四个分组。按照按序最后一个的规则,接收方只会发送 2 号分组的确认。发送方将收不到后面三个分组的确认,所以会重传3,4,5。

累积确认使用了滑动窗口实现,它的优点是不需要对每个分组发送确认,从而减少了网络开销。缺点是不能向发送方真实反映收到分组的信息,比如上面例子里,发送方认为 3 号分组以后的都没有收到,但是接收方其实是收到了4,5号分组的。

以字节为单位的滑动窗口

发送方和接收方分别维护 发送窗口接收窗口 两个滑动窗口。

发送窗口维护了三个指针p1、p2、p3,它们划分了发送窗口的区域:

  • [p1, p2):等待确认区域,记录已发送但没收到确认的分组。
  • [p2, p3] :可用窗口,允许发送但是还未发送的分组。

既然是滑动窗口,那么它的左右边界应该是能够移动的,下面来分析发送窗口的左右边界的移动。

p2前移

p2指针指向的是第一个允许发送但还未发送的分组,所以p2的前移是发送方发送了新的分组。

p1前移

p1指针只有在收到确认后才会移动到被确认分组的下一个分组。

因为采用的累积确认的方式,接收方只会发送按序到达最后一个分组的确认,所以p1的前移可能不止一个分组。

比如向上图的情况,假如接收方收到了31,32,33三个分组,它只会发送按序到达最后分组的确认,也就是33号分组的确认。此时发送方的p1指针将会直接从31号位置移动到34号位置,也就是收到确认分组的下一个。

p3前移

p3的前移是收到接收方发送的确认报文窗口字段控制的。

窗口值表示从确认分组号开始到p3的分组数量。比如确认分组号为101,窗口值为200,那么p3就会移动到301的位置。

接收方通过窗口值来控制发送窗口的大小也叫做流量控制,这里不过多介绍。

TCP缓存

TCP既然能够保留未确认的分组以及按序发送确认,它肯定需要一个内存空间作为缓存,而不是直接用应用进程的内存。

如图所示,接收方和发送方各自维护了一个缓存,发送窗口和接收窗口都在这个缓存中。首先TCP缓存有以下特点:

  • 因为缓存空间和序号有限,TCP缓存是循环使用的,是一个环形的结构。
  • 滑动窗口只是缓存的一部分,已经确认的数据会被删除。

发送缓存和接收缓存结构相同但是作用不同。

发送缓存

  • 缓存应用程序让TCP发送的数据
  • 暂存已经发送但未收到确认的数据

接收缓存

  • 暂存未按序到达的数据
  • 缓存按序到达但没有被应用程序读取的数据

总结

  1. TCP可靠传输的原理是超时重传和连续ARQ
  2. 超时重传时间大于分组平均往返时间
  3. 连续ARQ采用了累积确认的方式发送确认
  4. TCP通过发送窗口和接收窗口实现可靠传输
  5. 发送窗口大小受到接收方的窗口值控制
  6. 滑动窗口是TCP缓存的一部分,TCP缓存是一个环形结构,还负责缓存应用程序数据

TCP可靠传输原理的更多相关文章

  1. 网络学习笔记(二):TCP可靠传输原理

      TCP数据段作为IP数据报的数据部分来传输的,IP层提供尽最大努力服务,却不保证数据可靠传输.TCP想要提供可靠传输,需要采取一定的措施来让不可靠的传输信道提供可靠传输服务.比如:出现差错时,让发 ...

  2. TCP可靠传输的工作原理

    TCP可靠传输的工作原理 一.停止等待协议 1.1.简介 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数据在分组传输的平均往返时间更 ...

  3. TCP可靠传输及流量控制实现原理

    一.为什么TCP是可靠传输? 1. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...

  4. TCP/IP详解学习笔记(14)-- TCP可靠传输的实现

    1.概述      为方便描述可靠传输原理,假定数据传输只在一个方向上进行,即A发送数据,B给出确认 2.以字节为单位的滑动窗口      TCP的滑动窗口是以字节为单位的.为了便于说明,字节编号取得 ...

  5. TCP可靠传输的实现

    TCP可靠传输的实现 1.概述      为方便描述可靠传输原理,假定数据传输只在一个方向上进行,即A发送数据,B给出确认 2.以字节为单位的滑动窗口      TCP的滑动窗口是以字节为单位的.为了 ...

  6. 计算机网络概述 传输层 TCP可靠传输的实现

    TCP可靠传输的实现 TCP的可靠性表现在:它向应用层提供的数据是 无差错的.有序的.无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的. TCP采用了流量控制.拥塞控 ...

  7. 运输层6——TCP可靠传输的实现

    目录 1. 以字节为单位的滑动窗口 2. 超时重传时间的选择 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3- ...

  8. TCP 可靠传输与流量控制的实现

    TCP 可靠传输与流量控制的实现 一.TCP可靠传输的实现 现在所讲的可靠传输是根据之前所说的可靠传输原理的实现,是现实中应用的技术. 1.1.以字节为单位的滑动窗口 如图A端一份文件分为了多个字节, ...

  9. TCP可靠传输

    1. TCP 可靠性如何保证? 信道可靠:用三次握手.四次挥手保证连接正确: 数据正确:分区编号.校验和.超时重传: 传输控制:流量控制.拥塞控制 2. 重传机制 TCP可靠传输方式是序列号与确认应答 ...

随机推荐

  1. 大数据学习(10)—— Hive进阶

    前面提到了Hive的知识点非常零散,我不知道该怎么把这些知识点分类,跟SQL关系没那么大的就放在这一篇吧. Hive Serde 参考Hive Serde Serde是啥 Serde是序列化和反序列化 ...

  2. 记录一次现网MySQL内存增长超限问题定位过程

    问题现象现网物理机内存近几日内爆涨使用率超过了90%,可用内存从250G,降低到20G以下,报告警.服务器使用情况来看,并没有什么异常.除了QPS缓慢增长外. MySQL内存分配结构 定位这个问题,先 ...

  3. 解决 OnDropFiles 可能无响应的问题【转】

    大多数程序都有接收拖放文件的功能,即是用鼠标把文件拖放到程序窗口上方,符合格式的文件就会自动被程序打开.最近自己对编写的程序增加了一个拖放文件的功能,在 Windows XP.Windows Serv ...

  4. [JAVA]关于excel的jxl包的操作-创建sheet

    前言 最近玩的游戏需要记录数据, 手打excel太麻烦了 于是就学了学java的jxl操作.本来记录在有道云笔记就可以的,由于乐于分享的精神 就在博客园造了个号, 之前自己本来有做个人的网站的,奈何网 ...

  5. MobSF移动安全扫描平台本地化部署与简单汉化

    在之前的文章MobSF移动安全扫描平台环境搭建与试用中,我们用docker进行了搭建,那么我们如何在本地直接搭建呢,其实也是很简单的. 本地化部署 我们在本地安装 其实是很简单的,里面有两个文件,在不 ...

  6. GitHub不再支持密码验证解决方案:SSH免密与Token登录配置

    今天提交代码,push到GitHub上,突然出现这个问题. remote: Support for password authentication was removed on August 13, ...

  7. 跟我一起写 Makefile(八)

    六.多行变量   还有一种设置变量值的方法是使用define关键字.使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令(前面我们讲过"命令包"的技术就是利用这个 ...

  8. Python断言及常用断言函数总结

    Python断言 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 As ...

  9. DVWA(六):XSS-Reflected 反射型XSS全等级详解

    XSS 概念: 由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. XSS类型: Reflected(反射型):只是简单的 ...

  10. flutter中修改键盘状态

    当用户进行表格输入时,为更方便的方便用户操作,我们需要设置键盘状态方便用户点击,如当表格填写完成时,用户可以直接点击键盘下面的"完成"状态完成提交. 实现如下: TextFormF ...