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

2024-03-15

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


Summary

TCP 套接字是一个端点instance由特定 TCP 连接或侦听状态上下文中的 IP 地址和端口定义。

端口是虚拟化标识符定义服务端点(与服务不同)instance端点又名会话标识符)。

TCP 套接字是not一个连接,它是特定连接的端点。

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

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

博览会

这是一个有趣的问题,迫使我重新审视一些我自以为已经了解透彻的事情。您可能会认为像“套接字”这样的名称是不言自明的:选择它显然是为了唤起您插入网络电缆的端点的图像,两者在功能上有很强的相似之处。然而,在网络用语中,“套接字”这个词带有太多的包袱,因此有必要仔细重新检查。

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

为了讨论的目的,我将限制对 TCP-IP 网络环境的考虑。 OSI 模型一切都很好,但从未完全实施,更不用说在高流量高压力条件下广泛部署。

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

A TCP 联系由两个端点定义sockets.

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

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

它是套接字对(4元组 由客户端 IP 地址组成, 客户端端口号、服务器IP地址、 和服务器端口号)指定 唯一的两个端点 标识每个 TCP 连接 互联网。 (TCP-IP 图解卷 1,W·理查德·史蒂文斯)

在大多数 C 派生语言中,TCP 连接是使用 Socket 类实例上的方法来建立和操作的。尽管在更高的抽象级别(通常是 NetworkStream 类的实例)上进行操作很常见,但这通常会公开对套接字对象的引用。对于编码人员来说,此套接字对象似乎代表连接,因为连接是使用套接字对象的方法创建和操作的。

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

所有这些都有点令人困惑,让您相信套接字就是一个连接,这完全是胡说八道。我一直在这种误解中挣扎,直到理查德·多尔曼提出这个问题。

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

其他方面的清晰度也将得到提高。一个插座是not通过IP地址和端口的组合来识别:

TCP 使用构成本地和外部地址的所有四个值来解复用传入数据段:目标 IP 地址、目标端口号、源 IP 地址和源端口号。 TCP 无法仅通过查看目标端口来确定哪个进程获取传入数据段。此外,[给定端口号] 处的[各种] 端点中唯一一个将接收传入连接请求的端点是处于侦听状态的端点。 (第255页,TCP-IP 图解卷 1,W·理查德·史蒂文斯)

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

Hagrawal 不相信我(请参阅评论),所以这是一个真实的示例。我连接了网络浏览器http://dilbert.com 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.

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

Addendum

RFC793 第 2.7 节第二段说

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

从编程角度来看,套接字的这种定义没有帮助,因为它与套接字不同object,这是特定连接的端点。对于程序员来说,这个问题的大多数受众都是程序员,这是一个至关重要的功能差异。

@plugwash 提出了一个重要的观察。

根本问题是 TCP RFC 对套接字的定义与所有主要操作系统和库使用的套接字定义相冲突。

根据定义,RFC 是正确的。当库误用术语时,这不会取代 RFC。相反,它给该库的用户带来了理解两种解释并注意单词和上下文的责任负担。如果 RFC 不一致,则以最新且最直接适用的 RFC 为准。

参考

  1. TCP-IP 图解卷 1 协议,W.理查德·史蒂文斯,1994 年艾迪生·韦斯利

  2. RFC793 https://www.rfc-editor.org/rfc/rfc793,南加州大学 DARPA 信息科学研究所

  3. RFC147 https://www.rfc-editor.org/rfc/rfc147, 套接字的定义,Joel M. Winett,林肯实验室

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

端口和套接字有什么区别? 的相关文章

  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • 如何在 Android 上检测从 3g 到 H+ 的网络类型更改

    通过连接管理器和广播接收器 我能够获取连接和断开连接事件 如下所述埃里克的帖子在这里 https stackoverflow com questions 1783117 network listener android 我想知道的是网络连接
  • 如何在 Windows 8.1 中的 anaconda(python3.6) 中构建 cython pyx 到 pyd?

    我参考了一些网站在 Windows 8 1 中将 pyx 构建为 pyd 我正在使用带有 Spyder IDE 的 Anaconda Distribution 我已经开发了 pyx 文件 但无法在 Anaconda 命令提示符 中构建 水蟒
  • C++ Boost.asio Ping

    我正在尝试编写一个程序来列出网络上设备的所有 IP 地址 其主要组成部分之一是能够对设备执行 ping 操作 这个程序必须在Linux Windows和Mac上运行 所以我选择了Boost库 我设法在文档中找到这个示例 http www b
  • Android 中客户端服务器通信的选项

    我目前正处于论文项目的研究阶段 我的项目是一个针对移动设备的订票系统 我选择以 Android 为目标 我预计需要带有中央服务器的客户端 服务器架构 因此目前正在研究 Android 如何与这样的服务器进行通信 服务器将授予客户端访问票务信
  • ModemManager:mmcli 获取信号强度

    我无法检索 Sierre Wireless MC7304 上的信号强度 另外通过 mmcli 发送 AT 命令似乎不起作用 sudo mmcli m org freedesktop ModemManager1 Modem 0 signal
  • “致命错误:调用未定义的函数 socket_create()”,即使在 php.ini 中启用

    我有一个奇怪的 PHP 问题 我在 Windows 7 的 IIS 上运行 PHP 5 当我在 PHP 文件中调用 socket create 时 如下所示 sock socket create AF INET SOCK DGRAM get
  • 如何从一个端口为 Jetty 提供 https 和 http 服务?

    我知道这是一个重复的问题 但原始发帖者提出这个问题的原因是错误的 我并不是暗示我问它是为了right原因 但让我们看看 我们有一个在非标准端口号上运行的 Web 服务 尽管用户似乎能够记住端口号 但有时他们会错误地输入 http 而不是 h
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • 客户端使用高端口号

    为什么客户端会结束连接 使用高端口号 临时端口 而应用程序 监听通常较小的端口号 谢谢你的优点 卡蒂克 巴拉古鲁 服务器侦听固定端口号 以便客户端知道连接到哪里 客户端不需要使用固定端口号 因为没有人发起与它们的连接 事实上 如果同一台计算
  • http客户端在Windows 8.1中取消请求

    我正在开发一个 Windows Phone 8 1 项目 Windows 8 1 中有两个版本的 http 客户端 system net http and windows web http Microsoft 建议使用后者 所以 我决定接受
  • 管道破裂错误

    我在 FTP 实现中的打开的数据套接字上使用 write 来发送文件 但写入一些数据后 它会挂起一段时间 之后它会返回 损坏的管道 错误 对此的任何帮助将不胜感激 我的进程从一个缓冲区读取数据包并写入套接字 我在增加带宽时注意到了这个问题
  • Rails 是否支持侦听 UDP 套接字的简洁方式?

    在 Rails 中 集成更新模型某些元素的 UDP 侦听过程的最佳方式是什么 特别是向其中一个表添加行 简单的答案似乎是在同一进程中使用 UDP 套接字对象启动一个线程 但不清楚我应该在哪里执行适合 Rails 方式的操作 有没有一种巧妙的
  • 良好的客户端套接字池

    我需要管理从我的 Java 应用程序到外部服务器的长时间运行的 TCP 套接字连接 我正在寻找一个好的套接字池 这样我就可以重复使用套接字 有什么建议吗 你可以看看在上面建立一个套接字池公共池 http commons apache org
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 基于邻近度的负载均衡

    我正在开展一个项目 我们在世界各地拥有大量 目前为 5 台 服务器 客户端通过集中式代理连接到其中一台服务器 我们知道客户的原籍国 但除此之外一无所知 我们完全控制服务器 因此我们可以获得所需的所有信息 我们不控制客户 他们必须按照标准通过
  • 我该怎么做才能完全关闭与mcu的tcpClient连接?

    我现在正在研究与 ESP32 中运行的 tcp 服务器的 tcp 套接字连接 通信工作正常 但我无法关闭连接 在搜索关闭 重置 tcpClient 上的解决方案后 似乎关闭 tcpClient 的正确方法应该是 tcpClient GetS
  • php中的可变长度数据包

    我正在接收通过 UDP 发送到我的服务器的数据包 我正在使用 socket read 来读取数据 它运行得很好 但是我遇到了一个错误 在我的例子中 socket read 的长度参数并不总是相同的 数据长度的范围可以是 50 150 字节
  • 使用 ImageMagick 进行 SVG 转换无法正确应用翻译

    我使用的是 Mac OS X 10 5 的 Mac 我正在尝试使用 ImageMagick 来转换SVG http en wikipedia org wiki Scalable Vector Graphics文件到一个PNG http en
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓

随机推荐