scapy 中是否有 TCP 和 UDP 的常量?

Are there a constants in scapy for TCP and UDP?

scapy 中有用于 TCP 和 UDP 的常量吗?

我是说

TCP=6, UDP=17 

等...

TCP 和 UDP 是 TCP/UDP 数据包的发起者。 例如:

pack = IP(dst="www.google.com") / UDP(dport=80)
pack.show()

结果:

>>> pack = IP(dst="www.google.com") / UDP(dport=80)
>>> pack.show()

###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= udp
  chksum= None
  src= 'Your local address'
  dst= Net('www.google.com')
  \options\
###[ UDP ]###
     sport= domain
     dport= http
     len= None
     chksum= None
>>> 

a) 查找 IPimplementation 我们看到 IP.protoByteEnumField("proto", 0, IP_PROTOS),。这意味着,它从 IP_PROTOS 列表中获取值,该列表仅加载您的 os /etc/protocols/。所以你可以自己解析 /etc/protocols 或者,scapy 已经加载,直接访问 IP_PROTOS 对象:

>>> IP_PROTOS
</etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip rohc ipv6_opts xtp st mobility_header dccp igmp ipv6_route igp ddp etherip wesp xns_idp ipv6_frag vrrp gre ipcomp encap ipv6 iso_tp4 sctp ipencap rsvp hip udp ggp hmp idpr_cmtp hopopt fc skip icmp pup manet isis rdp l2tp ipv6_icmp udplite egp ipip ipv6_nonxt eigrp idrp shim6 rspf ospf vmtp>
>>> IP_PROTOS.tcp
6
>>> IP_PROTOS.udp
17
>>> IP_PROTOS.ip
0

b) 另一种方法是直接读取 scapys 层绑定信息。这是当您(或 scapy core 本身)调用 bind_layers(lower,upper[,overload_fields]) 时添加到层的信息。您可以通过以下方式轻松阅读该信息:

>>> TCP.overload_fields
{<class 'scapy.layers.inet6.IPv6'>: {'nh': 6}, <class 'scapy.layers.inet.IP'>: {'frag': 0, 'proto': 6}}

意味着,如果 TCP 是 IPv4 (scapy.layers.inet.IP) 的有效负载,它将覆盖 IP.proto=6。 这是 UDP

的相同信息
>>> UDP.overload_fields
{<class 'scapy.layers.inet6.IPv6'>: {'nh': 17}, <class 'scapy.layers.inet.IP'>: {'frag': 0, 'proto': 17}}

供参考,here is the bind_layers call for TCP/UDP