Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

ネットワークでよく出てくる「コネクション」ってなんなんだろう?

ネットワークにおいて「コネクション」という単語はよく耳にします。

  • 「WebSocketはコネクションを確立後、ずっとそのコネクションを使う」
  • 「ロングポーリングは返すたびにクライアントがコネクションを確立し直す」
  • 「TCPでは3ウェイハンドシェイクでコネクションを確立する」

これらを見ると「コネクションは通信経路のことなのかな?」と勘違いしてしまいます。今回はそんな誤解を解いていこうと思います。

コネクションはネットワーク上の経路のことではない

TCPとUDPはそれぞれ

  • コネクション型プロトコル
  • コネクションレス型プロトコル

と呼ばれます。この2つを例にとって、コネクションについて説明していきたいと思います。

TCPは「通信をはじめるよ」「いいよ」というように通信できるか確認してから通信を行います。それに対し、UDPでは「送るよ。返事はいらないよ」と相手の状態を確認することなく無造作に送り続けます。

UDPもTCPも、ルーターを中継しながらデータを届けています。しかし、経路は固定ではありません。ルーターがあるのに経路を固定していたら何のためのルーターなのかわからなくなりますからね。つまりコネクション型でも、コネクションレス型でも経路は固定されていません。

(余談ですが、経路を固定するコネクション型通信も存在します)

コネクション型とコネクションレス型

TCPは通信を開始する際、相手が通信可能であることを確認してから通信をはじめます。また、一度通信を始めたらコネクションを解放するまではお互いに通信状態を維持します。それに対してUDPでは相手が通信可能状態なのか確認せず、ひたすら投げます。

ここがコネクション型とコネクションレス型のちがいです。通信経路を確保する(=相手と通信ができることを保証する)かどうかが異なっています。つまり「コネクションを確立する」というのは「お互いに通信状態になる」ということです。片一方が勝手にやめることはできません。

様々なコネクション

HTTPでは、クライアントがリクエストするときにコネクションを確立します。そして、サーバーがレスポンスを返すとコネクションを切断します。

ロングポーリングもHTTPと同様に、コネクションをリクエスト時に確立し、レスポンスを返すときに切断します。そのため、レスポンスを返した後は再度コネクションを確立する必要が有ります。

WebSocketではコネクションを確立したあとはずっとそれを使い通信を行います。サーバーがレスポンスを返しても切断をしません。