我正忙于使用 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) 之间“放置”标头?
提前致谢。
最好的祝福
马库斯