作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们有一个 TCP 流协议(protocol),我们在数据负载前加上大小前缀。因此,数据在接收时可以正确解码。非常标准的东西。
这适用于成千上万的人。不幸的是,我们至少有 4 起客户报告的连接问题案例,全部发生在偏远国家。俄罗斯的一位客户已经能够帮助我们进行大量测试并缩小问题范围。如果我们发送一个前缀大小强制为 0 的数据包,那么整个数据包都会通过。如果数据包数据以 1c
开头,则数据包将无法通过。
我从他的计算机上获得了两个并排的 Wireshark 捕获结果:
Working
-------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
00000000000000001c0000000000000000000000000000000000000000000000
Toronto -> Rusion [PSH,ACK] <- server in toronto got the data, sent a reply!
Not-Working
--------
Russia -> Toronto [SYN]
Toronto -> Russia [SYN, ACK]
Russia -> Toronto [ACK]
Russia -> Toronto [PSH,ACK] <- data is sent here
1c000000000000001c0000000000000000000000000000000000000000000000
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Russia -> Toronto [PSH,ACK] <- TCP Retransmission
Server in Toronto never gets the packet from Russia!
实际的客户端和服务器使用 IOCP,但我的测试应用程序使用 C# TcpListener
和 TcpClient
,完全没有自定义选项标志。
Not actual code
--------------
var client = new TcpClient()
client.Connect(host, port)
client.GetStream().Write()
client.GetStream().Read()
var listener = new TcpListener(port);
listener.Start();
var serverClient = listener.AcceptTcpClient();
serverClient.GetStream().Read()
serverClient.GetStream().Write()
是否有任何进一步的测试可以推荐以获取更多信息/解决此问题?我的直觉是他的硬件/驱动程序已损坏,但他声称一般情况下任何其他应用程序或互联网都没有问题。
最佳答案
可能是其中一个终端链接通过移动运营商?
我没有数据了,但由于我们处于推测领域,我记得不久前意大利移动运营商也遇到过类似问题:显然,数据连接上的特定位序列会丢失载体。隐约类似于+++ATH0 旧的“ping”技巧。
您能否尝试通过另一种媒体(例如 netcat 流)发送类似的序列 (1c0000000....)?
关于c# - 当数据以 '1c' 开头时,TCP 数据包不会从俄罗斯到达加拿大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22779467/
我是一名优秀的程序员,十分优秀!