networking - TCP header 选项 : SACK-permitted (Selective Acknowledgments) negotiation

标签 networking tcp network-protocols

我正在做一个研究项目,需要拆分 tcp 连接。所以我有一些特殊的问题,这些问题可能会在我的发展中发生。问题在于理解 TCP SACK 允许的协商。我阅读了 RFC,但在那里找不到答案。

对于两个 tcp 程序之间的 3 次 tcp 握手:A 和 B。如果 A 向 B 发送 TCP SYN 并允许 SACK,B 肯定会响应一个 SACK 允许的 SYN/ACK 数据包吗?如果 B 在没有允许 SACK 的情况下用 TCP SYN/ACK 回复,这是否意味着

1) SACK-permited只在A上启用。A可以选择性的确认来自A的tcp包,但是A不能选择性的确认来自B的tcp包。

2) A 和 B 都没有启用 SACK-permited

如果A在没有允许SACK的情况下向B发送一个TCP SYN,B是否可以响应一个允许SACK的SYN/ACK数据包?

此外,为什么允许或不允许 SACK-permitted?这取决于操作系统或内核设置或其他什么?有可能控制它吗?谢谢!

最佳答案

以下应该对您有所帮助:TCP Selective Acknowledgements

不过要回答您的问题(可能控制它),这完全取决于“您可以控制什么”。例如,对于 Windows你可以控制它,但是你必须启用它。因此,如果您控制着 TCP session 的两端,答案是肯定的。显然,如果您不控制另一端,您将无能为力。因此,想象一下,您在自己的终端(可控)启用了它,但目的地(比方说网站)不支持 SACK,这最终会在一定程度上浪费时间。

大多数操作系统都允许您关闭和打开。在 FreeBSD(我当前的桌面)上它是默认打开的,在大多数 Linux 变体中,它也是默认打开的。

关于networking - TCP header 选项 : SACK-permitted (Selective Acknowledgments) negotiation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482583/

相关文章:

cocoa - 如何确定 Mac 连接的网络是 WiFi 还是有线网络等

android - 设备静音且不响应 ping - android

http - 我可以在完全读取 HTTP 请求之前发送 HTTP 响应吗?

go - 从 net.Conn 检索 uri 路径

java - TCP/IP 应用程序 Keepalive 大小和带宽开销

c# - 对于本地帐户中的服务,File.exists() 返回 false

java - 使用 Java 的 BitTorrent 协议(protocol) - 成功握手后的位字段

network-protocols - 以编程方式确定 Web 域是否可用的最有效方法?

networking - 在 tcpdump 之类的工具中,网络数据包究竟是在什么时候捕获的?

c++ - 我如何知道 C++ 驱动程序是否丢失了与 Cassandra 的连接?