2012-10-04 77 views
0

我目前正在试验Icmp协议,我想实现一个新类IcmpPacket。 我阅读了维基百科上的协议,并且我还发现了一篇关于在MSDN上使用Icmp进行ping操作的文章。 由于两个网站之间存在一些差异,我有点困惑。Icmp协议问题

维基百科定义的ICMP分组作为结构如下: 1字节类型 1个字节码 2字节校验和 4报头字节休息(无论这是)

在MSDN有给定的一个例子对于这样的IcmpPacket类(类的提取物)

public class IcmpPacket { 
    public byte Type; 
    public byte SubCode; 
    public UInt16 CheckSum; 
    public UInt16 Identifier; 
    public UInt16 SequenceNumber; 
    public byte[] Data; 
} 

第一三个属性是清楚但对于IdentifierSequenceNumber(=>头的休息?)

我得到的另一个问题是如果我想使用IcmpPacket来ping服务器,我真的需要Identifier,SequenceNumberData? (我的主机供应商说,最小的IcmpPacket可能是大约28Bytes大,所以如果服用IdentifierSequenceNumber,做我有Data以填补剩余的20个字节?)

PS:也许有一个网站哪个好介绍结构如果Icmp?

+2

的结构,撞了上去[IETF(http://datatracker.ietf.org/doc/search/?name=icmp&rfcs=on&activeDrafts=on&search_submit= ),你会在那里找到所有的规格。 – Landern

+1

你会发现两者都是正确的,因为C#类不代表在网络上生成和发送的最终数据包。正如@Moses所建议的,如果您想了解包格式,您应该阅读IETF RFC文档。此外,在ping设备时,使用Microsoft Network Monitor或Wireshark捕获一些网络数据包也很有帮助。 –

回答

1

标识符和序列号怎么样?

标识符和序列号是对您的实现有意义的值,以便将回显请求与相应的回复答复进行匹配。 RFC 792提供了一个建议使用它们...

For example, the identifier might be used like a port in TCP or UDP to 
    identify a session, and the sequence number might be incremented 
    on each echo request sent. The echoer returns these same values 
    in the echo reply. 

,如果我想用一个IcmpPacket来ping服务器,我真的需要标识的SequenceNumber数据?

标识的SequenceNumber数据字段必须存在于框架...

我的主机供应商说,最小的IcmpPacket可能是大约28Bytes大,所以如果服用标识和的SequenceNumber,我必须用数据填充剩余的20个字节?

如果他们在谈论28字节的IPv4数据包,那么最小的数据包必须包含最小20字节的IPv4标头+ 8字节的ICMP标头。

是否有一个网站可以很好地描述结构如果Icmp?

你应该阅读RFC 792在线...