3章ではネットワークプログラミングについて学びます。まず3.1章で通信プロトコルについて学びます。そして3.2章以降で、ソケットを用いたネットワークプログラミングの技法を体得します。3章が終わる頃には、分散アルゴリズムの実装に向けて最低限必要なプログラミングのテクニックが身についていることでしょう。 # 3.1 通信プロトコル ## 3.1.1 コンピュータネットワークと通信プロトコル **コンピュータネットワークは、コンピュータ同士がコミュニケーションするための技術です**。そしてコンピュータネットワークを介して円滑にコミュニケーションするためには、主に以下の2点をお互いが守る必要があります。これらを定めたものを、**通信プロトコル**といいます。 - **やり取りの手順** - **フォーマット** **コミュニケーションには共通の通信プロトコルが不可欠です**。人間社会に例えると理解しやすいでしょう[^1]。ビジネスマンとヤンキーの間ではやり取りの手順が異なります。ビジネスマンはまず丁寧に会釈をし、その後本題を切り出します。しかしヤンキーはまず相手の学校に乗り込み、バット・竹刀等を駆使して威圧したあとに本題を切り出します。また、やり取りの手順が同じビジネスマン同士でも、フォーマットが異なる場合があります。日本語話者のビジネスマンは「こんにちは」と喋るのに対して、マケドニア語話者のビジネスマンは「Здраво」と喋ります。この例からわかるように、やり取りの手順やフォーマットが異なると、お互いの意思疎通が難しいのです。ビジネスマンとヤンキー、日本語話者とマケドニア語話者はいつまでも意思疎通できないでしょう。 ![[communication-different-protocol.excalidraw.svg]] <center><b>Fig 1: やり取りの手順・フォーマットが異なることでコミュニケーションが破綻している図</b></center> ## 3.1.2 プロトコルの階層 前章では、コンピュータ同士で通信するためにはプロトコルを定める必要があり、プロトコルはやり取りの手順およびフォーマットを定めたものだということを学びました。具体的には、0と1を何で(光、電気、電波)どう表現し、どのような手順でやり取りするか(挨拶の仕方、一部の情報が失われたら送り直す方法など)を定める必要があります。 これらを1つのプロトコルで定めてしまうと、仕様書が膨大になってしまいます。そのため、いくつかのレイヤに分けて通信プロトコルが標準化されています。国際標準化機構(ISO)によって策定されたOSI参照モデルが有名です。 <center><b>Table 1: OSI参照モデル</b></center> | レイヤ番号 | レイヤ名 | 機能 | 代表的なプロトコル | | ----- | ---------- | -------------------------------------------------------- | ------------------ | | 7 | アプリケーション層 | アプリケーションごと必要なやり取りの手順を定義 | HTTP・IMAP・FTP | | 6 | プレゼンテーション層 | 通信に用いるデータの表現形式(バイナリ)とアプリケーション層で取り扱うデータの表現形式を相互に変換する方法を定義 | 文字コード・CSV・JSON | | 5 | セッション層 | 送信者と受信者の間でお互いの存在を確認し、セッションを確立してデータを送り合う方法を定義 | TLS | | 4 | トランスポート層 | メッセージを確実に宛先アプリケーションに届ける方法を定義 | TCP・UDP | | 3 | ネットワーク層 | 複数の機器間でメッセージをルーティングし、宛先に届ける方法を定義 | IP(IPv4・IPv6)・ICMP | | 2 | データリンク層 | 2台の機器の間をつなぐ方法を定義 | Ethernet・Wi-Fi・ARP | | 1 | 物理層 | メディアを使って0・1を表現し、届ける方法を定義 | ISDN, 1000BASE-T | 各レイヤは、下層のレイヤに依存しながらそれぞれの仕事をこなし、上位レイヤにサービスを提供します。 インターネットでは、主にトランスポート層プロトコルとしてTCP・UDPが、ネットワーク層のプロトコルとしてIPが使われます。本資料では、IPの概要およびTCP・UDPの特性について説明します。それぞれのプロトコルの詳細は説明しませんが、気になる人は勉強してみてください。 ## 3.1.3 IP TCP/IP入門の本を要約する Internet ProtocolはInternet ## 3.1.4 TCP・UDP ![TCP vs UDP](https://i.redd.it/duv11av99nm11.png) [r/ProgrammingHumorのスレッド](https://www.reddit.com/r/ProgrammerHumor/comments/9gcwgw/tcp_vs_udp/)より引用 # 3.2 ソケット - Socket(概念) - トランスポート層以下はやってくれる # 3.3 ネットワークプログラミング - UDPでパケットを送ってみる - TCPで送る, echo - TCPで複数のコネクションをさばく(マルチスレッド) --- 前ページ: [[02 マルチスレッドプログラミング]] 次ページ: [[04 演習 チャットアプリを作ってみよう]] [^1]: 人間社会でもプロトコルは非常に重要です。実際、プロトコルという用語は外交分野からもたらされたものです。[参考](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)