端口号和套接字之间的区别

tkh*_*a96 4 sockets port networking

我开始阅读W. Richard Stevens撰写的UNIX网络编程,并且在端口和套接字之间感到非常困惑。当我在互联网上阅读时,它表示套接字是连接的端点,对于端口号来说,IP地址和端口不能构成唯一的对。所以现在我的问题是:

  • (1)两者有什么区别?

  • (2)如何在内部操纵套接字和端口。套接字是文件吗?

  • (3)使用应用程序发送数据时如何发送?

  • (4)如果有插座,那为什么要使用端口号?

对不起,我的英语。.在此先感谢您的答复。

Jer*_*ner 5

(1)两者有什么区别?

运行IP网络的计算机始终具有固定数量的端口-65535 TCP端口和65535 UDP端口。网络数据包的标头中包含一个16字节的unsigned-short字段,用于指定应将数据包传递到哪些端口。

另一方面,套接字由每个程序按需分配。套接字用作程序和OS的网络堆栈之间的句柄/接口,并用于构建和指定特定网络任务的上下文。一个套接字可以绑定也可以不绑定到一个端口,也可以(并且通常)同时将多个套接字绑定到一个特定的端口。

(2)如何在内部操纵套接字和端口。套接字是文件吗?

这完全取决于操作系统。而不同的操作系统则以不同的方式进行操作。目前尚不清楚在这个问题中“文件”是什么意思,但是通常套接字与文件系统没有任何关系。另一方面,Unix风格的OS的一个功能是套接字描述符也可以以与文件系统文件描述符相同的方式使用-即您可以将它们传递给read()/ write()/ select()等并获得有用的结果。其他操作系统(例如Windows)不支持该功能,因此对于它们,您必须对套接字与文件使用完全独立的一组函数调用。

(3)使用应用程序发送数据时如何发送?

应用程序调用send()函数(或类似的函数,如sendto()),传入相关的套接字描述符以及指向要发送的数据的指针,然后由网络堆栈来复制数据打包成数据包,然后将其传送到适当的网络设备进行传输。

(4)如果有插座,那为什么要使用端口号?

因为您需要一种与其他计算机上的特定程序进行通信的方法,并且计算机A无法知道计算机B上存在哪些套接字(如果有),但是端口号是固定的,因此程序员可以将它们用作一个通信的交汇点-例如,您的Web浏览器知道Web服务器几乎可以确定每当服务器运行时就在端口80上侦听传入的HTTP请求,因此可以合理地将其请求发送到端口80获得有用的回应。如果必须将套接字指定为目标,它将指定什么?服务器的套接字号是任意的,并且每次服务器运行时都可能不同。

  • 当程序想要创建套接字时,它通过调用 socket() 函数来实现。当它使用套接字完成时,它通过在套接字的文件描述符上调用 close()(或在 Windows 的情况下为 closesocket())来破坏套接字。一个程序可能同时使用 0 个、1 个或多个套接字,这取决于它正在做什么,并且它可能随时关闭套接字和/或创建新套接字,如果它选择的话。另一方面,端口永远不会“创建”或“销毁”;例如,在给定的主机上总是有 65535 个 TCP 端口。 (2认同)