Skip to content

コンピューター間通信のフロー

フローの全体像

  1. ソケット作成
  2. コネクションの確立
  3. データ送受信
  4. コネクションの破棄

ソケット作成

browserなどのアプリケーションがSocketライブラリ経由でOSのプロトコルスタックにソケット作成を依頼する。 ソケットとは、プロトコルスタック内のメモリ領域のことを指し、通信に必要な制御情報(クライアントのIP、サーバーのIP、クライアント-サーバー間の通信状態(未接続なのか、接続済みなのか、など)、通信しようとしているプロセスのIDなど)が記録される。 ソケット作成とは、プロトコルスタックがこのメモリ領域を確保することを指す。 ソケット作成後は、アプリケーションに制御が戻る。

コネクションの確立

アプリケーションがSocketライブラリのconnect()関数を呼び出すと、プロトコルスタックがコネクション確立を開始する。 アプリケーションはプロトコルスタックに、接続先のIPアドレスを渡す。 プロトコルスタックはサーバーに対し、接続元/接続先のIP・ポート番号を含むパケットを送信する。 サーバーはパケットを受領し接続処理を行った上で、「パケットを受領したこと」を示す情報を含むパケットをクライアントに送信する。 クライアントはパケットを受領し、ソケットに接続先IP・ポートを記録した上で、「パケットを受領したこと」を示す情報を含むパケットをサーバーに送信し、アプリケーションに制御が戻る。 サーバーはパケットを受領し、コネクションの確立が完了する。

↑これが「3wayhandshake」と言われる手順?

データの送受信

パケットの送信

アプリケーションはSocketライブラリのwrite(descriptor, request-message)を呼び出し、プロトコルスタックにデータの送受信を依頼する。 プロトコルスタックが一度に送信できるデータ量は決まっている(maximum transfer unit, maximum segment size)。 データ送信効率を高めるために、MSSギリギリになるまでアプリケーションからの送信依頼を溜め、一回の送信でなるべく多くのデータを送信しようとする。 しかし、MSSギリギリまでデータ送信を待つと、アプリケーションからの送信依頼から実際の送信までにタイムラグが生じる。そのため待ち時間の限度もプロトコルスタックで決まっている。 また、アプリケーションから渡されたリクエストメッセージのサイズがMSSより大きい場合は、TCPがMSSに収まるようにリクエストメッセージを分割する。

受信確認応答

TCPでは送信したパケットが相手に届いたかどうかを検証する。 送信側は送信対象のデータをパケットに分割し、各パケットが先頭から何バイト目なのかを計算する。この値をシーケンス番号と言う。 パケット送信時は、送信対象のパケットのシーケンス番号がTCPヘッダに付加される。 受信側はパケットとシーケンス番号を受け取る。パケットサイズを計算し、ACK番号として「シーケンス番号+パケットサイズ」を送信側に返却する(受信応答確認)。 送信側はACK番号を確認し、パケットが相手に届いたことを確認する。

ウィンドウサイズ

受信側は、受け取ったパケットを受信バッファに溜めた上でACK番号の計算等の処理を行い、データをアプリケーションに渡すと、その分の受信バッファを解放する。 受信バッファのサイズを超えてパケットが送信されてきた場合、その分は受信バッファに溜められず消滅する。受信バッファのサイズをウィンドウサイズと呼ぶ。 一方、送信側はACK番号の返却を待たずに次々とパケットを送信したいが、受信側のバッファを超えないように気をつける必要がある。 送信側が「あとどのくらいパケットを送信できるか」がわかるよう、受信側はバッファの空き容量をTCPヘッダのウィンドウフィールドにセットし、送信側に連携する。

IP,イーサネット層の役割

  • クライアントでパケット作成時にIPヘッダ、MACヘッダが作成される。
  • 宛先に向かう途中で複数個のルーターを経由するが、ルーターを経由する度にMACヘッダーのMACアドレスが次に向かうルーターの値に書き変わる。

IPヘッダ、MACヘッダの作成

IPはTCPからパケット送信依頼を受ける。 IPは、初めにIPヘッダを作成する。宛先IPはTCPから受け取ったものをセットし、送信元IPはクライアントが持つ経路表からセットする値を探す。 ※そもそもIPアドレスはマシンごとに決まる値ではなく、LANアダプタごとに決まる値である。1つのマシンが複数のLANアダプタを持つ場合、すなわち1つのマシンが複数のIPアドレスを持つことになり、送信元IPアドレスにどれをセットすべきか明らかではない。経路表では「宛先IPアドレス」「次に経由すべきルーター」「送信元IP」の組画管理されており、TCPから受け取った宛先IPを使い、「送信元IP」を特定する。 IPヘッダを作成したら、次にMACヘッダを作成する。MACヘッダには送信元MACアドレスや宛先MACアドレスをセットする。宛先MACアドレスは次に経由するルーターのMACアドレスをセットすることになっており、ARPを使い値を取得する。