【发布时间】: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 数据包只是为了改变窗口是很浪费的。)你已经可以看到每个数据字节一次,仅此而已你可以的。