36

私は独自の組み込みオペレーティング システムの QA エンジニアとして働いていました。彼らは独自のATN スタックを構築し、デバッガーを使用してステップ実行することは、私がネットワーキングに関して経験した中で最も目を見張るものがありました。スタックの各レイヤーがパケットのそれぞれの部分を構築するのを見るのは驚くべきものでした。そして最終的に、ビルドされたパケットをネットワーク上で確認できるようになったことには、より大きな意味がありました。

教育者として、この経験を他の人と共有したいと思います。TCP/IP スタックを通過する簡単な方法を知っている人はいますか? 理想的には、*BSD または Linux カーネルをデバッグするよりも簡単なものが欲しいのですが、これが唯一のオプションである場合は、このプロセスに関するいくつかのヒントとトリックが役立つでしょう。Visual Studio または Eclipse を使用してユーザー モードで実行できる C/C++ で記述された参照スタックが理想的です。

4

8 に答える 8

15

これはすべて、何に焦点を合わせたいかによって異なります。あなたの質問から、あなたが最も興味を持っているのは、さまざまなレイヤー全体のデータフローです (ユーザー空間ストリーム -> ケーブルの電圧)。

このために、完全なネットワーク シミュレーターであるhttp://www.csse.uwa.edu.au/cnet/を使用することをお勧めします。これにより、スタックのすべてのレベルをステップスルーできます。

実際のシステムでは、レイヤ 3、レイヤ 2、およびレイヤ 1 (チップ上のイーサネットおよび CRC チェック ファームウェア、ハードウェア MAC) が常に明確に区別されます。OS を使いこなすのに苦労し、実装の詳細が煩雑で学生を混乱させる可能性があります。Linux の場合、TCP/IP スタックの設計を理解するには、カーネル インフラストラクチャを説明する必要があります。

TCP/IP 部分のみに関心がある場合は、http://www.sics.se/~adam/lwip/のような組み込み TCP/IP スタックを使用することをお勧めします。これを単純なユーザー空間プログラムに組み込み、TCP/IP パケットを完全に構築できます。

TCP/IP スタックをステップスルーする際に対処できないネットワーク通信の側面がたくさんあることに注意してください。その間には、メディア アクセスや衝突などを制御する MAC チップがあります。その下には、すべてを電気/光信号に変換する PHY チップがあり、MAC と PHY 間の通信を処理するプロトコルさえあります。また、キューイング、同時実行性、OS リソース割り当てなどに関連するすべての側面が表示されているわけではありません。全体像には、これらすべての側面が含まれている必要があり、これはネットワーク シミュレータでのみ確認できます。

于 2012-01-05T13:19:53.987 に答える
13

仮想マシンで Minix を実行し、それをデバッグします。これにぴったりです。

Minix は TCP/IP スタックを備えた完全な OS であるため、必要なコードが用意されています。ただし、Linux/BSD とは異なり、そのルーツと設計目標は教育ツールであるため、明確にするためにある程度の複雑さを避けています。実際、これは Linus Torvalds が Linux を使い始めたときにハッキングを開始した OS です :-)

VirtualBox や VMware などの VM で minix を実行し、デバッグできます。Web サイトに説明があります: http://www.minix3.org/

于 2012-01-03T08:23:25.187 に答える
11

私は個人的に DOS と SoftICE を使用して TCP/IP スタックを学びました (おっと、私が年寄りだと漏らしました)。仮想マシンで DOS を使用し、TCP/IP ドライバーを介してデバッグする方法は、TCP/IP がどのように機能するかを理解することが目標であるため、はるかに簡単です。最新の OS はネットワーク I/O で多くの最適化を行っており、デバッグするのは簡単ではありません。

http://www.crynwr.com/には、オープン ソースのパケット ドライバーが多数あります。ソース コードを使用したデバッグは少し簡単になります。

于 2011-12-29T18:36:23.957 に答える
7

これはまさにあなたが探しているものではありませんが、これが役立つことを願っています

1995 - TCP/IP イラストレイテッド、第 2 巻: 実装 (Gary R. Wright 共著) - ISBN 0-201-63354-X

コードを並べて見ていきます。ほぼステップスルー経験。スティーブン氏も重要な変数について説明しています。ただ素晴らしい。注: 本書以降、コードが変更されている可能性がありますが、それでもすばらしいものです。

于 2012-01-04T01:11:19.460 に答える
6

おそらくlwIP プロジェクトは、オペレーティング システムなしで実行できるため、探しているものです。

Linux カーネルのデバッグに関しては、あまり単純ではありませんが、よく知られた方法があります。KGDBを使用します。Linux カーネルのデバッグ バージョンを仮想マシンまたは別のボックスにインストールします。そして、GDB をこのマシンにリモート接続します。おそらく、テキストのみのインターフェースではなく、GDB フロントエンドを使用したいと思うでしょう。より有能な人々からのカーネルデバッグの詳細が必要な場合は、質問に「linux」タグを追加してください。

于 2011-12-30T16:57:07.827 に答える
3

私は実際に8051でTCP/IPスタックの小さなサブセットを一度書いたことがありますが、それは非常に啓発的な経験でした。

何かを学ぶ最良の方法はそれをすることだと私は信じています。タスクが完了したら、他の開発者とフィードバックを取り、実装を他の既存の実装と比較します。

私の意見はここで偏っているかもしれませんが、組み込みプラットフォームでこれを行うことが最善の方法だと思います。あなたがやろうとしていることは非常に低レベルであり、PCは問題をさらに複雑にするだけです。組み込みチップには、邪魔になる運用システムがありません。それに加えて、単純な8051がping要求とtelnet呼び出しに応答するのを見るのは非常に満足です。

重要なのは、最初は小さく、完全なTCP/IPスタックを一度に作成しようとしないことです。最初にMACを処理し、次にIP、Ping、UDP、最後にTCPを処理するコードを記述します。

既存の実装を研究することは良い考えではないと思います。TCP / IPの実装は、目標とは関係のないコードで肥大化する傾向があります。

于 2012-01-05T18:27:32.347 に答える
1

私は TCP/IP 業界で働いています。BSD およびバリアントでは、関数 tcp_input() は、TCP の内部を探索するための理想的な出発点です。この関数にブレークポイントを設定し、ライブ システムでステップ実行すると、多くの情報が得られます。それが難しい場合は、ソースをブラウズして大まかに把握することができます。

http://fxr.watson.org/fxr/source/netinet/tcp_input.c

全体像を理解するには、少なくとも何週間もかかるでしょう。とても爽快です。:-)

于 2012-01-18T20:31:42.467 に答える