首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替罪羊"Ether()“没有"chksum”论证

替罪羊"Ether()“没有"chksum”论证
EN

Stack Overflow用户
提问于 2019-04-29 23:15:43
回答 1查看 1.8K关注 0票数 0

“帧检查序列”是整个以太网帧上的32位CRC“校验和”,从DMAC开始,覆盖SMAC、类型和有效载荷。它作为以太网帧的最后四个字节传输,就在分组间隔之前。

我希望Scapy的Ether()方法为这个字段的包属性设置一个参数。事实并非如此。

注意,Scapy方法(如IP()和TCP()/UDP() )包含一个校验和参数("chksum"),用于为这些协议定义的附加校验和。

例如..。

代码语言:javascript
复制
> IP( raw(UDP(chksum=0) / IP(version=4, chksum(0)) )
<IP  version=0 ihl=0 tos=0x35 len=53 id=28 flags= frag=0 ttl=69 proto=hopopt chksum=0x14 src=0.1.0.0 dst=64.0.0.0 |<Raw load='\x7f\x00\x00\x01\x7f\x00\x00\x01' |>>
> ls(Ether)
dst    : DestMACfield    = (None)
src    : SourceMACfield  = (None)
type   : XShortEnumField = (36864)
> Ether( raw(Ether()) )
<Ether dst=ff:ff:ff:ff:ff:ff src=12:34:56:78:9a:bc type=LOOP |>
> Ether.chksum()
AttributeError: chksum
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 10:07:17

FCS没有在Scapy中的以太网帧上实现,原因有二。

  • 首先,从历史上看,如果是在包的末尾,Scapy很难获得一个FCS (但现在已经不是这样了,因为FCSField已经成为一件事情了)。
  • 其次,大多数OSes在默认情况下不提供它,当它们提供时,除了假设数据包末尾的填充是FCS之外,没有办法知道实际上存在FCS。如果你觉得它应该被添加,你可能应该在他们的追踪器上打开一个问题。

原始答案:

当您构建数据包时,Scapy会自动生成chksum参数。构建数据包意味着将其转换为字节:使用bytes(pkt)raw(pkt) (或pkt.build())

例如,show2()显示包构建时的样子:

代码语言:javascript
复制
>>> pkt = IP()/UDP()/ICMP()
>>> pkt.show2()
 ###[ IP ]### 
  version= 4
  ihl= 5
  tos= 0x0
  len= 36
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= udp
  chksum= 0x7cc6   <-------
  src= 127.0.0.1
  dst= 127.0.0.1
[...]

校验和仅在其为None时计算,以便允许您在需要时设置自定义(不正确)校验和。如果要检查其中包含的内容,可以手动构建数据包:

代码语言:javascript
复制
>>> pkt = IP(raw(pkt))
>>> pkt[IP].chksum
31942
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55911950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档