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
库,或通过 tcpdump
或 wireshark
实用程序之一。
【讨论】:
任何代码 sn-ps 或链接,我可以如何在 Python 中做到这一点?我需要在已经存在的代码库中实现多少更改? ~TIA以上是关于Python:如何在数据包级别读取请求的详细信息的主要内容,如果未能解决你的问题,请参考以下文章