错误分段的IP协议

时间:2012-01-11 11:32:42

标签: c# sockets udp protocols wireshark

我在c#中进行应用程序。在该应用程序中,我想使用UDP协议广播一些数据。我正在使用socket作为

IPEndPoint ipep = new IPEndPoint(IPAddress.Broadcast, Convert.ToInt32(ServerPort));
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
 EndPoint ep = (EndPoint)ipep;
 socket.SendTo(m_SendBuffer, ep);

这里m_SendBuffer包含我想要发送的数据。 但每当我通过wireshark观察流量时,它显示协议IPV4并显示信息为“碎片化IP协议”。请帮助我为什么会这样?提前谢谢。

2 个答案:

答案 0 :(得分:0)

来自Wikipedia

  

Internet协议(IP)实现数据报碎片,因此可以形成可以通过具有比原始数据报大小更小的最大传输单元(MTU)的链路的数据包。

这意味着您发送的数据包过多。

答案 1 :(得分:0)

任何给定的网络链接都会在每个IP数据报上强制执行最大大小。最常见的是1500字节。 UDP和IP有28个字节的标头,因此有效负载为1472字节。

如果发送的数据不止于此,则每个数据包将被分解为片段。这些在网络中通过在IP报头中添加片段id来区分。如果所有碎片都到达目的地,它们将在到达接收应用程序之前重新组装成一个完整的数据包。

碎片通常很糟糕,原因如下:

  • 如果只丢弃一个片段,则整个数据包都会丢失。
  • 接收方必须花费内存和CPU时间来缓冲和重新组合片段。
  • 网络中很多东西都不喜欢碎片,可能会因为半随意的原因丢弃它们。

但避免分裂是棘手的。网络中的其他内容(如MPLS,PPPoE或VPN)可能会添加更多标头,从而减少每个数据包可以安全发送的数据量。为了安全起见,请将数据包保持在1400字节以下。为了确保安全,请将其保持在500字节以下。