请教个问题:当IP数据包小于46字节时为啥网卡没有自动填充

liyanshao2 2011-08-13 09:51:59
根据IEEE标准,如果以太网帧小于64字节(IP数据包小于46字节),必须自动填充到最小帧长。

可是我在Fedora 15下面用sendto方法送出的一个43字节的UDP数据包,用ethereal抓的结果却是没有填充。是不是我的网卡要做什么设置才行?

期待高手指教!

No. Time Source Destination Protocol Info size
1 12:23:45.607414 192.168.18.137 192.168.18.1 UDP Source port: 5001 Destination port: 5001 57

Frame 1 (57 bytes on wire, 57 bytes captured)
Arrival Time: Aug 7, 2011 12:23:45.607414000
Time delta from previous packet: 0.000000000 seconds
Time since reference or first frame: 0.000000000 seconds
Frame Number: 1
Packet Length: 57 bytes
Capture Length: 57 bytes
Protocols in frame: eth:ip:udp:cpfi:data
Ethernet II, Src: 00:0c:29:0e:b2:89, Dst: 00:50:56:c0:00:08
Destination: 00:50:56:c0:00:08 (Vmware_c0:00:08)
Source: 00:0c:29:0e:b2:89 (Vmware_0e:b2:89)
Type: IP (0x0800) <----这里没有padding/trailer
Internet Protocol, Src Addr: 192.168.18.137 (192.168.18.137), Dst Addr: 192.168.18.1 (192.168.18.1)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..0. = ECN-Capable Transport (ECT): 0
.... ...0 = ECN-CE: 0
Total Length: 43 <---------总长度43byte
Identification: 0x0000 (0)
Flags: 0x04 (Don't Fragment)
0... = Reserved bit: Not set
.1.. = Don't fragment: Set
..0. = More fragments: Not set
...全文
1388 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
填充(如果需要的话)是数据链路层协议自动完成的,如果你数据发送、接收都正确,那就应该没问题。我估计还是你的抓包软件设置的问题(只是没显示填充而已,CRC32不是也没显示出来吗)。
liyanshao2 2011-08-21
  • 打赏
  • 举报
回复
网上查到的以太帧的描述来看,不应该是前导码的问题。是在类型和填充(Data and Pad)这个域的。但不知道这个地方怎么加个Pad.

字段 字段长度(字节) 目的
前导码(Preamble) 7 同步
帧开始符(SFD) 1 标明下一个字节为目的MAC字段
目的MAC地址 6 指明帧的接受者
源MAC地址 6 指明帧的发送者
长度(Length) 2 帧的数据字段的长度(长度或类型)
类型(Type) 2 帧中数据的协议类型(长度或类型)
类型和填充(Data and Pad)注 46~1500 高层的数据,通常为3层协议数据单元。对于TCP/IP是IP数据包
帧校验序列(FCS) 4 对接收网卡提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧

注:如果数据包小于46字节,则要求“填充”,以使这个字段达到46字节。填充是必须的,因为数据字段要求至少46字节长。
liyanshao2 2011-08-21
  • 打赏
  • 举报
回复
贴个我抓的一个完整的。都是ethereal抓的包,我用的是version 0.10.11,我不知道他用的是哪个版本。
我比较两个包,UDP包和IP包的长度都一样,就是他多了3个byte的padding。所以我的长度就是57,他的就是60。

Frame 1 (57 bytes on wire, 57 bytes captured)
Arrival Time: Aug 7, 2011 12:23:45.607414000
Time delta from previous packet: 0.000000000 seconds
Time since reference or first frame: 0.000000000 seconds
Frame Number: 1
Packet Length: 57 bytes
Capture Length: 57 bytes
Protocols in frame: eth:ip:udp:cpfi:data
Ethernet II, Src: 00:0c:29:0e:b2:89, Dst: 00:50:56:c0:00:08
Destination: 00:50:56:c0:00:08 (Vmware_c0:00:08)
Source: 00:0c:29:0e:b2:89 (Vmware_0e:b2:89)
Type: IP (0x0800) <---- 就是这里少了3个byte的padding
Internet Protocol, Src Addr: 192.168.18.137 (192.168.18.137), Dst Addr: 192.168.18.1 (192.168.18.1)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..0. = ECN-Capable Transport (ECT): 0
.... ...0 = ECN-CE: 0
Total Length: 43 <---- IP包的长度跟他也一样
Identification: 0x0000 (0)
Flags: 0x04 (Don't Fragment)
0... = Reserved bit: Not set
.1.. = Don't fragment: Set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: UDP (0x11)
Header checksum: 0x94e7 (correct)
Source: 192.168.18.137 (192.168.18.137)
Destination: 192.168.18.1 (192.168.18.1)
User Datagram Protocol, Src Port: 5001 (5001), Dst Port: 5001 (5001)
Source port: 5001 (5001)
Destination port: 5001 (5001)
Length: 23 <-----UDP的长度跟他一样
Checksum: 0x28c9 (correct)
Cross Point Frame Injector
Header
Word one: 0x01000000
0000 .... .... .... .... .... .... .... = FrmType: 0x00000000
.... 0001 0000 00.. .... .... .... .... = srcTDA: 0x00000040
.... .... .... ..00 0000 0000 .... .... = dstTDA: 0x00000000
.... .... .... .... .... .... 0000 .... = SOFtype: SOFf (0x00000000)
.... .... .... .... .... .... .... 00.. = speed: 1 GBIT (0x00000000)
.... .... .... .... .... .... .... ..0. = OPMerror: False
.... .... .... .... .... .... .... ...0 = fromLCM: False
Word two: 0x01020607
Data (7 bytes)
liyanshao2 2011-08-21
  • 打赏
  • 举报
回复
贴上人家抓的包

Frame 2 (60 bytes on wire, 60 bytes captured)
Arrival Time: Jul 26, 2011 10:30:57.800924000
Time delta from previous packet: 0.555307000 seconds
Time since reference or first frame: 0.555307000 seconds
Frame Number: 2
Packet Length: 60 bytes
Capture Length: 60 bytes
Protocols in frame: eth:ip:udp:cpfi:data
Ethernet II, Src: 00:0a:eb:fd:7a:00, Dst: 60:eb:69:31:57:23
Destination: 60:eb:69:31:57:23 (192.168.1.40)
Source: 00:0a:eb:fd:7a:00 (192.168.2.254)
Type: IP (0x0800)
Trailer: 000000 <-----这里有3个字节的padding
Internet Protocol, Src Addr: 192.168.2.254 (192.168.2.254), Dst Addr: 192.168.1.40 (192.168.1.40)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..0. = ECN-Capable Transport (ECT): 0
.... ...0 = ECN-CE: 0
Total Length: 43
Identification: 0x0067 (103)
Flags: 0x00
0... = Reserved bit: Not set
.0.. = Don't fragment: Not set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 128
Protocol: UDP (0x11)
Header checksum: 0xb4e4 (correct)
Source: 192.168.2.254 (192.168.2.254)
Destination: 192.168.1.40 (192.168.1.40)
User Datagram Protocol, Src Port: 5001 (5001), Dst Port: 5001 (5001)
Source port: 5001 (5001)
Destination port: 5001 (5001)
Length: 23
Checksum: 0x492d (correct)
Cross Point Frame Injector
Header
Word one: 0x01000000
0000 .... .... .... .... .... .... .... = FrmType: 0x00000000
.... 0001 0000 00.. .... .... .... .... = srcTDA: 0x00000040
.... .... .... ..00 0000 0000 .... .... = dstTDA: 0x00000000
.... .... .... .... .... .... 0000 .... = SOFtype: SOFf (0x00000000)
.... .... .... .... .... .... .... 00.. = speed: 1 GBIT (0x00000000)
.... .... .... .... .... .... .... ..0. = OPMerror: False
.... .... .... .... .... .... .... ...0 = fromLCM: False
Word two: 0x01020607
Data (7 bytes)
  • 打赏
  • 举报
回复
你顶楼贴的是完整的吗?怎么比他的结构少很多?是同一软件的同一版本抓的吗?
  • 打赏
  • 举报
回复
Type: IP (0x0800) <----这里没有padding/trailer
===================================================

这里的0800只是标识frame里的数据类型是IP,不是长度,长度最多只到0x05dc(1500),你怎么知道“没有padding/trailer”的?可以把别人抓的包贴上来看看。

另外更正一个错误,64字节的最小frame限制不应该包括7字节的前导码和1字节的frame起始分隔符,所以你贴frame长度57应该是6(mac)+6(mac)+2(type)+43(payload),为什么没有列出来padding和CRC32不清楚,但是应该有的,否则应该不正常的。
liyanshao2 2011-08-17
  • 打赏
  • 举报
回复
这样啊。谢谢DelphiGuy。

我看别人抓的包是有3个byte的trailer/padding,其他的长度跟我一样,就有60个byte。你知道怎么样加上trailer/padding吗?
  • 打赏
  • 举报
回复
43是IP包的长度,Frame长度不是写着57吗?前面还有7字节的前导码没计算,总共恰好64字节。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧