Python:如何在数据包级别读取请求的详细信息

Posted

技术标签:

【中文标题】Python:如何在数据包级别读取请求的详细信息【英文标题】:Python : How to read details of a request at Packet level 【发布时间】:2021-10-19 11:12:36 【问题描述】:

大家好!

我正在编写一个使用套接字的 python 网络服务器,以具体了解 HTTP 请求的工作原理。到目前为止,我能够通过打开的套接字捕获 HTTP 请求。代码是这样的:

import socket
from time import sleep
c = None #Client socket1
addr = None #Client address1
    
server_socket1 = socket.socket() #by default it is SOCK_STREAM (TCP) and has porotocal AF_INET (IPv4) 

server_socket1.bind(('127.0.0.1',9999)) #server machine's ip and port on which it will send and recieve connections from

server_socket1.listen(2) #We will only accept two connections as of now , one for each client
print("Server started successfully!!!")
print("Waiting for connections...\n\n")

while (((c is None)and(addr is None))):
    if((c is None) and (addr is None)):
        c,addr = server_socket1.accept()
        print("User connected to client1 socket!!")
        print("Client connected ip address "+str(addr))
        

        
while True:
    msg = c.recv(4096)
    if(msg!=None):
        #print(msg)
        headers, sep, body = msg.partition(b'\r\n\r\n')
        headers = headers.decode('utf-8') 
        print(headers)

        html_body = "<html><body><h1>This is a test</h1><p>More content here</p></body></html>"
        response_headers = 
        'Content-Type': 'text/html; encoding=utf8',
        'Content-Length': len(html_body),
        'Connection': 'close',
        

        response_headers_raw = ''.join('%s: %s\r\n' % (k, v) for k, v in response_headers.items())
        response_proto = 'HTTP/1.1'
        response_status = '200'
        response_status_text = 'OK' # this can be random

        # sending all this stuff
        r = '%s %s %s\r\n' % (response_proto, response_status, response_status_text)
        c.sendall(r.encode())
        c.sendall(response_headers_raw.encode())
        c.sendall(b'\r\n') # to separate headers from body
        c.send(html_body.encode(encoding="utf-8"))

        sleep(5)

输出:

从浏览器向打开的套接字发送请求:

在浏览器上反映的捕获/传入请求:

现在,我要做的是能够识别数据包的 TCP 信息,即标志。 有什么方法可以使用上述实现来查看?

任何线索将不胜感激。

~问候

【问题讨论】:

【参考方案1】:

当您的 TCP 套接字产生数据时,内核中的 TCP 模块已取消分段数据,并且各个数据包已被丢弃——仅保留携带的字节流。

为了捕获单个数据包,您需要连接到低得多的网络堆栈。常见的方法是直接使用原始 IP 套接字,或通过 libpcap 库,或通过 tcpdumpwireshark 实用程序之一。

【讨论】:

任何代码 sn-ps 或链接,我可以如何在 Python 中做到这一点?我需要在已经存在的代码库中实现多少更改? ~TIA

以上是关于Python:如何在数据包级别读取请求的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

从商详页看多线程编排

Fiddler抓包工具

Kafka集群搭建与测试详细教程 | 附带详详细截图

Kafka集群搭建与测试详细教程 | 附带详详细截图

Kafka集群搭建与测试详细教程 | 附带详详细截图

python和数据库比哪个处理数据块