🧑‍💻

インターネットにおけるデータ転送とプロトコルの謎解き

2023/06/24に公開

はじめに

https://zenn.dev/bellstone/articles/c0da0fe697d0d9
前回の記事ではクライアントとサーバのやり取りとIPアドレスについて勉強しました。
しかし、IPアドレスでは限界があったた他のプロトコル(TCP/UDP)を使用すると話しました。
今回はプロトコルは何か、IPアドレスを補完するためどんなことを使えば良いかについて勉強したことを共有したいと思います。

プロトコル

インターネットを通信するためいろんなプロトコルがあります。代表的なプロトコルはIP(Internet Protocol)、TCP(Transmission Contorl Protocol)、UDP(User Datagram Protocol)があります。それでそもそもプロトコルは何なのでしょうか?
いつも通りWikipediaに通信プロトコルを検索してみました。
https://ja.wikipedia.org/wiki/通信プロトコル

通信プロトコル(つうしんプロトコル、Communication protocol)は、通信に関する規格のことである。「通信規約」や「通信手順」ともいう
通信を行うためには、通信に参加するもの同士の間で、あらかじめ通信に関する規格を定めなければならない。たとえば、江戸時代においては、旗振り通信により、米相場を各地に伝達していたが、旗を振る向きや回数の意味について、事前に打ち合わせて決めておかなければ意味を成さない

今回は分かりやすかったです。通信する時に事前に決めた約束でした。
例えば、現在働いてる会社で共通語(プロトコル)を日本語で決めた場合私が韓国語で喋るとコミュニケーションができないことです。但し、私が韓国の友達と会った時には日本語で喋るとコミュニケーションができないです。
なので、日本語も韓国語もコミュニケーション(有効なデータを送ること)はできますが、共通語(約束した規約)を使わないとコミュニケションができないため、約束すること、規約をプロトコルだと思います。

インターネットプロトコルスイート

インターネットプロトコルスイートはインターネットでコンピューター間のやり取りで使わられる通信プロトコルのセットです。このセットではOSI 7階層参照モデルとTCP/IP階層モデルがありますが、今回はTCP/IP階層モデルを利用して説明したいと思います。
まず、TCP/IP階層モデルは4階層で分けます。

より上位層のプロトコルはその目的の達成に役立てるために、より下位層のプロトコルを使用します。
一番上位からアプリケーション階層(HTTP、FTP)、トランスポート階層(TCP、UDP)、インターネット階層(IP)、リンク階層(LANカードなど物理的なもの)で構成されてます。
リンク階層はネットワークインターフェース階層とも言います。

アプリケーション階層

ソフトウェアアプリケーションがネットワークを利用して通信するために使用されるプロトコルが含めます。例えば、ブラウザを使用してWEBサイトを訪問する時にブラウザはこの階層のプロトコルを使用してサーバにサービス(WEBページを送受信)を要請するクライアントになります。

トランスポート階層

アプリケーションをためのHOST間の通信サービスを提供します。ここではアプリケーションに対するデータを分割、転送、組み立てる、エラー確認など安定的なデータ転送の部分を担当します。

インターネット階層

ノード(サーバ)間のネトワークパケットを移動させる役割です。ソースからターゲット(送り先)に転送できるように各パケットの目的地指定を処理します。

リンク階層

ネットワーク媒体にパケットを配置、受信します。装置(パソコン)をネットワークに連結できるようにケーブル又はWi-Fiルーターなどの物理的なものだと思ったら良いです。

説明がちょっと複雑ですが、実際にこんにちは👋🏻を送った際には下記の順番でメッセージを転送します。

  1. アプリケーションからこんにちは👋🏻というメッセージを生成する。
  2. ソケットライブラリを利用してOS層に転送
  3. OS層でTCPの情報とIP情報を利用してパケットを生成する。
  4. 最後にEthernet Frame(物理的なマックアドレスなど)を追加して転送する。
  5. LANなどを通じてサーバに転送される。

TCP/IPパケットの情報

TCP(Transmission Control Protocol)はインターネットプロトコルスイートのプロトコルでIPと一緒にTCP/IPだと言われます。
上の順番を見るとTCPの情報とIPの情報を利用してパケットを生成すると話しました。
TCPでは色んな情報がありますが、PORT、順番検証情報、送信制御、転送データが含まれてます。

TCPの特徴

TCPの特徴としては下記になります。

  1. TCPの3-way-handshakeを利用した連結志向的
  2. データの転送を保証する
  3. 順番を保証する。

このような特徴があったため、信頼できるプロトコルだし現在のアプリケーションで大体TCPを使うと思います。

TCPの3-way-handshake

TCPは転送を保証するため、3-way-handshakeというシステムを利用して発信者と受信者との安定的な連結を保証します。3-way-handshakeはSYN、SYN-ACK、ACKの段階になります。
SYN(Synchronize)は同期化の略としてクライアントとサーバの連結を設定する要請を意味します。
ACK(Acknowledge)は承認の略としてサーバのSYN-ACKを受諾して連結設定をために転送します。

  1. クライアントがサーバにSYNというメッセージを送ります。
  2. サーバが正常に起動中であればサーバからSYN-ACKをクライアントに送ります。
  3. 最後にクライアントがACKを送ります。
  4. データを転送します。

SYN、ACK複雑に見えますが、例えば電話をする二人を考えてみましょう。
SYNはAがBに電話して電話のベルの音がすることです。クライアントがサーバに連結設定を求めることを表するSYNパケットを送ります。
SYN-ACKはBが電話と受けてこんにちは👋🏻ということです。クライアントからのSYKパケットを受諾するACkパケットをまた転送して、自分のSYNパケットも転送します。
ACKはBが応答をした後Aがこんにちは🙌🏻と応答することです。クライアントはSYNパケットを受諾するACKパケットを改めてサーバに送ります。
これでクライアントとサーバはSYNパケットを確認したので、連結が設定されました。なので、データを送ります。

このような段階があったため、データを転送した後サーバの応答によってサーバの状態を確認できます。もし、サーバの状態が悪かったらデータを送らないこともできます。
それと、パケットの順番も保証できるので、順番が間違えた場合間違えたパケットも全部捨てて改めて転送を要求できます。サーバの内部の実装によって最適化されたら改めて要求しなくて処理することもできますが、基本的な処理は間違えたパケットから改めて要請します。

UDP

UDP(User Datagram Protocol)です。TCPよりUDPは機能があまりありません。それとTCPの3-way-handshakeみたいな機能も提供してくれません。なので、データの転送と順番を保証しません。
しかし、単純、早いというメリットがあります。IPと似てますが、ポートとメッセージの正しさを検証するチェックサム機能ぐらい追加されてます。
UDPは信頼性より速度が優先する実時間アプリケーションで適切なプロトコルです。

ポート

3-way-handshakeを利用してクライアントとサーバがデータを送受信状態になったか確認して送ることができました。
実はパソコンでは色んなアプリケーションが動いてます。例えば私もこの記事を書きながら音楽を聴いてます。
であれば、IPは一つしかないのにクライアントがメッセージを送りたい宛先をどうやって決めますか?逆にサーバはどのアプリケーション向けのメッセージかをどうやって分かりますかね?

TCP/IPが送る情報を改めてみるとポートという単語があります。

TCPでは色んな情報がありますが、PORT、順番検証情報、送信制御、転送データが含まれてます。

TCP/IPのパケットでは出発地ポート情報と到着地ポート情報が含まれてるため、同じIPのプロセスを区分できます。

ポートは0~65535まで割り振ることができます。ポート番号は大まかに三種類に分けます。

  • 0 ~ 1023 : システムポート番号
    • FTP(20)、TELNET(23)、HTTP(80)、HTTPS(443)
  • 1024 ~ 49151 : ユーザーポート番号
  • 49151 ~ 65535 : 動的・私用ポート番号

まとめ

今回はプロトコルとIPアドレスの限界を解決するために、TCPとUDPについて勉強しました。
それを理解するために、インターネットプロトコルスイートも軽くみてました。
TCPはIPアドレスを補完するため、必要な情報(3-way-handshake、ポートなど)を追加してサーバに送ること勉強しました。
何となくデータを送る流れについて分かりましたか?でも、一つの問題があります。
私たちがブラウザを利用する時には、IPアドレスを直接書かなくて、URLというテキストを使用して接続します。
例えば、Googleに接続するためにはwww.google.comを入力しますが、142.250.198.14を直接入力しません。www.google.com142.250.198.14に移動できることはDNSサーバからマッピングしてくれるからです。次回はDNSは何かについて勉強したいと思います。
今までの説明が皆さんにも分かりやすく説明できていればと嬉しいです。

Discussion