Webエンジニアのブログ

「マスタリングTCP/IP 入門編」要約 第2章「TCP/IP基礎知識」

マスタリングTCP/IP 入門編 第5版」の第2章の要約です。

TCPはTransmission Control Porotocl、IPはInternet Protocolの略称です。 この章ではTCP/IPの誕生から現在までの歴史について紹介します。

TCP/IP登場の背景とその歴史

1969年、パケット交換技術の実用性を試験するためのネットワークが構築されました。 当初ネットワークは、アメリカ西海岸の大学と研究機関のうちの4つのノードを結んだものでした。 これがARPANET(Advanced Research Projects Agency Network)と呼ばれるネットワークです。 このネットワークはわずか3年間で34のノードを接続するまでの大規模なネットワークに発達していき、実験は大成功をおさめました。 そして1975年にARPANET内でTCP/IPの仕様が決定されました。

UNIXの普及とインターネットの拡大

TCP/IPが普及した背景として、以下のような理由があります。

  • 1980年前後に大学や研究所で広く使われていたBSD UNIXというOSの内部にTCP/IPが実装された
  • 1983年にTCP/IPを実装した製品が一般ユーザー向けに提供され始めた
  • 1980年代半ばごろから、各コンピューターメーカーがTCP/IPに対応し始めた

商用インターネットサービスの開始

1990年代になると、企業や一般家庭に対してインターネットへの接続を提供するサービスが普及しました。 このようなサービスを提供する会社をISP(Internet Service Provider)と呼びます。 これと同時にインターネットを利用したオンラインゲームや動画配信などの商用サービスも始まりました。

TCP/IPの標準化

1990年代、ISOではOSIと呼ばれる国際標準プロトコルの標準化が行われていましたが、現在は普及しておらず、TCP/IPが使われています。

TCP/IPという語は何を指す

TCP/IPという言葉は、IPを利用したり、TCPで通信したりするときに必要になる多くのプロトコル群の総称として使われます。 具体的には、IPやICMP、TCPやUDP、HTTPなどのプロトコルが含まれます。 TCP/IPはインターネットプロトコルスイート(スイートは一式という意味)と呼ぶこともあります。

TCP/IP標準化の精神

TCP/IPが普及した理由は2つあります。

1つ目は、TCP/IPはIETFでの議論を通して決められていることです。この議論には誰でも参加することができるオープンな環境でした。 2つ目は、TCP/IPは実装することを念頭に置きながら作業が進められていることです。 TCP/IPではプロトコルの仕様がだいたい決まったら、複数の実装を持ち寄って相互接続の実験が行われるため、動かすことを重視して仕様が決められているのです。

TCP/IPの仕様書RFC

TCP/IPのプロトコルは、IETFで議論され、標準化しようとするプロトコルはRFC(Request For Comments)と呼ばれるドキュメントになり、インターネット上で公開されます。 RFCになったドキュメントには番号が付けられますが、内容と改定する場合はこの番号を新しく定義しなければなりません。 番号が変わるのは不便であるため、STD(Standard)という変化しない番号付けも行われています。 またインターネットのユーザーのためにFYI(For Your Information)という番号付けもされています。FYIはSTDのようなものですが、内容が更新されてもRFCの番号は変わりません。

TCP/IPプロトコルの標準化の流れ

IETFでは年3回のミーティングが行われていますが、通常はメーリングリストによる電子メールで議論が行われています。

  1. プロトコルを提案したら半年間のドラフト期間に入る
  2. IETFの主要メンバーから承認が得られると、RFCのドキュメントとして登録され、提案標準になる
  3. 提案標準として多くの機器で実装され広く運用されるようになると、ドラフト標準になる
  4. さらに多くの機器で実装され、利用されると標準になる

インターネットの基礎知識

インターネットは全世界を接続しているコンピュータネットワークのことを指します。 インターネットに接続するためには、ISPとの間で接続契約を交わすことになります。

TCP/IPの階層モデル

TCP/IPで登場するさまざまなプロトコルも、基本的にOSI参照モデルに当てはめることができます。

ハードウェア(物理層)

このハードウェアとは、イーサネットや電話回線などの物理層のことです。 仕様する通信媒体はケーブルでも無線でもよく、また信頼性やセキュリティについても特に制限なく利用できるようになっています。

ネットワークインターフェース層(データリンク層)

ネットワークインターフェース層は、イーサネットなどのデータリンク(接続された機器間で通信するためのプロトコルやネットワークのこと)を利用して通信するためのインターフェースとなる階層です。 つまりNICを動かすためのデバイスドライバとも考えられます。デバイスドライバはOSとハードウェアを橋渡しをするソフトウェアです。

インターネット層(ネットワーク層)

インターネット層ではIPプロトコルが使われます。IPプロトコルではIPアドレスをもとにしてパケットを転送します。 一般的にはこのインターネット層とトランスポート層がホストのOSに組み込まれることを想定しています。 インターネットの接続されるすべてのホストやルーターは必ずIPの機能を実装しなければなりません。 ブリッジやリピーター、ハブの場合は必ずしもIPやTCPを実装する必要はありません。

IP(Internet Protocol)

IPはネットワークをまたいでパケットを配送するプロトコルです。 それぞれのホストを識別するために、IPアドレスと呼ばれる識別子を使います。 IPはパケットが相手に到達しなかった場合のパケット再送などは行いません。

ICMP(Internet Control Message Protocol)

IPパケットを転送できなくなった場合に、パケット送信元に以上を知らせるために使われるプロトコルです。 ネットワークの診断などにも利用されます。

ARP(Address Resolution Protocol)

パケットの送り先の物理的なアドレス(MACアドレス)をIPアドレスから取得するプロトコルです。

トランスポート層

トランスポート層のもっとも重要な役割はアプリケーションプログラム間の通信を実現することです。 コンピュータ内部のどのプログラムと通信しているかを識別するため、ポート番号という識別子を使います。

TCP(Transmission Control Protocol)

TCPはコネクション型で信頼性のあるプロトコルです。 両端のホスト間でデータの到達性を保証します。もしパケットがなくなったり順番が入れ替わったりしてもTCPが正しく解決します。 またネットワークの帯域幅を有効利用する仕組みや、ネットワークの混雑を和らげる仕組みが組み込まれています。 ただしコネクションの確立/切断をするだけで制御のためのパケットを約7回もやり取りするため、少量のデータを転送する場合はむだが多くなります。

UDP(User Datagram Protocol)

UDPはTCPとは異なり、コネクションレス型で信頼性のないプロトコルです。 UDPは送信したデータが相手に届いているかどうかのチェックはしません。パケットが相手に届いたかどうかはアプリケーションのプログラムが行うことになります。 UDPはパケット数が少ない通信や、プロードキャストやマルチキャストの通信、ビデオや音声などの通信に向いています。

アプリケーション層

TCP/IP階層モデルでは、OSI参照モデルのセッション層、プレゼンテーション層、アプリケーション層は全てアプリケーションプログラムの中で実現されると考えられています。

WWW(World Wide Web)

WWWはインターネット上で提供されるハイパーテキストシステムです。 ブラウザとサーバーの間の通信で使われるプロトコルがHTTP(Hyper Text Transfer Protocol)です。 WWWでは、HTTPがアプリケーション層のプロトコル、HTMLがプレゼンテーション層のプロトコルといえるでしょう。

電子メール

電子メールの配送ではSMTP(Simple Mail Transfer Protocol)というプロトコルが使われています。 当初インターネットではテキスト形式でしかメッセージを送信できませんでしたが、現在は電子メールで送信できるデータ形式を拡張するMIME(Multipurpose Internet Mail Extensions)の仕様が一般的となり、音声や映像のファイルなどの情報も送ることができます。 このMIMEはプレゼンテーション層の機能といえます。

ファイル転送

ファイル転送のプロトコルとしてはFTP(File Transfer Protocol)が古くから利用されています。 FTPでファイルを転送するときにはバイナリモードやテキストモードを選ぶことができます。 テキストモードは改行コードが異なるOS間でも自動的に変換してくれます。 FTPではファイル転送の指示をする制御コネクションと、実際にデータを転送するためのデータコネクションという2つのTCPコネクションを確立します。

遠隔ログイン

遠隔ログインではTELNETプロトコルやSSH(Secure SHell)プロトコルがよく用いられています。

ネットワーク管理

ネットワーク管理にSNMP(Simple Network Management Protocol)というプロトコルが利用されます。 SNMPで管理されるルーターやブリッジ、ホストなどはエージェントと呼ばれ、SNMPはこのエージェントとマネージャの通信に使われるプロトコルです。

エージェントではネットワークインターフェースの情報やパケットの量などさまざまな情報を格納しています。 その情報はMIB(Management Information Base)という決められた構造によってアクセスできます。

TCP/IPの階層モデルと通信例

各階層では送信されるデータにヘッダと呼ばれる情報が負荷されます。 このヘッダにはその層で必要とされる情報が組み込まれています。 具体的には送信元や宛先の情報、そしてデータに関する情報です。

パケットの送信処理

電子メールを例として説明します。

アプリケーションの処理

メールソフトからメールを送信すると、TCP/IPによる通信が開始されます。 まずアプリケーションプログラムで符号化の処理が行われます。ISO-2022-JPやUTF-8といった規則に基づいて符号化されます。(プレゼンテーション層)

変換後、メールソフトによってはすぐにメールをすぐに送信せずにまとめて送信する場合があります。 このようなコネクションの確立の管理はセッション層に相当する機能です。 アプリケーションはメール送信時にTCPにコネクション確立の指示を出します。コネクション確立後、メールデータの送信を行い、TCPへデータを渡します。

TCPモジュールの処理

TCPはアプリケーションの指示によってコネクションを確立したり、データを送信したり、コネクションを切断したりします。 TCPは確実に相手に届けるために信頼性のあるデータ転送を提供します。

TCPのヘッダには送信ホストと受信ホストのアプリケーションを識別するためのポート番号、そのパケットのデータが何バイト目のデータなのかを示すシーケンス番号、データが壊れていないことを保証するためのチェックサムなどが含まれます。 そしてTCPヘッダが付けられたデータがIPに送られます。

IPモジュールの処理

IPヘッダには、宛先のIPアドレスや送信元のIPアドレス、IPヘッダの次に続くデータがTCPなのかUDPなのかといった情報が含まれます。 IPパケットが完成したら、経路制御表(ルーティングテーブル)を参照して、IPパケットを次に受け渡すルーターやホストを決定します。 そしてその機器が接続されているネットワークインターフェースのドライバにIPパケットを渡して、実際の送信処理をしてもらいます。

通信先のMACアドレスが分からない場合はARP(Address Resolution Protocol)を利用してMACアドレスが調べられます。 相手のMACアドレスが分かったら、イーサネットドライバへMACアドレスとIPパケットを渡して送信処理をしてもらいます。

ネットワークインターフェース(イーサネットドライバ)の処理

イーサネットのヘッダには、宛先のMACアドレスと送信元のMACアドレス、イーサネットタイプが書き込まれます。 イーサネットのパケットは物理層により相手先に運ばれます。 送信処理中にFCS(Frame Check Sequence)がハードウェアで計算され、パケットの最後に付けられます。このFCSはノイズなどによりパケットが破壊されたことを検出するためのものです。

データリンクを流れるパケットの様子

パケットの送信処理で見たように、各ヘッダには少なくとも2種類の情報が入っています。 それは「宛先と送信元のアドレス」と「上位層のプロトコルが何かを示す情報」です。

パケットの受信処理

受け取ったホストでの処理は、送信ホストの処理とまったく逆になります。

ネットワークインターフェース(イーサネットドライバ)の処理

イーサネットのパケットを受け取ったホストは、まず、イーサネットヘッダの宛先MACアドレスが自分宛てかどうかを調べます。自分宛てでない場合にはそのパケットを捨てます。 パケットが自分宛てであった場合は、イーサネットタイプを調べて、イーサネットプロトコルが運んでいるデータの種類を調べます。 この例ではIPなので、IPを処理するルーチンにデータを渡します。

IPモジュールの処理

IPのルーチンにIPヘッダ以降の部分が渡されると、宛先IPアドレスが自分のホストのIPアドレスであればそのまま受信して上位層のプロトコルを調べます。 TCPならばTCPの処理ルーチンに、UDPならばUDPの処理ルーチンにIPヘッダを除いたデータの部分を送ります。 ルーターの場合はほとんど自分宛てではないため、ルーティングテーブルを調べて転送処理を行います。

TCPモジュールの処理

TCPではチェックサムを計算してヘッダやデータが壊れていないか、データを順番通りに受信しているかどうかを確認します。 またポート番号を調べて通信を行っているアプリケーションを特定します。 データがきちんと届いた場合には送信ホストに「確認応答」を返します。この確認応答がデータを送信したホストに届かない場合には、送信ホストは確認応答されるまでデータを繰り返し送信します。 データを正しく受信した場合には、ポート番号で識別したプリケーションにデータがそのまま渡されます。

アプリケーションの処理

受信したデータを解析し、Bさん宛のメールであることを知ります。もしBさん宛のメールボックスが存在しない場合には、送信元のアプリケーションに受取人がいないとエラーを返します。 もしメールボックスが存在していれば、ハードディスクなどにメッセージを格納します。処理が正常に終了すれば送信元のアプリケーションに伝えます。

第2章 終わり

以上がTCP/IPの基礎知識です。


{ "name": "hareku", "job": "Web Engineer" }