插座和端口之间的区别


121

有人可以很清楚地解释一下端口和套接字之间的区别。我知道端口充当应用程序进程进入网络的大门,并且应用程序进程使用与给定端口号的套接字连接来处理网络通信,但是当您有多个进程在侦听单个端口号时,我发现很难理解插座和端口之间的区别以及它们如何装配在一起。


9
端口是物理地址,而套接字是对象。
2012年

14
如果数据包在端口上的插座上碰到了口袋……
user16764 2012年

Answers:


116

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将通过将其与套接字关联来跟踪客户端状态(如果有的话)。

因此,大致而言:

  • IP地址用于网络上主机之间的路由
  • 该端口用于路由到主机上的正确套接字
    • 我几乎说了正确的过程,但实际上可能有多个(通常是子过程)都在同一个套接字上接受...
    • 但是,每次并发accept调用之一返回时,它仅在一个进程中这样做,每个传入连接的套接字对于服务器的一个实例是唯一的
  • 套接字是进程用于与操作系统讨论特定连接的对象,非常类似于文件描述符
    • 在评论中提到,还有很多其他用途,对于不使用的端口,在所有插座:例如socketpair创建一对连接在一起插口,有没有解决方案在所有-使用该管道的唯一方法是通过被该进程称为socketpair,是该进程的子进程并继承该进程的子进程,或者被显式传递该进程的套接字之一

1
@Useless值得一提的插座就没有需要被基于IP的答案表示。它与OP并不完全相关,但对套接字系列的解释将有助于完善此答案。
hafichuk 2012年

好点-当我开始写多进程服务器时,我已经开始关注范围的蔓延。随时对其进行编辑,如果您不对其进行编辑,我会在某个时候解决它……
2012年

11
这一点都不是没有用的
l --''''''---------''''''''''''2012-10-30

我尝试了解电子产品中的插座,服务器将插座绑定到端口号,就像将插座放在墙上,等待一些电子设备插入以为电池充电。但是当接受后,会返回一个新的套接字吗?为什么?一个新的插座放在墙上吗?请通过类推帮助我使之有意义。
沉亚伦2015年

3
这里的问题是您的类比是错误的。忘了套接字在物理世界中意味着什么-它不是对其他事物的隐喻,而只是特定技术软件概念的技术术语。它甚至与物理网络端口或套接字都没有太大关系-您只需要在此领域将其理解为一个单独的概念。
2015年

49

将您的机器视为公寓楼:

  • 港口是公寓号码。

  • 插座是公寓的门。

  • IP地址是建筑物的街道地址。


3
我喜欢这样的类比,尽管现在我正在考虑在那间公寓里看着一扇无尽的走廊,里面有很多门。我不能出去 我不能出去!:)
Daniel Hollinrake 2012年

1
@Caleb A socket is the door of an apartment.但是一个端口不能打开许多插座吗?
Suhail Gupta

3
@suhail有时一间公寓有多个门。他们都有相同的公寓号,但门却不同。
卡雷布(Caleb)

45

端口是TCP和UDP协议中地址的一部分。它用于帮助OS识别哪个应用程序应该获取接收到的数据。操作系统必须支持端口以支持TCP和UDP,因为端口是TCP和UDP的固有部分。

套接字是操作系统提供给应用程序的接口的一部分,以允许它们发送和接收网络数据。大多数套接字实现都支持TCP和UDP以外的许多协议,其中一些没有端口的概念。操作系统不必支持套接字即可支持TCP或UDP。它可以为应用程序提供不同的接口。套接字只是在特定端口上发送和接收数据的一种方式。


套接字本质上是一个4元组,其组成为:源IP:端口-目标IP:端口。
托尼·狮子

您的意思是该端口仅存在于TCP和UDP协议中???那么http和其他协议呢?
H. Aqjn

HTTP是在传输层协议(例如TCP或UDP)之上运行的应用程序层协议。它没有自己的端口概念,而是从基础传输层协议继承它们。
Dirk Holsopple '16

8

计算机的IP地址将其标识为网络上的单独实体。我们在上面添加了一个额外的数字,以使我们能够区分与该计算机的连接。这是端口号。在连接的OS端,您需要缓冲区,连接状态等。此逻辑对象是套接字。


0

套接字是到端口的通信路径。当您希望程序通过网络进行通信时,您已经为它提供了一种寻址端口的方法,这可以通过创建一个套接字并将其附加到端口上来完成。基本上,套接字= IP +端口套接字提供对端口+ ip的访问


-1

IP地址标识设备,即特定设备的地址,当您使用IP现在访问计算机时,端口定义了该计算机中与哪个进程进行通信。

因此,为了进行实际的通信,您需要两个端口+ IP,即套接字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.