📜  ECN+、ECN+Wait、ECN+TryOnce 和 ECN 替代退避 (ABE)(1)

📅  最后修改于: 2023-12-03 14:40:56.501000             🧑  作者: Mango

ECN+、ECN+Wait、ECN+TryOnce 和 ECN 替代退避 (ABE)

介绍

ECN+、ECN+Wait、ECN+TryOnce 和 ECN 是一种替代退避 (ABE) 技术,用于 TCP 的拥塞控制。当网络拥塞时,传统的退避算法会导致数据包丢失,降低 TCP 的性能。而 ECN 技术可以在不丢失数据包的情况下控制网络拥塞。

ECN (Explicit Congestion Notification) 是一种被动的拥塞控制技术,它需要网络设备支持。当数据包经过路由器时,如果发现网络拥塞,则将 ECN 标志置 1。TCP 接收方收到带有 ECN 标志的数据包时,会降低拥塞窗口,从而控制传输速率。

ECN+、ECN+Wait、ECN+TryOnce 和 ECN 是在 ECN 的基础上进一步优化的拥塞控制技术。它们既可以被动地控制拥塞,也可以主动地检测拥塞。

ECN+

ECN+ 是一种被动的拥塞控制技术,不需要 TCP 发送方的支持。当数据包经过路由器时,如果发现网络拥塞,则将 ECN 标志置 1。TCP 接收方收到带有 ECN 标志的数据包时,会降低拥塞窗口。ECN+ 可以防止大量的数据包在网络拥塞时被丢弃,从而提高 TCP 的性能。

ECN+Wait

ECN+Wait 是一种主动的拥塞控制技术,需要 TCP 发送方的支持。当 TCP 发送方发送数据包时,首先会判断网络是否拥塞。如果网络不拥塞,则发送数据包,并将 ECN 标志置为 0。如果网络拥塞,则不发送数据包,并等待一段时间。如果在等待期间没有收到带有 ECN 标志的数据包,则发送数据包并将 ECN 标志置为 1。如果在等待期间收到了带有 ECN 标志的数据包,则将 ECN 标志置为 0,不发送数据包。ECN+Wait 可以主动检测拥塞,避免不必要的数据包传输。

ECN+TryOnce

ECN+TryOnce 是一种主动的拥塞控制技术,需要 TCP 发送方的支持。当 TCP 发送方发送数据包时,首先会判断网络是否拥塞。如果网络不拥塞,则发送数据包,并将 ECN 标志置为 0。如果网络拥塞,则不发送数据包,并等待一段时间。如果在等待期间没有收到带有 ECN 标志的数据包,则立即尝试发送一次带有 ECN 标志的数据包。如果带有 ECN 标志的数据包被确认,则将 ECN 标志置为 0,不再发送带有 ECN 标志的数据包。如果带有 ECN 标志的数据包被丢弃,则等待一段时间再次尝试发送带有 ECN 标志的数据包。ECN+TryOnce 可以较快地检测拥塞,并减少不必要的数据包传输。

ECN

ECN 是一种被动的拥塞控制技术,不需要 TCP 发送方的支持。当数据包经过路由器时,如果发现网络拥塞,则将 ECN 标志置 1。TCP 接收方收到带有 ECN 标志的数据包时,会降低拥塞窗口。ECN 可以防止大量的数据包在网络拥塞时被丢弃,从而提高 TCP 的性能。但是,ECN 无法主动检测拥塞,需要等待网络设备发现拥塞并设置 ECN 标志。

代码示例
使用 ECN+
import socket

# 创建 TCP Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 开启 ECN+ 模式
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_CONGESTION, "ecnplus")

# 连接服务器
s.connect(("127.0.0.1", 8080))

# 发送数据
s.send(b"Hello World!")

# 关闭连接
s.close()
使用 ECN+Wait
import socket

# 创建 TCP Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 开启 ECN+Wait 模式
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_CONGESTION, "ecnpluswait")

# 连接服务器
s.connect(("127.0.0.1", 8080))

# 发送数据
s.send(b"Hello World!")

# 关闭连接
s.close()
使用 ECN+TryOnce
import socket

# 创建 TCP Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 开启 ECN+TryOnce 模式
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_CONGESTION, "ecnplustryonce")

# 连接服务器
s.connect(("127.0.0.1", 8080))

# 发送数据
s.send(b"Hello World!")

# 关闭连接
s.close()
使用 ECN
import socket

# 创建 TCP Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 开启 ECN 模式
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_CONGESTION, "ecn")

# 连接服务器
s.connect(("127.0.0.1", 8080))

# 发送数据
s.send(b"Hello World!")

# 关闭连接
s.close()