Реализация стека Python TCP
Есть ли библиотека Python, которая реализует автономный стек TCP?
Я не могу использовать обычную библиотеку сокетов Python, потому что я получаю поток пакетов через сокет (они передаются мне через этот сокет). Когда я получаю пакет TCP SYN, адресованный определенному порту, я хотел бы принять соединение (отправить syn-ack) и затем получить данные, отправленные другим концом (ack'ing соответственно).
Я надеялся, что уже написан какой-то стек TCP, который я мог бы использовать. Есть идеи? В прошлом я использовал lwip для проекта C - что-то в этом роде в python было бы идеально.
5 ответов
Вы не говорите, на какой платформе вы работаете, но если вы работаете в linux, я бы открыл интерфейс tun/tap и вернул IP-пакеты обратно в ядро как настоящий сетевой интерфейс, чтобы ядро могло делать все это. хитрый TCP материал.
Вот как (например) работает OpenVPN - он получает необработанные IP-пакеты через UDP или TCP и туннелирует их обратно в ядро через интерфейс tun/tap.
Я думаю, что теперь есть интерфейс tun/tap для windows, который был разработан для порта OpenVPN для windows.
Взглянув на Scapy, похоже, он сможет справиться с этими ситуациями низкого уровня. Я не использовал это сам, поэтому я не могу подтвердить, что он делает то, что вы объяснили; Я только просмотрел документацию.
Я знаю, что это не связано напрямую с Python, но если вы хотите выполнять интенсивную сетевую обработку, вы должны рассмотреть Erlang вместо Python. Просто предложение на самом деле... вы всегда можете попробовать сделать это с Twisted... если вы чувствуете себя предприимчивым (и у вас много времени на вашей стороне);-)
Возможно, вы сможете использовать модуль ctypes для импорта lwip и использовать его снова.
Если вы уже привязаны к программному обеспечению на другом конце сокета, который пересылает вам пакеты TCP, то, возможно, TCPWatch покажет вам, как получить пакеты SYN. SCAPY, безусловно, отлично подходит для отправки именно тех пакетов, которые вы хотите, но я не уверен, что он будет работать как прокси.
http://hathawaymix.org/Software/TCPWatch
Однако, если вы не привержены тому, что находится на отправляющей стороне, тогда рассмотрите возможность использования Twisted Conch или Paramiko для пересылки SSH. Даже если вам не нужно шифрование, вы все равно можете использовать его с Blowfish, который мало влияет на ваш процессор. Это не означает, что вам нужен Conch на другом конце, так как SSH стандартизирован, поэтому любое программное обеспечение SSH должно работать. В мире SSH это обычно называют "переадресацией портов", и люди используют клиент терминала SSH для входа на сервер SSH и настройки туннеля переадресации портов. Conch и Paramiko позволяют встроить это в приложение Python, чтобы клиенту SSH-терминала не требовалось.