网络传输时间从TCP/IP堆栈
Network transmission time from the TCP/IP stack
每当客户端连接到我的服务器时,我想记录客户端和服务器之间的传输时间 - 是否可以做到这一点,而无需ping client。我的服务器用C 编写,并在LAN TCP/IP套接字上听。我希望TCP/IP堆栈上有一些我可以在每个客户连接后都可以使用的东西。
update
传输时间:客户端通过WAN/LAN等计算机网络连接到服务器的毫秒数。基本上,您会从外壳中的运行ping client1.example.com
获得相同的结果。
没有完全可移植的方法来找到客户设置连接的时间,因为没有API查询内核中的此信息。但是您有一些途径:
-
如果您可以在接口上捕获,则可以轻松地测量从第一个SYN到ACK的时间。您应该能够在大多数系统上执行此操作。
-
在某些UNIX系统上,您可以启用SO_DEBUG套接字选项,该选项可能为您提供此信息。根据我的经验,So_debug很难使用。
TCP API中没有任何明确内置的事情来完成您想要的事情,但是假设您对服务器和客户端具有控制权,则可以做以下操作:
- 当客户端的Connect()完成时,将客户端记录当前时间(使用getTimeofday()或类似)
- 当服务器接受TCP连接时,请立即将一些数据发送给客户端(数据是什么)
- 当客户端从服务器接收数据时,将客户端记录在当前时间,然后从(1) 中记录的时间从中减去
- 现在您有了TCP往返时间;将其除以两个以估算单程时间。
当然,此方法将在测量中包括TCP协议的变化(例如,如果TCP数据包在从服务器到客户端的途中丢失,则需要在客户端看到它之前重新启动数据包,并且这将增加测得的时间)。那可能就是您想要的,或者如果不是,则可以使用UDP数据包进行类似的操作(例如,让客户端发送UDP数据包和服务器响应,然后客户端测量Send()和Recv()和Recv())的时间。当然,使用UDP,您必须处理防火墙,而NAT则阻止了返回客户的数据包,等等。
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 我正在开发服务器,ip作为参数传递不起作用
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 网络传输时间从TCP/IP堆栈