この記事は セゾンテクノロジー Advent Calendar 2024 17日目の記事です。
シリーズ2は HULFT10 のエンジニアによる投稿をお届けします。
はじめに
12月10日にリリースされたHULFT10のラインナップとして、オンプレ環境に導入してインターネット経由での安全なファイル集配信を実現するSmartProxyが追加されました。
SmartProxyはインターネット経由のファイル転送を実現する仕組みとして、元々のラインナップであるHULFT-WebConnectと同様にWebSocketの仕組みが使用されています。このWebSocketについて触れてみたいと思います。
SmartProxyについて
基本的な構成としては以下のように配信HULFTと集信HULFTの両側にSmartProxyが配置される構成となります。
(以下は簡易的な図となります)
このSmartProxyの間の通信でWebSocketの仕組みが使用されています。
WebSocketの特徴
- 双方向通信
サーバーとクライアント間で双方向のデータ通信が可能です。 - フルデュプレックス通信
サーバーとクライアントが同時にデータを送受信できます。 - 低遅延
接続の確立後、データの送受信に必要なオーバーヘッドが非常に少ないため、低遅延で通信が可能になります。 - 効率的なリソース使用
一度のハンドシェイクで接続が確立され、その接続を維持することで、リソースの使用が効率化されます。
WebSocketの手順
大まかなWebSocketの手順としては
- 接続の確立 (openingハンドシェイク)
- データの送受信
- 接続のclose (closingハンドシェイク)
です。
1. 接続の確立 (openingハンドシェイク)
まずは接続を確立するために、接続をopenしてハンドシェイクと呼ばれる接続確立のプロセスを行います。
具体的には以下のようなリクエストをクライアント側から送信します。
HULFTの配信要求時の転送ではクライアントは配信HULFTとなるので、配信HULFT側のSmartProxyから送信します。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
このリクエストはHTTPの乗っ取った形式となっています。リクエストの中身にもあるようにHTTPをWebSocketにUpgradeするような要請となります。
サーバ側 (集信HULFT側のSmartProxy)から応答が返ってくることで接続が確立されます。
2. データの送受信
接続確立後はクライアント、サーバのどちらからも、接続がcloseされるまでいつでもデータを伝送することができます。
データは一連のフレームを利用して伝送されます。フレームはデータの情報を付与したデータの小さな塊のようなものです。
データの情報としては
- データの種類
- データが最後かどうか
- データを隠すための情報 (WebSocketにはマスクと呼ばれるデータを隠す仕組みがある)
等々の情報があげられます。
HULFTの転送においてはここで転送される実データがHULFT独自のプロトコルで流れることになります。
3. 接続のclose
前述のフレームの中でcloseを通知するようなCloseフレームが存在します。これを送信後、相手からの応答のCloseフレームを受信することで接続を安全にcloseします。
まとめ
以上のような仕組み+TLS暗号化 を用いたWSS(WebSocket Secure)を使用して、安全なインターネット接続を実現しています。
これをまとめるためにRFC6455を読みつつ、他の方の記事を読みつつでしたが、理解がふんわりだった部分があるのを実感しました。仕組みを理解していなくても今はライブラリのおかげで一行に書けてしまう部分もあります。こういった根本の技術の理解もすすめることを心掛けたいです。
参考
- RFC6455 The WebSocket Protocol
https://triple-underscore.github.io/RFC6455-ja.html#section-11.1.2 - WebSocketについて調べてみた
https://qiita.com/south37/items/6f92d4268fe676347160