2

我正忙于使用 C# 和 .NET Framework 4.5实现 ICE-TCP (RFC 6544 https://www.rfc-editor.org/rfc/rfc6544 )。但是,我面临一个与协议分层相关的非常棘手的问题,如下所示。

ICE-TCP RFC 说:

„ICE 需要代理来解复用 STUN 和应用层流量,因为它们出现在同一个端口上。在 [RFC5245] 中描述了这种多路分离,并使用魔术 cookie 和消息的其他字段完成。
面向流的传输引入了另一个问题,因为它们需要一种方法来构建连接,以便可以提取应用程序和 STUN 数据包,以便将 STUN 数据包与应用层流量区分开来。
因此,使用 ICE 的 TCP 媒体流使用 RFC 4571 ( https://www.rfc-editor.org/rfc/rfc4571#section-2 ) 中提供的基本帧,即使应用层协议不是 RTP。” </p>

框架方法如下所示:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 ---------------------------------------------------------------
|             LENGTH            |  RTP or RTCP packet ...       |
 ---------------------------------------------------------------

我还想在我的实现中使用 TLS,ICE-TCP RFC 说:

„当使用传输层安全性 (TLS) 或数据报传输层安全性 (DTLS) 时,它们也在 RFC 4571 成帧垫片上运行,而 STUN 在 (D)TLS 连接之外运行。生成的 ICE TCP 协议栈如图 1 所示,左侧有 (D)TLS,右侧没有。”</p>

最后,ICE TCP 堆栈如下所示:

                   +----------+
                   |          |
                   |    App   |
        +----------+----------+     +----------+----------+
        |          |          |     |          |          |
        |   STUN   |  (D)TLS  |     |   STUN   |    App   |
        +----------+----------+     +----------+----------+
        |                     |     |                     |
        |      RFC 4571       |     |      RFC 4571       |
        +---------------------+     +---------------------+
        |                     |     |                     |
        |         TCP         |     |         TCP         |
        +---------------------+     +---------------------+
        |                     |     |                     |
        |         IP          |     |         IP          |
        +---------------------+     +---------------------+

所以我对图的左侧很感兴趣。该图暗示帧头在 TLS 加密之外,我必须将未加密的头写入流。

目前我的应用程序使用包裹在我从 TCPClient 获得的 NetworkStream 的 SslStream 类。我的第一个意图是将帧头写入 NetworkStream,然后将加密的应用程序数据写入 SslStream。经过一番研究,我发现了这一点:

“在 AuthenticateAsClient/Server 之后,您的连接将受到 SSL 保护。然后不要调用 Socket 或 NetworkStream 方法:这会破坏 SslStream。” 来源:C# Sockets 和 SslStreams

因此,一旦建立 SSL 连接,我就无法写入 NetworkStream。

我的问题是:有没有办法在 TCP (NetworkStream) 和 TLS (SslStream) 之间“放置”标头?

提前致谢。

最好的祝福

马库斯

4

1 回答 1

2

实例将自身分层在实例SslStream之上NetworkStream。您写入 SSL 流的任何数据都由 SSL 流处理,然后将其生成的任何数据写入NetworkStream实例。

如果您保留对 的引用,NetworkStream您可以NetworkStream根据需要直接读取或写入,绕过 SSL 流。

只要您保持直接写入的任何内容都不会被连接的任一侧NetworkStream读取,就会继续正常运行。SslStreamSslStream

实际上,您将在单个流中多路复用两个字节流。这些字节流之一将是 SSL 流,另一个将是您的其他流。只要连接的两端都知道何时在两个流之间切换,就可以了。

于 2013-10-21T20:16:29.673 回答