TCP如何重传?哪个公式取决于将重新发送多少数据包?我知道它设置在立方 tcp 的某个地方,但是在哪里?
对它在 Linux 中的工作方式感兴趣。我使用 Debian 8,只是寻找转储。我使用 netcat 建立了到 27000 端口的连接。我通常在使 iptables 丢弃端口 27000 上的所有数据包并发送数据包的服务器上执行此操作(并查看该数据包被重新发送了多少次。)。
TCP如何重传?哪个公式取决于将重新发送多少数据包?我知道它设置在立方 tcp 的某个地方,但是在哪里?
对它在 Linux 中的工作方式感兴趣。我使用 Debian 8,只是寻找转储。我使用 netcat 建立了到 27000 端口的连接。我通常在使 iptables 丢弃端口 27000 上的所有数据包并发送数据包的服务器上执行此操作(并查看该数据包被重新发送了多少次。)。
这是一个非常广泛的问题。
不,这基本上不是也不一定是 CUBIC。
重传首先在 TCP "basic" RFC 793 (1981),第 3.7 节数据通信,段落“重传超时”中指定。
从那时起,有很多(真的很多[*])增强。一个非常引人注目的是“慢启动”,最后由 RFC 5681 指定,但其根源可以追溯到 1997 年 RFC 2001,“TCP 慢启动、拥塞避免、快速重传和快速恢复算法”。
在这个领域没有“一刀切”,总是需要权衡取舍。此外,“智能”算法将占用更多空间(软件 + CPU 使用),因此它们可能会被使用,也可能不会被使用,或者甚至只是可用,具体取决于应用程序(想想嵌入式设备)。并且由于这些东西在实现中(即在主机之间交换的数据中看不到),您永远无法确定哪个主机使用哪个。例如,您会在段中看到 TCP 窗口的大小和比例,但您不会知道它是由哪种算法管理的。
至于 Linux,它应该从 3.2 开始默认为 PRR。在此之前是 CUBIC,之前是 BIC。
但是,默认并不意味着它是唯一可用的。在我的 debian stock 4.4.0 内核上,它是 CUBIC:
jbmaillet@sumo:~$ cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
虽然 Reno 也可用:
jbmaillet@sumo:~$ cat /proc/sys/net/ipv4/tcp_allowed_congestion_control
cubic reno
...内核配置的“TCP:高级拥塞控制”部分中有十几个可用。
*: https ://en.wikipedia.org/wiki/TCP_congestion-avoidance_algorithm