2011-01-20 8 views
21

でのHTTP GETリクエストを作成することができます。のPython-Scapyなど-どのように私は、私はちょうどネットワークプログラミングに入る、適度なプログラマ午前パケットレベル

一般的にネットワークの私の理解を向上させる試みとして、私はパケットレベルから、いくつかの基本的なHTTPアクションを実行しようとしています。私の質問はこれです:どのようにSCAPYのようなライブラリを使用してHTTP GETリクエストを構築し、パケットレベルでアイテムをアソシエートすることができますか?私はこれが奇妙に聞こえるかもしれないことに気がついていますが、それを詳述している情報を見つけることができないようで、PAROSとEtherealの私自身の試みは...満足できるものではありません。

ご協力いただきありがとうございます。

Trimiert

+0

私はCのように、Pythonのより低いレベルの言語でこれを行うにはお勧めします/ C++。 – orlp

+13

@ nightcracker:私は強く反対します。 Scapyを使用すると、CまたはC++プログラマが必要とするものを心配することなく、パケットを非常に簡単にビルドして送信できます。ネットワークの仕組みに興味があるなら、Scapyが道のりです。実際のサーバーを作成する場合は、おそらく異なる言語が適しています。そして、私はこれを、生活のためのネットワークデバイス用のCコードを書く人として言う。 – nmichaels

+3

@OP:nmichaelsが言うことに耳を傾けてください。私はすべてについての(unbased)意見を持っているだけで16歳です。 – orlp

答えて

34

あなたは完全な3ウェイハンドシェイクを行いたい場合は、手動で行う必要があるでしょう。あなたのSYNパケットと

スタート:

>>> syn = IP(dst='www.google.com')/TCP(dport=80, flags='S') 
>>> syn 
<IP frag=0 proto=tcp dst=Net('www.google.com') |<TCP dport=www flags=S |>> 

その後、サーバからSR1の作品をSYN-ACKパケットを受け取ります。

>>> syn_ack = sr1(syn) 
Begin emission: 
Finished to send 1 packets. 
* 
Received 1 packets, got 1 answers, remaining 0 packets 

>>> syn_ack 
<IP version=4L ihl=5L tos=0x0 len=44 id=424 flags= frag=0L ttl=55 proto=tcp chksum=0x2caa src=74.125.226.148 dst=10.20.30.40 options=[] |<TCP sport=www dport=ftp_data seq=3833491143 ack=1 dataofs=6L reserved=0L flags=SA window=5720 chksum=0xd8b6 urgptr=0 options=[('MSS', 1430)] |<Padding load='\x00\x00' |>>> 

は、その後、あなたのTCPシーケンスおよびACK番号を設定してGETを送信します:次に、あなたのHTTP GETリクエストを送信

getStr = 'GET/HTTP/1.1\r\nHost: www.google.com\r\n\r\n' 
request = IP(dst='www.google.com')/TCP(dport=80, sport=syn_ack[TCP].dport, 
      seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A')/getStr 
reply = sr1(request) 
+0

ありがとうございます!私がまだ見たことのある最高の情報です。そして、はい、私は3ウェイ・シェイクを自分でやろうとしましたが、それは私のものと同じくらいでした。ありがとうございました! – Trimiert

+0

sniffを使用してhttpパケットをキャプチャし、後者にhttpヘッダーを挿入する方法はありますか? – fayyazkl

+3

@fayyazkl:それはそれ自身の質問でなければならない種類のものです。 – nmichaels

1

あなたはthe tutorialを見たことがありますか? HTTPリクエストを組み立てるために起こっているように、単にコピーして貼り付け、これが見えます:

>>> a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n" 
+1

はい、しました。しかし、それを送信するだけで動作していないように見え、パケットレベルでどのように動作するかはわかりません。 – Trimiert

+0

私にとってもうまくいきません。ちょうど永遠に受け取ろうとします。 –

+0

質問は、パケットレベルでhttp get要求を作成する方法を尋ねます。この答えはこれを明確にします。あなたがTCPハンドシェイクを行う必要があるという事実が仮定されています。レスポンスに何か問題があるとは思わないでください。しかし、TCPハンドシェイクについて知らない人は正しい答えを参照する必要があります。 –

関連する問題