计算从客户端发送到服务器的数据包数量?
Posted
技术标签:
【中文标题】计算从客户端发送到服务器的数据包数量?【英文标题】:Count the number of packets sent to a server from a client? 【发布时间】:2009-02-25 16:41:24 【问题描述】:所以我几乎完成了一项涉及 Win32 编程和套接字的任务,但我必须生成和分析一些有关传输的统计信息。我唯一遇到的问题是如何计算从客户端发送到服务器的数据包数量。
发送的数据可以是可变长度的,所以我不能只将接收到的总字节数除以 #define'd 值。
我们必须使用异步调用来做所有事情,所以我一直在尝试用我为服务器套接字获得的每条 FD_READ 消息增加一个计数器。但是,因为我必须能够接受可能很大的文件大小,所以我必须使用大约 64k 的缓冲区大小调用 recv/recvfrom。如果我发送一个小数据包(a-z),就没有问题。但是,如果我发送 1024 个字符的字符串 10x,服务器会报告收到 2 或 3 个数据包,但发送/接收的字节数为 0%。
知道如何获取数据包的数量吗?
提前致谢:)
【问题讨论】:
我假设这是一个流式套接字(即 TCP)而不是数据报套接字(即 UDP)? ...问题是您正在接收流片段而不是数据包。 我们实际上必须同时实现 TCP 和 UDP。我不太清楚你所说的流片段是什么意思,但数据都被很好地读取了——它只是在排队,直到我调用 recv/recvfrom,然后它一口气尽可能多地抓取。我需要计算一下。 您必须以编程方式获取统计信息,还是只使用 Wireshark? 据我所知,我们必须从程序中获取它们。 【参考方案1】:这真的归结为您所说的“数据包”。
您可能知道,当通过网络发送 TCP/UDP 消息时,正在发送的数据会被“包装”或附加在相应的 TCP/UDP 标头中。然后将其“包装”在 IP 标头中,该标头又“包装”在以太网帧中。如果你使用像 Wireshark 这样的嗅探包,你可以看到这个突破。
重点是这个。当我听到“数据包”这个词时,我会想到 IP 级别的数据。 IP 数据是真正在线上打包的,因此在谈论 IP 时,数据包计数是有意义的。但是,如果您使用常规套接字发送和接收数据,则 IP 标头以及 TCP/UDP 标头将被剥离,即您无法从套接字中获取此信息。如果没有这些信息,就无法确定传输的“数据包”(再次,我认为是 IP)的数量。
您可以通过添加自己的带有长度和计数器的标题来执行其他人的建议。此信息将帮助您准确确定接收缓冲区的大小,但不会帮助您确定数据包的数量(同样,IP...),尤其是在您使用 TCP 时。
如果您想准确确定使用 Winsock 套接字的数据包数量,我建议按照 here 的建议创建一个“原始”套接字。此套接字将收集本地 NIC 看到的所有 IP 流量。使用 IP 和 TCP/UDP 标头根据您的客户端和服务器套接字(即 IP 地址和端口号)过滤数据。这将准确了解实际使用了多少 IP 数据包来传输您的数据。
【讨论】:
【参考方案2】:不是对您的问题的直接回答,而是对不同解决方案的建议。
如果您在要传输的数据前面发送一个长度描述符会怎样?这样您就可以在客户端上分配正确的缓冲区大小(不要太多,也不要太少),并在传输结束时检查是否有任何损失。
使用 TCP,您应该完全没有问题,因为协议本身会处理无错误传输,否则您应该会得到一个有意义的错误。
也许使用 UDP,您还可以将传输拆分为具有适当序列 ID 的固定大小的块。您必须先累积所有传入的包,然后再对它们进行排序(UDP 不保证接收顺序)并将数据粘贴在一起。
另一方面,如果真的有必要支持 UDP,您应该考虑一下,因为如果您想获得该协议的错误安全,则需要相当多的手动开销...(请参阅 Wikipedia Article on TCP 以获取要解决的问题)
【讨论】:
嗯,根据我给的作业PDF,支持UDP是必须的。我希望避免明确发送长度,但是在阅读您的帖子时,我有一个想法来实现它,它可能会起作用。感谢您的大脑轻推:) 总是乐于提供帮助,即使其他人只是从我的错误中吸取教训 ;)【参考方案3】:您的数据包是否有固定的标头,或者您是否可以定义自己的标头。如果您可以自己定义,请在标头中包含一个数据包计数器以及长度。您必须在计数器中保留一个计算翻转的运行总数,但这将确保您计算发送的数据包,而不是接收的数据包。对于一个简单的分配,您可能不会遇到丢失(显然是使用 UDP),但如果您遇到了,数据包计数器将确保您的统计信息准确地反映发送的消息。
【讨论】:
以上是关于计算从客户端发送到服务器的数据包数量?的主要内容,如果未能解决你的问题,请参考以下文章