在python中模拟类似路由器的组件

问题描述 投票:-1回答:1

根据我的理解,路由器接收数据包流,并通过保留已连接设备的表并进行一些查找和查找(简单地将其解释为here)将其重定向到最终设备。现在,我似乎理解的重要一点是没有绑定,它只接收数据包流并将其重定向。

[我想做的基本上是一个“中间人”组件,在该组件中我接收到数据包流,进行一些处理,然后简单地转发它,这应该与协议无关。

我一直在尝试使用与SOCK_RAW捆绑在一起的AF_PACKET,但取得了一些成功,但是我对几件事感到困惑。

我的代码:

import socket
# 0x0800 corresponds to ETH_P_IP on linux
sock_r = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, htons(0x0800))

while True:
    _bytes, _addr = sock_r.recvfrom(65536)
    # don't listen to loopback
    if _addr[0] != 'lo': 
        print(_bytes)

从这里

  1. _bytes是否包含所有数据包信息?
  2. 它同时包括TCP和UDP吗?
  3. 我将如何转发数据包?
  4. _bytes是否转换为正确的字节序,还是必须注意?
python sockets networking raw-sockets
1个回答
-1
投票

它只是获取一个数据包流并将其重定向。

不,路由器分别处理每个数据包,而不是数据包流。这是非常重要的,因为它是分组交换网络的基础,并且是优于电路交换网络的优势。路由是动态的,这意味着如果路径中发生某些情况,则下一个数据包路径可能会自动不同。路由器使用路由协议填充其路由表,并且路由协议不断在路由器之间进行通信,以使每个路由表保持最新。

路由器也有其他要求(请参阅RFC 1812, Requirements for IP Version 4 Routers)。例如,路由器必须减少数据包头中的TTL,并且对于IPv4,由于数据包头已更改,因此必须重新计算IHL。

[您还必须了解路由器并不关心数据包有效载荷内部的内容,因此更改有效载荷并不是路由器要做的,但是更改有效载荷肯定会破坏传输协议,因为必须重新计算传输协议的校验和,否则,目的地将仅将损坏的有效载荷掉落。

© www.soinside.com 2019 - 2024. All rights reserved.