

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 设备通信协议
<a name="protocols"></a><a name="iot-message-broker"></a>

AWS IoT Core 支持使用 MQTT 和 MQTT over S WebSocket ecure (WSS) 协议发布和订阅消息的设备和客户端，以及使用 HTTPS 协议发布消息的设备和客户端。所有协议都支持 IPv4 和 IPv6。本节介绍设备和客户端的不同连接选项。

## TLS 协议版本
<a name="connection-protocol-tls"></a>

AWS IoT Core 使用 [TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security) [版本 1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2) 和 [TLS 版本 1.3](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3) 来加密所有通信。通过[在域配置中配置 TLS 设置](https://docs.aws.amazon.com//iot/latest/developerguide/iot-endpoints-tls-config.html)，您可以为端点配置其他 TLS 策略版本。将设备连接到 AWS IoT Core时，客户端可以发送[服务器名称指示（SNI）扩展](https://tools.ietf.org/html/rfc3546#section-3.1)，这对于[多账户注册](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html#multiple-account-cert)、[可配置端点](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)、[自定义域](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable-custom.html)以及 [VPC 端点](https://docs.aws.amazon.com//iot/latest/developerguide/IoTCore-VPC.html)等特征是必需的。有关更多信息，请参阅 [AWS IoT中的传输安全](transport-security.html)。

[AWS IoT 设备 SDKs](iot-connect-devices.md#iot-connect-device-sdks) 支持 MQTT 和基于 WSS 的 MQTT，并支持客户端连接的安全要求。我们建议使用 [AWS IoT 设备 SDKs](iot-connect-devices.md#iot-connect-device-sdks) 将客户端连接到 AWS IoT。

## 协议、端口映射和身份验证
<a name="protocol-mapping"></a><a name="protocol-port-mapping"></a>

设备或客户端如何连接到消息代理是可以使用[身份验证类型](#connection-protocol-auth-mode)配置的。默认情况下，或者如果未发送 SNI 扩展，身份验证方法基于设备使用的应用程序协议、端口以及应用程序层协议协商（ALPN）TLS 扩展。下表列出了基于端口和 ALPN 的预期身份验证。


**协议、身份验证和端口映射**  

| 协议 | 支持的操作 | 身份验证 | 端口： | ALPN 协议名称 | 
| --- | --- | --- | --- | --- | 
| MQTT 结束了 WebSocket | 发布、订阅 | Signature Version 4 | 443 | 不适用 | 
| MQTT 结束了 WebSocket | 发布、订阅 | 自定义身份验证 | 443 | 不适用 | 
| MQTT | 发布、订阅 | X.509 客户端证书 | 443† | `x-amzn-mqtt-ca` | 
| MQTT | 发布、订阅 | X.509 客户端证书 | 8883 | 不适用 | 
| MQTT | 发布、订阅 | 自定义身份验证 | 443† | `mqtt` | 
| HTTPS | 仅发布 | Signature Version 4 | 443 | 不适用 | 
| HTTPS | 仅发布 | X.509 客户端证书 | 443† | `x-amzn-http-ca` | 
| HTTPS | 仅发布 | X.509 客户端证书 | 8443 | 不适用 | 
| HTTPS | 仅发布 | 自定义身份验证 | 443 | 不适用 | 

**应用程序层协议协商（ALPN）**  
† 使用默认端点配置时，通过 X.509 客户端证书身份验证在端口 443 上连接的客户端必须实现[应用层协议协商 (ALPN)](https://tools.ietf.org/html/rfc7301) TLS 扩展，并使用客户端作为消息一部分 ProtocolNameList 发送的 AP [N 中列出的 ALPN 协议名称](https://tools.ietf.org/html/rfc7301#section-3.1)。`ClientHello`  
[在端口 443 上，[Iot: data-ats](iot-connect-devices.md#iot-connect-device-endpoint-table) 端点支持 ALPN x-amzn-http-ca HTTP，但是 IoT: Jobs 端点不支持。](iot-connect-devices.md#iot-connect-device-endpoint-table)  
在端口 8443 HTTPS 和带有 ALPN 的 443 MQTT 端口上 x-amzn-mqtt-ca，无法使用[自定义身份验证](custom-authentication.md)。

客户端连接到其 AWS 账户设备端点。有关如何查找您账户的设备端点的信息，请参阅 [AWS IoT 设备数据和服务端点](iot-connect-devices.md#iot-connect-device-endpoints)。

**注意**  
AWS SDKs 不需要完整的 URL。它们只需要端点主机名，例如适用于 [Python 的 AWS IoT 设备 SDK 的`pubsub.py`示例 GitHub](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py#L100)。如下表中所示传递整个 URL 可能会生成错误，例如主机名无效。


**正在连接到 AWS IoT Core**  

|  协议  |  端点或 URL  | 
| --- | --- | 
| MQTT | `{{iot-endpoint}}` | 
| 基于 WSS 的 MQTT | `wss://{{iot-endpoint}}/mqtt` | 
| HTTPS | `https://{{iot-endpoint}}/topics` | 

## 为设备通信选择应用程序协议
<a name="protocol-selection"></a>

对于通过设备端点进行的大部分物联网设备通信，您需要使用安全 MQTT 或 MQTT over S WebSocket ecure (WSS) 协议；但是，设备端点也支持 HTTPS。

下表比较了如何 AWS IoT Core 使用两种高级协议（MQTT 和 HTTPS）进行设备通信。


**AWS IoT 设备协议（MQTT 和 HTTPS） side-by-side**  

|  功能  |  [MQTT](mqtt.md)  |  [HTTPS](http.md)  | 
| --- | --- | --- | 
| 发布/订阅支持 | 发布和订阅 | 仅发布 | 
| SDK 支持 | [AWS 设备 SDKs](iot-connect-devices.md#iot-connect-device-sdks)支持 MQTT 和 WSS 协议 | 不支持 SDK，但您可以使用特定于语言的方法来发出 HTTPS 请求 | 
| 服务质量支持 | [MQTT QoS 级别 0 和 1](mqtt.md#mqtt-qos) | 通过传递查询字符串参数 ?qos=qos 来支持 QoS，其值可以是 0 或 1。您可以添加此查询字符串，以发布具有所需 QoS 值的消息。 | 
| 可以接收设备离线时错过的消息 | 是 | 否 | 
| `clientId` 现场支持 | 是 | 否 | 
| 设备断开检测 | 是 | 否 | 
| 安全通信 | 可以。请参阅 [协议、端口映射和身份验证](#protocol-mapping)。 | 可以。请参阅 [协议、端口映射和身份验证](#protocol-mapping)。 | 
| 主题定义 | 定义的应用程序 | 定义的应用程序 | 
| 消息数据格式 | 定义的应用程序 | 定义的应用程序 | 
| 协议开销 | 小于 | 更高 | 
| 功耗 | 小于 | 更高 | 

## 为设备通信选择身份验证类型
<a name="connection-protocol-auth-mode"></a>

您可以使用可配置的端点为物联网端点配置身份验证类型。或者，使用默认配置，并确定您的设备如何通过应用程序协议、端口和 ALPN TLS 扩展组合进行身份验证。您选择的身份验证类型决定了您的设备在连接时将如何进行身份验证 AWS IoT Core。身份验证类型有五种：

**X.509 证书**

使用 [X.509 客户端证书对设备进行身份验证，该证书](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)可 AWS IoT Core 验证设备身份。这种身份验证类型适合配合安全的 MQTT（基于 TLS 的 MQTT）和 HTTPS 协议使用。

**X.509 证书和自定义授权方**

使用 [X.509 客户端证书](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)对设备进行身份验证，并使用[自定义授权方](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)执行其他身份验证操作，自定义授权方将接收 X.509 客户端证书信息。这种身份验证类型适合配合安全的 MQTT（基于 TLS 的 MQTT）和 HTTPS 协议使用。只有结合使用可配置端点与 X.509 自定义身份验证时才能使用这种身份验证类型。没有 ALPN 选项。

**AWS 签名版本 4 (Sigv4)**

使用 Cognito 或您的后端服务对设备进行身份验证，支持社交和企业联合身份验证。这种身份验证类型适用于 WebSocket 安全 MQTT (WSS) 和 HTTPS 协议。

**自定义授权方**

通过配置 Lambda 函数来处理发送到 AWS IoT Core的自定义身份验证信息，对设备进行身份验证。这种身份验证类型适用于安全 MQTT（基于 TLS 的 MQTT）、HTTPS 和 MQTT over S WebSocket ecure (WSS) 协议。

**默认**

根据设备使用的端口 and/or 应用层协议协商 (ALPN) 扩展对设备进行身份验证。不支持某些其他身份验证选项。有关更多信息，请参阅 [协议、端口映射和身份验证](#protocol-mapping)。

下表显示了所有支持的身份验证类型和应用程序协议组合。


**支持的身份验证类型和应用程序协议组合**  

| 身份验证类型 | 安全端点 MQTT（基于 TLS 的 MQTT） | 基于 WebSocket 安全的 MQTT (WSS) | HTTPS | 默认 | 
| --- | --- | --- | --- | --- | 
| X.509 证书 | ✓ |  | ✓ |  | 
| X.509 证书和自定义授权方 | ✓ |  | ✓ |  | 
| AWS 签名版本 4 (Sigv4) |  | ✓ | ✓ |  | 
| 自定义授权方 | ✓ | ✓ | ✓ |  | 
| 默认 |  |  |  | ✓ | 

## 连接持续时间限制
<a name="connection-duration"></a>

HTTPS 连接的持续时间不一定能超过接收和响应请求所需的时间。

MQTT 连接持续时间取决于您所使用的身份验证特征。下表列出了每个特征在理想条件下的最长连接持续时间。


**按身份验证特征列出 MQTT 连接持续时间**  

|  特征  |  最长持续时间 \*  | 
| --- | --- | 
| X.509 客户端证书 | 1-2 周 | 
| 自定义身份验证 | 1-2 周 | 
| Signature Version 4 | 长达 24 小时 | 

\*无法保证

使用 X.509 证书和自定义身份验证，则连接持续时间没有硬性限制，但最短可能只有几分钟。导致连接中断的原因多种多样。以下列表包含一些最常见的原因。
+ Wi-Fi 可用性中断
+ 互联网服务提供商（ISP）连接中断
+ 服务修补
+ 服务部署
+ 服务自动扩缩
+ 服务主机不可用
+ 有效载荷均衡器问题和更新
+ 客户端错误

您的设备必须执行检测断开连接的策略和重新连接的策略。获取有关断开连接事件及其处理方式的指导信息，请参阅 [生命周期事件](life-cycle-events.md) 中的 [连接/断开连接事件](life-cycle-events.md#connect-disconnect)。