TCP/IP 网络传输(二)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: TCP/IP 网络传输(二)
发送窗口

由于无法确认接收方是否能及时接收数据包,TCP 传输中不适合每发一个数据包就停下来等待确认,因为这样传输效率太低。最好的方式是一次性将所有数据包发送出去,然后一起等待确认。但是,实际情况存在一些限制:

  • 接收方的缓存(接收窗口)可能无法一次性接收所有数据;
  • 网络的带宽也不一定足够大,一次性发送过多的数据包可能导致数据丢失。

因此,在 TCP 传输中,发送窗口通过限制发送数据包的数量来平衡传输效率和数据可靠性。发送窗口的大小计算公式为 wnd = min(rwnd, cwnd * mss),其中 rwnd 表示接收方告知的接收窗口大小,cwnd 表示发送方的拥塞窗口大小。在此限制范围内,尽可能多地发送数据包,一次可以发送的数据量即为 TCP 发送窗口。

发送窗口大小对传输性能的影响非常大。下图显示了发送窗口大小为 1 个 MSS(即每个 TCP 包所能携带的最大数据量)和 2 个 MSS 时的差别。在相同的往返时间内,发送窗口大小为 2 个 MSS 时,传输的数据量是发送窗口大小为 1 个 MSS 的两倍。

在实际应用中,发送窗口通常可以达到数十个 MSS 的大小,因此发送窗口的大小会对 TCP 传输的效率和可靠性产生巨大影响。

发送窗口 VS MSS

发送窗口决定了一口气能发多少字节,而 MSS 决定了这些字节要分多少个包发完。例如:

发送窗口为 16000 字节,MSS 为 1000 字节时,需要发送 16000/1000=16 个包;而如果 MSS 等于 8000,那要发送的包数就是 16000/8000=2。

接收窗口

在 TCP 协议中,接收窗口是一项非常重要的参数,它决定了发送方在一个确定时间内可以发送多少数据。

在 TCP 协议初期,网络带宽非常有限,因此 TCP 的最大接收窗口被定义为 65535 字节。但随着网络带宽的提高,这个值已经无法满足现代网络传输的需求了。

  • 如果抓包时没有抓到三次握手,Wireshark 就不知道该如何计算,所以有时候会很莫名地看到一些极小的接收窗口值。
  • 如果防火墙识别不了 Window Scale,因此对方无法获得 Shift count,最终导致严重的性能问题。

1992 年,RFC 1323 提出了一种解决方案,即在三次握手时向对方发送自己的 Window Scaling 信息,Window Scaling 是一个 2 的指数,通过它可以计算出实际的 TCP 接收窗口大小。这个方案的好处是可以不需要修改 TCP 头的设计。

# 查看 Linux 内核 TCP Window Scaling
sysctl net.ipv4.tcp_window_scaling
> net.ipv4.tcp_window_scaling = 1
# 设置 Linux 内核 TCP Window Scaling
sudo sysctl -w net.ipv4.tcp_window_scaling=0
> net.ipv4.tcp_window_scaling = 0
拥塞窗口

拥塞控制的基本思想是发送方通过维护一个虚拟的拥塞窗口,控制数据包的发送速度,以防止网络拥塞。

  1. 在连接建立初期,发送方对网络状况一无所知。由于一次发送过多数据可能会遭遇拥塞,因此发送方需要将拥塞窗口的初始值设置得很小。根据 RFC(请求评论文档)的建议,初始值为 2 个、3 个或者 4 个 MSS(最大报文段长度),具体取决于 MSS 的大小。
  2. 在慢启动过程中,拥塞窗口大小随着时间的推移而逐渐增加。此时,传输速度比较快,触碰拥塞点的风险也增加。因此,不能继续采用翻倍的慢启动算法,而是要缓慢增加拥塞窗口大小。根据 RFC 的建议,在每个往返时间中增加 1 个 MSS。例如,如果发送了 16 个 MSS 并得到全部确认,则拥塞窗口大小增加到 16+1=17 个 MSS。随后,拥塞窗口大小会增加到 18、19 等,这个过程称为拥塞避免。
  3. 在慢启动过渡到拥塞避免的临界窗口值方面,需要根据之前是否发生过拥塞来确定。如果发生过拥塞,则应将该拥塞点作为参考。如果从未发生过拥塞,则可以选择一个较大的值,例如与最大接收窗口相等。

具体怎么知道窗口多大会触发拥塞呢?

假设我们要计算的是某个 TCP 连接的拥塞点,而在该连接中存在一连串重传包。首先,我们需要找到重传包序列中的第一个包,然后根据其 Seq 值找到其对应的原始包,进而计算出原始包发送时刻的在途字节数。因为网络拥塞发生在该原始包发送的时刻,因此该时刻的在途字节数大致代表了拥塞点的大小。

在途字节数的计算公式应该是:

在途字节数 = Seq + Len - Ack

其中,Seq 是指包的序列号,Len 是包的长度,Ack 是指确认号。

具体步骤:

  1. Wireshark 上单击 Analyze 菜单,再单击 Expert Info 选项,得到重传统计表。
  2. 点击第一个重传包No.1225,可见它的 Seq=1012852。于是用“tcp.seq ==1012852”作为过滤条件
  3. 点击 Apply 过滤之后得到了原始包 No. 1053
  4. 选定 1053 号包,然后点击 Clear 清除过滤。可见上一个来自服务器端的包是 1051 号包
  5. 利用上述公式,可知当时的在途字节数为 1012852(No.1053 的 Seq)+816(No.1053 的 Len)-910546(No.1051 的 Ack)=103122 字节。

重传

在传输数据时,由于网络拥塞、硬件故障等原因导致数据包未能及时到达接收方,发送方会重新发送该数据包。

快速重传

在网络传输过程中,丢包是很常见的问题,不过有时候出现的丢包症状并不像严重拥塞时那么明显。一些因素如校验码不对可能导致单个包的丢失,或者只有少量的包丢失。当这些包的后续包能够正常到达接收方时,接收方会发现其 Seq 号比期望的大,为了提醒发送方重传这些包,接收方会每收到一个包就 Ack 一次期望的 Seq 号。当发送方接收到三个或以上的重复确认(Dup Ack)时,发送方便会意识到相应的包已经丢失,于是立即重传它。这个过程称为快速重传,与超时重传不同,它无需等待一段时间。

为什么要规定收到 3 个或以上的重复确认才会重传呢?这是因为网络包有时会乱序,乱序的包同样会触发重复的 Ack,但是为了乱序而重传却是不必要的。因为一般乱序的距离不会相差太大,比如 2 号包也许会跑到 4 号包后面,但不太可能跑到 6 号包后面。所以规定收到三个或以上的重复确认,可以在很大程度上避免因乱序而触发快速重传。

如下图所示,2 号包的丢失凑满了 3 个 Dup Ack,所以触发快速重传。而在右图中,2 号包跑到 4 号包后面,但因为凑不满 3 个 Ack,所以没有触发快速重传。

如果在拥塞避免阶段发生了快速重传,是否需要像发生超时重传一样处理拥塞窗口呢?

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
28 1
|
20小时前
|
缓存 网络协议 网络性能优化
网络协议详解:TCP/IP与HTTP
【7月更文挑战第24天】TCP/IP协议和HTTP协议是现代互联网通信的重要基石。TCP/IP协议提供了计算机之间数据传输和通信的底层支持,而HTTP协议则在此基础上实现了超文本数据的传输。随着互联网的不断发展,TCP/IP协议和HTTP协议将继续发挥重要作用,为各种网络应用提供稳定、高效的通信服务。
|
13天前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
21 2
|
1月前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
36 3
|
2月前
|
网络协议 安全 网络安全
网络 (TCP/IP 四层协议中常见网络协议)
网络 (TCP/IP 四层协议中常见网络协议)
53 7
|
2月前
|
网络协议 算法 网络性能优化
网络编程:TCP/IP与套接字
网络编程:TCP/IP与套接字
|
2月前
|
网络协议 前端开发 网络安全
网络通信基础(网络通信基本概念+TCP/IP 模型)
网络通信基础(网络通信基本概念+TCP/IP 模型)
|
2月前
|
存储 缓存 网络协议
网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)
网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)
29 1
|
1月前
|
网络协议 网络架构
计算机网络——计算机网络体系结构(1/4)-常见的计算机网络体系结构(OSI体系、TCP/IP体系、原理体系五层协议)
计算机网络——计算机网络体系结构(1/4)-常见的计算机网络体系结构(OSI体系、TCP/IP体系、原理体系五层协议)
47 0
|
2月前
|
存储 网络协议 Linux
【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解(下)
【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解(下)