ネットワーク(4)
リンク層
- Ethernet & Fast Ethernet
- FDDI, ATM
- SLIP, PPP
- Loopback
シリアル回線
SLIP (Serial Line IP)
シリアル回線(RS232C)上のIPデータグラムのための単純なカプセル化(RFC1055)。
- データの最後に 0xc0 (END キャラクタ)をつける。
ノイズの影響を無くすために、先頭にも 0xc0 をつけるのが一般的である。
- データが 0xc0 の場合は、代りに 0xdb, 0xdc を送る。
0xdb はSLIP ESC キャラクタと呼ばれる。
- データが 0xdb と同じ場合、代りに 0xdb, 0xdd を送る。
欠点
- point-to-pointリンクの双方の端が、それぞれ相手のIPアドレスを
前もって知っておく必要がある。
- タイプ・フィールドが無いので、他のプロトコルと混ぜてシリアル
ラインを使うことができない。
- SLIPで付加できるチェックサムはない。
IPパケットを送るためには、本来のデータ(たとえ1byteでも。
対話的な利用では1バイト毎にパケットが飛ぶことが多い)に
IP ヘッダ (20byte) とTCP ヘッダ (20byte) が必要となる。
SLIPは遅い回線で使われることが多いので、このオーバーヘッドは
無視できない。
CSLIP (圧縮 SLIP) は、40バイトのヘッダを3〜5バイト程度に圧縮して送る。
PPP (Point-to-Point Protocol)
SLIPの欠点を解決したプロトコル (Fig.2.3)。
- リンクを確立し、設定を変更する、リンク制御プロトコル (LCP) があり、
さまざまなオプションを取り決めることができる。
- ネットワーク制御プロトコル (NCP) により、各種のネットワーク層
プロトコル (IP, AppleTalk, ...)に対応できる。
- フレームの最初と最後には 0x7e (フラグ・バイト) がおかれる。
それに続いて、0xff (アドレスバイト), 0x03 (制御バイト),
プロトコル・フィールド (0x0021: IPパケット、0xc021: LCP, 0x8021: NCP)が続く
- 0x7e は 0x7d, 0x5e として送られる。
- 0x7d は 0x7d, 0x5d として送られる。
- デフォルトでは0x20以下の値(x)も 0x7d, (0x20+x) として送られる。
- NCP を用いて (CSLIPと同等な)ヘッダの圧縮の使用を開始することができる。
また、たいていの場合、値が一定の「アドレス・バイト」や「制御バイト」を
省略し、さらに、プロトコル・フィールドの大きさを1バイトにしてしまう。
ループバック・インターフェイス
同一ホスト上のクライアントとサーバがIP通信するには
loopback interface を用いる。
127.0.0.1 localhost
ループバック・インターフェイスや自ホストのIPアドレス宛の
IPパケットは、ネットワークに送り出されることはない。
- 127.0.0.1 に送られたパケットは、IP入力として扱われる。
- 自ホストのIPアドレスに送られたパケットは、ループバック
インターフェイスに送られる。
- ブロードキャスト・アドレスに送られるIPパケットは、
ループバック・インターフェイスにコピーしてから、Ethernetに
送り出す。
MTU
MTU (最大転送ユニット, Max Transfer Unit) は、そのリンク層で一度に
送ることのできる最大のデータサイズを表す(図2.5)。
MTUを調べる (Linux)
[nitta@degas ~]$ netstat -ni
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags
lo 3584 0 982286 0 0 0 982286 0 0 0 BLRU
eth0 1500 0 2775 0 0 0 2223 0 0 0 BRU
MTUがIPパケットよりも小さい場合は、IPパケットは小さく分けられて
(フラグメント、fragment)送られる。
2台のホストの間がネットワークで結ばれているとき、その
経路のうちの最小のMTUを、パスMTUと呼ぶ。
シリアル回線のスループット
Fig.2.5 「典型的なMTU」の 「PPP(低い遅延レベル)」ではMTUが296バイトに
なっている。これはハードウェアからの要請ではなく、対話環境における
遅延時間を小さくし、かつ、大きいサイズのパケットもそれなりに
効率よく送るためにこのサイズが使われている。
MTUを小さくすると、データに対するヘッダの割合が大きくなり
転送効率が悪くなる。
しかし、MTUを大きくすると、小さいパケット(対話的な環境で
流れるパケットのほとんどがこれ)を、たとえ大きいパケット
よりもキューの前につなぐとしても、その時点で転送中の
大きいパケットを待つ必要はあるので、遅延時間(期待値としては、
最大のパケットを送る時間の半分)が大きくなってしまう。
IP層は、データにIPヘッダとTCPヘッダを合計40バイト付加して、
リンク層(PPP)に渡す。
PPPは、これらのヘッダを(3〜5バイト程度に)圧縮して通信するが、
それはIP層には見えない。したがって、296バイトとなっているが、
MTUと同じサイズのデータのとき、実際に送られているのは
256バイト (+ 3〜5バイト)である。
PPPのヘッダでさらに5バイト付加されると仮定すると、
実際に送られているデータは 266バイト程度と仮定できる。
[例] 9600bps、8bitデータ長 (non-parity), 1 start bit, 1 stop bitの回線で送る場合
1バイトのデータを送る時間 (8+1+1)/9600 秒
266バイト送る時間は 266 * (8+1+1)/9600 = 0.277083... 秒
このときの対話環境の平均待ち時間 = 最大サイズのパケットを送る時間/2
= 0.1385... 秒
MTUを1000と仮定すると、パケットの大きさは 1000-40+5+5=970 バイト程度。
これを送る時間は 970 * (8+1+1)/9600 = 1.010... 秒。
このときの対話環境の平均待ち時間 = 最大サイズのパケットを送る時間/2
= 0.505... 秒 ←とても待てない