Sockets 端口号和套接字之间的差异

Sockets 端口号和套接字之间的差异,sockets,networking,port,Sockets,Networking,Port,我开始阅读W.Richard Stevens的UNIX网络编程,我对端口和套接字感到非常困惑。当我在互联网上读到这篇文章时,它说套接字是一个连接的端点,而对于端口号,它写道,IP地址和端口号不是唯一的一对。 现在我的问题是: (1) 这两者有什么区别 (2) 如何在内部操纵套接字和端口。套接字是文件吗 (3) 当我们使用应用程序发送数据时,数据是如何发送的 (4) 如果有套接字,为什么要使用端口号 对不起,我的英语。。提前感谢您的回复 (1) 这两者有什么区别 运行IP网络的计算机总是有固定

我开始阅读W.Richard Stevens的UNIX网络编程,我对端口和套接字感到非常困惑。当我在互联网上读到这篇文章时,它说套接字是一个连接的端点,而对于端口号,它写道,IP地址和端口号不是唯一的一对。 现在我的问题是:

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

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

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

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

对不起,我的英语。。提前感谢您的回复

(1) 这两者有什么区别

运行IP网络的计算机总是有固定数量的端口——65535个TCP端口和65535个UDP端口。网络数据包的报头包含一个16字节的无符号短字段,指定数据包应该发送到哪些端口

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

(2) 如何在内部操纵套接字和端口。插座是a吗 档案

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

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

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

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

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

1) 这两者有什么区别? (2) 如何在内部操纵套接字和端口。套接字是文件吗

插座为(IP+端口):

  • 插座类似于电话(即用于通信的端到端设备)
  • IP就像你的电话号码(即你的插座地址)
  • 端口类似于您想要与之交谈的人(即您想要从该地址订购的服务)
套接字是进程的一部分。linux中的进程是一个文件

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

通过将数据转换为字节发送数据。在字节排序方面存在小/大端问题,因此在编码时必须考虑这一点

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


插座是(地址+端口),这意味着可以通过多个电话号码(IP)和多个插座(这并不意味着一个电话号码上的人会像另一个电话号码上的人一样回复你,因为他在这里/那里的工作可能不同).

从一些初级计算机网络书籍开始,比如Tanenbaum的。我在上个学期读过这本书……然后,是时候让你再去读一次了。否则,你就不会问这个问题了!在学习过程中培养逻辑理解能力。可能重复我理解了你的整个答案,这是一个很好的解释,但请你详细说明一下:“另一方面,套接字是由每个程序按需分配的。”当程序想要创建套接字时,它通过调用socket()函数来实现。当使用套接字完成时,它会通过调用套接字的文件描述符上的close()(或者在Windows中为closesocket())来销毁套接字。一个程序可能同时使用0、1或多个套接字,这取决于它正在执行的操作,并且如果它选择,它可能随时关闭套接字和/或创建新的套接字。另一方面,港口从未“创建”或“销毁”;e、 g.给定主机上始终存在65535个TCP端口。根据您的回答(这是一个很好的解释),我们需要唯一标识主机上的应用程序,因此我们使用端口号,如果是这样的话,我们为什么不直接使用端口号呢?因为套接字被用作句柄来查找与给定通信上下文相关的所有状态,而不仅仅是端口号。例如,当您在连接的TCP套接字上调用send()时,内核使用socket fd参数不仅查找端口号,还查找远程计算机socke的IP地址