有人可以很清楚地解释一下端口和套接字之间的区别。我知道端口充当应用程序进程进入网络的大门,并且应用程序进程使用与给定端口号的套接字连接来处理网络通信,但是当您有多个进程在侦听单个端口号时,我发现很难理解插座和端口之间的区别以及它们如何装配在一起。
有人可以很清楚地解释一下端口和套接字之间的区别。我知道端口充当应用程序进程进入网络的大门,并且应用程序进程使用与给定端口号的套接字连接来处理网络通信,但是当您有多个进程在侦听单个端口号时,我发现很难理解插座和端口之间的区别以及它们如何装配在一起。
Answers:
S是一个服务器程序:假设它是一个HTTP服务器,因此它将使用HTTP的知名端口号80。我在具有IP地址的主机上运行它10.0.0.4
,因此它将侦听10.0.0.4:80
(因为那是每个人都希望找到它的地方)。
在S内部,我将创建一个套接字并将其绑定到该地址:现在,操作系统知道10.0.0.4:80
应该通过该特定套接字将进入的连接路由到我的S进程。
套接字绑定后,netstat输出:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
注意 本地地址全为零,因为S不在乎其客户如何到达
一旦S绑定了此套接字,它将接受连接-每次新客户端连接时,都会accept
返回一个特定于该客户端的新套接字。
接受连接后,netstat输出:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.4:80 10.0.0.5:55715 ESTABLISHED
10.0.0.4:80
表示S的连接结束,并与由返回的套接字关联accept
10.0.0.5:55715
是客户端连接的末端,并且与客户端传递给connect的套接字相关联。客户端的端口除了将TCP连接上的数据包路由到正确的进程外,不用于其他任何用途:它是由客户端的内核从临时端口范围随机分配的。现在,S可以愉快地继续接受更多的客户端连接……每个连接都将拥有自己的套接字,每个套接字将与唯一的TCP连接关联,并且每个连接将具有唯一的远程地址。S将通过将其与套接字关联来跟踪客户端状态(如果有的话)。
因此,大致而言:
accept
调用之一返回时,它仅在一个进程中这样做,每个传入连接的套接字对于服务器的一个实例是唯一的socketpair
,是该进程的子进程并继承该进程的子进程,或者被显式传递该进程的套接字之一将您的机器视为公寓楼:
港口是公寓号码。
插座是公寓的门。
IP地址是建筑物的街道地址。
A socket is the door of an apartment.
但是一个端口不能打开许多插座吗?
端口是TCP和UDP协议中地址的一部分。它用于帮助OS识别哪个应用程序应该获取接收到的数据。操作系统必须支持端口以支持TCP和UDP,因为端口是TCP和UDP的固有部分。
套接字是操作系统提供给应用程序的接口的一部分,以允许它们发送和接收网络数据。大多数套接字实现都支持TCP和UDP以外的许多协议,其中一些没有端口的概念。操作系统不必支持套接字即可支持TCP或UDP。它可以为应用程序提供不同的接口。套接字只是在特定端口上发送和接收数据的一种方式。