しいしせねっと
[技術資料室] [ネットワーク編] [フォーマット辞典] [Linuxメモ] [Java編]
[SMTP] [PPPoE] [Socks] [RADIUSメモ] [SSL/PKI] [ネットハード] [IRC]

ネットワーク編

Last update 

ネットワークまわりをわけてみました。
ここでは、プロトコル解説が中心、のはずです。ネットワークの基礎的な説明はまだまだ不十分ですね。
インストール系は、Linux設定メモの方へまとめています。

おしながき


情報家電

情報をどこから取ってくるか、どこへ送るか

情報家電と言われていますが、ピントはずれの機能ばかりがそろってきています。

何が必要で、何が必要ではないのでしょうか。ネットワークデバイス認証は、現在いくつかの実装がありますが、実用段階まで普及しているとはいえません。

情報家電でも、人との関係では操作するリモコン側、そして本体側というふうに分けることができます。

家電同士の接続は、AVケーブルの置き換えのような役割が主なところになると思います。

ネットワークに対応するには、人に対応する操作端末となるものが必要です。これは、PCや携帯電話となりますが、Webによる操作にするなどしても、共通のプロトコルが必要となります。Java Appletのように操作ソフトを家電からダウンロードし、Bluetoothのように個別の機器を認証して操作するという形体が最も考えられる形体です。そこまでできなければ、誰も興味を引くことはないでしょう。

複数の機器を操作するには、メッセンジャー形式がよいのかもしれません。相手が人ではなく家電製品になります。

Webサーバを備えるのか?

通信するには、ソフトウェアをクライアントとなるハードウェアに供給する機能が必要です。

1:1かn:nか

通信には、相手が複数ある場合、1対1の場合などがあります。TCP/IPは、複数対複数の例です。RS-232Cなどは1対1の例です。複数対複数の中には、1対1の接続を作り出すためのプロトコルが存在します。

XMPP

Google Talk などで採用されているらしいオープンな規格? XMLを使って通信だ。IETFにより標準化されている。

NTP (Network Time Protocol)

標準時にあわせるプロトコルです。

標準時は何種類かあります。

原子時計の時間と標準時。

標準時は、UTCとかGMTとかJSTとかいうあれです。

原子時計の時間(TAI)は世界標準時と少し違うようです。

協定世界時(UTC) = 国際原子時(TAI) + うるう秒(GMTにあわせるため)

グリニッジ標準時(GMT) = 協定世界時(UTC) ±1秒

日本標準時 = 世界協定時(UTC) + 9時間

緯度経度の計測方法をGPSにあわせたので、日本の子午線の位置が移動している。今まで正しくなかったのかのか?

RFC 1305

参考

POP3

メールの受信のときに使うプロトコルですね。

SMTPサーバを作ったので、ついでにこちらも実装してしまいましょう。

参考

RDFといふもの

RDFとかRSSとかいうものをWeb上で見るようになりました。これは、XMLで書かれています。

DV動画配信プロトコル? DVTS

参考
DVTS Consortium

ドメイン関連 DNS

ドメインの仕組み

ドメインは、DNSサーバを指定して、そこから検索してきますが、その先はどうなっているのでしょう。
プロバイダに加入すると設定内容として資料に書かれているDNSサーバは、キャッシュDNSサーバというものです。
このほかに、各種役割を持ったDNSサーバがあります。

Javaから使うには、[JNDI]を利用します。

Dynamic DNS

ドメインをクライアントから自動更新できる仕組み。Javaでは標準ではサポートされていない。

参考

日本語ドメイン/国際化ドメイン名

Last update 2003.06.24

正式な日本語ドメイン(国際化ドメイン名)の仕様が決まりました。
Internationalizing Domain Names In Application (IDNA) というらしいです。
UNICODEをいろいろクライアント側で変換し、従来のASCII文字列としてDNSに問い合わせを行う方法。
半角を全角にしたりいろいろされた後、punycode だとかなんかという方法でACEエンコードされるそうです。
Mozilla では正式サポートされていない? Opera では古いRACE形式がサポートされています。
いろいろ複雑なようです。
RACEエンコードの場合はprefix といしてbq-- というのが使われていましたが、Punycode ではxn--がつくことになりました。

Punycode
英数字は変換なし。

http://もじら組.dev.jp/ というのを用意してみました。http://もじら組.jp/ もあります。

手順?

  1. NAMEREPという前処理 (RFC3454)
    1. 英字の大文字等を小文字に。
    2. 半角全角の変換
    3. 使用禁止文字チェック
  2. Punycode変換

メールではクライアントがドメイン名をPunycode化するのでせう? サーバがDNSを引くときにはじめて変換するのでいいのかな?
Webでは? リンクURLはそのまま記述し、ブラウザが変換してHost:でも使うのかな・・・やDNS検索で使用でしょうね。
HTTPのhost: ヘッダなどは Punycode で記述しなければならないのかな?

Punycode は、UTF32 に対応しているのかな? RACEはUTF16だったからだめだったのかな。

参考

IPv6のかたち

Last update 2001.4.27

次世代ネットワーク機器の選び方をハード部屋に書いてみましょうか。

IPv6を使うためには、一部ハードウェアの対応と、OSの対応(APIの整備)、基幹ソフトウェア(サーバ類)の対応、アプリケーションの対応というようにさまざまな条件があります。

さて・・・各OSの対応状況なんていうのから見ないといけないですね・・・・。
Windows 2000 てくのろじーぷれびゅーで対応 (Windows2000 SP1必要)
SP3を入れてしまったあとにインストールしたいときにはどうすればいいのか謎
WindowsXPはSP1で正式対応?
Linux kernel 2.2 で対応 ? USAGI Project のツール等々が必要なようです。

IPv6アドレス

RFC 4291,4864あたり。2005年以前のものは古い説明か。

EUI-64

下位64bitはMacアドレスを拡張したり。

24bit で2つに区切り、FFFFFFFE

アドレス

  IPv6 bit IPv4  
未指定アドレス 0:0:0:0:0:0:0:0/128   0.0.0.0  
ループバックアドレス ::1/128   127.0.0.0/8  
グローバルユニキャストアドレス 2000::/3 - E000::/3 (FF00::/8除く) 001 グローバル  
IANA 割り当て中 2001::/16      
技術文書、記事、各種資料のための 2001:0DB8::/32      
一意ローカルIPv6ユニキャストアドレス FC00::/7     RFC 4193
管理組織による割り当てを実施する領域 FC00::/8      
独自割り当て領域 FD00::/8   10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
企業内などルータ超えてもローカル
リンクローカルユニキャストアドレス FE80::/10   169.254.0.0/16 ルータを超えない
サイトローカルアドレス FEC0::/10     廃止
マルチキャストアドレス FF00::/8      
既知 FF00::/12      
インターフェースローカル FF01::/16      
リンクローカル FF02::/16      
サブネットローカル FF03::/16      
アドミンローカル FF04::/16      
組織 FF08::/16      
グローバル FF08::/16      
一時的 FF10::/12      

RFC 4864

ローカルアドレスは?
リンクローカルアドレス
fe80::

逆引きはできるのか?
ルールが初期の頃から変わってしまったようです。

勝手に生成されるらしい。その仕組みは?
上位数ビットがプロバイダから割り当てられます。
下位ビットは、各機器がMacアドレスなどを元にして自動生成します。
上位ビットの配布形式等々も決まっているような感じです。上位アドレスを配布するために従来のDHCPに相当するものがルータ等々で1つ必要なのですね。

Vine Linux で使うには

Vine Linux では、Module 形式で IPv6 サポートが組み込まれているようです。
ここが参考になるかな?
# insmod -s ipv6
で使えるようになります。

IPv6 FAQ
Linux IPv6 FAQ/HOWTO
IPv6start.net (日経BP社)
IPv6 Related Specifications
USAGI Project (LinuxのIPv6実装)
Kame Project (BSDでIPv6)
TAHI Project
Linux IPv6 Users Group JP

プロトコルへの追撃

プロトコルをちょこちょこ改善できないかなと。

PPPoEってどんなだ・・・。

PPPoEというのは、PPPをEthernet上に載せただけのものなんだろうか?
PPP over Ethernet の略です。PPPなのでIPv6にも対応しているはずです。他にPPPoAというのもあるようです。PPP over ATMの略です。
通常、PPPのサーバ側での認証は、RADIUSというプロトコルが使われます。
PPPoEでもRADIUSを使っていると思われます。
RADIUSの設定方法は、Linuxメモの方に書いてたかな・・・。ハード部屋に書いてました。
というわけで、こちらはプロトコルの解説です。どのようにしてEthernet上にPPPプロトコルを載せているのでしょうか?
EthernetとPPPは、別々に下のほうにメモしてあると思います。
PPPは従来、Ethernet以外の1対1の通信環境(アナログ回線やISDNなど)の上でTCP/IPなどEthernet上? のプロトコルを使うために使われています。
しかし、その通信方法はHDLC手順にそっているので、アドレス欄を使用すれば1対1に限らず通信することは可能です。(MN128などでもアドレス拡張がされています)

FreeBSDは3.4以降のカーネルでサポートしているらしい?

Discovery Stage で認証等接続処理を行い
PPP Session Stage で通信をおこなう

参考

OpenSSH

OpenSSH 日本語版がある。
SSHもある。

各種の暗号化を行い、telnet やftp の代わりに使うことができる。
OpenSSHの場合は、SSH1で3DESとBlowfish、SSH2で3DES、Blowfish、CAST128、Arcfour、AESを使えるらしい。
RSAも特許が切れたのでサポートされるかもしれない。
RFC は、ドラフトである。
通信手順
C = クライアント, S = サーバ
プロトコルバージョン
1.99 バージョン2のこと
1.5 SSH-RFC ? のこと

バイナリフォーマット
|パケット長(unsigned 32bit)| padding | パケットタイプ | データ | チェックバイト |
データ 解説
パケット長 パケットタイプ以降の合計の長さ
padding padding からチェックバイトまでで8の倍数長になるようにランダムな値を詰める。
暗号化されていない場合は 0
パケットタイプ データの種類を示す。いろいろある。
SSH_MSG_NONE = 0
SSH_MSG_DISCONNECT=1
SSH_SMSG_PUBLIC_KEY=2
SSH_CMSG_SESSION_KEY=3
などなど

通信手順
  1. Port 22へ接続
  2. S>SSH-<protocolmajor>.<protocolminer>-<version>\n
    プロトコルとサーバのバージョン
    SSH-1.99-OpenSSH_3.4p1\n
    など。終端は \r\n(CR LF) ではない。LF(\n)のみ
  3. C>SSH-<protocolmajor>.<protocolminer>-<version>\n
    サーバ側とおなじ。プロトコルは1.5とかでいいのかな。
  4. 以後、バイナリで通信
    まずは、S>SSH_SMSG_PUBLIC_KEY

参考

SIP

SIPは、IP電話などで使われている

HTTPプロキシの作成

Last update 2000.2.3
Javaで200行程度のHTTPプロキシサーバを作ってみました。
プロキシと、通常のHTTP接続との違いは、URLにプロトコル、サーバ名が含まれるか含まれないかの違いだけです。

プロキシ無しリクエストの一行目
GET /~siisise/ HTTP/1.0

プロキシありリクエストの一行目
GET http://www.bekkoame.ne.jp:80/~siisise/ HTTP/1.0

GETの部分は、GET/POST/DELETE 等があります。それぞれ、HTTPサーバに対するコマンドですが、普段はGETとPOSTぐらいしか使われていません。FTP等をプロキシするときは、DELETE等も使うのでしょう。

バージョンアップの要望がないようなので、内部で使おう・・・。

HTTPは、1.0と1.1があり、RFCにまとめられています。

これを元にしてかどうかわかりませんが、Servletエンジンを開発します。

FTPクライアントの作成

Last update 2000.2.3

FTPには、ファイルを途中から転送するというきのうがあり。
ライブラリ化すると便利なのかな・・・しなくても標準で使えるような。
インターフェイスはまだまだ工夫が足りない気がするかも。

TCP/IP解説

Last update 2002.12.10

ひとつひとつを完結させずに次から次へとはじめてしまいます。
どこにも載っていない考え方でTCP/IPを解説。つまり自己流に解釈するともっと詳しくわかったということです。

TCP/IPは、インターネットで使われているプロトコルです。しかし、1つのプロトコルではなく、複数のプロトコルの集合だということか、大抵の解説書のはじめの方に書かれています。
TCPとIP, UDPが主なところで、その上にhttpだとかftpだとかがあるわけですが、プログラムを作ろうとした時点で見えてくるのがSocketという関数やクラスにまとまったTCP層です。(UDPも使えますが)

OSI的な分類(一部不一致)      
アプリケーション層   HTML等 BIND/ICQ等
プレゼンテーション層   HTMLやhttp  
セッション層 Proxy等 http/ftp etc DNS etc
プログラム的なつながり API Socket等
トランスポート層 接続プロトコル TCP UDP
ネットワーク層 ルータ等/NAT/ドメイン? IP/ICMP
データリンク層 スイッチングHUB等 DIX/Macアドレス PPP/HDLC
ソフト的つながり   デバイスドライバ
物理層 ハードウェア Ethernet モデム/ISDN等

まぁ、この図は、右と左を別々にみてください。正しい関係ではないですが、こんな感じになってます。
トランスポート層からデータリンク層までが、主にOSが担当する機能です。

トランスポート層(TCP)

Socketで相手マシンと接続すると、RS-232Cのように、無手順双方向通信が可能になります。それも、一つのバスで同時に複数のマシンとの通信が可能です。
ということで、IPがデータの固まりに付けられたアドレスを基に、マシン別にデータを送信します。TCPはさらにポート番号で同じマシン間の通信を多重化しています。エラー訂正や順序整理もTCPがこなします。
UDPは、トランスポート層的な機能をあまりもっていないので、ほんとうはネットワーク層的プロトコルです。

ネットワーク層とデータリンク層

PCには、1台1台IPアドレスが割り振られていますが、このIPアドレスはネットワークを特定する部分と機器を特定する部分の2つに分けることができます。それぞれ、ネットワーク層、データリンク層と関係してきます。
ネットワークアドレスは、ネットワーク単位につけられる番号です。そして、ホスト番号は、マシンごとにつけられる番号です。これはネットマスクで分けることができます。
しかし、相手側のネットマスクなどは、わかりません。とりあえず、自分のネットワークのネットマスクだけがわかればいいです。ネットワーク内で、他のネットワークへの接続方法を知っているルータがありますので、自分のネットワーク以外のときは、そのルータに問い合わせたりします。デフォルト・ゲートウェイという指定をしているアドレスの機器がそれにあたります。PC内部でも、そういう情報を管理できます。
IPアドレス別に送信する相手を指定したものは、ルーティング・テーブルといいます。

IPのパケット | 送信元IP | 送信先IP | データ |

IPのパケットはネットワーク層を通ります。IPのパケットは、送信元のコンピュータから送信先のコンピュータまで、そのまま伝えられていきます。

ルータ、ルーティングテーブルなどなどは、ネットワーク層とデータリンク層を結びつけるものです。

データリンク層では、Ethernetの場合はIPのパケットに送信元、送信先のMacアドレスが付加されます。

Ethernetのパケット | 送信元Macアドレス | 送信先Macアドレス | IPのパケット |

ここで送信元、送信先に指定できるのは、LAN内(同じネットワーク内)のアドレスだけです。同じネットワーク内に対応するIPアドレスがない場合には、ルータなどにパケットを送ります。このとき送信先MacアドレスがルータのMacアドレスとなりますが、送信先IPアドレスは変わりません。

ルータまでパケットが届くと、ルータは送信先IPアドレスに対応する次の送信先を探し、送信先Macアドレスを書き換えます。送信元Macアドレスはルータのものになります。このときも、NATなどを使用していなければIPアドレスは変わりません。

複数ネットワークに接続されている場合

接続経路はルータが決めるのですが、Unixや最近のWindowsなどではPCの中にも、ルータと同じようなルーティングテーブルを持っています。このため、最初にPC内のルーティング・テーブルを参照して、見つからなかったときにデフォルト・ゲートウェイで指定されたルータにおまかせをします。ルータが、別のルータを指定してくることもあります。この時の情報は、可変のルーティングテーブルに持たせます。このルーティングテーブルは、PPPなどで相手が1つではなく、LANのように複数の機器が接続されているような場合には、実装の程度は違っても、一応どの機器にもあるはずです。

PCがAネットワークとBネットワークに接続されており、AネットワークにA1Cルータ、A2Dルータがあり、Cネット、Dネットへとつながっています。BネットワークにB1Eルータ、B2Fルータがあり、Eネット、Fネットへとつながっていました。さてどのように経路を決めるでしょう。

最初にPC内のルーティングテーブルで、一致する物があるかどうかを探します。このルーティングテーブルには、AネットからFネットまでのルーティングテーブルすべてを登録しておくこともできますが、直接接続されていないネットワークの設定は、各ルータに任せることもできます。

PC内のルーティングテーブルに情報がみつかれば、対応するルータに対してパケットを送ります。見つからない場合は、デフォルト・ゲートウェイとして指定されたルータにパケットを送ります。

そのルータがパケットを中継可能であった場合は、そのまま中継を行います。他のルータが適しているという情報をルータが持っていた場合には、送信元のPCにその情報を伝え、PCが別のルータに情報を再度送ります。

PPPは、RS-232CやISDNといったところにIPパケット他イーサネット上のプロトコルを流すプロトコルで、rfc1661/rfc1662などを参考にするといいようで。

イーサネットからはじまったTCP/IP
現在では、PPP接続でモデムやTA/ルータでも使えているTCP/IPは、イーサネット(Ethernet)

Ethernet

DIX規格と、IEEE802.3と、二種類の形式があり、普通は、DIX規格のプロトコルが使われている。
Ethernetには、Macアドレスというものが、アドレスとしてEthernetカード一枚一枚に割り振られている。

複数のネットワークアドレスの混在
192.168.0.XXXと、192.168.10.XXXを同一Ethernet上に作ってみたり・・・。同じネットワークアドレス内では問題なく通信可能。

PPP

シリアルライン上に、Ethernetで使われているプロトコルを乗せる規格。
ネゴジエーションが多少複雑かもしれないが、接続してしまえば、あとは簡単。
モデム、ISDNなどの上ではHDLC手順をバイト単位にしたものを使う。
00h-1Fh, 7Dh, 7Ehは、エスケープ文字(7Dh)とデータに20hを XOR したものを使って回避します。
これは、バイト単位の送信では不要な場合もあるので、省略することも可能です。省略する方式は、次のLCPの項目で決定します。決まるまでは、初期状態で00-1Fh, 7Dh, 7Ehをエスケープします。
接続に、LCPという接続プロトコルで接続後、IPCPでアドレスなどなどを決定、IPで通信可能に。

プロトコル(基本)フォーマット
Flag Address Control Protocol Information Padding FCS Flag
7Eh FFh 03h 16bit 16bit 7Eh
Flag
HDLC手順なフラグ7Ehです。 8ビットで01111110 となり、これでデータの先頭と終わりを見分けます。
フラグとデータ(アドレスからFCSまで)で同じコードを使ってしまわないように、データ中の7Ehは7Dhでエスケープされ、さらにXOR 20hされます。
Address
HDLC手順ではアドレスですが、特に使用しないので FFh です。MN128では、使ってます。(^^)
Control
なんとなく03hです。無手順だったかなんだか。
Protocol
上位プロトコルの種類 (必ず奇数...です)

プロトコル番号 プロトコル
0021h Internet Protocol (IP)
8021h Internet Protocol Control Protocol (IPCP)
c021h Link Control Protocol (LCP)
などなどTCP/IPでは、このあたりを使います。
Information(情報)
Protocolで指定した、上位プロトコルのデータです。
Padding
データサイズをそろえるためにあるのですが。ダイヤルアップなPPPでは固定サイズ以上のデータを送信しなければならないという決まりはありませんから、使う必要はありません。
FCS
フラグ・チェック・シーケンス
エラーを見つけるために入っています。低速回線ではCRC16を使います。


あるPPPパケットの例 (LCPが含まれている)

ADDR +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000 7E FF 7D 23 C0 21 7D 21 7D 21 7D 20 7D 34 7D 22
0010 7D 26 7D 20 7D 20 7D 20 7D 20 7D 25 7D 26 30 4D
0020 E4 4A 7D 27 7D 22 7D 28 7D 22 DB 7D 2A 7E
  
Link Control Protocol (LCP)
PPPのネゴジエーション(接続認証)に使われるのがLink Control Protocolなわけですが、これが多少複雑というか、いろんなことができます。
まだ書いてません・・・。

参考

IPv4
20バイト・・・ではなかったか、インターネットではオプションヘッダが省略されることがほとんどなので、固定でよい。

00 4bit バージョン() 4bit ヘッダ長/4(?)
01
02
ICMP
IP管理用というか、エラーなどを処理するプロトコルか?
IPv6
次世代IP。実用化されつつあるのかどうか。
アドレスが128ビットに拡張されているのが主な特徴。
TCP
通信相手を決めて、コネクションを張って通信します。必ずIP層の上で使われます。
この上に、HTTPやFTPといったプロトコルが実装されます。
ポート番号を使って相手アプリケーション(サービス)を特定します。
また、同じポート番号に複数接続できるように、接続側のポート番号も使用します。これは、OSで順番に割り当てる場合がほとんどです。
UDP
IP層にそのままデータを乗せてしまっているような、非常に簡単なプロトコルです。
コネクションレスです。

参考文献
RFC1661 The Point to Point Protocol( 和訳もあるようです)
RFC1662 PPP in HDLC-like Framing( 和訳もあるようです)


[ HOME]