ネットワークプログラミング入門① ~基礎の基礎編~

ネットワーク
Pythonネットワークプログラミング

さっそくですが,ネットワークプログラミングに入門しましょう.

ネットワークを学ぶ上で,「ネットワーク 仕組み」などとネット検索すればたくさんの情報を得ることができます.しかし,網羅的に情報が得られるネット検索は,たくさんの情報を得られるが故に知識が飽和状態に陥りやすくなってしまい,学習効率が非常に悪くなります.

そこで,自分の手を動かしながらネットワークの基礎を理解できるネットワークプログラミングを数回に分けて学んでいきましょう.

想定読者

この記事では,ネットワーク初心者もしくは入門者を対象としています.
そのほか,ネットワークプログラミングに興味がある方を対象としています.


  注)ネットワークプログラミングではPython3を用います.
    下記のサイトを参考にPython3を使える環境を用意してください.

Pythonの開発環境を用意しよう!(Windows)
Progateはオンラインでプログラミングを学べるサービスです。プログラミングを学んでWEBアプリケーションを作ろう。
Pythonの開発環境を用意しよう!(Mac)
Progateはオンラインでプログラミングを学べるサービスです。プログラミングを学んでWEBアプリケーションを作ろう。

記事から得られるもの

本記事からは以下に示す知識が得られます.

 ・ネットワークを支える基礎技術
 ・TCP/IPの基礎
 ・ネットワークプログラミング


TCP/IPの基礎

はじめに,ネットワークプログラミングをする上で必要になるネットワーク基礎中の基礎部分だけを述べます.ここでは,以下の用語について軽く解説します.

・Internet Protocol (IP)
・User Datagram Protocol (UDP)
・Transmision Control Protocol (TCP)
・ポート番号

Internet Protocol (IP)

Internet Protocol (IP) とは,ネットワーク上でコンピュータが機器間通信を行うために定められている通信のルール(プロトコル)です.

IPを用いてコンピュータを一意に識別するための番号を割り当てたものをIPアドレスと言います.
各コンピュータにそれぞれ異なるIPアドレスを割り当てることで,IPアドレスを宛先に指定した通信を行うことが出来ます.

現在,IPアドレスには IP version 4 (IPv4) と IP version 6 (IPv6) の2つがあります.IPv4の方が歴史は長く,一般に「IPアドレス」 と呼ばれる場合には IPv4 を示していることが多いです.

本記事では,指定が無い限り IPv4 で解説をしていきます.

Transmission Control Protocol (TCP)

Transmision Control Protocol (TCP) は,IPと同じくインターネットで標準的に使用されるプロトコルで,信頼性の高い通信を実現することが出来ます.
TCPは,通信先の端末との間にコネクションと呼ばれる論理的な通信路を構築し,通信データ(パケット)の再送やエラー訂正機能を用いて信頼性のある通信を実現しています.

User Datagram Protocol (UDP)

User Datagram Protocol (UDP) は,音声や映像といったリアルタイム性を重視した通信に使用されるプロトコルです.
通信先に事前の問い合わせ無く通信を発生させるため,コネクションレス型通信とも呼ばれます.UDPはその特性から,TCPと比較すると信頼性はありませんが,代わりに高速に通信を行うことができます.

ポート番号

ポート番号は,TCPやUDPが提供している機能で,通信に使用するプログラムを識別するための番号です.
1つのコンピュータが複数のプログラムを同時に稼働していた場合,IPアドレスを指定しただけでは複数のプログラムのどこと通信すればいいのかわかりません.例えるならば,大きなマンションに住む友達にマンションの名前を指定しただけでは,部屋番号が分からず郵便を届けることができないことと同じです.友達に郵便を届けるためにはマンションの名前と部屋番号を指定する必要があります.このとき,部屋番号に当たるのがポート番号であり,ポート番号とIPアドレスの両方を用いることで,どのコンピュータのどのプログラムと通信するかを決めることができます.


ソケット

ここでは,ネットワークプログラミングをする上での基礎となるソケットについて説明します.
最初は難しいと思いますが,ここではこんなものだとわかれば十分です.
続けていく中で理解が深まりますので1度では諦めず,他のサイトも参考にしながらソケットについて理解していってください.

ソケットとは

ソケットは言ってしまえば,ネットワークプログラミングをするための Application Programing Interface (API) のことです.
このような言い方をしても,わからない方もいると思いますので私なりに解説してみます.

TCP/IPなどのプロトコルを使用して通信するためには,定義されているプロトコルの通りに処理を行うプログラムが必要になります.たいていの場合,プロトコルの基礎的な処理を行うプログラムは Operating System (OS) に組み込まれており,これらのプログラムを利用するためには橋渡しをしてくれるソフトウェアインターフェイスが必要です.このソフトウェアインターフェイスの役目を果たしてくれるのがソケットです.

ソケットを例えてみる

よりわかりやすく,ソケットを別のもので例えてみましょう.
宅配便を例に考えてみます.荷物が友人の元に届くまでの流れは以下になります.
 1.荷物に友人の住所を記載した伝票を貼り付ける
 2.荷物を配達会社にいる受付の人に渡す
 3.受付の人はドライバーに荷物を渡す
 4.ドライバーが伝票から目的地を確認して目的地まで運ぶ(到着)

ここで,各登場人物をコンピュータの機能に当てはめてみましょう.
 ・荷物に伝票を貼り付ける <=> アプリケーションプログラム
 ・受付の人 <=> ソケット
 ・ドライバー <=> OS (+α)

この例では,「受付の人」がソケットの役割に当たり,荷物の依頼主(アプリケーションプログラム)がドライバー(OS)に直接荷物を渡さなくても,受付の人がドライバーに荷物をわたしてくれるため相手の元まで荷物を届けることが出来ます.

厳密には,ドライバーは伝票に記載された住所(通信先)にいる受付の人(ソケット)に荷物を渡しますが,ここでは説明の簡略化のため省略しています.

ソケット通信

ここからは,ネットワークプログラミングをする上でソケットを簡単に扱うことができるPythonのsocketモジュールを具体例にクライアントサーバシステムでのソケット通信の流れを見ていきましょう.

クライアントサーバモデル

ソケットの解説をする前に,クライアントサーバシステムについて理解しておきましょう.
クライアントサーバモデルとは,サービスを提供するサーバと,それを利用するクライアントで役割を分割してコンピュータ間の通信を行うモデルのことです.現在のほとんどのアプリケーションはこのクライアントサーバモデルを使用しています.


ソケットの観点からクライアントサーバモデルを見ていきましょう.
クライアントサーバモデルでは,サーバはソケットを用いて接続を待ち受けており,これをパッシブオープンと言います.クライアントは,ソケットを用いて自ら接続を要求しにいきます.これをアクティブオープンといいます.


ソケットから見た通信の手順を見ていきます.
はじめに,サーバは空のソケットを作成し,TCPもしくはUDPを用いるのかを指定します.次に,作成したソケットをポートに接続し,ポートを待ち受け状態にします.これでサーバはパッシブオープン状態となります.


サーバが待ち受け状態になれば,クライアントはサーバのサービスを利用できるようになります.サーバのサービスを利用するために,クライアントは空のソケットを作成し,サーバと同じプロトコル(TCP/UDP)を指定します.次に,空のソケットに,接続先となるIPアドレスとポート番号を指定して,サーバに接続しに行きます.


サーバはクライアントから接続要求があると,通信に使用するためのソケットを新たに作成します.クライアントとサーバのやり取りは,新しいソケットを利用して行います.その後,実際にデータのやり取りが行われます.ここでのやり取りは使用するプロトコル(TCP/UDP)によって通信方法が変わります.

データのやり取りが終わると,TCPでは一般的にクライアントから接続の切断が行われます.


ソケット通信のフロー

ソケット通信から見たクライアントサーバモデルの流れを,今度はPythonのsocketモジュールに当てはめながら見ていきましょう.
ソケット通信(TCP)の流れを図で表すと以下のようになります.

① 空のソケットを作成する(TCP/UDPを指定する)
② ソケットにIPアドレスとポートを紐づける
③ ポートを待ち受け状態にする
④ 空のソケットを作成する(サーバと同じプロトコル(TCP/UDP)を指定する)
⑤ 接続先のIPアドレスとポート番号を指定して,サーバに接続する
⑥ 接続要求を受け取り新しいソケットを作成する
⑦ データの送信
⑧ データの受信
⑨ 接続を切断する


まとめ

今回は,ネットワークプログラミングを行うための基礎的な内容を学びました.
今回の内容を理解すれば,ネットワークプログラミングはサクサクと行けるでしょう.
次は実際にプログラムをプログラムを作成して理解を深めていきましょう.


コメント

タイトルとURLをコピーしました