SLIP と PPP

Copyright (c) 1996, Hirofumi Fujii
Talk given at KEK-DD Internal Seminar (15-July-1996)

1. はじめに

最近個人ベースでインターネットに接続する事例が増えて きました。その時、使われるのは、電話線などを媒体としてモデム による接続が主体です。その時用いられる接続方法が SLIP や PPP と 呼ばれているものです。ここでは、SLIP や PPP とは、どのような ものであるか、どうしてこのようなものが用いられるのかを 考えてみましょう。

2. ネットワークアプリケーションプログラム

ネットワークアプリケーションプログラムには、様々なものが あります。遠隔端末を実現する telnet やネットワーク経由で ファイルを転送する ftp などは古くから用いられてきました。 最近では World-Wide-Web browser なども多く用いられています。 これらのプログラムは、ネットワーク先とは、あたかも1本の 回線が張られているかのように書かれています。

例えば telnet は、基本的にはキーボードから入力された文字を 接続先へ送る、逆に接続先から送られてきた文字を画面に表示す るという風に書かれています。

このような書き方が可能なのは、そのようなアプリケーション インターフェイスが用意されているからです。インターネットの 場合、このような、「あたかも1本の回線がつながっている」 ような状態を作り出す層が存在していて、これを TCP 層と 呼んでいます。TCP 層は、一連のデータの流れを漏れなく順序良く 送る役目を果たす層です。

TCP 層の下には IP 層があります。TCP 層は、IP 層に対し、 データの流れをぶつ切りにして、送り先を指定して渡します。 この時、ぶつ切りにしたデータは受信側で順序良く並べる 必要がありますから、番号などのヘッダをつけます。これを TCP ヘッダと呼びます。

IP 層では、送り先から、どの(物理)インターフェイスを 経由して送ればよいかを決定して、物理インターフェイスに ぶつ切りデータを送り出します。この時、もちろん相手先や 自分のアドレスを書いたヘッダを付けて送り出します。この ヘッダを IP ヘッダと呼びます。

さて、ようやく、データは物理インターフェイスへやって きました。この時ぶつ切りにされた IP のデータは、それを 一かたまりとして送らなければなりません。なぜなら、 IP ヘッダの部分がどこであるかわからなくなるからです。 このデータのかたまりをどのようにやり取りするかを決めて、 IP のデータが IP のデータとして正しく相手に伝わるように するのが、この層の役割です。この層をデータリンク層、 またはネットワークインターフェイス層と呼びます。

PPP や SLIP は、このデータリンク層での一つの規約 (プロトコル)です(実際には PPP の場合は、もう少し 複雑ですが、この点は、後で説明していきます)。

ネットワーク4層モデル


3. SLIP

さて、IP 層から一かたまりのデータが渡された時、どのように して相手に送るのでしょうか? まず、非常に単純なプロトコルである SLIP の場合を見て みましょう。

SLIP は、一般に RS-232-C で使われるプロトコルだと思われ がちですが、必ずしもそうではありません。8bit データを 透過に送れる Point-to-Point の接続であれば、使えます。

さて、一かたまりであることが重要であるわけですから、 かたまりの区切りを設定する必要があります。SLIP では この区切りマークとして、0xc0 を使います。プロトコル上は このマークを、かたまりの終端につけることになっていますが、 実際には両端につけることが多く行われています。回線の ノイズに対して強くなるからです。


Transparency
さて、区切りマークとして 0xc0 を使ってしまったので、 データの中にある 0xc0 を送る場合の対策をたてなければいけ ません。SLIP では、データ中にある 0xc0 は 0xdb と 0xdc の2オクテット(バイト)にして送ることになっています。 これでデータ中には 0xc0 は現れないことになったわけです。

しかし、ここでまた問題が起こります。データとしての 0xdb はどうすればよいのでしょう。 SLIP では、0xdb は 0xdb と 0xdd の2オクテット (バイト)にして送ることになっています。 つまり、 0xdb の次には 0xdc または 0xdd しか来なくて (来たらエラー)、 0xdc はデータの 0xc0 を、0xdd はデータの 0xdb を表すと いうわけです。

SLIP のプロトコルは、これでおしまいです。非常に簡単です。


4. SLIP の問題点

上で述べたように SLIP は、非常に簡単なのですが、問題も 多く抱えています。 などがあります。PPP は、このような問題点を解決する手段として 登場しました。

5. PPP のフレーム

PPP も、SLIP と同様、データの一かたまりを示すのに、区切り マークを入れます。これを Flag Sequence と呼びます。0x7e が使われます。 SLIP とは異なり、これは先頭に置かれます。 次に Address と呼ばれるデータ 0xff が付加されます。 更に Control と呼ばれるデータ 0x03 が付加されます。 続いて Protocol と呼ばれる2オクテット(バイト)のデータが 付加されます。 この後にようやく送るべきデータが来ます。 しかし、それだけでは終わりません。このデータの後に Frame Check Sequence (FCS) と呼ばれるデータが2オクテット(4オクテットの 場合もある)付加されます。 SLIP 同様、回線ノイズに強くするため、末尾にも一つ Flag Sequence を 付けて送り出すのが普通です。 この Address や Control や Protocol や FCS が、どのように使われる かは、後の節で説明するとして、その前に PPP の Transparency に ついて述べましょう。

SLIP と PPP のフレーム
SLIP と PPP のフレーム


PPP の Transparency
PPP での Transparency は、SLIP より柔軟に作られてます。 SLIP 同様 Flag Sequence が、それ以外の場所に現れないように して、8bit すべてのビット組み合わせを送れるようにすることが ここでの主題になります。

PPP では、XON (0x11) や XOFF (0x13) がフロー制御に 使えるように、XON や XOFF も別のコード(列)に置き換えられる ように、また、回線によっては NUL (0x00) が落とされたりする ことがあるので、NUL も別のコード(列)に置き換えられるように することも念頭におかれていて、次のような手法をとります。

0x00 から 0x1f までのコードは 0x7d に続けて、そのコードと 0x20 との XOR をとって送る。例えば XON (0x11) -> 0x7d 0x31 XOFF (0x13) -> 0x7d 0x33 のようにして送ります(ただし、XON/XOFF を使わない場合はリンク 設定時の交渉で XON/XOFF をデータとして送ることもあります)。

また、0x5e を除く 0x40 から 0xff までのデータも同じ方法で送って もよいことになっています。

デフォルトでは、0x00 から 0x1f までのデータは、すべてこの方法 でやり取りすることになっています。その場合は、0x00 から 0x1f の範囲のデータが来たら、無視されます。


6. PPP の接続手順

本来なら、ここで PPP の状態遷移について述べるべきなのですが、 具体的に何をするかを示した方が理解しやすいと思われます。 そこで、PPP でネットワーク接続する時に、具体的にどのような やり取りが行われるかを述べます。 接続形態としては、個人ユーザが電話とモデムを通じて、リモート のネットワークに接続することを想定します。

ユーザは、まず相手方に電話をし、接続が行われたら、モデム経由 でログイン手続きを行います(スクリプトなどで自動化されている ことが多い)。

ログインが無事済むと、PPP のセッションを開始します。これを ユーザ側から手動で開始する場合もありますが、多くは自動的に 開始される設定になっています。

さて、ここからがいよいよ、PPP の出番です。

まず、どちらかから(あるいは両方から)、先に述べた Protocol の部分に 0xc021 を入れて、設定データを送ります。この 0xc021 というのは、送っているデータが Link Control Protocol (LCP) のデータであることを示します。 最初に送るのは Configure-Request です。この Configure-Request で様々なパラメータを交渉で決めます。

次に、LCP の Configuration で、Authentication Protocol を 使うことが決められたならば、Authentication Protocol を使って 認証を行います。通常 0xc023 (Password Authentication Protocol (PAP)) が使われます。また、ログイン時の認証で代用して、PPP の 認証を使わない場合も多くあります。

これらが確立すると、Network Control Protocol を使って、 ネットワーク層のパラメータを決めます。ここで注意すべきは、 使用するネットワーク毎に、決めるという点です。例えば IP ネットワークであれば IP Control Protocol を使って、IP ネットワークに必要なパラメータを決めます。AppleTalk で あれば、AppleTalk Control Protocol を使って AppleTalk に 必要なパラメータを決めます。IP ネットワークの場合、 IP アドレスの交渉や Van Jacobson 圧縮を使用するかしないか などが、この段階で決められます。

Network 層の切断は、やはり Network Control Protocol を 使って行います。同様に DataLink 層の切断は Link Control Protocol を使って行います。

このように、PPP では、パケットに Protocol と呼ばれるフィールド を付け加えることにより、自動的に相手と交渉しながら設定を決めたり、 Network 層や DataLink 層の確立や切断も自動的に行えるように しているのです。


参考資料

SLIP の Document

0047 Nonstandard for transmission of IP datagrams over serial lines:
     SLIP. J.L. Romkey. August 1993. (Format: TXT=12578 bytes) (Also
     RFC1055)

PPP の Document

0051 The Point-to-Point Protocol (PPP). W. Simpson, Editor. July 1994.
     (Format: TXT=151158 bytes) (Obsoletes RFC1549) (Also RFC1661,
     RFC1662)

Assigned Numbers

0002 Assigned Numbers. J. Reynolds, J. Postel. October 1994. (Format:
     TXT=458860 bytes) (Also RFC1700)

SLIP の Frame
   Data
   Flag                         0xc0

SLIP の Transparency
   0xc0 は 0xdb 0xdc
   0xdb は 0xdb 0xdd

PPP の Frame

   Flag                         0x7e
   Address                      0xff
   Control                      0x03
   Protocol(1 or 2 octets)
      Information
      Padding
   Frame Check Sequence(2 or 4 octets)

PPP の Transparency
   0x20 より小、または 0x5e を除く 0x40 から 0xff
   まで、
   0x7d に続けて 0x20 と XOR したもの

PPP の Protocol

0021   Internet Protocol
0023   OSI Network Layer
0027   DECnet Phase IV
0029   Appletalk
002b   Novell IPX
002d   Van Jacobson Compressed TCP/IP
002f   Van Jacobson Uncompressed TCP/IP
0039   AppleTalk EDDP
003b   AppleTalk SmartBuffered
003f   NETBIOS Framing

8021   Internet Protocol Control Protocol
8023   OSI Network Layer Control Protocol
8027   DECnet Phase IV Control Protocol
8029   Appletalk Control Protocol
802b   Novell IPX Control Protocol
803f   NETBIOS Framing Control Protocol
80fd   Compression Control Protocol

c021   Link Control Protocol
c023   Password Authentication Protocol
c025   Link Quality Report
c027   Shiva Password Authentication Protocol
c029   CallBack Control Protocol (CBCP)

LCP/IPCP における Information Field の Format
   Code      1 octet
   ID        1 octet
   Length    2 octets
   Data         :

LCP/IPCP における Code
   1   Configure-Request
   2   Configure-Ack
   3   Configure-Nak
   4   Configure-Reject
   5   Terminate-Request
   6   Terminate-Ack
   7   Code-Reject
   8  *Protocol-Reject
   9  *Echo-Request
  10  *Echo-Reply
  11  *Discard-Request
  12  *Identification
  13  *Time-REmaining
(* LCP only)

LCP/IPCP Configuration に関する Data Field の Format
   Type        1 octet
   Length      1 octet
   Data            :

LCP Configuration Type
   0   Reserved
   1   Maximum-Receive-Unit
   2   Async Control Character Map
   3   Authentication-Protocol
   4   Quality-Protocol
   5   Magic-Number
   7   Protocol Field Compression
   8   Address and Control Field Compression

IPCP Configuration Type
   1   IP Addresses (only for backwards compatibility)
   2   IP Compression Protocol
   3   IP Address