【问题标题】:A server cannot receive TCP packet which size is bigger than 1500 byte服务器无法接收大小大于 1500 字节的 TCP 数据包
【发布时间】:2014-12-17 22:36:09
【问题描述】:

有一台服务器无法接收大于 1500 字节的 TCP 数据包,
但是这个服务器可以发送一个大于 1500 的 TCP 数据包。

我还尝试在此服务器中捕获数据包以供 WireShark 分析。
但是,WireShark 无法在此服务器上正常抓包。
(例如,某些接收到的数据包不会被 WireShark 捕获)

有人知道吗?非常感谢。

服务器信息。
操作系统:Windows 2008;
MTU:1500。

================================================ ====
让我更清楚地描述这个问题。
我有一个客户端/服务器程序,它在 2 个服务器之间创建 TCP 连接
情况如下
服务器_A ---- 服务器_B
---> pkt ---> pkt >1500 字节可以接收
1500 Byte 可以接收

此程序在其他服务器上运行良好,仅在server_B异常。
有人有这种经验吗?

【问题讨论】:

  • 如果mtu为1500,那么服务器可以发送大于1500字节的TCP包,但是IP层会对包进行分片,使得得到的IP数据报不大于mtu
  • 是的,在正常情况下,我的程序可以发送大于 1500 的数据包。但在这种情况下,特定服务器,我在 server_A 和 server_B 之间创建 TCP 连接。然后我向 server_B 发送一个数据包。当数据包大小小于1500时,我在server_B中的程序可以接收数据包。但如果大于 1500,则不能。
  • 我认为此时如果您发布代码 sn-p 会有所帮助。在 Linux/Unix 中编写写入 TCP 套接字的代码时,我只是执行 write() 系统调用,给它一个指向缓冲区及其长度的指针。然后操作系统告诉我写了多少。如果操作系统没有写入整个缓冲区,我会再次调用 write() 并使用指向未发送字节的指针。
  • 这可能是由 pMTU 黑洞造成的,因为有人认为 ICMP 是可选的,因此配置防火墙来阻止它是完全可以的。 ICMP 是 Internet 端点要求,阻止它会破坏 TCP 之类的东西。

标签: networking tcp wireshark mtu


【解决方案1】:

当数据包大小小于1500时,我在server_B中的程序可以接收数据包。但是如果大于 1500 就不行了。

TCP 不是消息传递协议。这是一个字节流协议。继续阅读。

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 2018-08-25
    • 2020-03-24
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多