例えば telnet は、基本的にはキーボードから入力された文字を 接続先へ送る、逆に接続先から送られてきた文字を画面に表示す るという風に書かれています。
このような書き方が可能なのは、そのようなアプリケーション インターフェイスが用意されているからです。インターネットの 場合、このような、「あたかも1本の回線がつながっている」 ような状態を作り出す層が存在していて、これを TCP 層と 呼んでいます。TCP 層は、一連のデータの流れを漏れなく順序良く 送る役目を果たす層です。
TCP 層の下には IP 層があります。TCP 層は、IP 層に対し、 データの流れをぶつ切りにして、送り先を指定して渡します。 この時、ぶつ切りにしたデータは受信側で順序良く並べる 必要がありますから、番号などのヘッダをつけます。これを TCP ヘッダと呼びます。
IP 層では、送り先から、どの(物理)インターフェイスを 経由して送ればよいかを決定して、物理インターフェイスに ぶつ切りデータを送り出します。この時、もちろん相手先や 自分のアドレスを書いたヘッダを付けて送り出します。この ヘッダを IP ヘッダと呼びます。
さて、ようやく、データは物理インターフェイスへやって きました。この時ぶつ切りにされた IP のデータは、それを 一かたまりとして送らなければなりません。なぜなら、 IP ヘッダの部分がどこであるかわからなくなるからです。 このデータのかたまりをどのようにやり取りするかを決めて、 IP のデータが IP のデータとして正しく相手に伝わるように するのが、この層の役割です。この層をデータリンク層、 またはネットワークインターフェイス層と呼びます。
PPP や SLIP は、このデータリンク層での一つの規約 (プロトコル)です(実際には PPP の場合は、もう少し 複雑ですが、この点は、後で説明していきます)。
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 のプロトコルは、これでおしまいです。非常に簡単です。
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 の範囲のデータが来たら、無視されます。
ユーザは、まず相手方に電話をし、接続が行われたら、モデム経由 でログイン手続きを行います(スクリプトなどで自動化されている ことが多い)。
ログインが無事済むと、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