网络协议系列之六:TCP流量控制

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介:

TCP的流量控制就是TCP接收端对发送端发送多少字节的数据进行控制,防止接收端处理不及而丢失数据。差错控制就是保证接收端接收的数据是完整未受损伤的,是可靠性的重要保证。

这里以TCP连接的建立过程说明流量控制,则流量控制的过程如下:

  1. TCP发送端向接收端发送一个SYN=1、seqNo=100的连接请求。这里的SYN=1表示一个建立连接的标志位,seqNo表示发送端发送数据的起始字节的编号是100
  2. 接收端收到SYN=1、seqNo=100的报文后,给客户端发送ACK=1、seqNo=1000、ackNo=101、rwnd=800的响应报文,告诉发送端,我如果向你发送数据则我这边的数据的字节起始编号是1000,而且你刚才发送的连接请求我已经收到了,我下一个希望接收编号是101的字节,还告诉发送端发送窗口是800,并且接收端的接收窗口也是800字节
  3. 发送端收到后,发送端的连接就建立了,于是给接收端发送ackNo=1001、ACK=1的报文,接收端收到后知道发送端已经收到刚才自己发的报文,所以接收端的连接也建立了。
  4. 当两边的连接建立后就可以发送数据了,首先发送端发送seqNo=101,Data=200bytes的数据。
  5. 接收端收到这200字节的数据后,接收窗口由800变为600(因为窗口缓存是800字节),并向发送端发送ACK=1、seqNo=301、rwnd=600的报文,告诉发送端你发送的200字节我已经收到了,下次发送的字节的起始编号是301,你的发送窗口要变为600了
  6. 发送端收到后,知道刚才发送的200字节一杯确认了,于是把发送窗口向右移动200字节,这样发送窗口就变为600字节了。之后,发送继续向接收端发送数据,发送seqNo=301,Data=300bytes的报文,向接收端发送起始编号为301且长度是300的数据
  7. 接收端收到后,把窗口减小为300字节,这时接收进程从接受缓存中拉取了100字节的数据,于是接收窗口的大小重新变为400字节,于是向发送端发送ACK=1、ackNo=601、rwnd=400的报文,告诉发送端你刚才发送的300字节数据我已经收到了,我下次希望接收的字节起始编号是601,你要把发送窗口继续减小为400字节
  8. 发送端收到后,知道刚才发送的300字节被确认了,于是把发送窗口向右移动,并不得不继续较小发送窗口为400字节
  9. 一会后,接收进程从接收缓存中拉取了200字节的数据,接收窗口变为600字节,于是接收端向发送端发送ACK=1、ackNo=601、rwnd=600的报文,告诉发送端窗口可以增大为600字节了
  10. 后面的过程与此类似,以此类推

从这个过程中,可以发现,发送窗口的大小是受到接收窗口的控制的。发送窗口必须根据接收端的大小及时调整发送窗口的大小,这个机制保证了每次TCP传输的数据量都是接收端可以及时处理的。不过这个过程中可能存在一个特例,就是当发送端每次只发送一个字节的数据的时候后者接收端处理数据的速度每一次只有一个1字节或者两者都有的时候,每次发送的报文段都很短,就会导致低效率,以发送端每次发送1字节为例,数据1字节、TCP首部20字节、IP首部20字节,这样为了发送1字节需要使用41字节发送浪费率达到40/41,加上数据链路层以及物理层的开销,可能这个数值还更大。这个问题有一个术语叫糊涂窗口综合征。有兴趣可以自己了解一下

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6天前
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
31 10
|
26天前
|
域名解析 缓存 网络协议
TCP传输层详解(计算机网络复习)
本文详细解释了TCP/IP协议族的分层模型、各层的功能、TCP报文的格式以及TCP连接建立的三次握手和断开的四次挥手过程。
68 2
TCP传输层详解(计算机网络复习)
|
24天前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
51 2
|
24天前
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
55 1
|
1月前
|
域名解析 存储 网络协议
TCP套接字【网络】
TCP套接字【网络】
29 10
|
22天前
|
移动开发 网络协议 测试技术
Mininet多数据中心网络拓扑流量带宽实验
Mininet多数据中心网络拓扑流量带宽实验
39 0
|
25天前
|
XML 网络协议 算法
【TCP】网络原理
【TCP】网络原理
26 0
|
2月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
2月前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
2月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。