net.tcp和TCP协议有什么区别?

23
我正在阅读Michele Leroux Bustamante的《学习WCF》。在这本书中,当涉及到net.tcp协议时,作者只使用了TCP一词。那么net.tcp和著名的TCP协议有什么区别呢?
而对于net.msmqnet.pipenet前缀代表什么意思?
非常感谢。

为什么我不能在这个问题上发起悬赏?我没有看到开始悬赏按钮。 - smwikipedia
这篇好文章描述了wcf绑定之间的差异 - HotTester
1
net.tcp 是一个 URI 方案,而 TCP 只是一个协议。它用于 WCF 通过 .NET 帧二进制协议在 TCP 上接收或发送 WCF 消息,当使用默认绑定时。其默认端口为 808,并且帧格式使用 .net 二进制消息帧。 - Sajay
4个回答

38

net.tcp是Windows中用于标识可使用TCP访问的端点的URI方案。

同样的,net.msmqnet.pipe是用于寻址利用MSMQ协议Named Pipes协议的端点的URI方案。

在所有三个方案上都加上net前缀表示该URI方案仅适用于Microsoft .NET平台,不被广泛接受于更广泛的互联网。(其他URI方案,例如httpftp已经被普遍接受,并因此在WCF中被使用而无需前缀)。因此,net前缀作为一个警示,表明相关的端点将具有与未在.NET平台上运行的其他应用程序的互操作性受限或无法实现。

示例URI:

net.tcp://localhost:7272
net.msmq://somemachine/publicQueue
net.pipe://machine.domain.com/somePipe

SIDEBAR: 虽然 MSMQ 和 Named Pipes 明显是 Microsoft 的协议,因此缺乏互操作性并不令人惊讶,但 TCP 是互联网的基础协议,因此,在 WCF 中使用它应该不是 .NET 特定的吧?

在 WCF 中,互操作性已经由 SOAP 和 HTTP 处理,这两个协议都运行在 TCP 之上。如果你想要通过 TCP 实现互操作性,则可以使用其中一种协议。

因此,Microsoft 寻求提供一种通信替代方案,其中性能而非互操作性是关键目标。TCP 是合乎逻辑的选择,但 TCP 是一个相对较低级别的协议,需要实现额外的行为和默认值,以便像 WCF 这样的消息框架可以直截了当地工作。此外,没有普遍接受的用于访问 TCP 资源的 URI 方案,因此 Microsoft 需要发明一个。因此,net.tcp 就诞生了。


虽然 URI 本身并不一定表示要使用哪种绑定,但它们确实提供了提示。根据 Simon Mourier 的答案,WCF 中当前可用的绑定可以在此处找到 (链接)。因此,例如 net.tcp 地址可能表示需要使用 NetTcpBinding、NetPeerTcpBinding 或 NetTcpContextBinding。


6
自从HTTP在TCP协议上运行时,我们就简单称之为“HTTP”,FTP在TCP协议上被称为“FTP”,BitTorrent在TCP协议上是“Torrent”(其他所有互联网协议也是如此)。我认为微软应该将其命名为“net.wcf”而不是“net.tcp”。 - slebetman
这是迄今为止最好的答案。你能给我提供更深入的net.tcp技术信息资源吗? - csteinmueller

5

net.tcp存在于Service Model (WCF)命名空间中。它由许多类表示,其中最明显的是NetTcpBinding Class。因此,net.tcp本质上是一个WCF绑定(“适用于跨机器通信的安全、可靠绑定”)。

因此,net.tcp只能在WCF上下文中使用,并且仅仅基于TCP协议。但你不能说net.tcp=TCP。net.tcp只是使用TCP。与其他绑定相比,它被认为是性能高的,但不具备互操作性。

对于net.pipe、net.msmq,它们也是WCF绑定,分别在较低级别的Windows技术Named PipesMSMQ上实现。

这里是系统提供的WCF绑定列表:System-Provided Bindings

3

这些是在微软堆栈中设置的协议,作为WCF通信中的附加选项。基本上,这些是您可以用于服务通信的工具。但是,请注意,尽管每个协议可能具有不同的好处,但微软为WCF提出的net*协议与那些非WCF(和非Microsoft)消费者的服务不兼容。如果互操作性是一个问题,它们可能会在以后引起麻烦。


1
前缀 .net 暗示着框架作者已经封装了协议,为您提供了一个API来隐藏复杂性,使开发人员更容易使用它。

感谢您的帖子。因此,net.tcp和TCP本质上是相同的东西。 - smwikipedia
1
不,我没有这么说。我猜 net.tcp 是 TCP 的一个封装。看一下是否正确。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接