TCP的十个核心机制(一)

简介: TCP的十个核心机制

前言


TCP协议是传输层的重点协议, 负责将数据从发送端传输到接收端.

TCP协议是传输控制协议, 顾名思义也就是对数据的传输进行控制的协议.

TCP 协议有很多, 我们今天就介绍其最重要的十个核心机制, 即 :


  1. 确认应答
  2. 超时重传
  3. 连接管理
  4. 滑动窗口
  5. 流量控制
  6. 拥塞控制
  7. 延迟应答
  8. 捎带应答
  9. 面向字节流
  10. 异常处理


一 到 三


确认应答及超时重传(保证TCP的可靠性)

连接管理(三次握手及四次挥手)

下面就详细讲解其它七点特性.


四. 滑动窗口


相比于 UDP 来说 TCP 的效率是很低的, 使用 TCP 最重要的还是为了保证可靠性, 在可靠性的基础上再来尽可能高的提高效率, 当然再怎么提高都不如 UDP, 这只是尽可能的止损. (提高可靠性, 往往要损失效率, 所谓鱼和熊掌不可兼得)


什么是滑动窗口呢 ? 滑动窗口又是如何提高效率的呢 ?

首先, 我们回到两台主机间的数据传输, 我们知道 TCP 因为要保证数据的可靠性, 因此在数据接收方在接收到数据后, 就会发送一个 ack 报文, 来告知发送方已接收到数据请发下一条数据, 具体场景如下:


bd6e0e70cd88477f8b2d601ac4a97125.png

观察上图, 我们发现这些数据都是一条一条发送, 发送完了一条还得对方回应再发送, 我们是不是可以对其进行优化, 使得等待时间变短. 滑动窗口就是通过减少等待时间, 来增大传输效率的.

具体场景如下:


5bbf2e60909b491ca2c41ef45a9f14da.png

可以看到, 滑动窗口是通过批量发送数据来达到减少等待时间的目的.

这里是批量发送四个数据, 再统一等待 ack, 每次收到一个 ack 就发下一条, 用一份等待时间等待多个ack, 这样总的等待时间变短了, 总体效率也就提高了.


批量传输为啥要叫滑动窗口呢 ?

批量传输不是无限传输, 它是发送一定的数据然后等待 ack, 每等到一个 ack 就立即再传输一个数据, 这样总的等待数量就不变, 我们把批量等待数据的大小就叫做窗口大小, 场景如下:

2de1c57d8bcc4b2cacfc1be5af6d9552.png


电脑的传输处理数据能力是非常快的, 因此这个窗口就像一直处在滑动状态.


那如果在批量传输过程中出现丢包情况怎么办 ?

这里我们可以分两种情况, 一种是数据报抵达但 ack 丢了, 另一种是数据报丢了.


情况一 : ack丢了.


a3489f3ae97c48319804b1370dca0e28.png

图中的 ack 丢了一半多了, 丢包率相当高了, 这种情况有啥影响吗 ?


其实即是丢了这么多 ack, 对可靠性也没任何影响.

我们知道返回的 ack 中有确认序号, 确认序号的含义就是该序号之前的数据已经收到了.


注意 : 后一个 ack 能够涵盖前一个 ack 的意思, 举个例子 :

我们看图中返回的确认序号 1001 丢了, 但 2001 到了, 这个时候接收方收到 2001 之前的数据, 发送方即使没收到 1001, 根据 2001 也知道前面的数据都收到了, 接着就是发下面的数据了.


那如果最后一条数据丢了呢 ?

很简单, 超时重传.(发送方不知道是ack丢了还是数据包丢了)


情况二 : 数据包直接丢了

138eb528a95d4f0b92294cd246d66bce.png


上图中 1001-2000 的数据包丢了, 接收方接收到的数据, 是按照序号在缓冲区进行排列的, 如下 :

b7234888bd9542b8b1cb2a47a1471900.png

B接收到 2001-3000, 3001-4000, 4001-5000 时就会发现少了 1001-2000 的数据, 这个时候返回的确认序号就是 1001, 即向A索要 1001 开始的数据, 如果A一直不发送, 那 B 会一直索要, 当 B 发送了三个重复确认序号时, A 就会发现事情不简单, 就会重新发送 1001-2000 的数据, 当 B 接收到后, 就不是发送 2001 的确认序号了, 而是索要接下来未发送的数据, 也就是 5001.

e548e1717dca496883bf29063de95566.png


注意 : 上述重传过程没有任何冗余操作, 丢了的数据才会进行重传, 整体速度比较快, 又叫快速重传.


滑动窗口及快速重传是在批量传输大量数据时才会采用的措施, 当数据量少, 且比较低频时, 就不会这样搞了, 此时依靠确认应答及超时重传.


五. 流量控制


为啥要流量控制呢 ?


上面讲了滑动窗口, 批量发送, 窗口越大, 批量发送的数据就越多, 传输的效率也就越大了.

但滑动窗口大小可不是无限大的, 得保证可靠传输, 如果一次性发的数据包太多了, 瞬间就会将接收方的数据接收缓冲区给冲满, 接下来继续发送就会丢失数据包, 得不偿失.

通过流量控制, 本质上就是让接收方来限制发送方的发送速度.


它是如何控制的呢 ?

其实在 TCP 报文中, 携带了 “窗口大小” 这样的字段, 如下 :

271ccc96e7c647e8a40324707f29c456.png


当 ack 为 1 时, 此时窗口大小字段就会生效, 这里的值只是建议发送方发送的窗口大小.


那接收方是如何计算窗口大小的呢?

接收方直接拿缓冲区剩余空间作为窗口大小.

1353a78b1c5741b88651b1851685ef1a.png


① : 当 B 收到数据时, 根据缓冲区大小计算窗口大小, 并写入 ack 中.

② : A 收到窗口大小后, 批量发送适量的数据.

③ : B 每次收到数据时, 都会计算一次窗口大小, 并写入 ack 中.

④ : A 收到窗口大小为 0 的 ack 后, 就不再发送剩下的数据包了, 而是每隔一段时间发一个窗口探测报文, 如果探测到了窗口大小不为零, 则说明有空间了, 可以继续发送.

⑤ : B 腾出空间了, 将窗口大小写入 ack 中, 并索要接下来的数据.


应用程序从 socket 读数据, 就是在消费缓冲区里的数据, 读完就腾出空间了.


注意 : 上述过程是将返回的窗口大小作为实际窗口大小, 实践中可能会有出入.

窗口大小 = 流量控制 + 拥塞控制


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
网络协议 算法 网络性能优化
第十一问:TCP的窗口机制是什么?
TCP的窗口机制是实现流量控制和拥塞控制的重要手段,主要包括滑动窗口、接收窗口(rwnd)和拥塞窗口(cwnd)。滑动窗口定义了发送方允许发送的数据范围,接收窗口控制接收方的缓冲区容量,拥塞窗口防止网络拥塞。这些窗口通过动态调整,确保数据传输的高效性和可靠性。
49 1
|
4月前
|
域名解析 网络协议 物联网
深度解析:UDP协议及其工作机制与优点
【8月更文挑战第20天】
171 0
|
7月前
|
存储 网络协议 Java
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
192 1
|
7月前
|
网络协议 Linux
Linux网络编程(TCP状态转换关系)
Linux网络编程(TCP状态转换关系)
63 0
|
网络协议 大数据 程序员
TCP的十个核心机制(二)
TCP的十个核心机制
91 0
|
网络协议 Java
(服务器&客户端)网络通信是怎么实现的?7000字爆肝----原来java网络编程技术功不可没(多线程,URL,InetAddressm,TCP,UDP)集结
(服务器&客户端)网络通信是怎么实现的?7000字爆肝----原来java网络编程技术功不可没(多线程,URL,InetAddressm,TCP,UDP)集结
183 1
|
网络协议
TCP 通信并发服务器详解(附有案例代码)
TCP 通信并发服务器详解(附有案例代码)
|
消息中间件 缓存 网络协议
计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
146 0
|
网络协议 安全
TCP协议中的几个核心特性(上)
TCP协议中的几个核心特性(上)
107 0
|
网络协议 网络性能优化
TCP协议中的几个核心特性(下)
TCP协议中的几个核心特性(下)
128 0