---
title: "WebSocketとは何か、どのように機能するか"
description: "Web3におけるWebSocketの概要と仕組み"
---

# WebSocketとは何か、どのように機能するか

WebSocketは、TCPをベースにした双方向通信プロトコルであり、クライアントとサーバー間の通信を標準化し、双方がお互いにデータを要求できるようにするものです。対照的に、HTTPのような単方向プロトコルでは、クライアントがサーバーにデータを要求することしかできません。

クライアントとサーバー間のWebSocket接続は、両者が接続を維持したいと望む限り開いたままにでき、継続的な通信が可能になります。

HTTPでは、各接続はクライアントがリクエストを送信した時点で開始し、そのリクエストが処理されると終了します。

WebSocketがWeb3 dApp通知においてより優れている可能性がある理由は、個別のリクエストを必要とすることなく、重要なイベントに対する[リアルタイム通知](https://www.alchemy.com/docs/reference/webhooks-overview)を継続的に実現できるからです。[Alchemy Notify](https://www.alchemy.com/notify?a=e35dd0b6f1)のようなツールを使えば、ウォレットや[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)にリアルタイム通知を簡単に追加できます。

## WebSocketとは何か

**WebSocketは、クライアントとサーバー間でインタラクティブな通信セッションを可能にする双方向通信プロトコルです**。TCPをベースにしており、リアルタイム通知機能を必要とするアプリやサービスでよく使用されます。

### WebSocketサーバーとは何か

**WebSocketサーバーとは、特定のプロトコルに従ってTCPポートをリッスンしているアプリケーションです。** WebSocketはクライアントとサーバー間の双方向通信プロトコルであり、両者が互いにデータを要求し送信できるようにします。

対照的に、HTTPは単方向通信プロトコルであり、クライアントはサーバーにリクエストを送信することしかできず、サーバーはそのレスポンスとしてデータを返すことしかできません。HTTPの関係において、サーバーがクライアントに対してデータを要求することはありません。

### WebSocket接続とは何か

**WebSocket接続とは、クライアントとサーバー間の継続的な接続です**。対照的に、HTTP接続は一度限りのものです。接続はクライアントがサーバーにリクエストを送るたびに開始し、サーバーのレスポンスとともに終了します。WebSocket接続は、クライアントとサーバーの両者が望む限り維持することができ、つまり最初の1回のリクエストから、両者が望む限りデータをそのWebSocket上で流し続けることができます。

### WebSocketはどのプロトコルを使用しているか

**WebSocketはWSプロトコルを使用しており、これはTransmission Control Protocol（TCP）をベースにしています**。これはコネクション指向のネットワークであり、データを正しい宛先にルーティングするには、参加者間で先に接続を確立する必要があります。

対照的に、Internet Protocolでは、そのデータパケット内の情報に基づいてデータの送信先が決定されます。パケットをルーティングするための事前設定は必要ありません。

### WebSocket APIとは何か

サーバーがクライアントにデータを送信する方法は2つあります。クライアントが定期的にサーバーにデータを要求する方法である**ポーリング**か、サーバーが自動的にクライアントにデータを送信する方法である**サーバープッシュ**です。

WebSocket APIは、最初のリクエストの後も接続を開いたままにしておくことで、このクライアント・サーバー間の接続を活用してサーバープッシュの手法を用い、クライアントが常に新しい更新をサーバーにポーリングし続けることで生じるインフラへの負荷を取り除きます。

## WebSocketはどのように機能するか

WebSocketは双方向通信の方式であり、1つのサーバーリクエストに対して複数のレスポンスを返すことができます。また、WebSocketは主にクライアント・サーバー間の通信に使用されるのに対し、webhookは主にサーバー・サーバー間の通信に使用されます。

### WebSocketとwebhookはどう違うのか

WebSocketとは対照的に、HTTPを使用する[webhook](http://www.alchemy.com/overviews/what-is-a-webhook)は厳密に単方向であり、サーバーはリクエストがあった時にのみアプリケーションに応答し、リクエストが処理されるたびに接続は終了します。

[Alchemy Notifyはwebhookを使用](https://www.alchemy.com/docs/reference/notify-api-quickstart)してサーバー間の通信を行い、WebSocketを使ってdAppユーザーが目にする通知をプッシュします。

## Web3のWebSocketは何に使われるのか

[AlchemyのSubscription API](https://www.alchemy.com/docs/reference/subscription-api)は、既存のEthereum APIの機能を拡張する2つの新しいAPIメソッド、**eth_subscribe**と**eth_unsubscribe**を提供しており、Web3開発者がWebSocketを使用して、保留中のトランザクション情報や保留中のトランザクションハッシュ、新しいヘッダーブロック、ログといった情報やデータを継続的に受信できるようにします。

以下は、WebSocketを使用するAlchemyのSubscription APIがサポートするメソッドです。

- **alchemy_newFullPendingTransactions** - 保留状態に追加されたすべてのトランザクションについて、（トランザクションハッシュだけでなく）トランザクション情報全体を返します
- **alchemy_filteredNewFullPendingTransactions** - toまたはfromのアドレスフィルタに一致する、保留中のすべてのトランザクションについてトランザクション情報を返します
- **newPendingTransactions** - 自分が送信したかどうかに関わらず、保留状態に追加されたすべてのトランザクションのハッシュを返します
- **newHeads** - 新しいヘッダー（ブロック）がブロックチェーンに追加されるたびにイベントを送信します
- **logs** - 指定されたフィルタ条件に一致する、新しく追加されたブロックに含まれるログを送信します

既存のWebSocket接続を終了する必要がある場合は、サブスクリプションIDパラメータとともに**eth_unsubscribe**呼び出しを使用できます。

### WebSocketとwebhookをいつ使い分けるか

WebSocketとwebhookのどちらを使用するかのトレードオフは、多数のWebSocket接続を同時に開いたまま維持する方が自分のインフラ設計にとって都合が良いか、それともクライアントからの多数のwebhook接続リクエストを処理する方が都合が良いかによって決まります。

サーバーアプリケーションがクラウド関数（AWS Lambda、Google Cloud Functionsなど）として動作している場合は、アプリケーションがWebSocket接続を開いたまま維持しないため、webhookを使用してください。

送信される通知の量が少ない場合も、webhookの方が優れています。これは、接続がイベント発生時のみを条件として開始されるためです。

そのイベントが稀にしか起きないのであれば、クライアントとサーバー間で多数のWebSocket接続を開いたままにしておくよりも、webhookを使用する方が良いでしょう。

最後に、サーバー同士を接続しようとしているのか、それともクライアントとサーバーを接続しようとしているのかも重要です。前者にはwebhookが、後者にはWebSocketが適しています。[webhookサーバーをセットアップするためのGithubリポジトリ](https://github.com/alchemyplatform/webhook-examples)を作成しました。

### WebSocketプロトコルをいつ使うか

多くのWeb3アプリにとって、トランザクションのステータスをリアルタイムでユーザーに更新することは必須です。そうしなければ、ユーザー体験が悪化し、アプリやサービスから離脱してしまう可能性があります。Alchemy Notifyは、ユーザーに正確なトランザクションのステータスを知らせることで、この問題を解決します。

#### HTTPよりWebSocketを使うべき場合

レイテンシを可能な限り最小にする必要があり、イベントの発生とほぼ同時にユーザーに通知を届けたい場合は、HTTPリクエストよりもWebSocketを使用すべきです。HTTPは、クライアントがどのくらいの頻度でリクエストを送信するかによって更新を受け取れる頻度が制限されるため、比較的はるかに遅くなります。

### WebSocketの実例

ウォレット残高の変化のような重要なイベントについて、ユーザーに更新を知らせるアプリ内通知をAlchemy Notifyで実装する方法についてのガイドを作成しました。以下は、これまでに公開したチュートリアルの一部です。

1. [保留中および採掘済みのEthereumトランザクションを追跡する](https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum)
1. [リアルタイムのトランザクション通知を備えたdAppを構築する](https://www.alchemy.com/docs/reference/webhooks-overview)
1. [AlchemyのwebhookをZapierと連携する](https://www.alchemy.com/docs/reference/webhooks-overview)

[Alchemy Notify](https://www.alchemy.com/notify?a=e35dd0b6f1)は、dAppユーザーにメール通知を送信するためにも使用でき、トランザクションのステータスに関する不満を防ぐことができます。
