TCP 实现可靠通信的两种方式

我们都知道 IP 协议是“不太靠谱”。因为 IP 协议是不可靠的,所以 IP 数据包可能在传输过程中发生错误或者丢失。这就意味着,TCP 协议不得不面对以下三个问题。1)每个数据包有可能发送不成功 2)数据包在传输过程中有可能被丢弃 3)接收端有可能接受不到数据包

TCP 为了解决这丢包问题,提出两个补救措施。

1.ACK 回复

在每收到一个正确的、符合次序的片段之后,就向发送方(也就是连接的另一段)发送一个特殊的 TCP 片段,用来知会(ACK,acknowledge)发送方:我已经收到那个片段了。这个特殊的 TCP片段 叫做 ACK 回复。如果一个片段序号为 L,对应ACK 回复有回复号 L+1,也就是接收方期待接收的下一个发送片段的序号。

2.重新发送机制

如果发送方在一定时间等待之后,还是没有收到 ACK 回复,那么它推断之前发送的片段一定发生了异常。发送方会重复发送那个出现异常的片段,等待 ACK 回复,如果还没有收到,那么再重复发送原片段… 直到收到该片段对应的 ACK 回复(回复号为 L+1 的 ACK)。

TCP 的滑动窗口

虽然采用 “ACK 回复” + “重新发送机制” 方式能实现不丢包,但是会存在两个问题。

1.效率低的问题。 stop-and-wait。stop-and-wait 虽然实现了 TCP 通信的可靠性,但同时牺牲了网络通信的效率。同时,在等待ACK的时间段内,我们的网络都处于闲置(idle)状态

2.有点小缺陷

TCP 为了进一步优化解决这两个问题,提出滑动窗口(sliding window)的概念。滑动窗口被同时应用于接收方和发送方, 发送方和接收方各有一个滑窗。当片段位于滑窗中时,表示 TCP 正在处理该片段。此外,如果滑窗中可以有多个片段,也就是可以同时处理多个片段。

我们借助一些图片来进一步了解下滑动窗口内部机制。

黄色框框表示可以容纳三个片段的固定大小的滑窗。在图中,并假设片段从左向右排列。实际运用中,滑动窗口是可变的,窗口大小是字节(byte)来计算的。

对于发送方来说,滑窗的左侧为已发送并已 ACK 过的片段序列,滑窗右侧是尚未发送的片段序列。如果滑动窗口第一个片段一直没有收到 ACK 回复,窗口不会向右滑动。但是发送方还是可以继续发送后面两个片段数据包。

对于接受方来说,滑窗的左侧是已经正确收到并 ACK 回复过的片段,也就是正确接收到的文本流。滑窗中的片段是期望接收的片段。如果滑窗中第一个片段先收到, 滑窗会向右移动。如果滑窗中后面两个片段先收到,但是第一个片段没有收到。窗口不会向右滑动。

发送端已经发送三个数据包(1、2、3),在等待每个数据包的 ACK 回复

接收端成功收到两个数据包,回复两个 ACK。还有一个数据包没有收到。当收到 数据包 1 时,接收端会回复一个 ACK 1,然后将窗口向有滑动一个位置。

发送端成功接收到 ACK 1 回复

发送端的窗口向右滑动一个位置

在没有收到 ACK 2 和 3 的回复,还能继续发送数据包 4

之前数据包 4 已经发送了。在之后成功收到 ACK 2 和 3 的回复,窗口向右滑动两个位置,现在又能继续发送数据包 5,6
通过上面一系列图片,我们可以大致知道滑动窗口的机制。我们来做下小总结:

对于发送端

如果滑动窗口第一个片段一直没有收到 ACK 回复,窗口不会向右滑动。但是发送方还是可以继续发送后面两个片段数据包。

对于接受端

如果滑窗中第一个片段先收到,滑窗会向右移动。如果滑窗中后面两个片段先收到,但是第一个片段没有收到。窗口不会向右滑动

那么实际应用中确实是这样吗?如果接收方每接受一个片段,就回复一个 ACK。这种效率有点低。所以实际应用中, TCP 协议为了减少了 ACK 回复所消耗的流量,采用的是累计 ACK 回复。 接收方往往利用一个 ACK 回复来知会连续多个片段的成功接收。通过累计 ACK,所需要的 ACK 回复通常可以降到 50%。

我们同样通过图片的形式来了解累计 ACK 回复的原理。

在图中,橙色为已经接收的片段。方框为滑窗,滑窗可容纳3个片段。

情况1:滑窗还没接收到片段 7 时,已接收到片段 8,9。这样就在滑窗中制造了一个“空穴”(hole)。

情况2:当滑窗最终接收到片段7时,滑窗送出一个回复号为 10 的 ACK 回复。发送方收到该回复,会意识到,片段 10 之前的片段已经按照次序被成功接收。整个过程中节约了片段 7 和片段 8 所需的两个 ACK 回复。

为什么说TCP协议是可靠的?的更多相关文章

  1. TCP协议学习

    一.TCP参考模型  VS OSI参考模型 二.TCP/IP分层模型的四个协议层分别完成以下的功能 第一层 网络接口层 网络接口层包括用于协作IP数据在已有网络介质上传输的协议.实际上TCP/IP标准 ...

  2. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

  3. TCP协议三次握手和四次挥手

    http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...

  4. TCP协议三次握手过程分析【图解,简单清晰】

    转自:http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是 ...

  5. 关于TCP协议握手的那些事儿

    旁白 今天面了下鹅场的后台技术开发,面试官问了我关于TCP连接协议的3次握手和断开连接协议的4次握手的问题.因为之前看过TCP的连接和断开处理,但是印象没有那么深刻.我想主要原因是一直重复简单的记忆, ...

  6. 通信协议之HTTP,UDP,TCP协议

    1.UDP,TCP,HTTP之间的关系 tcp/ip是个协议组,它可以分为4个层次,即网路接口层,网络层,传输层,以及应用层, 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协 ...

  7. TCP协议的一些问题

    1 连接握手三次 解释1:已失效的连接请求报文段 情况下如下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server.本 ...

  8. 网络编程——TCP协议的三次握手和四次挥手

    三次握手原理解析 TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND ...

  9. TCP协议握手与分手

    TCP(Transmission Control Protocol) 传输控制协议 TCP的7次握手可以理解为3次握手和4次分手. TCP状态转换图,如下: 这个图N多人都知道,它对排除和定位网络或系 ...

随机推荐

  1. 在命令行运行 python 抛出 ModuleNotFoundError 的解决方法

    所要运行的 py 文件在子目录中,并且该文件引用了另一个子目录中的 py 模块.类似这样: 原因 在运行环境下, a.py 找不到 b.py 所以抛出 ModuleNotFoundError. 解决 ...

  2. git commit 后,没有push ,怎么撤销

    如果是撤销到commit 之前,本地修改也放弃,可以 使用git  reset --hard , 但是想保留本地修改,也想撤销commit 可以使用 git reset  --mixed  HEAD^ ...

  3. WPF之转换器

    IValueConverter的用法1. COnvert方法object Convert( object value, Type targetType, object parameter, Cultu ...

  4. Java程序员必备的工具和框架

    最近几年,Java 的技术栈发展的非常快,成百上千的技术工具正不断地涌出来,这也造成了一个问题: 我们作为开发者,到底应该选哪些工具搭建出最合适的技术栈呢? 今天我就推荐一波我常用的.我了解的工具和框 ...

  5. 记录一次SQL函数和优化的问题

    一.前言 上次在年前快要放假的时候记录的一篇安装SSL证书的内容,因为当时公司开始居家办公了,我也打算回个家 毕竟自己在苏州这半年一个人也是很想家的,所以就打算年过完来重新写博客.不巧的是,当时我2月 ...

  6. Blazor 002 : 一种开历史倒车的UI描述语言 -- Razor

    Razor是一门相当怪异丑陋的标记语言,但在实际使用中却十分高效灵活.本文主要介绍了Razor是什么,以及Razor引擎的一些浅薄的背后机理. 写文章前我本想一口气把Razor的基本语法,以及Blaz ...

  7. Java Study two

    由于前段时间再做.NET 项目没做更新,今天简单的学习java项目的新建和入门的学习 今日目标 基础语法了解 新建第一个java项目 新建第一个项目Class ->HelloWorld 运行并输 ...

  8. elasticsearch 了解多少,说说你们公司 es 的集群架构,索 引数据大小,分片有多少,以及一些调优手段 ?

    面试官:想了解应聘者之前公司接触的 ES 使用场景.规模,有没有做过比较大 规模的索引设计.规划.调优. 解答: 如实结合自己的实践场景回答即可. 比如:ES 集群架构 13 个节点,索引根据通道不同 ...

  9. Springmvc入门基础(三) ---与mybatis框架整合

    1.创建数据库springmvc及表items,且插入一些数据 DROP TABLE IF EXISTS `items`; CREATE TABLE `items` ( `id` int(11) NO ...

  10. 什么是 Idempotence 以及它在哪里使用?

    幂等性是能够以这样的方式做两次事情的特性,即最终结果将保持不变,即好像 它只做了一次. 用法:在远程服务或数据源中使用 Idempotence,这样当它多次接收指令时,它 只处理指令一次.