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 读数据, 就是在消费缓冲区里的数据, 读完就腾出空间了.


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

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


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
存储 网络协议 Java
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
70 1
|
7天前
|
网络协议 Linux
Linux网络编程(TCP状态转换关系)
Linux网络编程(TCP状态转换关系)
25 0
|
7月前
|
网络协议 网络性能优化 数据库
华为18级工程师用200张图带你一次性搞懂HTTP/TCP/IP网络协议
互联网世界中,网络协议的重要性不言而喻。很多人都知道,网络协议中的五层模型或者七层模型,这些在操作系统中,那都是“必考题”。上学的时候,无论是死记硬背,还是各种小抄,总得把下面这个图记下来。踏入工作,走进 web 开发“不归路”,发现还是不能落下它。 计算机网络相关的知识点是在面试过程中开发者经常被问到。当然可能这一块知识点与前面的操作系统、数据库相比较比重可能没那么高。但是优秀的你,一定是想做好充分的准备吧!
|
9月前
|
网络协议 大数据 程序员
TCP的十个核心机制(二)
TCP的十个核心机制
53 0
|
10月前
|
运维 网络协议 应用服务中间件
C/S UDP通信实践踩坑记录与对于ICMP的进一步认识
C/S UDP通信实践踩坑记录与对于ICMP的进一步认识
|
11月前
|
网络协议
TCP 通信并发服务器详解(附有案例代码)
TCP 通信并发服务器详解(附有案例代码)
|
11月前
|
网络协议
TCP 通信流程详解(附有案例代码)
TCP 通信流程详解(附有案例代码)
|
12月前
|
消息中间件 缓存 网络协议
计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
89 0
|
网络协议 安全
TCP协议中的几个核心特性(上)
TCP协议中的几个核心特性(上)
|
网络协议 网络性能优化
TCP协议中的几个核心特性(下)
TCP协议中的几个核心特性(下)