TCP/IP

インターネットアドレス(IP address)

RFC (Index) による規格化 32 ビットの数字で構成。ネットワーク部とホスト部に分けられる。
クラスA0ネットID(7bit)ホストID(24bit)
クラスB10ネットID(14bit)ホストID(16bit)
クラスC110ネットID(21bit)ホストID(8bit)
クラスD1110マルチキャストグループID(28bit)
クラスE11110将来の拡張のために予約(27bit)

クラス範囲
A0.0.0.0 〜 127.255.255.255
B128.0.0.0 〜 191.255.255.255
C192.0.0.0 〜 223.255.255.255
D224.0,0,0 〜 239.255.255.255
E240.0.0.0 〜 247.255.255.255

インターネットアドレスの割り当ては InterNIC (Internet Network Information Center) が一元的におこなう。日本(JPNIC)は、アジアパシフィック地域 (APNIC)の下に位置づけられる。

インターネット参加組織の増加によって、クラスCでは足りないがクラスBでは余る組織のために クラスレスなネットワークアドレスの交付が行われる。またプロバイダ毎にその複数のネットワークアドレスを 集約することがおこなわれている。

TCP/IPのリンク層

Ethernet/IEEE802.3 へのカプセル化 (Encapsulation)
RFC894, RFC1042

802.3 MAC802.2 LLC802.2 SNAP
宛先
アドレス
発信元
アドレス
データ長DSAP
AA
SSAP
AA
Control
03
Original Code
00
タイプデータCRC
タイプ
0800
IPデータグラム
タイプ
0806
ARP要求/応答PAD
タイプ
0835
RARP要求/応答PAD
Ethernet
宛先
アドレス
発信元
アドレス
タイプデータCRC
タイプ
0800
IPデータグラム
タイプ
0806
ARP要求/応答PAD
タイプ
0835
RARP要求/応答PAD

特別な IP アドレス ... ループバックインターフェース 127.0.0.1 (localhost)

MTU ... Maximum Transfer Unit (RFC1191)

IP:インターネットプロトコル

公式仕様
IP Header の仕様
                                    
    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Example Internet Datagram Header
Version 4
IPv4
Type of service (TOS)
000dtrc0 d=最小遅延 t=最大スループット r=最大信頼性 c=最小金銭コスト
Identification
データグラムの識別
Flags & Fragmentation
データグラムの分割
Time to Live (TTL)
ルータを経由するたびに 1減らされる。もし 0 になると、データは破棄され、送り手にそのむねが通知される。
Protocol
RFC1700

IPルーティング

サブネット

クラスで規定されたホストアドレス空間を複数のネットワークに分割して使う。
サブネットマスク
例:高知大学に割り当てられたネットワーク 133.97 (クラスは何だろうか?)
分割されたネットワークアドレス ... 情報科学科は 133.97.54
このときのサブネットマスク ... 255.255.255.0

ARP: Address Resolution Protocol

IP アドレスを持つホストの Ethernet Address を尋ねる(broadcast)/答える(unicast)
Type = 0806
0123
0123456789 0123456789 0123456789 01
Hardware Type (=1) Protocol Type (=0x0800)
Hardware Size (=6) Protocol Size (=4) Operation (要求=1,応答=2)
送り手 Ethernet Address(1)
送り手 Ethernet Address(2) 送り手 IP Address (1)
送り手 IP Address (2) ターゲット Ethernet Address(1)
ターゲット Ethernet Address(2)
ターゲット IP Address
RFC826

代理(Proxy) ARP

PPP リンクの先にあるマシンの代わりに ARP 応答を出す。

arp コマンド

オプションと機能(詳しくは man arp)
-a
ARPキャッシュのデータを表示する
-d
ARPキャッシュのデータを削除する
-s
データを追加する

RARP: Reverse Address Resolution Protocol

Ethernet Address から IP アドレスを尋ねる(broadcast)/答える(unicast)
X端末やディスクレスワークステーションなど、IPアドレスをディスクのファイル上に 保存できない(起動時に読み込めない)システムでは必要になる。
Type = 0835
0123
0123456789 0123456789 0123456789 01
Hardware Type (=1) Protocol Type (=0x0800)
Hardware Size (=6) Protocol Size (=4) Operation (要求=3,応答=4)
送り手 Ethernet Address(1)
送り手 Ethernet Address(2) 送り手 IP Address (1)
送り手 IP Address (2) ターゲット Ethernet Address(1)
ターゲット Ethernet Address(2)
ターゲット IP Address
RFC903

/etc/ethers ファイル

ICMP:インターネット・コントロール・メッセージ・プロトコル

ICMP (Internet Control Message Protocol)は IP データグラムにカプセル化される。
RFC792 IPプロトコル = 1
IP データグラム
IP ヘッダICMP メッセージ
20 byte
0123
0123456789 0123456789 0123456789 01
Message Type Message Code Check Sum (メッセージ全体)
:
(内容はタイプとコードによる)
:

ICMP メッセージのタイプ

タイプコード説明照会エラー
0 0エコー応答
3宛先到達不可
0ネットワーク到達不可
1ホスト到達不可
2プロトコル到達不可
3ポート到達不可
4フラグメンテーションが必要だが、フラグメントしてはいけないことを示すビットが設定されている
5ソースルートが失敗
6宛先ネットワークが不明
7宛先ホストが不明
8発信元ホストが孤立(使用されていない)
9宛先ネットワークが管理的に禁止されている
10宛先ホストが管理的に禁止されている
11サービスタイプにネットワーク到達不可
12サービスタイプにホスト到達不可
13フィルタリングで通信が管理的に禁止されている
14ホスト優先違反
15事実上、優先切断
40発信元抑制
5リダイレクト
0ネットワークへのリダイレクト
1ホストへのリダイレクト
2TOS, ネットワークへのリダイレクト
3TOS, ホストへのリダイレクト
80エコー要求
90ルータ広告(advertise)
100ルータ請願(request)
11時間超過
0転送中の生存時間=0
1リアセンブリ中の生存時間=0
12パラメタ問題
0IPヘッダに問題
1必要なオプションの欠落
130タイムスタンプ要求
140タイムスタンプ応答
150インフォメーション要求(Obsolete)
160インフォメーション応答(Obsolete)
170アドレスマスク要求
180アドレスマスク応答

Ping プログラム

ICMP エコー要求
0123
0123456789 0123456789 0123456789 01
Message Type = 0 または 8 Message Code = 0 Check Sum (メッセージ全体)
識別子 シーケンス番号
オプションのデータ
:

Traceroute プログラム

UDP: User Datagram Protocol

簡単なトランスポート層プロトコル。一つの UDPデータグラム は一つの IP データグラムとして 送信される。
<---- IP データグラム ---->
<---- UDP データグラム ---->
IP
ヘッダ
UDP
ヘッダ
UDP データ
20 バイト 8 バイト
RFC768 IP プロトコル番号 = 17

UDP はデータグラムが相手に到達することを保証しない。つまり、信頼性のあるプロトコルではない。 しかし、時と場合によってはこのようなプロトコルが有効な場合がある。

UDP ヘッダ
0123
0123456789 0123456789 0123456789 01
16 bit 発信元ポート番号 16 bit 宛先ポート番号
16 bit UDP データ長 16 bit UDP チェックサム
データ
:
ポート番号: 送り手のプロセスと受け手のプロセスを識別する。 サーバー側はあらかじめ決められた番号を使い、クライアント側はたまたま使われていない 番号を使う (但し、通常 1024 から 5000 の間)。これを、エフェメラル(短命の)ポートということが ある。

TCP: Transmission Control Protocol

RFC793 IP プロトコル = 6

TCP はコネクション指向の、信頼性のあるバイト・ストリーム・サービスを提供する。

<---- IP データグラム ---->
<---- TCP セグメント ---->
IP
ヘッダ
TCP
ヘッダ
TCP データ
20 バイト 20 バイト
TCP ヘッダ
0123
0123456789 0123456789 0123456789 01
16 bit 発信元ポート番号 16 bit 宛先ポート番号
32 bit シーケンス番号
32 bit 確認応答番号
4 bit
ヘッダ長
予約ずみ
(6bit)
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
16 bit ウィンドウサイズ
16 bit TCP チェックサム 16 bit 緊急ポインタ
オプション(もしあれば)
:
データ
:
ソケット:IP アドレスとポート番号の組み合わせ。BSDのライブラリ名称。
ソケット・ペア送り手・受け手のソケットの組み合わせ。

フラグ・ビット

URG
緊急ポインタが有効
ACK
確認応答番号が有効
PSH
受け手はこのデータを可能な限り早急にアプリケーションに渡さなければならない
RST
コネクションをリセット
SYN
コネクションを初期化するためにシーケンス番号を同期させる
FIN
送り手はデータの送信を終了した

TCP コネクションの確立と終了

コネクションの確立

  1. クライアントは、接続したいサーバーのポート番号とクライアントの初期シーケンス番号 (普通クロックから作成される 32bit unsigned int) を指定した SYN セグメントを送る。
  2. サーバーは、サーバーの初期シーケンス番号を含む SYN セグメントを送る。この際 クライアントのシーケンス番号+1のACKをつける。
  3. クライアントはサーバーから送られてきた SYN に対して、サーバーのシーケンス番号 +1 のACKで確認応答を返す。
コネクション終了プロトコル
  1. 片方(普通はクライアント)から FIN を送る。
  2. もう一方(普通はサーバー)から FINに対する ACK を送る。
    この段階で「片方」はデータの送信を終了したことになる。しかし、TCP は上位のアプリケーション 層に対して「全二重」通信を提供しているので、必ずしも「もう一方」からのデータ送信が終了した わけではない。この状態を ハーフ・クローズという。
  3. 「もう一方」から FIN を送る。
  4. 「片方」から ack を送る。

TCP の状態遷移

クライアントの通常の遷移

  1. appl: アクティブ・オープン; send: SYN
  2. recv: SYN,ACK; send: ACK
  3. appl: クローズ; send: FIN
  4. recv: ACK; send: 何も送らない
  5. recv: FIN; send: ACK

サーバーの通常の遷移

  1. appl: パッシブ・オープン; send:何も送らない
  2. recv: SYN; send: SYN,ACK
  3. recv: ACK; send: 何も送らない
  4. recv: FIN; send: ACK
  5. appl: クローズ; send: FIN
  6. recv: ACK; send: 何も送らない

TCP のデータ・フロー

インタラクティブ入力

1文字キーを打つ毎に1つのデータパケットが発生する。また、Rlogin の場合は クライアントがタイプした文字をサーバーがエコーする。そのため、データの 流れは次のようになる。
  1. クライアントからの1文字のキー入力
  2. サーバーからの確認応答(ACK)
  3. サーバーからのエコー
  4. クライアントからの確認応答(ACK)
遅延 ACK ... ACK を次のデータに載せるため ACK を遅らせる。遅延ACKタイマーは 200 msec から 500 msec 程度。次のデータが無ければ、タイマーで決められた時間 後に ACK を単独のパケットで送り出す。
Nagleアルゴリズム ... 1文字1パケットは混雑の少ない高速のLANでは問題が無いが、遅い混雑のあるWAN などでは 効率が悪い。ACK が来るまで送信すべきデータをひとつのセグメントに集積する。

バルク・データ・フロー

LAN上で受け手が十分速いマシンの場合 ... 受け取ったパケットを高速に処理できる。ACK はひとつおき。
受け手が遅い場合 ... 受け取ってすぐに ACK を送るが、処理しきれないデータがバッファにたまるため ウィンドウサイズを小さくする。ウィンドウサイズ 0 の確認応答を出した時は データバッファに十分な空きができたら、ウィンドウ更新ACKを送る。
スロースタート ... 最初に受け手から広告されたウィンドウサイズで一気にデータを高速に送ろうとすると 途中に低速回線がある場合に輻輳(congestion)が発生する。そこで、送り手は 輻輳ウィンドウ(cwnd)と呼ばれる送り手側のウィンドウを用意する。 cwnd のサイズは最初は1パケット分、ACK が返って来るたびに、2倍にされる。 インターネットの限界に達すると途中でパケットの破棄が発生するため ACK が返って来なくなる。そこで、適切な cwnd のサイズを決定することができる。
スループット ... 送り出したセグメントと返ってくる ACK が、伝送路の途中にどれだけ存在できるか。 パイプのキャパシティ(bit) = 帯域幅(bit/sec) x 往復時間(sec) ... 帯域幅遅延積
ボトルネック ... WAN の途中に低速の回線があるとき