好的,当我尝试研究IP地址、端口和套接字时,我得到了以下内容:
IP地址用于在网络上映射到不同的设备。
端口号用于访问主机上特定的应用程序。
套接字是两者的组合。
我不理解的是,如果端口将您连接到特定的应用程序,那么每个应用程序应该只有一个端口号,对吗?但例如端口80用于HTTP,因此如果一个应用程序正在使用该端口,则它正在侦听HTTP请求,对吗?那么如果有多个人尝试访问它会发生什么?套接字和端口让我非常困惑..
好的,当我尝试研究IP地址、端口和套接字时,我得到了以下内容:
IP地址用于在网络上映射到不同的设备。
端口号用于访问主机上特定的应用程序。
套接字是两者的组合。
我不理解的是,如果端口将您连接到特定的应用程序,那么每个应用程序应该只有一个端口号,对吗?但例如端口80用于HTTP,因此如果一个应用程序正在使用该端口,则它正在侦听HTTP请求,对吗?那么如果有多个人尝试访问它会发生什么?套接字和端口让我非常困惑..
socket_recv时调用port_recv吗?
如果您只对TCP和UDP感兴趣,可能会起作用。请记住,“套接字”抽象不仅适用于TCP和UDP。它还适用于其他网络协议,以及用于在同一台机器上进行进程间通信。
另一方面,TCP套接字不仅映射到端口。 “已连接”TCP套接字映射到本地IP地址,本地端口,远程地址,和远程端口。它还具有其他相关数据,包括各种标志,发送和接收缓冲区,用于传入/传出数据流的序列号以及用于拥塞控制(速率限制)等各种其他变量。该数据不仅属于本地端口。
可以通过同一“端口”同时进行数千个TCP连接。每个连接都有其自己的相关数据,封装该每个连接数据的软件对象是“TCP套接字”。
即使你只使用TCP/UDP,即使你每次只有一个进程使用任何给定的本地端口,即使你每次只有一个连接通过每个本地端口,我认为“套接字”抽象仍然是有意义的。如果我们只称套接字为“端口”,那么在这一个词中会有更多的含义混淆。对于太多含义重叠的单词进行重复使用会阻碍沟通。
“端口”是应用程序进程的传输协议级别标识符。“套接字”是软件中用于发送/接收从/到这些标识符地址的消息的对象。
区分“我的地址”和“发送来自我的信件”的东西是有用的区分。“我的地址”只是一个标签。一个标签不是像发送数据这样的活跃物体。给“用于发送数据的东西”赋予与表示“数据标记的发件人地址”不同的名称是有逻辑的。
当应用程序(例如像Apache或Nginx这样的Web服务器)监听某个端口(比如80端口)时,它会创建所谓的监听套接字。
当有客户端连接时,这个监听套接字会被更新(可以通过select
或poll
API来观察),然后我们的应用程序会创建通信套接字。这个套接字由元组(src_addr, src_port, dst_addr, dst_port)
唯一标识——很可能许多客户端将具有完全相同的(dst_addr, dst_port)组合。
然后我们的Web服务器可以通过该通信套接字进行通信,以提供Web页面并最终关闭此套接字。当许多客户端同时到来时,Web服务器可以为每个客户端创建线程/进程(Apache模型),或逐个服务所有套接字(Nginx模型)。
请注意,在这种情况下,每个端口只能存在一个监听套接字,多个应用程序不能绑定到相同的端口(如80端口)。但是,拥有许多通信套接字是完全可以的(有些人报告成功处理超过一百万个并发请求)。
your-host:22482 <---> remote-host:80
your-host:23366 <---> remote-host:80