目次
1.前書き
1980年代に異なる種類のコンピュータ間で通信を行うための約束事としてISO(国際標準化機構)とITU(国際電気通信連合)によって通信機能を7階層に分けて定義したOSI参照モデルが出来ました。
各階層毎に機能や通信の約束事が決まっていて、2つのコンピュータ間の同じ階層間で論理的な接続が成立するようになっています。また、各階層は下位の機能を使って自身の機能を実現し、上位に機能を使ってもらう関係にあります。
一方、TCP/IPはコンピュータネットワークの通信プロトコルとして1970年代に仕様が策定され、TCP/IP v4までの4つのバージョンが作られました。TCP/IPは1980年代に標準化され、インターネットを含む多くのコンピュータネットワークで標準的に利用される通信プロトコルのセット(インターネット・プロトコル・スイート)となっています。
TCP/IPは、前記の7階層に分けて定義されたOSI参照モデルに対して4層から成ります。
通信に関する標準規格を定める団体として以下のものがあります。
(1)ISO(International Organization for Standardization、国際標準化機構)
(2)ITU-T(International Telecommunication Union Telecommunication Standardization Sector、国際電気通信連合電気通信標準化部門)
(3)ANSI(American National Standards Institute、アメリカ規格協会)
(4)IEEE(Institute of Electrical and Electronics Engineers、電気・情報工学分野の学術研究団体)
LAN(Local Area Network)に関する規格策定は、IEEE 802委員会(LAN/MAN Standards Committee, 略称LMSC)で行われている。
策定された規格として、
・IEEE 802.1 Higher layer LAN protocols; High Level Interface (HILI) アーキテクチャ
・IEEE 802.3 Ethernet (旧: CSMA/CD) イーサネット
・IEEE 802.11 Wireless LAN (WLAN) 無線LAN
などがある。
(5)IETF(The Internet Engineering Task Force)
インターネット・プロトコル・スイートの技術面に関するNPOで標準化団体で、IETFにおける技術仕様は RFC(Request For Comments)という名前で文書化される。
2.TCP/IPプロトコル
送信側では上位層から受けたパケットを自身の層の機能を果たすためのヘッダでカプセル化して下位の層、または装置(ノード)にデータを渡します。受信側では下位層、または装置(ノード)からカプセルの中身のデータを受けて上位層、または装置(ノード)に渡します。
この様にプロトコル階層に応じてカプセル化されたデータがノード間でバケツリレー式に送られます。下記にイメージ図を示します。
各プロトコル層における仕組みを以下に示します。
2.1 ネットワークインターフェース層
ネットワークインターフェース層では隣接するネットワーク間、又は同じネットワーク内のノード間でデータ転送するための伝送媒体と、パケットをビットストリームに分解/再構築して隣接するノード間でデータを送るための誤り検出と誤り訂正方法を提供します。ネットワークインターフェース層が扱うデータを「フレーム」といいます。
イーサネット (Ethernet)はネットワークインターフェース層の代表的なプロトコルで下記に概要を示します。
(1)伝送媒体
・同軸ケーブル:
バス型のイーサネット
・光ファイバー:
主にインターネット回線に使用されるスター型のイーサネットで、「1000BASE-LX」や「1000BASE-SX」といった光ファイバーケーブルなどがあります。
・LANケーブル:
インターネット接続に使われるスター型のイーサネットで、「1000BASE-T」や「1000BASE-CX」というツイストペアケーブルなどがあります。
(2)データリンク層
IEEEによりIEEE 802.3としてその技術仕様が公開されていて、MACアドレス(ネットワークインターフェイスが持っている端末を識別するための固有値)で隣接するノードにフレームデータを送るための誤り検出、誤り訂正方法が決められています。
各ノードは自身や宛先のMACアドレス情報をフレームに含めて送信し、スイッチングハブや端末ノードはそのアドレス情報に基づいて受信や中継処理を行います。
全てのビットが1のMACアドレス(FF.FF.FF.FF.FF.FF)はブロードキャストアドレスでこの宛先のフレームは全てのイーサネットカードが取り込みます。ARP(Address Resolution Protocolの略でIPアドレスからMACアドレスを動的に知る)プロトコルで使われます。
イーサネットフレームにはいくつかの種類があり、Ethernet IIフレーム(イーサネットバージョン2またはDIXフレームともいう)は現在最も使用されているものです(下図)。
(3)データリンク層で動作する機器
①ブリッジ
ネットワーク間(バス型とスター型など異なる方式間)を接続するための機器でイーサネットフレームの中継を行います。
②スイッチ(スイッチングハブ、L2スイッチ)
ネットワークインターフェース層で中継する機能を持つ機器で、MACアドレスを使って中継動作を行います。
ポートに接続されている機器のMACアドレスを学習して記憶しているため、宛先の機器が繋がっているポート以外のポートから無駄なデータが送信されることがなく、ネットワークを有効に使えます。
2.2 インターネット層
インターネット層は、前記のネットワークインターフェース層で論理的に接続されたノード間の1つ、または複数にまたがってIPアドレスによって論理的に接続します。
この層ではパケットの送受信を行うインターネットプロトコル (IP)の他に、アドレス解決プロトコル (ARP)、インターネット制御メッセージプロトコル (ICMP) が組み込まれています。
インターネットプロトコルのパケットの構造を下図に示します。
(1)IPアドレス(IPv4)
IPアドレスはネットワークIDとホストIDに区切って使い、区切る位置によって、A、B、Cの3つのネットワーククラスに分けられます。
ホストIDフィールドが全て0のアドレスはネットワーク自身を表わすため、全て1のアドレスはネットワーク中の全てのホストへのブロードキャスト用に予約されています。
①グローバルIPアドレス
グローバルIPアドレスはインターネットで相手と通信するための他と重複しない一意のIPアドレスです。
②プライベートIPアドレス
プライベートIPアドレスはLANなどの企業内ネットワークで自由に使用できるIPアドレスです。IPアドレスの範囲はRFC 1918で規定されています。
③DNS (Domain Name System)
各ドメイン名にはIPアドレスが割り振られています。ドメイン名からDNSによって対応するIPアドレスを求め、その宛先IPアドレスを利用してネットワーク上の機器と通信を行ないます。
(2)IPアドレスを調べる(Linux)
①自分のホストのIPアドレス
$ ifconfig または$ /sbin/ifconfig
②ドメイン名のホストのIPアドレス
$ nslookup ドメイン名
又は
$ dig ドメイン名
(例)
$ nslookup www.yahoo.co.jp
$ dig www.yahoo.co.jp
2.3 トランスポート層
トランスポート層のプロトコルにはTCPとUDPの2つがあります。
2.3.1 TCP
インターネットプロトコル(IP)ではパケット(最大長1500バイト程度)単位で転送する仕組みしかなく、大きなサイズのファイルを送ることができません。またIPでは途中でパケットが破棄されることもありパケットが相手に届くことが保証されていません。
TCPでは大きなデータをIPで送れるサイズのパケットへの分割を行なったり、途中で破棄されたパケットを再送して信頼性の高い通信を行います。
また、TCPでは接続するアプリケーションを識別するためにポート番号を利用し、1つのIPアドレスをもつホストでポート番号の異なる複数のアプリケーションと接続することができます。
(1)TCPヘッダのフォーマット
①送信元ポート番号:相手からの応答を受付するポート番号
②宛先ポート番号:相手のアプリケーションを識別するポート番号
③シーケンス番号:データの到着順を確認するための番号で相手からの確認応答番号を設定する
④確認応答番号:シーケンス番号に受信したデータサイズ(byte数)を足して確認応答番号として応答する
⑤データオフセット:ヘッダー長を表し、データ開始位置を示す
⑥予約:将来用で常に0
⑦コントロールフラグ:6つのフラグ情報(URG,ACK,PSH,RST,SYN,FIN)の各々1ビットで0:無効、1:有効を表わす
⑧ウィンドウサイズ:応答確認を待たずにまとめて送ることのできるデータ量を示す
⑨チェックサム:TCPセグメント(TCPヘッダ+データ)のチェックに使用
⑩緊急ポインタ:URGフラグが有効のとき、緊急データの位置を示す
⑪オプション:MSS値などを設定するときに使用
⑫パディング:TCPヘッダが32bit単位になるように0で埋める
(2)TCPプロトコルの仕組み
コントロールフラグの[SYN]、[ACK]で2点間の同期を取り、シーケンス番号(SEQ)と確認応答番号(ACK)でTCPセグメント(TCPヘッダ+データ)の到着順とデータ欠落の検出を行います。[SYN]、[ACK]で2点間の同期を取る仕組みを「3ウェイハンドシェイク」と言います。
TCPプロトコルではデータ転送の信頼性を確保するため、送信データに対して[ACK]を監視して、一定時間[ACK]が返ってこないときは再送します。一定回数再送しても[ACK]が返ってこないときは[RST]フラグを送信してコネクションを強制終了し、初期状態とします。
2.3.2 UDP
UDPは相手とのコネクションを確立する手順はなく、単純に相手をアドレスで特定して送受信します。
UDPではデータ部の内容も利用者が自由に決められるため、通信の相手をIPアドレスだけでなくポート番号によってアドレスを拡張することで、ポート番号ごとに機能を割り振った送受信が可能になります。
(1)UDPヘッダのフォーマット
①送信元ポート番号:相手からの応答を受付するポート番号。
返信不要の場合は0。
②宛先ポート番号:相手のアプリケーションを識別するポート番号
③パケット長:UDPヘッダとデータを合わせたサイズ(btye)
④チェックサム:UDPデータグラム(UDPヘッダ+データ)をチェックするために使用。チェック不要の場合は0。
2.4 アプリケーション層
2.4.1 HTTPプロトコル
(1)プロトコルの概要
Webサーバ(HTTPのサーバ)とWebブラウザ(HTTPのクライアント)の2つがTCPの80番ポートを使い通信します。
最初にクライアント側からTCPの80番ポートで待ち受け(リッスン)しているサーバに対して接続します。
TCPの接続が完了すると、クライアント側からHTTPのGETメソッドでファイルを要求します。クライアント側からの要求に対してサーバ側から応答を返し、続いて要求したファイルのデータが送信されます。
(2)実験
①試験環境準備
VirtualBoxの仮想マシンCentOS8にApatch(HTTPサーバ)をインストールします。
・インストール対象(httpd)のパッケージを確認します。
$ yum list | grep httpd
・ここではhttpd、httpd-tools、httpd-devel、httpd-manualをインストールします。
# yum install -y httpd httpd-tools httpd-devel httpd-manual
・Apache(httpd)サーバの起動
# systemctl start httpd
・Apache(httpd)サーバの状態確認
# systemctl status httpd
②ゲストOS(CentOS8)のファイアウォールの設定
・ファイアウォールが起動しているか確認します。
$ systemctl status firewalld
Active: active (running)となっていれば起動しています。
・HTTPが許可されていることを確認します。
・「services:」に「http」がないときは下記のコマンドで追加します。
$ sudo firewall-cmd –permanent –add-service=http
$ sudo firewall-cmd –reload
・httpが追加されたことを確認します。
$ systemctl status firewalld
③HTTPプロトコルの実験
・index.html(トップページ)の配置
/var/www/htmlにindex.html(”テストページ”の記載のみ)を置きます。
・ホストOS(Windows10)のコマンドプロンプトから
telnetでWebサーバにTCP接続してページを取得します。
$ telnet localhost 80
Webサーバに接続できたら
GET / HTTP/1.1(改行)
host:localhost(改行)
(改行)
サーバからページのレスポンスが返ります。
アプリケーション層のプロトコルには、「HTTP」の他に
電子メールで使う「SMTP」・「POP3」・「IMAP4」、自動的にIPアドレスを割り振る「DHCP」、インターネット上でドメイン名を管理する「DNS」、ファイル転送「FTP」、ネットワーク・タイム・プロトコルの「NTP」、ネットワークの機器の監視・制御の「SNMP」、、暗号や認証を使ってリモートコンピュータと通信するための「SSH」などがあります。
3.ソケット
3.1 ソケットの概要
TCP/IPアプリケーションからTCP/IPを使って通信するときにIPアドレスとポート番号の組み合わせによって識別されるリンクをソケットといい、ソケットを使ってTCP/IPプロトコルを操作するAPIがシステムコールとして提供されています。
ソケットにはTCPとUDPのどちらを使うかによって2つのタイプがあります。
TCPを操作するソケットは「ストリーム型」(SOCK_STREAM)、UDPを操作するソケットは「データグラム型」(SOCK_DGRAM)と呼びます。また、IP層以下を操作する型として「RAW型」(SOCK_RAW)があります。
3.2 ソケットの動作
(1)ストリーム型ソケット
ストリーム型ソケットの動作概要を下図に示します。
(2)データグラム型ソケット
データグラム型ソケットの動作概要を下図に示します。
3.3 ソケットの実装例
CentOS8のAPI(システムコール)を使ったC言語のサンプルプログラムは下記を参照して下さい。
ソケット通信(Linux)(本サイト内のページ)
(参考文献)
・「はじめてのTCP/IP」
著者:中西 隆 発行:株式会社技術評論社
The end