2017-06-28 12 views

答えて

1

独自のユーザーレベルのネットワークスタックを作成できないようなPythonの本質は何もありません。ただし、生のイーサネットドライバにアクセスして、生のイーサネットパケットを送信する必要がある場合は、オペレーティングシステムでサポートされている必要があります。

私は何が起こっているのか漠然とした絵を描こうとします。あなたがすでに知っているかもしれない(またはしていない)かもしれません。従来のオペレーティングシステムでは、プログラムがハードウェアとやりとりできるように、システムコールレイヤと呼ばれる抽象化が用意されています。この抽象化は、ハードウェアの詳細のいくつかを抽象化する点で、やや高水準です。 Unixの抽象化を実装するオペレーティングシステムでは、ネットワーク抽象化システムコールの1つがsocket(int domain, int type, int proto)であり、新しいソケットエンドポイントが作成されます。ここで何が抽象化されていますか?ほとんどのプロトコルでは、データリンクレイヤの詳細を処理する必要はありません。明らかに、ここでいくつかの柔軟性が失われてしまいます(ハードウェアにアクセスできない場合は、他のOSデータ構造を壊す心配はありません)、利便性があります(ほとんどの人はユーザーレベルのネットワークスタックを実装する必要はありません) )。

したがって、カーネルを変更せずに「できる」ことができるかどうかは、OSが提供する抽象概念によって異なります。 Linuxはthe packet(7)インターフェイスを提供しており、AF_PACKETをソケットドメインとして使用できます。 manページによると、 "パケットソケットは、デバイスドライバ(OSIレイヤ2)レベルでrawパケットを送受信するために使用されます。"

これはPythonでアクセスできますか? You bet!

import socket 
s = socket(socket.AF_PACKET, socket.SOCK_RAW) 
s.bind(("eth1", 0)) 

sが今、あなたは生のパケットを送信するために使用できるソケットでなければなりません。これを行う方法の詳細については、他のStack Overflowポストを参照してください。彼らは私よりも優れた仕事をしています。このテクニックは、Windowsでも同様に動作するはずです。同様の抽象化を提供していると思われます。

+0

本当に良い答えです。私のクライアントが達成したいことについては、私はそれを「いいえ」(または、少なくとも、有用ではない)として要約するつもりです:) Thx – RightmireM

関連する問題