#1 楼
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
是客户端的连接端,并且已关联与客户端传递来连接的套接字。客户端的端口除了将TCP连接上的数据包路由到正确的进程外,什么都没有使用:它是由客户端的内核从临时端口范围随机分配的。现在,S可以愉快地继续接受更多的客户端连接……每个连接都将拥有自己的套接字,每个套接字将与唯一的TCP连接相关联,并且每个连接将具有唯一的远程地址。 S将通过将其与套接字关联来跟踪客户端状态(如果有的话)。
因此,大致来说:
IP地址用于主机之间的路由在网络上
该端口用于路由到主机上的正确套接字
我差点说了正确的过程,但是实际上可能有多个(通常是子过程)都在同一个套接字上接受...
但是,每次并发
accept
调用之一返回时,它仅在一个过程中这样做,每个传入连接的套接字对于服务器的一个实例都是唯一的。套接字是进程用于与OS讨论特定连接的对象,就像文件描述符一样
socketpair的进程,作为该进程的子进程并继承该进程的子进程,或者被显式传递该进程的套接字之一。
评论
@Useless值得一提的是,套接字不需要基于IP,如答案所示。它与OP并不完全相关,但对套接字系列的说明将有助于完善此答案。
– hafichuk
2012年10月30日14:06
好点-当我开始写多进程服务器时,我已经开始关注范围的蔓延。随时对其进行编辑,如果您不对其进行编辑,我会在某个时候解决它...
–没用
2012年10月30日14:10
这根本没有用
– Alex Gordon
2012年10月30日16:36
我试图了解电子设备中的插座,服务器将插座绑定到端口号就像将插座放在墙上,等待一些电子设备插入以为电池充电。但是当接受后,返回一个新的套接字吗?为什么?一个新的插座放在墙上吗?请通过类比帮助我使之有意义。
–沉亚龙
2015年4月15日在6:32
这里的问题是您的类比是错误的。忘记套接字在物理世界中的含义-它不是对其他事物的隐喻,而只是特定技术软件概念的技术术语。它甚至与物理网络端口或套接字都不紧密相关-您只需要在此领域将其理解为一个单独的概念。
–没用
15年4月15日在10:07
#2 楼
将您的机器想像成公寓楼:端口是公寓号。
插座是公寓的门。
IP地址是建筑物的街道地址。
评论
我喜欢这样的类比,尽管现在我正在考虑在那间公寓里看着一个有很多门的无尽走廊。我不能出去我不能出去! :)
–丹尼尔·霍林拉克(Daniel Hollinrake)
2012年10月30日在22:13
@Caleb插座是公寓的门。但是在一个端口上不能打开许多插座吗?
– Suhail Gupta
16年5月31日在12:57
@suhail有时一间公寓有多个门。他们都有相同的公寓号,但门却不同。
–卡莱布
16年5月31日在13:21
这是一个很棒的类比,清楚地说明了每个抽象层的范围。您正在尝试将流量路由到在世界“某处”特定计算机上运行的特定进程🗺。没有准确的位置和收件人(这是我们进入消息传递,建模和交付协议的位置),交付司机无法成功完成自己的尝试。非常感谢! 🇺🇸
– A-Dubb
20 Jan 22'19:21
@Caleb我同意@ suhail-gupta的观点,因为该门隐式地谈论一个唯一的门,而一个门或任何一个门分别允许隐式和显式地包含多个门。
–卡洛斯·平佐(CarlosPinzón)
20 Dec 14'在22:51
#3 楼
端口是TCP和UDP协议中地址的一部分。它用于帮助OS识别哪个应用程序应获取接收到的数据。操作系统必须支持端口以支持TCP和UDP,因为端口是TCP和UDP的固有部分。套接字是操作系统提供给应用程序以允许它们发送和接收网络的接口的一部分。数据。大多数套接字实现都支持TCP和UDP以外的许多协议,其中一些没有端口的概念。操作系统不必支持套接字即可支持TCP或UDP。它可以为应用程序提供不同的接口。套接字只是在特定端口上发送和接收数据的一种方法。
评论
套接字本质上是一个4元组,其组成为:源IP:端口-目标IP:端口。
–托尼狮子
2012年10月30日13:07
您的意思是该端口仅存在于TCP和UDP协议中???那么http和其他协议呢?
–侯赛因·阿卡贾尼(Hosein Aqajani)
16-10-16在6:46
HTTP是运行在诸如TCP或UDP之类的传输层协议之上的应用程序层协议。它没有自己的端口概念,而是从基础传输层协议继承它们。
– Dirk Holsopple
16-10-18在1:29
#4 楼
计算机的IP地址将其标识为网络上的单独实体。我们在上面添加了一个额外的数字,以使我们能够区分与该计算机的连接。这是端口号。在连接的OS端,您需要缓冲区,连接状态等。此逻辑对象是套接字。#5 楼
套接字是到端口的通信路径。当您希望程序通过网络进行通信时,您已经给它提供了一种寻址端口的方法,可以通过创建一个套接字并将其附加到端口上来实现。基本上,socket = IP + ports套接字提供访问权限到端口+ ip
#6 楼
IP地址标识设备,即特定设备的地址,当您使用IP到达计算机时,端口定义了该计算机中要与哪个进程进行通信。因此,要进行实际通信,两个端口+ IP,称为套接字。
评论
端口是物理地址,而套接字是对象。如果数据包碰到端口上的插座上的口袋,则......
您能否详细说明“何时有多个进程在单个端口号上侦听”?在我看来,这似乎是一种误解。我认为端口号的整个想法是唯一地标识在特定IP地址的计算机上运行的特定进程。如果我同样对此受到误解,我希望某些答案(或其他评论)能纠正我。