仅在某些时候解压缩TCP头时出错

时间:2017-11-27 00:01:37

标签: python sockets tcp

我正在开展一个涉及阅读数据包的学校项目。我需要知道数据包的源和目标IP,协议以及源和目标端口。现在我的IP头运行良好,但是当我从TCP头显示端口时,我只在某些时候收到错误。我也不想使用外部库和工具,因为我不确定标记时项目将在哪个环境中进行测试。

错误

Traceback (most recent call last):
  File "capturePacket.py", line 26, in <module>
    tcp_hdr = struct.unpack("!HHII2sH2sH", tcpheader)
struct.error: unpack requires a buffer of 20 bytes

一些指导会有所帮助。谢谢。

import socket,struct,binascii,os

#if windows
if os.name == "nt":
    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)
    s.bind((socket.gethostname(),0))
    s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
    s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
#if other
else:
    s=socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))

while True:
    pkt=s.recvfrom(65565)


    print ("\n\nIP Header:")
    ipheader = pkt[0][14:34]
    ip_hdr = struct.unpack("!1s1s1H1H2s1B1B2s4s4s",ipheader)
    print ("Source IP", socket.inet_ntoa(ip_hdr[8]))
    print ("Destination IP", socket.inet_ntoa(ip_hdr[9]))
    print ("Protocol", ip_hdr[6])

    print ("\n\nTCP Header:")
    tcpheader = pkt[0][34:54]
    tcp_hdr = struct.unpack("!HHII2sH2sH", tcpheader)
    print ("Source Port:", tcp_hdr[0])
    print ("Destination Port:", tcp_hdr[1])

1 个答案:

答案 0 :(得分:0)

问题非常简单;您既没有将BPF过滤器传递给嗅探器,也没有将数据包捕获限制为仅限TCP,也没有检查IP协议值是否实际上是6或TCP。

所有这一切的意思是,当你试图解压缩你所假设的TCP头时,你可能会在UDP或ICMP数据包(或其他一些嵌入式协议)中找到更少的数据。疗程)。