C# TCP速度测试算法问题

C# TCP速度测试算法问题,c#,tcp,C#,Tcp,我在一家ISP公司工作。我们正在为我们的客户开发速度测试仪,但在TCP速度测试方面遇到了一些问题 一个客户端传输100 MB数据包的总持续时间为102秒,数据包大小为8192。100.000.000/8192=12.202个数据包。如果客户端每隔一个数据包发送一个ACK,那么仅仅发送ACK似乎需要很长时间。假设客户端发送6000个ACK,RTT为15毫秒,即6000*7.5=45.000ms=45秒,仅用于ACK 如果我对Mbit/s使用此计算: (((sizeof_download_in_by

我在一家ISP公司工作。我们正在为我们的客户开发速度测试仪,但在TCP速度测试方面遇到了一些问题

一个客户端传输100 MB数据包的总持续时间为102秒,数据包大小为8192。100.000.000/8192=12.202个数据包。如果客户端每隔一个数据包发送一个ACK,那么仅仅发送ACK似乎需要很长时间。假设客户端发送6000个ACK,RTT为15毫秒,即6000*7.5=45.000ms=45秒,仅用于ACK

如果我对Mbit/s使用此计算:

(((sizeof_download_in_bytes / durationinseconds) /1000) /1000) * 8 = Mbp/s
我将以Mbp/s的形式获得结果,但是发送方和客户端之间的TTL越高,Mbp/s速度就会越低

为了模拟用户离服务器更近,在Mbp/s的最终结果中删除ACK响应时间是否“合法”?这就像模拟终端用户靠近服务器一样

因此,我将向最终用户显示此计算:

(((sizeof_download_in_bytes / (durationinseconds - 45sec)) /1000)/1000) * 8 = Mbp/s 

这有效吗?

这里的问题是RTT太大,无法使用整个带宽。您可能希望增加TCP窗口的大小,这可以基于每个套接字进行测试,同时也可以

作为一个客户,如果一个速度测试程序通知我次优的系统设置,并给我一个改正的选项,我会认为这是一个很好的服务。
如果TCP窗口设置正确,则RTT在TCP速度测试中应该无关紧要,除非您丢失了大量数据包(但毕竟这是您首先要检测的)。

TCP利用窗口流控制,通常在发送下一帧之前不等待确认。ACK与数据帧同时进行,不需要任何额外的挂钟时间。任何最近的TCP实现都可以处理这样的RTT和比特率,而不会造成速度损失

所以正确的计算是第一位的

另外,您是否确定您的网络从客户的PC到您的测试服务器确实有8192 MTU?很可能存在具有1500 MTU的以太网段,您的8192字节发送缓冲区被TCP堆栈拆分为标准的1500字节TCP段


最后,有1024个字节以千字节表示,1024个字节以兆字节表示。

是的,但他不是在测量大小,而是在测量速度,1kbps=1000位/秒-1Mbps=1000000位/秒-1Gbps=100000000位/秒我知道1024字节的正确术语是kibibyte,但这很奇怪,标准组织是错误的和邪恶的:)这是正确的-TCP使用滑动窗口,所以数据仍然在传输,而ACK在飞行中(只要您的TCP窗口大小超过2*RTT*带宽)。