マスタリングTCP/IP 入門編 読書メモ 【第2章】
今回からいよいよTCP/IPの話に入っていきます。
元書籍→マスタリングTCP/IP
前回の記事→
TCP/IPの概要
- 元々軍事の文脈でネットワークの一部が破壊されても迂回路によってデータを配送できる分散型パケットネットワークとして考案された
- 中央集権的なネットワークでは通信回線の交換局が破壊されると死ぬ
- UNIXの中に実装され、UNIXとともに発達、普及してきた
- 標準化の精神として、ある程度プロトコルの実装されたプロトタイプがある状態で仕様を煮詰めたため、実用性が高いプロトコルとなったらしい
- これが前章でやったOSIを尻目にどんどん普及していった要因らしい
インターネット
TCP/IPプロトコルの階層モデル
基本的には1章でやったOSI参照モデル に当てはめられるようだ(図2.8)
ハードウェア(物理層)
- TCP/IPでは通信媒体や、通信する上での信頼性、セキュリティ、帯域、遅延時間などの制約を設けず、とにかくネットワークで接続された装置間で通信できることを前提に作られているらしい(??)
ネットワークインターフェース層(データリンク層)
- イーサネットなどのデータリンクを利用して通信するためのインターフェースとなる層
- NIC(Network Interface Card)を動かすためのデバイスドライバ
- デバイスドライバはOSとハードウェアの橋渡しとなるソフトウェア
- ハードウェア層とまとめられることも多い
インターネット層(ネットワーク層)
- IPプロトコルを用いて最終目的のホストまでパケットを配送
- ICMP(Internet Control Message Protocol)
- IPパケット転送中の異常をそう信玄に伝えるためのプロトコル
- ネットワークの診断などにも利用
- ARP(Address Resolution Protocol)
トランスポート層(トランスポート層)
アプリケーション層(セッション層以上の各層)
- セッション層以上の処理は全てアプリケーションプログラムで実現されるという考え
- ただ、結局プログラム内でOSIモデルと同様の役割をもつ各モジュールに分けそう
- TCP/IPのアプリケーションの多くはサービスを提供するサーバーと受けるクライアントからなるクライアント/サーバーモデルで作られる
- WWW(World Wide Web)
- 電子メール
- ファイル転送(FTP)
- 遠隔ログイン(TELNETとSSH(Secure Shell))
- ネットワーク管理(SNMP)
通信の処理の流れ
パケットヘッダ
- 各階層でデータに付加される情報をヘッダという
- 送信元、宛先などプロトコルのための情報
- 階層から見れば、上位層から受け取る全ての情報(上位層のヘッダも含む)は単なるデータとして認識
- 各層におけるヘッダには少なくとも、「宛先と送信元の情報」および「上位層のプロトコルが何かを示す情報」が含まれる(図2.19)
パケットの送信処理
電子メールの場合(図2.18)
①アプリケーションの処理
- キーボードの入力をUTF-8などの規則に基づいて符号化
- メールソフトによっては複数のメールをまとめて送信するなどの機能がある場合も
- OSIでいうセッション層のような機能
- TCPにコネクションの確立を指示し、確立され次第メールを送信する
②TCPモジュールの処理
- アプリケーションからもらったデータにTCPヘッダを付加
- 送受信ポート番号
- パケットの順番を示すシーケンス番号
- データが壊れていないことを保証するチェックサム
- ここでデータを相手に確実に届けることが保証される
③IPモジュールの処理
- TCPからもらったデータ(TCPヘッダ込み)にIPヘッダを付加
- IPパケットが完成したら、経路制御表(ルーティングテーブル)を参照し、次のルーターやホストを決定
- 次の通信先のMACアドレスを調べ、IPパケットとともにイーサネットドライバへ渡す
④ネットワークインタフェース(イーサネットドライバ)の処理
- IPパケットにイーサネットのヘッダを付加
- ここでできたイーサネットパケットが物理層により運ばれる
- 送信処理中にパケット破壊検出のためのFCS(Frame Check Sequence)がハードウェアで計算され、パケットの最後につけられる
パケットの受信処理
送信処理とは逆順にパケットが流れていく
⑤ネットワークインタフェースイーサネットドライバ)の処理
- イーサネットヘッダのMACアドレスが自分宛てかを確認し、違う場合はスルー
- イーサネットタイプフィールドを調べ、イーサネットプロトコルが運ぶデータの種類を確認
- この場合はIPなのでIPを処理するルーチンにデータ(IPヘッダ以降)を渡す
⑥IPモジュールの処理
- ヘッダから読み取られる宛先のIPアドレスが自分のホストのものであればそのまま受信
- 上位層のプロトコル(TCP/UDP)を調べる
- ルーターの場合は宛先は自分宛てではないことが多く、この場合は経路制御表から次の行き先を調べて転送処理
⑦TCPモジュールの処理
TCPの場合は
- チェックサムによる壊れてないかの確認
- シーケンス番号による順番の確認
- ポート番号による通信しているアプリケーションの確認 が行われる
データが正しく届いた場合は送信元に確認応答を送る
- 送信側はこの確認応答を受け取るまで繰り返しデータを送り続ける
⑧アプリケーションの処理
- 受信したデータを解析し、ハードディスクなどにメッセージを格納しつつディスプレイに内容を表示する
- 処理が正常に終了した場合はそれを送信元のアプリケーションに伝え、ダメな場合は異常終了のメッセージを送る
前期実験で訳も分からずいじったソケットプログラミングの理解が若干進んだような気がする
次回→(coming soon)
最初の記事→