网络损伤
网络损伤 界面会运行一个中继,它位于客户端与其所通信的目标之间,并对两个方向经过它的流量施加劣化:糟糕的 Wi-Fi、移动链路、卫星一跳、会掉线的链路。用它来查看您的客户端和设备在您手边没有的网络上如何表现。
您让客户端指向中继,而不是真正的目标;中继把一切转发给目标,把应答带回客户端,并在此之前对每个数据报或流按其损伤配置施加处理。您可以在运行期间更改损伤配置,而不会断开端口。
启动中继
- 选择 协议:UDP 用于数据报(OSC、大多数演出控制和传感器流量),TCP 用于流(HTTP、MQTT、TCP 设备)。
- 设置 监听:中继监听的
IP:port。0.0.0.0:9010接收来自网络的流量;127.0.0.1:9010只接收来自本机的流量。 - 设置 目标:真正目的地的
IP:port,或主机名加端口,例如device.local:9000。 - 选择一个预设或设置损伤配置的值。
- 按 启动中继。
- 让您的客户端指向中继的端口,而不是目标——例如用
127.0.0.1:9010代替127.0.0.1:9000。
停止中继 会关闭中继;此后它仍扣住的任何内容都不会发出。
默认值:UDP,监听 0.0.0.0:9010,目标 127.0.0.1:9000,40 ms 延迟、15 ms 抖动和 2 % 丢包。
监听 是要绑定的地址,始终为 IP:port。目标 中的主机名会在您按 启动中继 时解析一次,方式与 OSC 目标相同;无法找到的名称会被拒绝,不会启动中继。中继运行期间,协议、监听 和 目标 是固定的;要更改它们请先停止中继。
client ──► relay (0.0.0.0:9010) ──► target (127.0.0.1:9000)
client ◄── relay ◄───────────────── targetUDP
中继从自己的一个端口把每个数据报转发给目标,并把目标的应答送回客户端。每个数据报都有各自的遭遇,在它到达时决定。
应答发往发送最近一个数据报的客户端:中继一次服务一个客户端。
TCP
客户端与中继建立的每个连接都会与中继自己到目标的一个新连接配对。每个连接的两个流——客户端到目标和目标到客户端——在中继读取它们时逐块施加损伤(一次最多 16 KiB)。无论抖动如何,流总是按顺序到达。
当目标拒绝连接时,客户端的连接会被重置。
损伤配置
中继在两个方向施加的值。UDP 中继读取数据报的值,TCP 中继读取流的值;其他的则隐藏。
UDP 下
| 值 | 作用 | 范围 |
|---|---|---|
| 离线——任何数据都无法通过 | 每个数据报都会被丢弃,两个方向都是,直到您取消勾选。 | 开 / 关 |
| 延迟 | 加到每个数据报上。 | 0–1000 ms |
| 抖动 | 每个数据报额外增加的随机延迟,从 0 到此值——因此数据报可能乱序到达。 | 0–500 ms |
| 丢包 | 从不到达的数据报所占比例,各自独立。 | 0–100 % |
| 突发丢包 | 一个数据报开始一连串丢失的概率:链路短暂掉线,不同于零散丢包。 | 0–20 % |
| 突发长度(数据报) | 一次突发平均丢失多少个数据报。当 突发丢包 大于 0 时显示;首次提高它时为 5。 | 1–1000 |
| 重复 | 被投递两次的数据报所占比例。 | 0–100 % |
| 损坏 | 有一个字节中的一位被翻转的数据报所占比例。 | 0–100 % |
| 乱序 | 被扣住的数据报所占比例——扣住时长为延迟,且至少 20 ms——好让它们之后的数据报先到达。 | 0–100 % |
| 带宽(kbit/s) | 带宽限制,以千比特每秒计;0 表示不限。数据报按此速率排队等待链路;等待超过一秒的会被作为限速丢弃。 | 0,或 8–10 000 000 |
突发的运作方式如下:不处于突发中的数据报会以 突发丢包 的概率开始一次突发;突发中的每个数据报都会丢失,且每个都有 1/突发长度(数据报) 的概率结束突发,因此一次突发平均持续那么多数据报。
数据报按以下顺序判定:离线、突发、丢包、带宽,然后对每个副本进行重复、损坏、延迟和乱序处理。
TCP 下
| 值 | 作用 | 范围 |
|---|---|---|
| 离线——任何数据都无法通过 | 两个方向都没有流量,新连接会等待目标,直到您取消勾选——然后一切照常进行。 | 开 / 关 |
| 延迟 | 加到流的每个数据块上,两个方向都是。 | 0–1000 ms |
| 抖动 | 每个数据块额外增加的随机延迟,从 0 到此值——绝不会超过它前面的数据块。 | 0–500 ms |
| 连接重置 | 重置其连接而不是通过的数据块所占比例:客户端和目标都会收到重置。 | 0–100 % |
| 半开 | 使其连接保持半开的数据块所占比例:两个方向都不再有内容通过,且双方都未被告知。中继保持两侧打开、原封不动,直到它停止。 | 0–100 % |
| 带宽(kbit/s) | 每个连接的每个流的带宽限制,以千比特每秒计;0 表示不限。排队超过一秒后,中继会停止读取,从而让发送方放慢速度,如同在慢速链路上。不会丢弃任何内容。 | 0,或 8–10 000 000 |
丢包、突发、重复、损坏和乱序不适用于 TCP:真正的 TCP 流会重传它丢失的内容并自行恢复顺序,因此客户端在糟糕链路上遇到的是延迟、缓慢的发送方、重置和停止应答的连接。
TIP
滑块在 1000 ms 延迟和 500 ms 抖动处停止。中继本身最多接受各 60 000 ms,例如来自实验文件的值。
预设
预设一键设置所有值。只要值仍是该预设的,它的标签就一直亮着;更改任何值,它就会熄灭。
| 预设 | UDP 下 | TCP 下 |
|---|---|---|
| 局域网 | 1 ms ±1 | 1 ms ±1 |
| 繁忙 Wi-Fi | 20 ms ±30,1 % 丢包,突发 1 % × 3,0.5 % 重复,2 % 乱序 | 20 ms ±30 |
| 4G | 60 ms ±25,0.5 % 丢包,0.5 % 乱序,20 000 kbit/s | 60 ms ±25,20 000 kbit/s |
| 卫星 | 300 ms ±30,1 % 丢包,2000 kbit/s | 300 ms ±30,2000 kbit/s |
| 间歇 | 30 ms ±20,突发 3 % × 15 | 30 ms ±20,0.2 % 的数据块保持半开 |
| 离线 | 什么都通不过 | 没有流量 |
运行期间更改
在中继运行期间更改任何值,或选择另一个预设:它会在您最后一次更改的四分之一秒后生效,而不会断开端口或连接。控制台会记录每个新的损伤配置,实时 下方的一行会说明中继现在的行为——预设的名称,或简短的值,例如 60 ms ±25 · loss 2% · 20000 kbps。
数据报或数据块由它到达时生效的损伤配置决定;已经在路上的则保持其延迟。
计数器
实时 显示中继自启动以来做了什么,两个方向合计,每秒更新四次。
UDP 下:
| 计数器 | 内容 |
|---|---|
| 已接收 | 到达中继的数据报。 |
| 已转发 | 转发出去的数据报;重复的一个计两次。 |
| 已丢弃 | 被故意丢失:离线、突发或丢包。 |
| 限速 | 被带宽限制丢弃,或因为已有 10 000 个在路上。 |
| 已重复 | 被发送两次的数据报。 |
| 已损坏 | 有一位被翻转的副本。 |
| 已乱序 | 被扣住以致后续副本超过它们的副本。 |
| 数据量 | 转发出去的字节数。 |
TCP 下:
| 计数器 | 内容 |
|---|---|
| 连接 | 客户端与中继建立的连接。 |
| 已接收 | 中继读取的数据块,两个方向。 |
| 已转发 | 它转发写出的数据块。 |
| 重置 | 被重置的连接。 |
| 半开 | 保持半开的连接。 |
| 被延缓 | 流等待带宽限制的次数:发送方被放慢,没有丢弃任何内容。 |
| 数据量 | 转发写出的字节数。 |
捕获开启时,检查器会显示中继的数据报和数据块——两个方向合计每 25 ms 最多一个——每个都带有其命运:forwarded +43ms、· corrupted、· reordered、· copy 2/2、dropped (loss)、dropped (burst)、dropped (offline)、throttled,TCP 下还有 reset 和 half-open。→ 是客户端到目标,← 是目标到客户端。
中继的帧会标明真实的套接字:本地 是中继监听的地址,对端 是该数据报或数据块的去向——目标,或应答返回给的客户端。这一段会结束判定:forwarded +43ms · client→target、dropped (loss) · target→client。因此中继的数据报可以用 保存为信号 保留,并指向它的去向;TCP 数据块是流的一部分,无法这样(见检查器)。
相同的流量,相同的命运
每个决定——哪个数据报丢失、延迟多少、在哪里损坏——都从中继的种子中抽取,两个方向分开,TCP 下每个连接也分开。使用相同的种子和相同的流量,中继会丢弃相同的数据报并以相同的方式延迟它们。
网络损伤 界面在您每次启动中继时使用新的种子。要精确重现一次运行,请在实验中使用 网络损伤 节点:它从本次运行的种子中抽取,您可以固定该种子(见重现故障运行)。
在实验中
有两个节点可以把相同的中继放进实验:
- 网络损伤 在第一个步骤之前打开一个中继,并在运行结束时关闭它,无论以何种方式结束。它的监听和目标地址只接受参数;目标可以是主机名,在运行开始时解析。参见节点。
- 更改损伤 从此步骤起,把本次运行中的某个中继切换到另一个损伤配置——正常、丢包、离线、再恢复正常——运行报告会统计每个阶段做了什么。参见节点。
在 OSC 或 UDP 节点上,经由损伤中继 会在它前面放置一个 网络损伤,并让该节点指向中继。参见故障。