【问题标题】:TCP Window size libnidsTCP 窗口大小库
【发布时间】:2012-10-03 03:50:21
【问题描述】:

我的目的是编写一个应用程序。 libnids之上的层进程。使用 libnids API 的原因是因为它可以模拟 Linux 内核 TCP 功能。 Libnids 将返回 hlf->count_new,它是最后一次调用 TCP 回调函数的字节数。然而,每次有新数据包进来时都会调用 tcp_callback,因此 hlf->count_new 包含单个 TCP 段。

但是,应用程序。层应该接收 TCP 窗口缓冲区,而不是单独的 TCP 段。

有什么方法可以获取 TCP 窗口(而不是 TCP 段)的数据?换句话说,就是让 libnid 传递 TCP 窗口缓冲区数据。

提前致谢!

【问题讨论】:

  • 我不明白这怎么可能工作。 TCP 连接的末端已经有一个应用程序(正在侦听端口的应用程序),我看不出一个 TCP 连接如何在同一个端点有两个应用程序。哪一方决定向另一方发送什么数据?
  • 我所指的应用程序对 TCP 连接是被动的。例如,一个 HTTP 对象重构器。我的进程读取接口(或数据包跟踪),并尝试确定在 HTTP 事务中发送了多少字节。但是,我不想添加单独的 TCP 段,而是添加 TCP 缓冲区。问题是如何获得 TCP 缓冲区大小?让我知道这是否更清楚。
  • 这是与活动应用程序通信的另一个 TCP 堆栈的内部细节。您必须查看其他 TCP 堆栈才能知道。 (就像窃听的邮递员可以知道您收到了哪些信件以及您发送了哪些信件,但不能知道您是否阅读过一封信。)从您的角度来看,您无法判断其他应用程序是否已从其他 TCP 堆栈。
  • 您缺少的是两个 TCP 堆栈之间根据 那些 接收到的内容协商窗口大小TCP 堆栈,而不是它们正在与之交谈的应用程序。它旨在调节“飞行中”的数据量,而不是端点缓冲的数据量。当应用程序从 TCP 堆栈中读取数据时,大多数情况下,nothing 会在线发送以反映这一点。
  • 您将窗口与应用程序缓冲区混淆了。应用程序缓冲区保存应用程序尚未读取的数据。该窗口保存接收 TCP 堆栈尚未确认的数据。您假设应用程序读取触发 TCP 窗口更改。它可能会,但最常见的是不会。 (而且由于另一端不在乎,当还有足够的空间时,发送一个 TCP 数据包只是为了改变窗口是很浪费的。)你已经可以看到每个数据字节一次,仅此而已你可以的。

标签: tcp libpcap


【解决方案1】:

你有误会。 TCP 窗口旨在控制传输中的数据量。应用程序读取并不总是触发 TCP 窗口更改。因此,您寻找的信息在您正在寻找的地方不可用。

考虑,例如,如果窗口是 128KB 并且已经发送了 8 个字节。无论应用程序是否读取它们,接收 TCP 堆栈都必须确认这八个字节,否则 TCP 连接将超时。现在想象应用程序读取一个字节。 TCP 堆栈将窗口扩大一个字节是没有意义的——如果正在使用窗口缩放,它不能这样做,即使它想这样做。

然后呢?如果四秒后应用程序读取另一个单字节,再次调整窗口?有什么意义?

窗口的目的是控制两个 TCP 堆栈之间的数据流,防止缓冲区无限增长,并控制“飞行中”的数据量。它只是间接反映了应用程序从 TCP 堆栈中读取的内容。

你甚至想要这个也很奇怪。即使您能说出应用程序读取了什么内容,那对您有什么可能的用途?

【讨论】:

  • 我的问题不是应用程序是否更改了 TCP 窗口。我知道这不会发生,因为它会违反分层原则。让我们稍微修改一下您的示例。假设 TCP 已确认 6KB。然后有一个应用程序调用。该应用程序最多可以获取 6KB。这是正确的吗?如果是,那么我想要我的嗅探器应用程序。获取那些 6KB(而不是来自 TCP 层的每个独立确认的 TCP 段)。
  • 但是你已经得到了那些 6KB。如果您再次需要它们,只需将它们保存在某个地方即可。
  • 由于 6KB 已被最终主机确认,我希望 libnids 知道并交付 6KB。 Libnids 不提供 6KB,它只是提供 6KB 分成多个段(因此约 5 次调用)。我的问题是我的应用程序如何能够一次调用而不是多次调用 6KB。抱歉,这篇文章太长了……
  • 每次调用回调时,将数据添加到缓冲区。当您的应用程序调用时,将缓冲区中的所有数据提供给它。
猜你喜欢
  • 2013-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多