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

9
我开始阅读 W. Richard Stevens 的《UNIX网络编程》,我对端口和套接字之间的区别感到非常困惑。当我在网上阅读时,看到套接字是连接的终点,而有关端口号则写道,IP地址和端口号组成一个唯一的对。 那么现在我的问题是:
(1) 这两者有什么区别?
(2) 套接字和端口如何在内部操作?套接字是否是文件?
(3) 当我们使用应用程序发送数据时,数据是如何发送的?
(4) 如果已经有套接字,为什么还要使用端口号?
抱歉我的英语不好..提前感谢你的回复。

3
从一本像Tanenbaum的初级计算机网络书开始学习。 - Am_I_Helpful
1
我在上个学期读到过...... - tkhurana96
1
那么,现在是你再去阅读的时候了。否则,你就不会问这个问题!在学习过程中培养逻辑理解能力。 - Am_I_Helpful
可能是端口和套接字有什么区别?的重复问题。 - YetAnotherRandomUser
2个回答

11
(1) 这两者有何不同? 运行IP网络的计算机始终具有固定数量的端口——65535个TCP端口和65535个UDP端口。网络数据包的头部包含一个16位无符号短整型字段,用于指定该数据包应传递到哪个端口。
另一方面,套接字是由每个程序按需分配的。套接字用作程序和操作系统网络堆栈之间的句柄/接口,并用于构建和指定特定网络任务的上下文。套接字可能绑定到一个端口,也可能没有绑定到端口,而且有多个套接字同时绑定到一个特定端口是常见的。
(2) 套接字和端口在内部如何操作?套接字是文件吗? 这完全取决于操作系统;不同的操作系统有不同的处理方式。这个问题中“文件”的意思不清楚,但通常情况下,套接字与文件系统没有任何关系。另一方面,Unix风格的操作系统的一个特点是,套接字描述符也可像文件描述符一样使用,即可以将它们传递给read()/write()/select()等函数,并获得有用的结果。其他操作系统(如Windows)不支持该功能,因此必须使用完全独立的一组函数调用来处理套接字和文件。
(3) 当我们使用应用程序发送数据时,数据是如何发送的? 应用程序调用send()函数(或类似的函数,如sendto()),传递相关的套接字描述符以及一个指向要发送的数据的指针,然后由网络堆栈将该数据复制到数据包中,并将其传送到适当的网络设备进行传输。
(4) 如果有套接字,为什么还要使用端口号?因为您需要与其他计算机上的特定程序进行通信,而且计算机A无法知道计算机B上存在哪些套接字(如果有的话)。但是端口号是固定的,因此程序员可以将它们用作通信的会合点--例如,您的 Web 浏览器知道 Web 服务器几乎肯定会在服务器运行时监听传入的 HTTP 请求的80端口,因此它可以将其请求发送到80端口,并合理地期望得到一个有用的响应。如果必须指定套接字作为目标,它将指定什么?服务器的套接字号是任意的,并且每次服务器运行时可能会发生变化。

我理解了你的整个回答,这是一个非常好的解释,但是你能否详细说明一下这句话的含义:“另一方面,套接字是由每个程序按需分配的。” - tkhurana96
2
当程序想要创建一个套接字时,它通过调用socket()函数来实现。当它使用完一个套接字后,通过在套接字的文件描述符上调用close()(或在Windows情况下调用closesocket())来销毁套接字。一个程序可能同时使用0个、1个或多个套接字,这取决于它正在做什么,并且它可能随时关闭套接字和/或创建新的套接字,如果它选择这样做的话。另一方面,端口从未被“创建”或“销毁”;例如,在给定主机上始终存在65535个TCP端口。 - Jeremy Friesner
根据您的答案(这是一个非常好的解释),我们需要唯一标识主机上的应用程序,所以我们使用端口号,那么如果是这种情况,为什么我们不直接使用端口号呢? - tkhurana96
1
因为套接字被用作句柄来查找与给定通信上下文相关联的所有状态,而不仅仅是端口号。例如,当您在连接的TCP套接字上调用send()时,内核使用套接字fd参数来查找的不仅仅是端口号,还包括所连接的远程计算机的IP地址,套接字当前设置为阻塞或非阻塞,套接字的出站数据缓冲区(它保存着出站数据,直到网络设备可以发送它),等等。 - Jeremy Friesner

2

1) 这两者之间有什么区别? (2)套接字和端口是如何进行内部操作的?套接字是否是一个文件?

一个套接字是(IP+Port):

  • 套接字就像电话(即用于通信的端到端设备)
  • IP就像你的电话号码(即套接字的地址)
  • 端口就像你想要与之交谈的人(即你想从该地址订购的服务)

套接字是进程的一部分。在Linux中,进程是一个文件。

(3) 当我们使用应用程序发送数据时,数据是如何发送的?

将数据转换为字节后发送。由于字节的顺序问题存在大小端问题,因此在编码时必须考虑这一点。

(4) 如果有套接字,为什么还要使用端口号?

套接字是(地址+端口),这意味着你想要交谈的人(端口)可以从许多电话号码(IP)到达,因此可以从许多套接字到达(这并不意味着一个电话号码上的人会像另一个电话号码上的人一样回答你,因为他在这里/那里的工作可能不同)。

"最初的回答"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接