端口和套接字有什么区别?

这是我组织中的一位软件工程师提出的问题。 我对最广泛的定义感兴趣。


概要

TCP套接字是由特定TCP连接或监听状态的上下文中的IP地址和端口定义的端点实例

端口是定义服务端点的虚拟化标识符 (与服务实例端点aka会话标识符不同)。

TCP套接字不是连接 ,它是特定连接的端点。

可以有一个到服务端点的并发连接 ,因为连接由其本地和远程端点标识,允许将流量路由到特定的服务实例。

对于给定的地址/端口组合,只能有一个侦听器套接字

解释

这是一个有趣的问题,迫使我重新审视一些我认为自己知道的事情。 你会认为像“套接字”这样的名字是不言而喻的:它显然选择唤起你插入网络电缆的端点的图像,这里有强大的功能相似性。 尽管如此,用网络术语来说,“套接字”一词带有如此多的包袱,因此需要仔细重新检查。

从最广泛的意义上讲,港口是一个入口或出口点。 虽然没有在网络环境中使用,但法文词porte字面意思是门或网关,进一步强调了无论您是运送数据还是大型钢制集装箱,港口都是运输终点。

为了讨论的目的,我将考虑TCP-IP网络的背景。 OSI模型非常好,但从未完全实施,在高流量高压力条件下部署得更少。

IP地址和端口的组合被严格称为端点,有时称为套接字。 这种用法源自原始TCP规范RFC793。

TCP连接由两个端点(也就是套接字)定义。

端点(套接字)由网络地址和端口标识符的组合来定义。 请注意,地址/端口不能完全识别套接字(稍后会详细介绍)。

端口的目的是区分给定网络地址上的多个端点。 你可以说一个端口是一个虚拟端点。 这种虚拟化使得单个网络接口上的多个并发连接成为可能。

它是套接字对(由客户端IP地址,客户端端口号,服务器IP地址和服务器端口号组成的4元组),用于指定在互联网中唯一标识每个TCP连接的两个端点。 (TCP-IP Illustrated Volume 1,W. Richard Stevens)

在大多数C派生语言中,TCP连接是使用Socket类实例上的方法建立和操作的。 虽然通常在更高层次的抽象层次(通常是NetworkStream类的一个实例)上进行操作,但这通常会暴露对套接字对象的引用。 对编码器来说,这个套接字对象似乎表示连接,因为连接是使用套接字对象的方法创建和操纵的。

在C#中,为了建立一个TCP连接(到一个现有的监听器),首先创建一个TcpClient。 如果您没有为TcpClient构造函数指定端点,则它使用默认值 - 定义本地端点的方式有所不同。 然后在你创建的实例上调用Connect方法。 该方法需要一个描述另一个端点的参数。

所有这些都有点让人困惑,并且会让你相信套接字是一个连接,这是一个连接。 我一直在这种误解之下工作,直到理查德多曼提出这个问题。

经过大量的阅读和思考,我现在确信,使用带有两个参数LocalEndpoint和RemoteEndpoint的构造函数的TcpConnection类会更有意义。 当本地端点可以接受默认值时,您可能支持一个参数RemoteEndpoint。 这在多宿主计算机上是不明确的,但是可以通过选择具有到达远程端点的最短路由的接口来使用路由表来解决歧义。

清晰度在其他方面也会增强。 套接字不是由IP地址和端口的组合标识的:

TCP使用包含本地和外部地址的所有四个值对传入段进行解多路复用:目标IP地址,目标端口号,源IP地址和源端口号。 通过仅查看目标端口,TCP无法确定哪个进程获得传入段。 而且,将在接收传入连接请求的[给定端口号]处的[各种]端点中唯一一个端点处于监听状态。 (p255,TCP-IP Illustrated Volume 1,W. Richard Stevens)

如您所见,这不仅可能,而且网络服务很可能拥有多个具有相同地址/端口的套接字,但在特定地址/端口组合上只有一个侦听套接字。 典型的库实现提供了一个套接字类,它的一个实例用于创建和管理连接。 这是非常不幸的,因为它引起了混乱,导致了这两个概念的广泛混淆。

Hagrawal不相信我(见评论),所以这里有一个真实的样本。 我将网络浏览器连接到http://dilbert.com,然后运行netstat -an -p tcp 。 输出的最后六行包含两个地址和端口不足以唯一标识一个套接字的例子。 在192.168.1.3(我的工作站)和54.252.92.236:80之间有两个不同的连接

  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

我认为海格劳尔的误解来源于我非常小心地使用“识别”一词。 我的意思是“完全,明确和唯一的标识”。 在上面的示例中,有两个端点的地址/端口组合为54.252.94.236:80 。 如果您拥有的是地址和端口,则您没有足够的信息来分辨这些套接字。 没有足够的信息来识别套接字。

附录

RFC793第2.7节的第二段说

连接由两端的一对插座完全指定。 本地套接字可以参与到不同外部套接字的许多连接。

从编程的角度来看,这个套接字的定义是没有用的,因为它不同于套接字对象,它是特定连接的端点。 对程序员来说,这个问题的大部分受众都是程序员,这是一个重要的功能差异。

参考

  • TCP-IP图解卷1 The Protocols,W. Richard Stevens,1994 Addison Wesley

  • DARPA的南加州大学信息科学研究所RFC793

  • RFC147,Socket的定义,Joel M. Winett,林肯实验室


  • 一个套接字由三件事组成:

  • 一个IP地址
  • 传输协议
  • 一个端口号
  • 端口是1到65535之间的数字,表示设备中的逻辑门。 客户端和服务器之间的每个连接都需要一个唯一的套接字

    例如:

  • 1030是一个港口。
  • (10.1.1.2,TCP,端口1030)是一个套接字。

  • 套接字表示两个网络应用程序之间的单个连接。 这两个应用程序名义上运行在不同的计算机上,但套接字也可用于单台计算机上的进程间通信。 应用程序可以创建多个套接字来相互通信。 套接字是双向的,这意味着连接的任何一方都能够发送和接收数据。 因此,理论上可以在OSI模型的任何级别从2开始创建套接字。 程序员经常在网络编程中使用套接字,尽管是间接的。 像Winsock这样的编程库隐藏了许多套接字编程的低级细节。 自20世纪80年代初以来,套接字已被广泛使用。

    端口代表网络通信的端点或“通道”。 端口号允许同一台计算机上的不同应用程序利用网络资源而不会相互干扰。 端口号通常出现在网络编程中,特别是套接字编程。 但是,有时候,偶尔用户可以看到端口号。 例如,某人在互联网上访问的某些网站使用如下所示的URL:

    http://www.mairie-metz.fr:8080/在这个例子中,数字8080是指Web浏览器用于连接到Web服务器的端口号。 通常情况下,一个网站使用的端口号是80,这个数字不需要包含在URL中(虽然可以)。

    在IP网络中,理论上端口号的范围可以从0到65535.但是,大多数流行的网络应用程序都使用端口号在低端范围​​内(例如HTTP为80)。

    注意:术语端口也指网络技术的其他几个方面。 端口可以​​指外围设备的物理连接点,例如串行端口,并行端口和USB端口。 术语端口也指某些以太网连接点,如集线器,交换机或路由器上的连接点。

    ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

    ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

    链接地址: http://www.djcxy.com/p/9685.html

    上一篇: What is the difference between a port and a socket?

    下一篇: django: Passing posted files through HttpResponseRedirect