

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

# 多路复用数据流并在安全隧道中使用同步 TCP 连接
<a name="multiplexing"></a>

您可以借助安全隧道多路复用功能，为每条隧道使用多个数据流。利用多路复用功能，您可以使用多个数据流对设备进行故障排除。您还可以通过取消构建、部署和启动多个本地代理或向同一设备打开多个隧道来减少操作有效载荷。例如，对于需要发送多个 HTTP 和 SSH 数据流的 Web 浏览器，可以使用多路复用。

对于每个数据流， AWS IoT 安全隧道支持同步的 TCP 连接。使用同步连接可减小客户端发出多个请求时发生超时的几率。例如，它可以减少远程访问目标设备的本地 Web 服务器时的加载时间。

以下各节详细介绍了多路复用和使用同步 TCP 连接及其不同的使用案例。

**Topics**
+ [在安全隧道中多路复用多个数据流](multiplexing-multiple-streams.md)
+ [在安全隧道中使用同步 TCP 连接](multiplexing-simultaneous-tcp.md)

# 在安全隧道中多路复用多个数据流
<a name="multiplexing-multiple-streams"></a>

您可以对使用多个连接或端口的设备使用多路复用功能。当您需要与远程设备建立多个连接以解决任何问题时，也可以使用多路复用功能。例如，对于需要发送多个 HTTP 和 SSH 数据流的 Web 浏览器，可以使用此功能。通过多路复用隧道将来自两个数据流的应用程序数据同时发送到设备。

## 使用案例示例
<a name="multiplexing-use-case"></a>

假设您需要连接到设备上的 Web 应用程序来更改某些联网参数，同时通过终端发出 shell 命令，以验证设备是否使用新的联网参数正常运行。在这种情况下，您可能需要通过 HTTP 和 SSH 连接到设备，并传输两个并行数据流，以便同时访问 Web 应用程序和终端。通过多路复用功能，这两个独立的流可以同时通过同一隧道传输。

![\[显示用于通过不同协议流式传输数据的物联网云架构以及源设备、代理服务器和目标设备的示意图。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tunnel-multiplexing.png)


## 如何设置多路复用隧道
<a name="multiplexing-tutorial"></a>

以下流程将指导您如何设置多路复用隧道，以便使用需要连接到多个端口的应用程序对设备进行故障排除。您将设置一个隧道，其中包含两个多路复用流：一个 HTTP 流和一个 SSH 流。

1. 

**（可选）创建配置文件**

   您可以选择使用配置文件来配置源和目标设备。如果您的端口映射可能会经常发生更改，请使用配置文件。如果您希望使用 CLI 显式指定端口映射，或者如果您不需要在指定侦听端口上启动本地代理，则可跳过此步骤。有关如何使用配置文件的更多信息，请参阅中的[通过--config 设置的 GitHub选项](https://github.com/aws-samples/aws-iot-securetunneling-localproxy#options-set-via---config)。

   1. 在源设备上，在将运行本地代理的文件夹中，创建一个名为 `Config` 的配置文件夹。在此文件夹中，使用以下内容创建一个名为 `SSHSource.ini` 的文件：

      ```
      HTTP1 = 5555
      SSH1 = 3333
      ```

   1. 在目标设备上，在将运行本地代理的文件夹中，创建一个名为 `Config` 的配置文件夹。在此文件夹中，使用以下内容创建一个名为 `SSHDestination.ini` 的文件：

      ```
      HTTP1 = 80
      SSH1 = 22
      ```

1. 

**打开隧道**

   使用 `OpenTunnel` API 操作或 `open-tunnel` CLI 命令打开隧道。通过将`SSH1`和指定`HTTP1`为服务以及与您的远程设备对应 AWS IoT 的事物的名称来配置目的地。您的 SSH 和 HTTP 应用程序正在此远程设备上运行。您必须已经在 AWS IoT 注册表中创建了物联网事物。有关更多信息，请参阅 [使用注册表管理事物](thing-registry.md)。

   ```
   aws iotsecuretunneling open-tunnel \
   	--destination-config thingName=RemoteDevice1,services=HTTP1,SSH1
   ```

   运行此命令将生成源和目标访问令牌，您将使用这些令牌运行本地代理。

   ```
   {
   	"tunnelId": "b2de92a3-b8ff-46c0-b0f2-afa28b00cecd",
   	"tunnelArn": "arn:aws:iot:us-west-2:431600097591:tunnel/b2de92a3-b8ff-46c0-b0f2-afa28b00cecd",
   	"sourceAccessToken": source_client_access_token,
   	"destinationAccessToken": destination_client_access_token
   }
   ```

1. 

**配置和启动本地代理**

   在运行本地代理之前，请先设置 AWS IoT 设备客户端，或者从中下载本地代理源代码[GitHub](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)并针对您选择的平台进行构建。之后，您可以启动目标和源本地代理以连接到安全隧道。有关配置和使用本地代理的更多信息，请参阅[如何使用本地代理](how-use-local-proxy.md)。
**注意**  
在源设备上，如果您不使用任何配置文件或使用 CLI 指定端口映射，则仍可以使用相同的命令来运行本地代理。在源模式下，本地代理将自动为您选取要使用的可用端口和映射。

------
#### [ Start local proxy using configuration files ]

   运行以下命令可使用配置文件在源和目标模式下运行本地代理。

   ```
   // ----------------- Start the destination local proxy -----------------------
   ./localproxy -r us-east-1 -m dst -t destination_client_access_token
   
   // ----------------- Start the source local proxy ----------------------------
   // You also run the same command below if you want the local proxy to
   // choose the mappings for you instead of using configuration files.
   ./localproxy -r us-east-1 -m src -t source_client_access_token
   ```

------
#### [ Start local proxy using CLI port mapping ]

   运行以下命令可通过使用 CLI 显式指定端口映射，以便在源和目标模式下运行本地代理。

   ```
   // ----------------- Start the destination local proxy -----------------------------------
   ./localproxy -r us-east-1 -d HTTP1=80,SSH1=22 -t destination_client_access_token
   
   // ----------------- Start the source local proxy ----------------------------------------
   ./localproxy -r us-east-1 -s HTTP1=5555,SSH1=33 -t source_client_access_token
   ```

------

现在可以通过多路复用隧道同时传输来自 SSH 和 HTTP 连接的应用程序数据。如下面的地图中所示，服务标识符充当可读格式，用于转换源设备和目标设备之间的端口映射。使用此配置，安全隧道可将所有传入的 HTTP 流量从源设备*5555*上的端口转发到目标设备*80*上的端口，并将任何传入的 SSH 流量从一个端口转发*3333*到目标设备*22*上的端口。

![\[一种转换过程，用于在进行处理后将服务标识符从源和目标本地代理映射到转换后的端口。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/multiplexing-post-mapping-translation.png)


# 在安全隧道中使用同步 TCP 连接
<a name="multiplexing-simultaneous-tcp"></a>

AWS IoT 安全隧道支持每个数据流同时使用多个 TCP 连接。当您需要建立与远程设备的同步连接时，可以使用此功能。使用同步 TCP 连接可减小客户端发出多个请求时发生超时的几率。例如，当访问正在运行多个组件的 Web 服务器时，同步 TCP 连接可减少加载站点所需的时间。

**注意**  
同时 TCP 连接的带宽限制为每秒 800 千字节。 AWS 账户 AWS IoT 安全隧道可以根据传入请求的数量为您配置此限制。

## 使用案例示例
<a name="tcp-use-case"></a>

假设您需要远程访问目标设备的本地 Web 服务器，并且该 Web 服务器上运行了多个组件。利用单一 TCP 连接，在尝试访问此 Web 服务器时，顺序加载会增加在站点上加载资源所花费的时间。同步 TCP 连接可以满足站点的资源要求来减少加载时间，从而减少访问时间。下图说明如何支持同步 TCP 连接，以便将数据流传输到远程设备上运行的 Web 服务器应用程序。

**注意**  
如果要使用隧道访问远程设备上运行的多个应用程序，则可以使用隧道多路复用功能。有关更多信息，请参阅 [在安全隧道中多路复用多个数据流](multiplexing-multiple-streams.md)。

![\[显示物联网云设置的示意图，其中有源设备、本地代理、代理服务器、目标设备以及 Web 服务器应用程序，通过 TCP 和 WSS 协议连接。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/tcp-tunneling.png)


## 如何使用同步 TCP 连接
<a name="multiple-tcp-tutorial"></a>

以下过程将为您演练如何使用同步 TCP 连接来访问远程设备上的 Web 浏览器。当客户端有多个请求时， AWS IoT 安全隧道会自动设置同时的 TCP 连接来处理这些请求，从而缩短加载时间。

1. 

**打开隧道**

   使用 `OpenTunnel` API 操作或 `open-tunnel` CLI 命令打开隧道。通过将 `HTTP` 指定为服务并指定与远程设备对应的 AWS IoT 事物的名称来配置目标。您的 Web 服务器应用程序正在此远程设备上运行。您必须已经在 AWS IoT 注册表中创建了物联网事物。有关更多信息，请参阅 [使用注册表管理事物](thing-registry.md)。

   ```
   aws iotsecuretunneling open-tunnel \
   	--destination-config thingName=RemoteDevice1,services=HTTP
   ```

   运行此命令将生成源和目标访问令牌，您将使用这些令牌运行本地代理。

   ```
   {
   	"tunnelId": "b2de92a3-b8ff-46c0-b0f2-afa28b00cecd",
   	"tunnelArn": "arn:aws:iot:us-west-2:431600097591:tunnel/b2de92a3-b8ff-46c0-b0f2-afa28b00cecd",
   	"sourceAccessToken": source_client_access_token,
   	"destinationAccessToken": destination_client_access_token
   }
   ```

1. 

**配置和启动本地代理**

   在运行本地代理之前，请从下载本地代理源代码[GitHub](https://github.com/aws-samples/aws-iot-securetunneling-localproxy)并将其构建到您选择的平台上。之后，您可以启动目标和源本地代理以连接到安全隧道，并开始使用远程 Web 服务器应用程序。
**注意**  
要使用同步的 TCP 连接进行 AWS IoT 安全隧道，必须升级到最新版本的本地代理。如果您使用 AWS IoT 设备客户端配置本地代理，则此功能不可用。

   ```
   // Start the destination local proxy
   ./localproxy -r us-east-1 -d HTTP=80 -t destination_client_access_token
   
   // Start the source local proxy
   ./localproxy -r us-east-1 -s HTTP=5555 -t source_client_access_token
   ```

   有关配置和使用本地代理的更多信息，请参阅[如何使用本地代理](how-use-local-proxy.md)。

现在，您可以使用隧道访问 Web 服务器应用程序。 AWS IoT 当客户端有多个请求时，安全隧道将自动设置和处理同时的 TCP 连接。