

# 将 WebSocket 与 CloudFront 分配结合使用
<a name="distribution-working-with.websockets"></a>

Amazon CloudFront 支持使用 WebSocket，后者是一种基于 TCP 的协议，它在客户端和服务器之间需要长期双向连接时很有用。对于实时应用程序，持久连接通常是必需的。可使用 Websocket 的场景包括社交聊天平台、在线协作工作区、多玩家游戏和提供实时数据馈送（如金融贸易平台）的服务。对于全双工通信，通过 WebSocket 连接的数据可双向流动。

WebSocket 功能会自动启用，以便与任何分配结合使用。要使用 WebSocket，请在附加到您的分配的缓存行为中配置以下内容之一：
+ 将所有查看器请求标头转发到源。您可以使用 [AllViewer 托管源请求策略](using-managed-origin-request-policies.md#managed-origin-request-policy-all-viewer)。
+ 具体而言，就是在您的源请求策略中转发 `Sec-WebSocket-Key` 和 `Sec-WebSocket-Version` 请求标头。

## WebSocket 协议的工作原理
<a name="distribution-working-with.websockets.how-it-works"></a>

WebSocket 协议是一种独立的、基于 TCP 的协议，可让您避免 HTTP 的一些开销和潜在的延迟增加。

为了建立 WebSocket 连接，客户端将发送使用 HTTP 升级语义更改协议的常规 HTTP 请求。随后，服务器可以完成握手。WebSocket 连接将保持打开状态，并且客户端或服务器可以相互发送数据帧，而无需每次都建立新连接。

默认情况下，WebSocket 协议使用端口 80（对于常规 WebSocket 连接）和端口 443（对于通过 TLS 的 WebSocket 连接）。您为 CloudFront [查看器协议策略](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy)和[协议（仅自定义源）](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy)选择的选项适用于 WebSocket 连接以及 HTTP 流量。

## WebSocket 要求
<a name="distribution-working-with.websockets.requirements"></a>

WebSocket 请求必须遵守 [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455)（采用以下标准格式）。

**Example 示例客户端请求**  

```
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: https://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
```

**Example 示例服务器响应**  

```
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
```

如果客户端或服务器或网络中断已断开 WebSocket 连接，则客户端应用程序应重新发起与服务器的连接。

## 推荐的 WebSocket 标头
<a name="distribution-working-with.websockets.recomended-settings"></a>

为了避免在使用 WebSocket 时出现与压缩相关的意外问题，建议您在[源请求策略](origin-request-create-origin-request-policy.md)中包含以下标头：
+ `Sec-WebSocket-Key`
+ `Sec-WebSocket-Version`
+ `Sec-WebSocket-Protocol`
+ `Sec-WebSocket-Accept`
+ `Sec-WebSocket-Extensions`

**注意**  
目前，CloudFront 仅支持通过 HTTP/1.1 协议进行 WebSocket 连接。