实现功能
在计算机里捕获IP协议报文、UDP协议报文、TCP协议报文,并分析报文里的关键信息。
流程
搭建服务基本框架
基于操作系统的线程池实现。
链接:操作系统学习实战篇——实现支持异步任务的线程池
网卡的工作模式
本文将网卡设置成混杂模式
server.py
# -*- encoding=utf-8 -*-
import socket
import json
from 计算机操作系统.pool import ThreadPool as tp
from 计算机操作系统.task import AsyncTask
class ProcessTask(AsyncTask):
def __init__(self,packet,*args,**kwargs):
self.packet = packet
AsyncTask(func=self.process,*args,**kwargs)
pass
def process(self):
pass
class Server:
def __init__(self):
# 工作协议类型、套接字类型、工作具体的协议
self.sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
# 套接字绑定到具体端口
# 自己的主机IP,在终端通过 ipconfig 命令查看
self.ip = '192.168.1.105'
self.port = 8888
self.sock.bind((self.ip, self.port))
# 混杂模式
self.sock.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
# 定义线程池,线程数量10个
self.pool = tp(10)
self.pool.start()
def loop_server(self):
while True:
# 1. 接收
packet, addr = self.sock.recv(65535)
# 2. 生成Task
task = ProcessTask(packet)
# 3. 提交
self.pool.put(task)
# 4. 获取结果
result = task.get_result()
result = json.dumps(
result,
indent=4
)
print(result)
if __name__=='__main__':
server = Server()
server.loop_server()
Python操作字节序列
字节序:
大端字节序:高位字节在前,低位字节在后
小端字节序:低位字节在前,高位字节在后
由于计算机电路先处理低位字节效率比较高,主机的CPU处理时会按照小端字节序处理,但是呈现出来是大端字节序的形式。
而人类习惯读写大端字节序,所以网络中使用的是大端字节序。
struct_demo.py
# -*- encoding=utf-8 -*-
import struct
# 八个字节
bin_str = b'ABCD1234'
print(bin_str)
# B 一个字节转换为一个整数
# >表示大端字节序
result = struct.unpack('>BBBBBBBB', bin_str)
print(result)
# H 两个字节转换为一个整数
result = struct.unpack('>HHHH', bin_str)
print(result)
# L 四个字节转换为一个整数
result = struct.unpack(