0

私は tcp の変更を必要とする研究作業を行っており、私のバージョンの TCP listen() 関数を実装したいと考えています。私の考えは、libpcap を使用TCP SYNして特定のポートからすべてのパケットをキャプチャし、生のソケットを使用して SYN/ACK を作成/送信することです。次の ACK パケット

私の質問は

  1. 従来の/通常の TCP スタック listen() はどのように実装されていますか? メカニズムを簡単に説明できる人はいますか?
  2. 私のアイデアは実現可能ですか?トリック/バリアはありますか?
  3. 必要なものを実現するために利用できる他のライブラリ/ソース スニペットはありますか?

ありがとう!

4

2 に答える 2

0

がどのように実装されているか知りたい場合listen()は、無料のオペレーティング システムで実装のソース コードを参照するだけでよいのですが、基本的には、ソケットに関連付けられたカーネルのデータ構造にフラグを設定して、将来の着信SYNパケットがSYN|ACK応答を取得します (またSYN、アプリケーションが を使用してキューからそれらを排出する前に応答する必要があるそのような の数を構成しますaccept())。

あなたのアイデアは実装可能ですが、それは大変な作業です: ユーザー空間に TCP スタックを実装することになります。研究のために接続を開いたり閉じたりするだけでよい場合は、ほとんどの作業 (スロー スタート、ウィンドウ スケーリング、および TCP スタックが持つべきすべてのデータ転送機能を含む) を実装する必要がなくなりますが、それでも大きな仕事。

必要なことの 1 つは、カーネルが着信 TCP パケットに応答しないようにするためのファイアウォール ルールです。これにより、代わりにコードがそれらに応答できるようになります。

于 2013-04-12T14:52:41.183 に答える
0

これはできません。Libpcap は、パケットがさらに処理されるのを止める方法を提供しないため、すべてのパケットは引き続き TCP/IP スタックの残りの部分によって処理されます。したがって、SYN は確認され、SYN/ACKS への ACK は TCP 接続を作成し、FIN はそれらを終了します。

于 2013-04-12T23:02:16.153 に答える