Networking 端口和套接字之间的混淆

Networking 端口和套接字之间的混淆,networking,port,ip-address,Networking,Port,Ip Address,好的,当我试图研究ip地址、端口和套接字时,我得到的是: IP地址用于通过网络映射到不同的设备 端口号用于访问主机上的特定应用程序 插座是两者的组合 我不明白的是,如果端口将您连接到一个特定的应用程序,那么每个应用程序应该只有一个端口号,对吗?但例如,端口80用于HTTP,所以如果应用程序正在使用该端口,它正在侦听HTTP请求,对吗?那么,如果不止一个人试图访问它,会发生什么呢?插座和端口让我很困惑 当应用程序(如Apache或Nginx等web服务器)在端口80上侦听时,它会创建所谓的侦听套接

好的,当我试图研究ip地址、端口和套接字时,我得到的是:

IP地址用于通过网络映射到不同的设备

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

插座是两者的组合

我不明白的是,如果端口将您连接到一个特定的应用程序,那么每个应用程序应该只有一个端口号,对吗?但例如,端口80用于HTTP,所以如果应用程序正在使用该端口,它正在侦听HTTP请求,对吗?那么,如果不止一个人试图访问它,会发生什么呢?插座和端口让我很困惑

当应用程序(如Apache或Nginx等web服务器)在端口80上侦听时,它会创建所谓的侦听套接字

当一些客户端到来时,这个监听套接字会得到更新(可以通过
select
poll
API来注意),我们的应用程序会创建通信套接字。这个套接字由tuple
(src_addr,src_port,dst_addr,dst_port)唯一标识。
-很可能许多客户端都有完全相同的(dst_addr,dst_port)组合

然后,我们的web服务器可以通过该通信套接字来传递所述网页,并最终关闭该套接字。当许多客户机并行时,web服务器可以为每个客户机创建线程/进程(Apache模型),或者逐个为所有套接字提供服务(Nginx模型)


请注意,在这种情况下,每个端口只能存在一个侦听套接字-多个应用程序不能像80一样绑定到同一端口。但是,拥有多个通信套接字是完全可以的(有些人报告说成功地同时处理了超过一百万个请求)。

每次您在侦听状态(例如端口80)的套接字上接受连接时,您都会得到一个表示连接的已建立状态的新套接字

在客户端,每次使用该地址和端口建立新连接(正在连接的新套接字)时,操作系统都会在您一侧分配一个随机端口

例如,如果连接两次:

your-host:22482 <---> remote-host:80
your-host:23366 <---> remote-host:80
您的主机:22482远程主机:80
您的主机:23366远程主机:80

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

TCP协议、IP协议和其他流行的网络协议本身没有任何“套接字”的概念。“套接字”是TCP/IP实现者提出的一个概念

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

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

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

因此,尽管套接字通常用于C等非OO语言中,但它是OO语言所称的“多态性”的完美例子。如果您在解释某人的“多态性”时遇到困难,只需教他们有关网络套接字的知识

“港口”是一个完全不同的概念。“端口”的概念内置于TCP和其他传输协议中

其他人可能会给出“端口”更高的错误定义,也许在技术上更准确。下面是一个完全脚踏实地的例子:

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

只是一个数字。不多不少

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

如果套接字的“本地端口”属性“绑定”到80,那么您发送的所有TCP段的“发送方端口”头中都将有“80”。然后,当其他人响应您的消息时,他们会将“80”放在他们的“目标端口”头中

更重要的是,如果您的套接字“绑定”到本地端口80,那么当数据从别处到达您的端口80时,操作系统将把它传递给您的应用程序进程,而不是任何其他进程。然后,当您尝试从套接字读取时,将返回该数据

显然,操作系统需要知道每个套接字绑定到哪个端口。因此,在“绑定”时,必须进行系统调用。如果您的程序没有以足够的权限运行,操作系统可能会拒绝您绑定到某个端口。然后,根据您使用的语言,您的网络