谷歌协议缓冲区-误码的概率和减少它们的方法
google protocol buffers - probability of bit errors and ways to reduce them
我通过TCP在互联网上通过无线VPN传输了相当大量的google协议缓冲区消息,我觉得我得到了相对较高的错误率(例如布尔字段从false切换到true或类似的东西)。在一万分之一到五万分之一之间。
这可能吗?Wikipedia指出,TCP有一个弱校验和,但这通常在底层协议中是固定的:
TCP校验和是现代标准下的弱校验。具有高误码率的数据链路层可能需要额外的链路纠错/检测功能。在TCP和IP下面的第2层,通常使用CRC或更好的完整性检查来部分补偿弱校验和,例如在PPP或以太网帧中使用。
有谁知道预期错误率应该是多少吗?如果可能的话,建议/最简单的修复方法是什么?复制字段?发送两次信息?或者还有其他方法可以提高可靠性吗?
谢谢
不,这是不可能的。假设您没有遭受硬件故障(内存,网卡等),这应该很容易检查—它是否发生在多台计算机上?
更有可能的是你在应用程序代码中有一个无效的内存访问或类似的,或者你发送的数据根本不是你想要的。试着在valgrind或类似的目录下运行代码。
将复制字段作为正常操作的一部分的想法似乎很荒谬:基本上没有人在野外这样做,你也不应该需要这样做。在您的系统中有多层保护来防止静默数据损坏,因此它很可能是一个简单的(或者可能不那么简单的)应用程序错误。
John Zwink的回答是正确的,因为你的结果是不合理的,在应用层修复是一个错误。
如果网卡引入那么多错误,VPN(假设是SW层)会发疯并失去连接。
按照建议,试试Valgrind,看看你的软件是否正在破坏缓冲区。
此外,如果"易于检查"内存似乎不是这样,一个不错的选择是memtest86, http://www.memtest86.com,您可以将其粘贴在USB驱动器或CD上,并让其运行过夜或周末。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 谷歌协议缓冲区-误码的概率和减少它们的方法