摘要
tcp套接字是一个端点。实例在特定TCP连接或侦听状态的上下文中由IP地址和端口定义。
端口是虚拟化标识符。定义服务端点(与服务不同)实例端点,也就是会话标识符)。
TCP套接字是不连接,它是特定连接的端点。
可以有到服务端点的并发连接。,因为连接是由它的本地和远程端点,允许将流量路由到特定的服务实例。
对于给定的地址/端口组合,只能有一个侦听器套接字。.
论述
这是一个有趣的问题,迫使我重新审视一些我认为我知道的事情。你可能会认为,像“套接字”这样的名字是不言自明的:它显然是为了唤起你插入网络电缆的端点的图像,有很强的功能相似之处。然而,在网络用语中,“套接字”一词承载着如此多的包袱,因此有必要进行仔细的重新检查。
在最广泛的意义上,一个港口是一个入口或出口点。虽然没有在网络环境中使用,但法语单词波尔特字面意思是门或网关,进一步强调港口是运输终点,无论是运输数据还是大型钢铁集装箱。
为了本讨论的目的,我将只考虑TCP-IP网络的上下文。OSI模型是非常好的,但从来没有完全实施,更没有广泛部署在高交通高压力条件下。
IP地址和端口的组合严格地称为端点,有时称为套接字。这种用法起源于最初的TCP规范RFC 793。
TCP连接是由两个端点(即AKA)定义的。插座.
端点(套接字)由网络地址和港标识符注意地址/端口不完全标识套接字(稍后详细介绍)。
端口的目的是区分给定网络地址上的多个端点。您可以说端口是虚拟化端点。这种虚拟化使单个网络接口上的多个并发连接成为可能。套接字对(由客户端IP地址、客户端口号、服务器IP地址和服务器端口号组成的4元组)指定了唯一标识Internet中每个TCP连接的两个端点。(TCP-IP插图第1卷、理查德·史蒂文斯(W.Richard Stevens)
在大多数C派生语言中,TCP连接是使用套接字类实例上的方法来建立和操作的。虽然在更高级别的抽象(通常是NetworkStream类的实例)上操作是常见的,但这通常会公开对套接字对象的引用。对编码器来说,这个套接字对象似乎表示连接,因为连接是使用套接字对象的方法创建和操作的。
在C#中,要建立TCP连接(到现有侦听器),首先要创建一个TcpClient..如果不为TcpClient构造函数,它使用默认值-以一种或另一种方式定义本地端点。然后调用连接方法来处理您创建的实例。此方法需要一个描述另一个端点的参数。
所有这些都有点让人困惑,并使您相信套接字是一个连接,这是胡扯。我一直在这种误解下苦思冥想,直到理查德·多尔曼提出这个问题。
在做了大量的阅读和思考之后,我现在确信,上一节课会更有意义TcpConnection构造函数采用两个参数,局部端点和RemoteEndpoint..你也许可以支持一个论点RemoteEndpoint对于本地端点来说,默认值是可接受的。这在多宿主计算机上是不明确的,但是可以通过选择到达远程端点的最短路由的接口来使用路由表来解决歧义。
在其他方面也将加强透明度。插座是不通过IP地址和端口的组合识别:[.]TCP使用包含本地和外部地址的所有四个值来分解传入段:目的地IP地址、目的端口号、源IP地址和源端口号。TCP仅通过查看目标端口无法确定哪个进程获得传入段。另外,在[给定端口号]处接收传入连接请求的[各种]端点中,只有处于侦听状态的端点。(第255页)TCP-IP插图第1卷、理查德·史蒂文斯(W.Richard Stevens)
如您所见,网络服务不仅有可能而且很有可能拥有多个具有相同地址/端口的套接字,但在特定地址/端口组合上只有一个侦听器套接字。典型的库实现呈现一个套接字类,该类的实例用于创建和管理连接。这是非常不幸的,因为它造成混乱,并导致这两个概念的广泛混淆。
Hagrawal不相信我(见评论),所以这是一个真正的例子。我连接了一个网络浏览器http://dilbert.com然后跑netstat -an -p tcp..输出的最后六行包含两个示例,说明地址和端口不足以唯一标识套接字。192.168.1.3(我的工作站)和54.252.94.236:80(远程HTTP服务器)之间有两个不同的连接TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED
由于套接字是连接的端点,所以有两个带有地址/端口组合的套接字。207.38.110.62:80还有两个地址/端口组合54.252.94.236:80.
我认为Hagrawal的误解是因为我非常谨慎地使用了“识别”一词。我的意思是“完全、明确和独特地识别”。在上面的示例中,有两个端点具有地址/端口组合。54.252.94.236:80..如果您只有地址和端口,那么您就没有足够的信息来区分这些套接字。没有足够的信息鉴定插座。
增编
RFC 793第2.7节第2段说连接完全由两端的一对套接字指定。本地套接字可以参与到不同外部套接字的许多连接。
从编程的角度看,这个套接字定义是没有帮助的,因为它与套接字不一样。对象,它是特定连接的端点。对于程序员来说,这个问题的受众大多是程序员,这是一个重要的功能差异。
参考文献TCP-IP演示了第一卷协议,W.Richard Stevens,1994 Adison Wesley
,南加州大学信息科学研究所
,插座的定义,Joel M.Winett,林肯实验室