端口号和套接字的区别
Posted
技术标签:
【中文标题】端口号和套接字的区别【英文标题】:Difference between port number and socket 【发布时间】:2016-06-20 02:24:48 【问题描述】:我开始阅读 W. Richard Stevens 的 UNIX 网络编程,我很困惑端口和套接字。当我在互联网上阅读时,它说套接字是连接的端点,并且对于端口号,它写道,IP 地址和端口没有形成一个唯一的对。 所以现在我的问题是:
(1)这两者有什么区别?
(2)如何在内部操作套接字和端口。套接字是文件吗?
(3) 当我们使用应用程序发送数据时,数据是如何发送的?
(4) 如果有套接字,我们为什么要使用端口号?
对不起我的英语..提前感谢您的回复。
【问题讨论】:
从一些初学者的计算机网络书籍开始,比如 Tanenbaum 的。 我在上个学期读过这个...... 那么,你又该去读一读了。否则,你不会问这个问题!在学习的同时培养逻辑理解能力。 What is the difference between a port and a socket?的可能重复 【参考方案1】:(1) 这两者有什么区别?
运行 IP 网络的计算机始终具有固定数量的端口——65535 个 TCP 端口和 65535 个 UDP 端口。网络数据包的标头中包含一个 16 字节的无符号短字段,用于指定数据包应传送到哪些端口。
另一方面,套接字是由每个程序按需分配的。套接字用作程序和操作系统网络堆栈之间的句柄/接口,用于为特定网络任务构建和指定上下文。一个套接字可以绑定到一个端口,也可以不绑定,也有可能(并且常见)多个套接字同时绑定到一个特定端口。
(2)套接字和端口是如何在内部操作的。插座是不是 文件?
这完全取决于操作系统;并且不同的操作系统以不同的方式进行。目前尚不清楚这个问题中的“文件”是什么意思,但通常套接字与文件系统没有任何关系。另一方面,Unix 风格的操作系统的一个特点是套接字描述符也可以以与文件系统文件描述符非常相似的方式使用——即您可以将它们传递给 read()/write()/select() 等并获得有用的结果。其他操作系统(例如 Windows)不支持该功能,对于它们,您必须对套接字和文件使用一组完全独立的函数调用。
(3) 当我们使用应用程序发送数据时,数据是如何发送的?
应用程序调用 send() 函数(或类似的函数,如 sendto()),传入相关的套接字描述符以及指向它要发送的数据的指针,然后由网络堆栈决定将该数据复制到一个数据包中并将其传送到适当的网络设备进行传输。
(4) 如果有套接字,我们为什么要使用端口号?
因为您需要一种与其他计算机上的特定程序通信的方法,而计算机 A 无法知道计算机 B 上存在哪些套接字(如果有)。但是端口号是固定的,因此程序员可以将它们用作通信的集合点——例如,您的 Web 浏览器知道 Web 服务器几乎肯定会在服务器运行时侦听端口 80 上的传入 HTTP 请求,因此它可以将其请求发送到端口 80获得有用响应的合理期望。如果它必须指定一个套接字作为目标,它会指定什么?服务器的套接字编号是任意的,并且每次服务器运行时都可能不同。
【讨论】:
我理解了你的全部答案,这是一个很好的解释,但你能否详细说明一下:“另一方面,套接字是由每个程序按需分配的。” 当程序想要创建一个套接字时,它通过调用 socket() 函数来实现。使用套接字完成后,它会通过调用套接字文件描述符上的 close()(或在 Windows 的情况下为 closesocket())来销毁套接字。一个程序可能同时使用 0、1 或多个套接字,这取决于它正在做什么,并且它可能随时关闭套接字和/或创建新的套接字,如果它选择的话。另一方面,端口永远不会“创建”或“销毁”;例如给定的主机上总是正好有 65535 个 TCP 端口。 根据您的回答(这是一个很好的解释),我们需要唯一标识主机上的应用程序,这就是我们使用端口号的原因,那么如果是这种情况,那么为什么不我们只直接使用端口号吗? 因为套接字用作句柄来查找与给定通信上下文相关的所有状态,而不仅仅是端口号。例如,当您在已连接的 TCP 套接字上调用 send() 时,内核使用 socket fd 参数不仅查找端口号,还查找套接字连接到的远程计算机的 IP 地址,该套接字当前是否在设置为阻塞或非阻塞,套接字的输出数据缓冲区(在网络设备可以发送之前保存输出数据)等。【参考方案2】:1) 这两者有什么区别? (2)sockets和ports是如何内部操作的。套接字是文件吗?
一个套接字是(IP+端口):
套接字就像电话(即用于通信的端到端设备) IP 就像您的电话号码(即您的套接字地址) Port 就像您想与之交谈的人(即您想从该地址订购的服务)套接字是进程的一部分。 linux中的进程就是一个文件。
(3) 当我们使用应用程序发送数据时,数据是如何发送的?
通过将数据转换为字节来发送数据。关于字节排序存在小/大端问题,因此您在编码时必须考虑到这一点。
(4) 如果有套接字,我们为什么要使用端口号?
套接字是(地址+端口),这意味着您要与之交谈的人(端口)可以通过许多电话号码(IP)访问,因此可以从许多套接字(这并不意味着一个电话号码上的人会以与其他电话号码相同的方式回复您,因为他在这里/那里的工作可能不同)。
【讨论】:
以上是关于端口号和套接字的区别的主要内容,如果未能解决你的问题,请参考以下文章