端口和套接字之间的混淆

2023-12-29

好吧,当我尝试研究 IP 地址、端口和套接字时,我得到了以下结果:

IP 地址用于映射到网络上的不同设备。

端口号用于访问主机上的特定应用程序。

套接字是两者的组合。

我不明白的是,如果端口将您连接到特定应用程序,那么每个应用程序应该只有 1 个端口号,对吗?但例如端口 80 用于 HTTP,因此如果应用程序使用该端口,它就会侦听 HTTP 请求,对吗?那么如果超过一个人尝试访问它会发生什么呢?套接字和端口让我很困惑..


套接字是软件中使用的一种抽象概念,可让程序员更轻松地通过网络发送和接收数据。它们是一个接口,您可以在应用程序级代码中使用它来访问操作系统和语言运行时提供的底层网络协议实现。

TCP协议、IP协议等流行的网络协议都没有,在他们自己之中,有“套接字”的概念吗? “套接字”是一个概念实施者TCP/IP 的提出。

那么“套接字”是什么概念呢?基本上,您可以向其写入数据并从中读取数据的对象。 “打开”套接字意味着在程序内存中创建这些对象之一。您还可以“关闭”套接字,这意味着释放该对象在幕后使用的任何系统资源。

某些类型的套接字可以“绑定”到本地和远程地址,您可以将其视为在套接字对象上设置一些数据字段或属性。这些字段的值会影响从套接字读取或写入时发生的情况。

在 Unix 中,有多种套接字。如果你“打开”一个TCP套接字,将其“绑定”到本地和远程地址(和端口),并向其中写入一些数据,您的库/操作系统会将这些数据打包到 TCP 段中,并通过与您“的本地地址匹配的任何网络接口将其发送出去”将套接字绑定到。如果你“打开”一个IP插座,并向其中写入一些数据,该数据将被打包成IP数据包(不添加任何TCP头)并发送出去。如果你打开“原始”,链路层套接字,并写入它,数据将作为链路级帧的有效负载发送出去,减去IPandTCP 标头。还有“Unix 域套接字”。如果您打开其中一个并对其进行写入,数据将直接通过系统内存传递到同一台计算机上的另一个进程。

因此,尽管它们经常用于非 OO 语言(如 C),但套接字是 OO 语言所谓的“多态性”的完美示例。如果您在向某人解释什么是“多态性”时遇到困难,只需教他们有关网络套接字的知识即可。

“端口”是一个完全不同的概念。 “端口”的概念是built inTCP 和其他传输协议。

其他人可能会给出更冠冕堂皇的、也许在技术上更准确的“端口”定义。这是一个完全脚踏实地的:

“端口”是一个number它出现在 TCP 段的 TCP 标头中。 (或者 UDP 段上的 UDP 标头。)

只是一个数字。不多不少。

如果您使用基于“套接字”的接口进行网络编程,则该数字的意义在于您的每个 TCP 或 UDP 套接字都有一个“本地端口”属性和一个“远程端口”属性。正如我之前所说,设置这些属性称为“绑定”。

如果您的套接字的“本地端口”属性“绑定”为 80,则您发送出去的所有 TCP 段的“发送方端口”标头中都将包含“80”。然后,当其他人回复您的消息时,他们会将“80”放入“目标端口”标头中。

更重要的是,如果您的套接字“绑定”到本地端口 80,那么当数据从其他地方到达,发送到您的端口 80 时,操作系统会将其传递给您的申请流程而不是任何其他。然后,当您尝试从套接字读取数据时,将返回该数据。

显然,操作系统需要知道每个套接字绑定到哪个端口。所以“绑定”的时候,必须进行系统调用。如果您的程序没有以足够的权限运行,操作系统可能会拒绝让您绑定到某个端口。然后,根据您使用的语言,您的网络库将引发异常或返回错误代码。

有时操作系统可能拒绝让您绑定到某个端口,不是因为您没有正确的权限,而是因为another进程已经绑定到它。However,这就是其他一些答案出错的地方,如果在打开套接字时设置了某些标志,您的操作系统可能允许超过一个套接字绑定到相同的本地地址和端口。

你仍然不知道什么是“监听”和“连接”套接字。但一旦你理解了上面的内容,那将只是一个小小的跳跃。

上面解释了我们今天所说的“套接字”和我们所说的“端口”之间的区别。可能仍然不清楚的是:为什么我们需要进行这种区分?

你真的让我思考(谢谢)!我们能否将称为“套接字”的软件抽象称为“端口”,这样就不用调用socket_recv你会打电话给port_recv?

如果您只对 TCP 和 UDP 感兴趣,maybe那会起作用的。请记住,“套接字”抽象不仅仅适用于 TCP 和 UDP。它也适用于其他网络协议,以及同一台机器上的进程间通信。

话又说回来,TCP 套接字不仅仅映射到端口。一个“已连接”的 TCP 套接字映射到本地 IP 地址、本地端口、远程地址、and远程端口。它also有其他相关数据,包括各种标志、发送和接收缓冲区、传入/传出数据流的序列号以及用于拥塞控制(速率限制)的各种其他变量等。该数据确实not只属于本地端口。

可以有数千个 TCP 连接同时通过同一“端口”。每个连接都有其自己的关联数据,封装每个连接数据的软件对象是“TCP 套接字”。

即使您只使用 TCP/UDP,即使您一次只有一个进程使用任何给定的本地端口,即使您一次只有一个连接通过每个本地端口,我认为“套接字“ 抽象still说得通。如果我们只是将套接字称为“端口”,那么这个词就会有更多的含义。重复使用同一个词有太多的含义会阻碍沟通。

“端口”是应用程序进程的传输协议级标识符。 “套接字”是软件中用于发送/接收消息的对象,这些消息从/到这些标识符进行寻址。

区分“我的地址”和“发送来自我的信件的人”是一个有用的区别。 “我的地址”只是一个标签。标签不是主动的东西,它执行诸如发送数据之类的事情。给“用于发送数据的东西”赋予自己的名称是合乎逻辑的,这与表示“数据标记的发送者地址”的名称不同。

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

端口和套接字之间的混淆 的相关文章

  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • C# - 将指向 sockaddr 结构的 IntPtr 转换为 IPAddress

    从 P Invoked 本机函数中 我得到一个IntPtr http msdn microsoft com en us library system intptr aspx它指向一个sockaddr http msdn microsoft
  • 如何获取ISP名称?

    如何在 Salesforce com 中捕获用户的 ISP 名称 该解决方案可以采用 Salesforce com 中的 JavaScript 例如 Apex VisualForce Pages 捕获用户 ISP 名称的网站示例是 http
  • http客户端在Windows 8.1中取消请求

    我正在开发一个 Windows Phone 8 1 项目 Windows 8 1 中有两个版本的 http 客户端 system net http and windows web http Microsoft 建议使用后者 所以 我决定接受
  • C# Dns.GetHostEntry() - 异常:没有这样的主机已知

    From 文档 https learn microsoft com en us dotnet api system net dns gethostentry view netframework 4 8 Dns GetHostEntry 将主
  • 如何以编程方式证明“六度分离”概念?

    我有一个包含 2000 万用户以及这些人之间的联系的数据库 如何证明 六度分离 的概念以最有效的方式在编程中 链接到有关六度分离的文章 http en wikipedia org wiki Six degrees of separation
  • 根据 TCP 的 C++ 函数

    我正在使用 recv 函数 C 来获取有关网络问题的指示 在这种情况下它返回负值 看这里 https www rfc editor org rfc rfc1122 page 100 https www rfc editor org rfc
  • 如何从 NetService 获取 IP 地址

    当我得到一个 NetService 对象时 我尝试这样做 NSNetService ss netArray objectAtIndex indexPath row ss delegate self ss resolveWithTimeout
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用
  • 本地主机:8080 是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有什么区别本地主机 网络 vs 本地主机 8080 web TCP IP 连接始终与 IP 地址建立 您可以将 IP 地址视为某台计算机的
  • 如何在Windows Phone 7中获取Wi-Fi和移动网络参数?

    我的应用程序需要以下移动网络参数 MCC 移动国家代码 MNC 移动网络代码 LAC 位置区域代码 CID 小区标识符 细胞信号强度 对于 Wi Fi MAC地址 信号强度 我还需要两个变体的设备 IP 地址 Windows Phone 7
  • IP 标志的不分段位在哪里使用?

    我很想知道 IP 标志的 不分段 DF 位在哪里使用 因为碎片对于更高层来说是不可见的 并且他们也不关心 我也在寻找一个例子 预先非常感谢 碎片并不总是对所有上层都可见 一些早期 甚至可能是当前 微控制器 TCP IP 堆栈没有实现碎片处理
  • C# 自动检测代理设置

    C 2008 SP1 我正在使用代码来检测是否已在 Internet 选项 下设置代理 如果有代理 那么我将在我的网络客户端中设置它 所以我只是检查代理的地址是否存在 如果没有 则说明 Web 客户端中没有要设置的代理 这是执行此操作的正确
  • 在我的网络上的其他计算机上查看我的 IIS 托管站点

    在家里 我有一个包含两台机器的简单网络设置 在一台机器上 我有一个使用 IIS7 托管的网站 而不是标准localhost index htm地址我已经添加了一个条目HOSTS将本地 IP 127 0 0 1 指向该域的文件 www mys
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • 为什么 h_addr_list (在 hostent 结构中)类型为 char** 而不是 void*?

    我试图找出一段构建 hostent 对象的代码 更具体地说 它的工作部分是填充 h addr list 数组 我对分配到数组中的值被强制转换为这一事实感到困惑char 据我所知 这个数组与字符串无关 我注意到h addr list数组实际上
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • registerForRemoteNotificationTypes:iOS 8.0 及更高版本不支持

    当尝试在 iOS 8 x 下注册推送通知时 application registerForRemoteNotificationTypes UIRemoteNotificationType Alert UIRemoteNotification
  • 如何设置专门监控 AWS API Gateway API 限制(429 - 请求过多)的警报?

    一种方法是让警报监控自动发出的 Cloudwatch 指标4XXError 然而 这样做的问题是它无法区分节流错误 429 从其他地方4xx错误 因此 我的警报可能会因节流以外的原因而被触发 这违背了警报的特定目的 仅专门监视节流 Api
  • 在循环中调用函数两次或多次

    我使用下面的代码lambda在循环中调用函数一次 它可以工作 但现在我尝试在循环中调用特定时间的函数 例如循环中的 3 次 我寻找它并找到了一些解决方案 但如果没有循环 它们会在特定的时间调用函数 当我循环尝试时 没有任何变化 有没有有效的
  • 在通用故事板中使用当前作为弹出框

    Apple 建议针对不同尺寸类别的通用应用程序使用单一情节提要 现在我正在尝试根据设备调整 UI 到目前为止效果很好 我面临的唯一问题是如何分配特定的segues 例如 我的应用程序中的设置仅包含两个表格视图单元格 应该通过 iPad 上的
  • C++ 按值获取数组元素的索引

    到目前为止 我一直将数组存储在向量中 然后循环遍历向量以查找匹配元素 然后返回索引 在 C 中是否有更快的方法来做到这一点 我用来存储数组的 STL 结构对我来说并不重要 它不必是向量 我的数组也是唯一的 没有重复元素 并且是有序的 例如
  • 菜单项不会出现在 Google 表格插件中

    我正在尝试制作这个附加插件 可以帮助我和其他人将工作表导出为 JSON 在我的测试中 菜单显示并且所有功能都有效 如屏幕截图中所示 当我发送到 Google Web Store 上发布时 Docs Add ons Advisor 在评论中看
  • ui-router:基于用户角色的默认路由

    我在我的项目中使用 UI 路由器 我的应用程序的主页由 4 个选项卡组成 每个选项卡路由到不同的模板 这是我当前的路由代码 我使用 forEach 创建 6 个路由 Draft Assigned InProgress Completed R
  • Xcode、Swift:如何在 iOS 应用程序中添加多语言支持并使用带有占位符和复数的字符串?

    我需要在使用 Swift 在 Xcode 中编写的 iOS 应用程序中添加多语言支持 我需要本地化 静态字符串 带有占位符的字符串 复数 数量字符串 例如下面在 Android 中我们在 XML 文件中添加命名字符串和复数
  • 如何使用 PDFbox 创建固定宽度的段落?

    我可以插入这样的简单文本 document new PDDocument page new PDPage PDPage PAGE SIZE A4 document addPage page PDPageContentStream conte
  • Kivy:如何使用canvas来创建在python中创建的小部件

    我想向我的复选框添加画布以更改其颜色 我找到了这个answer https stackoverflow com a 37072458 3154274 但我正在努力实施它 我的复选框是使用以下代码在 python 中创建的 checkb Ch
  • Java 比较两个字符串与占位符值

    我正在为 Java 项目开发基于命令的功能 但在向这些命令引入参数时遇到了麻烦 例如 所有命令的存储方式如下 Hey tell USER to ACTION 现在 当用户提交命令时 它将如下所示 Hey tell Player to com
  • 如何抑制 Swift 3 中的警告?

    使用 clang 我可以做 pragma clang diagnostic push pragma clang diagnostic ignored Wdeprecated declarations pragma clang diagnos
  • WPF 中的命中测试

    我有一个Ellipse on a Canvas我正在对其进行命中测试 每次我点击Ellipse 测试通过 如果我点击中间Ellipse 测试失败 这很好 在我像这样填充椭圆之后 myEllipse Fill new SolidColorBr
  • OAuth2(不支持的授权类型)无效的授权类型:client_credentials

    我正在尝试获取 Google Drive API 的访问令牌 以便将其用于来自我的 Python 脚本的后续请求 但是我收到了一个无效的 grant type 错误 这有点令人困惑 我在用oauthlib and requests oaut
  • 如何增加文本小部件中的字体大小?

    当我使用以下代码增加字体大小时 它也会增加小部件的大小 是否可以通过保持文本小部件的大小不变来增加字体大小 谢谢 A11 tkinter Text top height 28 width 70 background 02e0a1 label
  • 使用 iTextSharp 禁用扩展功能

    我有一个 PDF 模板 其中包含启用了扩展功能的表单 填写此表格的字段后 使用iTextSharp 使用 acrobat reader 的用户收到错误消息 本文档启用了 Adob e Reader 中的扩展功能 该文件有 自创建以来已发生更
  • 如何将 jekyll _site 目录推送到 gh-pages 分支,并将源代码保留在 master 中?

    我有一个基本的 jekyll 网站 由页面 不是帖子 组成 但是 因为我想在列出页面时对页面进行排序 所以我必须使用杰基尔排序 https github com krazykylep Jekyll Sort插件 jekyll 中没有内置有点
  • IE - JQuery 在 $.each 循环中将子节点附加到 XML

    我遇到了 IE 无法正确附加或识别我将子节点附加到解析的 XML 字符串的尝试的问题 Chrome 和 Firefox 明白我正在尝试做什么 我不知道这是范围问题还是 IE 和 XML 的行为 var dataContainers data
  • 使用 Delicious API 在 Firefox 中创建 Delicious 书签

    我想在 Firefox 中创建一个 Delicious 小书签 用预定义的标签为当前页面添加书签 为了概念证明 如果我输入此网址 它会起作用 https john email protected cdn cgi l email protec
  • 端口和套接字之间的混淆

    好吧 当我尝试研究 IP 地址 端口和套接字时 我得到了以下结果 IP 地址用于映射到网络上的不同设备 端口号用于访问主机上的特定应用程序 套接字是两者的组合 我不明白的是 如果端口将您连接到特定应用程序 那么每个应用程序应该只有 1 个端