Select Language

AI Technology Community

9.1、TCP/IPプロトコルの詳細

コンピュータ間で情報を交換するには、情報交換の方式を定義する必要があります。1965年、ドナルド・デイビス(Donald Davies)は「メッセージ」という言葉を作り、2台のコンピュータ間で伝送されるデータを表すのに使いました。

1969年に、最初の広域ネットワークであるARPNETが登場しました。このネットワークは、メッセージ交換を使用した最初のネットワークでもあります(メッセージ交換に対して、初期の電話は回線交換を使用しており、通話の両者間に回線接続を確立し、通話が終了するまで維持します)。ARPNETは現在人々が使っているインターネットの前身でもあります。

1983年に、ARPNETは全面的にTCP/IPプロトコルを使用するようになりました。このセクションで使用するのもTCP/IPプロトコルですが、正確にはTCP/IPプロトコル群です。なぜなら、この中には多くのプロトコルが含まれており、TCPプロトコルとIPプロトコルだけではないからです。

ISOはネットワークプロトコルを階層化しており、最下層の物理層から最上層のアプリケーション層まで、合計7層です。しかし、TCP/IPでは4層に分けられています。図1に、それらの対応関係を示します。


図1 異なるプロトコル群におけるプロトコルの階層化


左側はISOが定義したリファレンスモデルで、右側はTCP/IPが定義したモデルです。この章で主に関心を持つのはネットワーク層とトランスポート層で、アプリケーション層は自ら開発する内容になります。

1、ネットワーク層

ネットワーク層で主に関心を持つのはIPv4プロトコルです。ネットワーク上の各マシンには少なくとも1つのIPアドレスがあり、異なるマシンは異なるIPアドレスを持ちます。このIPアドレスはネットワーク層で定義され、異なるマシンを区別するために使われます。


図2 異なるウェブサイトは異なるIPアドレスを持つ


図2のように、新浪網と百度のURLをそれぞれpingすると、異なるIPアドレスを持っていることがわかります。新浪網のIPアドレスは123.126.157.222で、百度のIPアドレスは123.125.114.144です。

IPv4では、IPアドレスは32ビットの整数で表されますが、ほとんどの場合、我々が見るのはドット(.)で区切られた4つの数字のセグメントで、各セグメントは0から255までの整数を表します。この表記法をドット10進表記法と呼びます(小数点で区切られ、区切られた各セグメントは10進数を表します)。

ドット10進表記法は直感的で、覚えやすいです。この2つの表記法が等価であることだけを知っておけばいいです。それらは相互に変換可能です。以下に、それらの相互変換を示します。

>>> import socket                        # これは我々が使用するライブラリです
>>> str_ip_addr = "123.125.114.144"    # 入力は文字列で表されたIPアドレスです
>>> int_ip_addr = socket.inet_aton(str_ip_addr)    # それをバイト列に変換します
>>> type(int_ip_addr)
<class 'bytes'>
>>> int_ip_addr[0]                        # 各バイトの内容を確認します
123
>>> int_ip_addr[1]
125
>>> int_ip_addr[2]
114
>>> int_ip_addr[3]
144
# バイト列を整数に変換します
>>> int_val_1 = int.from_bytes(int_ip_addr, byteorder='big')
>>> type(int_val_1)                        # 型を確認します
<class 'int'>
>>> int_val_1                            # 整数値を確認します
2071818896
>>> socket.inet_ntoa(int_ip_addr)        # バイト列を文字列に戻します
'123.125.114.144'

IPアドレスは合計32ビットで、2つのグループに分けられます。前半のグループはネットワークアドレスを表し、後半のグループはホストアドレスを表します。例えば、2台のマシンがあり、それらのIPアドレスがそれぞれ192.168.1.1と192.168.1.2です。この2台のマシンは同じネットワークに属しているため、それらのIPアドレスの前半部分、つまりネットワークアドレスは同じです(どちらも192.168.1)。ただし、後半のホストアドレスは異なります(それぞれ1と2)。

TCP/IPの設計時に、いくつかの特殊なIPアドレスが定義されました。例えば、127.0.0.1は自分自身を表し、ループバックアドレスとも呼ばれます。つまり、このアドレスにデータを送信することは、自分自身に送信することを意味します。このアドレスは非常に便利です。一般的なネットワーク通信には2台のマシンが必要で、1台はデータを送信し、もう1台はデータを受信します。このアドレスがあれば、1台のマシンで実際のネットワーク環境を模擬することができます。

例えば、1台のマシン上で2つのプロセスを実行し、1つはデータを送信し、もう1つはデータを受信します。送信側は目標アドレスを127.0.0.1に設定すれば、送信されたすべてのデータは自動的に自機にループバックされ、受信プロセスはこのデータを見ることができます。

もう1つの特殊なアドレスは0.0.0.0で、任意のIPアドレスを表します。ほとんどのマシンは複数のIPアドレスを持っており、一般的には少なくとも2つのIPアドレスがあります。1つは前述のループバックアドレス(127.0.0.1)で、もう1つは外部に公開される通常のIPアドレスです。異なるIPアドレスは異なるプロトコルスタックに対応しています。

このように理解することができます。異なるIPアドレスは異なる宅配便システムを表しています。もしあなたが複数の宅配便会社と契約している場合、あなたの家の前には複数のポストボックスがあり、宅配便を受け取るときには、確認するポストボックスを指定する必要があります。すべてのポストボックスを確認したい場合には、0.0.0.0という特殊なアドレスを使用する必要があります。もし127.0.0.1にバインドすると、このアドレスからのデータのみを受信することを意味し、自機の他のIPアドレスに送信されたデータは受信できません。これは、エクスプレスのポストボックスを見てもユンダの宅配便を見ることができないのと同じです。


図3 IPプロトコルスタック


図3では、2つの異なるプロトコルスタックのインスタンスが見られます。左側はループバックアドレス127.0.0.1を使用しており、右側は通常のアドレス192.168.1.1を使用しています。それらは独立しており、平等です。もし127.0.0.1からのデータを受信したい場合には、左側のシステムを使用します。もし192.168.1.1からのデータを受信したい場合には、右側のシステムを使用します。

それらが使用する物理層は同じでも異なっていても構いません。実際、ループバックアドレス127.0.0.1は物理層を必要としません。つまり、ネットワークカードとそれに対応するドライバが必要ないことを意味します。これは、127.0.0.1に送信されたデータはネットワーク上では見えないことを意味します。

2、トランスポート層

トランスポート層の主な機能は、アプリケーション間で通信を行うことです。IP層を通じて、データを特定のホストに送信することができます。しかし、そのホスト上には多くのアプリケーションがあり、このときには、送信された情報を処理するアプリケーションを指定する必要があります。

トランスポート層では、ポートという概念が導入されています。異なるアプリケーションは異なるポートを使用します。情報を送信するときには、目標ポートを指定するだけで、指定されたアプリケーションに送信することができます。

ポートは16ビットの整数で表されます。一部のポートは事前に定義されています。例えば、HTTPアプリケーションが使用するポートはデフォルトで80で、Telnetが使用するポートは23です。

注意すべきは、ポートはクライアントとサーバーの両方に対して決まっていますが、一般的にはサーバーのポートのみを指定し、クライアントは指定する必要はありません。すべてのセッションはクライアントが開始するため、サーバーは受動的に待機する側です。ただし、クライアントにも自分自身のポートがありますが、このポートは一般的に固定されていません。

トランスポート層のプロトコルには複数ありますが、このセクションでは主にTCPとUDPの2つのプロトコルを紹介します。

TCPは接続指向で、データ伝送の信頼性を

post
  • 5

    item of content
初期には、コンピュータ同士は相互に接続されておらず、孤立していました。それらの間のデータ交換は主にフロッピーディスク(現在のUSBフラッシュドライブに相当)を通じて行われていました。その後、人々はネットワークを創造し、コンピュータ間で情報の交換が可能になりました。
初期のコンピュータネットワークも種類が豊富で、サポートされているプロトコルも多岐にわたっていました。時間の経過とともに、現在広く使用されているのはIPネットワークとなり、他のタイプのネットワークは次第に姿を消しました。現在、オフィス内のローカルエリアネットワークでもインターネットでも、基本的にはIPネットワークを使用しています。
この章では、Pythonのネットワークプログラミングに関する知識を読者に紹介します。具体的には、TCP/IPプロトコル、ソケットインターフェース、TCP/UDPクライアントおよびサーバーの構築方法などを含みます。