e知識「e-chishiki.com」では、インドでの著名なIT著者、IT教育者、eセキュリティーの大家により作成された様々な種類のプログラミング言語に関する技術的なコンテンツを知識情報データーベースとして提供します。
ハッキング防止シリーズ
ステップバイステップ イーサネット プログラミング
ヴィジェイー・ムッキー
PPP プロトコルが信頼できないのではなく、低速で信頼性の低い電話回線が問題なのです。ユーザーと PPP サーバーとの間で、常にいくらかのパケット損失が発生します。インターネット自体の信頼性は非常に高いと言ってよいでしょう。通信線のほとんどが光ファイバで構成されているからです。「鎖の強さを決める最も弱い環」が電話回線ですが、ユーザーと ISP の間は、この電話回線で接続されます。
大勢の人々、たとえば大企業の従業員たちがネット サーフィンしたいという場合に、PPP を使用して全員のニーズを満たすことは不可能です。多くの組織は、ビルのすべての回線がモデム通信で話し中になることは望まないので、LAN を使用してインターネットに接続するという方法を選び、業務に支障が出ないようにしています。LAN を実現する方法として最もよく使われているのが、イーサネットです。
概要と初期処理
イーサネットでは、LAN 上のすべてのコンピュータの NIC (Network Interface Card) が 1 本のケーブルで結ばれています。データ リンク層には、マスタ/スレーブやサーバー/クライアントといった概念はありません。すべてのコンピュータに同じ優先度が与えられます。すべてのコンピュータの個々のカードに、48 ビットのイーサネット アドレスが割り当てられています。これは、IP アドレスと同様に一意です。TCP/IP パケットをイーサネット LAN 上で送信することは実に簡単です。次に示すように、イーサネット フレームの間に 40 バイトの TCP/IP パケットを挿入すればよいのです。
| 1 | 2 | 3 | 4 | 5 | 6 | 1 | 2 | 3 | 4 | 5 | 6 | 1 | 2 | --------データ--------- | 1 | 2 | 3 | 4 |
|-----宛先---------| |-------送信元------| |タイプ| | --------TCP/IP----------------| | ---FCS-----|
宛先イーサネット アドレスは、このパケットが到達しなければならないコンピュータのアドレスです。送信元イーサネット アドレスは、ユーザーのコンピュータのアドレスです。タイプは 0x08 0x00 で、伝送データが IP カプセル化されていることを示しています。FCS (Frame Check Sequence) とはチェックサムで、この値はカードによって計算されます。たとえば、Windows ソケットによる通信を行うときに、接続方法がダイヤルアップ (PPP を使用) であるとします。関係するイーサネット ヘッダーは WinSock によって生成され、TCP/IP パケットはそのままです。PPP を使用する場合は、WinSock によって PPP ヘッダーが作成されます。
では、このようなしくみがわかったところで、ごく単純なイーサネット プログラムの作成に取りかかりましょう。その前に、必要なハードウェアとソフトウェアをチェックします。コンピュータ、イーサネット カード、およびイーサネット LAN が必要です。インターネットには接続していなくてもかまいません。
イーサネット プログラミングでは、カードと直接通信する必要はありません。カードはそれぞれ仕様が異なるので、標準的なインターフェイスとなるドライバ ソフトウェアをメモリに読み込む必要があります。そのために、FTP Software 社から「Packet Driver Specification」と呼ばれる仕様が発表されています。パケット ドライバは単純な TSR プログラムです。最初にこの TSR がメモリに読み込まれ、それ以降プログラムは TSR と通信し、TSR がカードと通信します。この方法の利点は、TSR でサポートされるカードであればどのメーカーのどのカードでも利用できることです。これは、ハードウェア ポートに対して読み取りや書き込みを行うよりもはるかに簡単です。
これまで、ne1000 (パケット ドライバ) は 8 ビット カードと 16 ビット カードの両方に対して使用されていますが、特に問題は起きていません。このプログラムについてもう 1 つ注意すべきことは、DOS でのみ動作するということです。ここでは TSR について述べますが、読者が TSR のプログラミング方法を理解していることを前提とします。ほとんどのパケット ドライバは、60h ~ 80h の割り込みをキャプチャします。したがって、プログラム側では getvect() を使用してメモリ内のパケット ドライバの位置を見つけ出し、ダブル チェックとして、3 バイト離れた位置に「PKT DRVR」という文字列があることを確認します。
3 バイト離れた位置を調べるのは、ドライバ内の最初の命令コードが jmp 命令で、その後にパケット ドライバ シグネチャがあるからです。この文字列型のシグネチャを見つけるために、strncmp() を使用して前述の文字列の有無を調べます。今はパケット ドライバが読み込まれていないので、次のように入力する必要があります。
c:\>ne1000 0x60 3 0x300 {Enter キー}
このコマンドは、ne1000 に、INT 0x60 をキャプチャし、IRQ を 3 に設定し、0x300 をハードウェア ポートとして設定することを指示します。16 ビット カードを使用している場合は、ne2000 を実行してください。このコマンドが正しく実行されない場合は、コンピュータに装着されているカードが非標準でなんらかの問題があることが考えられます。ネットワーク管理者に連絡してください。
プログラム 1
#include <stdio.h>
#include <dos.h>
main()
{
char *t="PKT DRVR";
int ok=1;
char *p;
unsigned char i=0x60;
while ( (ok) && (i<=0x80))
{
p=(char *)getvect(i);
p = p+3;
if ( strncmp(p,t,8) == 0)
ok=0;
else
i++;
}
if ( ok)
printf("No Packet found\n");
else
printf("Packet Found...%d\n",i);
}
この単純なプログラムは、コンピュータのメモリの中でパケット ドライバを検索し、見つかったかどうかを報告します。次のプログラムに進みます。
プログラム 2
#include <stdio.h>
#include <dos.h>
union REGS a,b;
struct SREGS s;
char *p;
main()
{
a.h.ah=1;
a.h.al=255;
int86x(0x60,&a,&b,&s);
printf("Version %d\n",b.x.bx);
printf("Driver Class %d\n",b.h.ch);
printf("Type %d\n",b.x.dx);
printf("Number %d\n",b.h.cl);
printf("Basic functionality %d\n",b.h.al);
p=MK_FP(s.ds,b.x.si);
printf("Name %s\n",p);
}
これらのパケット ドライバは、互いに競合する多数の標準に対応します。たとえば、DIX (Digital, Intel and Xerox) Internet、IEEE 802.3、ARCnet などです。そのために、FTP Software 社は「クラス」というラベルを考案しました。1 は DIX を表し、11 は IEEE 802.3 を表すといった具合です。
カードには、「タイプ」と呼ばれる一意の番号がハードコーディングされています。このタイプ番号は FTP Software 社によって割り当てられます。2 つのカードのクラスもタイプも同一である場合は、「番号」と呼ばれる 3 番目のラベルで区別します。さらに、すべてのカードはバージョン番号と名前も持っています。では、上記の小さなプログラムを見てみましょう。このプログラムでは、AH レジスタに 1、AL レジスタに 255 を入れて INT 60h を呼び出します。これで、レジスタからパケット ドライバのクラス、タイプ、番号、バージョン番号、および名前が得られるようになりました。
レジスタの 1 つ (b.h.ch) からクラスが返されます。値は 1、つまり、カードが DIX イーサネット標準をサポートしていることを示します。この標準は、イーサネットの最も一般的な形式です。したがって、この文書では DIX のみに注目することにします。タイプ (b.x.dx) は、メイン クラス内のメーカーの番号です。これらの番号は、FTP Software 社によって割り当てられます。2 つのカードのタイプもクラスも同じ場合は、番号 (b.h.cl) を使用して区別します。ここでは、クラスとタイプは一意であるとします。
つまり、タイプとクラスは実際には何でもよいのです。バージョン番号 (b.x.bx) は、実際には重要ではありません。プログラムにとって関係が深いのは、カードよりもパケット ドライバです。
そして、レジスタ (s.ds,b.x.si) にパケット ドライバの名前があります。ここでは ne1000 です。名前は、既に説明したように 8 ビット カードか 16 ビット カードかで異なります。
既に説明したように、すべてのイーサネット カードに 48 ビットのイーサネット アドレスが割り当てられています。この 48 ビットのうち、最初の 24 ビットはイーサネット カードのメーカーに割り当てられ、残りの 24 ビットをどのように使用するかは各メーカーが決定します。最初の 24 ビットを OUI (Organisational Unique Identifier) と呼びます。詳しく知りたい場合は、重要な意味を持つ最初の 2 ビットについて調べてみてください。ここで理解する必要があるのは、購入したイーサネット カードには必ずイーサネット アドレスがハードコーディングされているということです。2 の 48 乗というのは巨大な数なので、枯渇問題が進みつつある IP アドレスとは異なり、イーサネット アドレスが不足するという事態は現時点では起きていません。



