IP报文的创建python代码实现

import struct
import socket

class IP_Packet:
    def __init__(self, source_ip, destination_ip, protocol,payload=b''):
        self.version = 4  # IP版本号,IPv4为4,IPv6为6
        self.header_length = 5  # IP报头长度(32位字的数量)
        self.type_of_service = 0  # 服务类型(通常为0)
        self.total_length = 20 + len(payload)  # IP报文总长度(字节数)
        self.identification = 0  # 标识符
        self.flags = 0  # 标志(DF和MF)(通常为0)
        self.fragment_offset = 0  # 分片偏移(通常为0)
        self.time_to_live = 64  # 生存时间(TTL)
        self.protocol = protocol  # 上层协议(TCP=6,UDP=17)
        self.checksum = 0  # 校验和(初始值为0)
        self.source_ip = socket.inet_aton(source_ip)  # 源IP地址
        self.destination_ip = socket.inet_aton(destination_ip)  # 目标IP地址
        self.payload = payload  # 上层协议数据

    def calculate_checksum(self, header):
        """
        计算IP报头的校验和
        """
        checksum = 0
        # 将每个16位字添加到校验和中
        for i in range(0, len(header), 2):
            checksum += (header[i] << 8) + header[i+1]
        # 将溢出位添加到校验和中
        while checksum >> 16:
            checksum = (checksum & 0xFFFF) + (checksum >> 16)
        # 取反得到校验和的补码
        checksum = ~checksum & 0xFFFF
        return checksum

    def pack(self):
        """
        将IP报文打包成二进制数据
        """
        # 构造IP报头
        version_header_length = (self.version << 4) + self.header_length
        flags_fragment_offset = (self.flags << 13) + self.fragment_offset
        header = struct.pack('!BBHHHBBH4s4s', version_header_length, self.type_of_service, self.total_length,
                             self.identification, flags_fragment_offset, self.time_to_live, self.protocol,
                             self.checksum, self.source_ip, self.destination_ip)
        # 计算IP报头的校验和
        self.checksum = self.calculate_checksum(header)
        # 重新构造IP报头,更新校验和字段
        header = struct.pack('!BBHHHBBH4s4s', version_header_length, self.type_of_service, self.total_length,
                             self.identification, flags_fragment_offset, self.time_to_live, self.protocol,
                             self.checksum, self.source_ip, self.destination_ip)
        # 打包IP报文数据和上层协议数据
        packet = header + self.payload
        return packet

if __name__ == "__main__":

    ip = IP_Packet('192.168.198.1', '192.168.198.1', protocol=socket.IPPROTO_TCP,payload=b'')
    packet = ip.pack()

    print(packet)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值