端口和套接字有什么区别?

这是我所在组织的一位软件工程师提出的问题。我感兴趣的是最广义的定义。

505430 次浏览

套接字= IP地址+端口(数字地址)
它们一起标识机器上网络连接的端点。(我刚刚是不是网络101不及格?)

一个套接字表示两个网络应用程序之间的单个连接。这两个应用程序名义上运行在不同的计算机上,但是套接字也可以用于一台计算机上的进程间通信。应用程序可以创建多个套接字用于相互通信。套接字是双向的,这意味着连接的任何一方都能够发送和接收数据。因此,从理论上讲,套接字可以在OSI模型2以上的任何级别上创建。程序员经常在网络编程中使用套接字,尽管是间接的。像Winsock这样的编程库隐藏了套接字编程的许多底层细节。自20世纪80年代初以来,套接字已被广泛使用

一个港口表示网络通信的端点或“通道”。端口号允许同一计算机上的不同应用程序在不相互干扰的情况下利用网络资源。端口号最常出现在网络编程中,尤其是套接字编程中。但是,有时端口号对普通用户是可见的。例如,一个人在因特网上访问的一些网站使用如下URL:

在本例中,数字8080指的是Web浏览器连接到Web服务器所使用的端口号。通常,Web站点使用端口号80,该端口号不需要包含在URL中(尽管可以包含)。

在IP组网中,端口号理论上可以在0到65535之间。但是,大多数流行的网络应用程序使用范围较低的端口号(例如HTTP的80)。

注意:术语端口还指网络技术的其他几个方面。端口可以指外部设备的物理连接点,如串口、并口和USB端口。术语端口也指某些以太网连接点,例如集线器、交换机或路由器上的连接点。

ref # 0

ref # 0

它们是来自两个不同领域的术语:“端口”是TCP/IP网络的概念,“套接字”是API(编程)的东西。“套接字”是通过将端口和主机名或网络适配器组合成一个数据结构(可以用来发送或接收数据)而形成的(在代码中)。

套接字基本上是网络通信的端点,至少由一个ip地址和一个端口组成。在Java/ c#中,套接字是双向连接一侧的高级实现。

此外,Java教程中的一个(非规范的)定义。

套接字是一种数据I/O机制。端口是通信协议合同概念。套接字可以没有端口而存在。一个端口可以没有特定的套接字而存在(例如,如果同一个端口上有几个活动的套接字,这可能是某些协议允许的)。

端口用于确定接收端应该将数据包路由到哪个套接字,在许多协议中,但它并不总是必需的,接收套接字的选择可以通过其他方式完成——端口完全是网络子系统中协议处理程序使用的工具。例如,如果协议不使用端口,数据包可以到所有侦听套接字或任何套接字。

套接字是软件中的一种结构。它差不多是一个文件;它有读和写这样的操作。它不是一个物理的东西;它是你的软件引用物理事物的一种方式。

端口是一个类似设备的东西。每台主机都有一个或多个网络(这些是物理网络);主机在每个网络上都有一个地址。每个地址可以有数千个端口。

只有一个套接字可能在某个地址上使用某个端口。套接字分配端口类似于为文件系统I/O分配设备。一旦分配了端口,就没有其他套接字可以连接到该端口。当套接字被关闭时,端口将被释放。

看看第0条。

端口:

端口可以指物理连接点用于外部设备,如串行、并行和USB端口。术语端口也指某些以太网连接点如集线器、交换机或路由器上的那些。< / p >

套接字:

套接字表示两个网络应用程序之间的单个连接。这两个应用程序名义上运行在不同的计算机上,但是套接字也可以用于单台计算机上的进程间通信。应用程序可以创建多个套接字用于相互通信。套接字是双向的,这意味着连接的任何一方都能够发送和接收数据。< / p >

套接字是一个通信端点。套接字与TCP/IP协议家族没有直接关系,它可以与系统支持的任何协议一起使用。C套接字API希望您首先从系统获得一个空白套接字对象,然后可以将其绑定到本地套接字地址(直接检索无连接协议的传入流量,或接受面向连接协议的传入连接请求),或者可以连接到远程套接字地址(对于任何一种协议)。如果你想同时控制两者,你甚至可以同时做这两件事,一个套接字绑定到的本地套接字地址和一个套接字连接到的远程套接字地址。对于无连接协议来说,连接套接字甚至是可选的,但如果你不这样做,你还必须将目标地址与你想通过套接字发送的每个数据包一起传递,否则套接字如何知道将数据发送到哪里?优点是可以使用一个套接字将数据包发送到不同的套接字地址。一旦配置了套接字,甚至连接了套接字,就可以将其视为双向通信管道。您可以使用它将数据传递到某个目的地,而某个目的地也可以使用它将数据传递回给您。写入套接字的内容将被发送出去,而接收到的内容则可用于读取。

另一方面,只有TCP/IP协议栈中的某些协议才具有端口。TCP和UDP报文都有端口。端口只是一个简单的数字。源端口和目的端口的组合标识了两台主机之间的通信通道。例如,你可能有一个服务器,一个简单的HTTP服务器和一个简单的FTP服务器。如果现在一个数据包到达该服务器的地址,它如何知道这是一个HTTP或FTP服务器的数据包?因为HTTP服务器运行在80端口上,FTP服务器运行在21端口上,所以如果数据包到达的目的端口是80,那么它是针对HTTP服务器的,而不是针对FTP服务器的。此外,数据包有一个源端口,因为没有这样的源端口,服务器一次只能有一个到一个IP地址的连接。源端口使服务器能够区分其他相同的连接:它们都有相同的目的端口,例如端口80,相同的目的IP(服务器的IP)和相同的源IP,因为它们都来自同一个客户端,但由于它们有不同的源端口,服务器可以将它们彼此区分开来。当服务器发送回应答时,它将发送到请求来自的端口,这样客户端也可以区分它从同一服务器接收到的不同应答。

端口表示IP网络协议的TCP和UDP传输中的通信端点。套接字是通信端点的软件抽象,通常用于这些协议的实现(套接字API)。另一种实现是XTI/TLI API。

参见:

史蒂文斯,W. R. 1998, UNIX网络编程:网络api:套接字和XTI;卷一,普伦蒂斯大厅
Stevens, W. R., 1994, TCP/IP画报,第1卷:协议,Addison-Wesley.

相对的TCP/IP术语,我认为这是隐含的问题。通俗地说:

PORT类似于特定邮政编码中特定房屋的电话号码。城镇的邮政编码可以被认为是城镇和城镇中所有房屋的IP地址。

另一方面,SOCKET更像是一对房屋之间的电话之间的通话。这些呼叫可以在同一城镇的房屋之间建立,也可以在不同城镇的两所房屋之间建立。这对手机之间建立的临时通道就是SOCKET。

总结

TCP套接字是一个端点实例由特定TCP连接或监听状态上下文中的IP地址和端口定义。

端口是虚拟化标识符定义了一个服务端点(与服务1端点又名会话标识符不同)。

TCP套接字是而不是,它是特定连接的端点。

可以存在到服务端点的并发连接,因为连接由既有本地的,也有偏远的端点标识,允许流量路由到特定的服务实例。

# 0。

博览会

这是一个有趣的问题,它迫使我重新审视一些我自以为已经完全了解的东西。你会认为像“socket”这样的名字;这是不言自明的:显然选择它是为了唤起你插入网线的端点的图像,有很强的功能平行。然而,在网络用语中,“socket”一词;携带了太多的行李,需要仔细的重新检查。

在最广泛的意义上,端口是一个入口或出口点。尽管不在网络环境中使用,但法语单词土耳其宫廷的字面意思是门或入口,进一步强调了端口是运输端点的事实,无论您运送数据还是大型钢集装箱。

为了本讨论的目的,我将只考虑TCP-IP网络的上下文。OSI模型非常好,但从未完全实现,更不用说在高流量、高压力条件下广泛部署。

IP地址和端口的组合严格地称为端点,有时称为套接字。这种用法起源于RFC793,即最初的TCP规范。

TCP 连接由两个端点定义,即套接字

端点(套接字)由网络地址和港口标识符的组合定义。请注意,address/port 完全标识一个套接字(稍后会详细介绍)。

端口的目的是区分给定网络地址上的多个端点。您可以说端口是一个虚拟端点。这种虚拟化使单个网络接口上的多个并发连接成为可能。

socket对(4元组)包括客户端IP地址,客户端端口号,服务器IP地址,和服务器端口号)指定这两个端点唯一对象中的每个TCP连接互联网。(TCP-IP图解卷1, W.理查德史蒂文斯)

在大多数c派生语言中,TCP连接是使用Socket类实例上的方法建立和操作的。虽然在更高的抽象级别上操作是常见的,通常是NetworkStream类的实例,但这通常会公开对套接字对象的引用。对于编码器来说,这个套接字对象似乎表示连接,因为连接是使用套接字对象的方法创建和操作的。

在c#中,要建立一个TCP连接(到一个现有的侦听器),首先要创建TcpClient。如果您没有为TcpClient构造函数指定端点,它将使用默认值—以某种方式定义本地端点。然后调用连接方法。这个方法需要一个描述另一个端点的参数

所有这些都有点令人困惑,并导致您相信套接字是一个连接,这是胡说八道。在理查德·多尔曼提出这个问题之前,我一直在这个误解中苦苦挣扎。

在进行了大量阅读和思考之后,我现在确信,在类TcpConnection中使用带有两个参数LocalEndpointRemoteEndpoint的构造函数会更有意义。当本地端点的默认值是可接受的时,您可能会支持单个参数RemoteEndpoint。这在多址计算机上是不明确的,但是可以使用路由表通过选择到远程端点的最短路由的接口来解决这种不明确。

在其他方面,透明度也将得到提高。套接字是由IP地址和端口组合标识的:

[…TCP使用本地地址和外部地址组成的所有四个值(目的IP地址、目的端口号、源IP地址和源端口号)对传入的段进行多路解复用。TCP不能仅通过查看目的端口来确定哪个进程获得了传入的段。同样,在[给定端口号]的[各种]端点中,唯一一个将接收传入连接请求的是处于侦听状态的端点。(第255页,TCP-IP图解卷1,W.理查德史蒂文斯)

正如您所看到的,网络服务有许多具有相同地址/端口的套接字,但在特定地址/端口组合上只有一个侦听器套接字,这不仅是可能的,而且很有可能。典型的库实现提供了一个套接字类,该类的实例用于创建和管理连接。这是非常不幸的,因为它引起了混乱,并导致了两个概念的广泛合并。

Hagrawal不相信我(见评论),所以这里有一个真实的例子。我将网络浏览器连接到http://dilbert.com,然后运行netstat -an -p tcp。输出的最后六行包含两个示例,说明地址和端口不足以唯一地标识一个套接字。在192.168.1.3(我的工作站)和54.252.94.236:80(远程HTTP服务器)之间有两个不同的连接。

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENTTCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENTTCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENTTCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENTTCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

由于套接字是连接的端点,因此有两个套接字的地址/端口组合207.38.110.62:80,还有两个套接字的地址/端口组合54.252.94.236:80

我认为哈格拉瓦尔的误解是由于我非常谨慎地使用了“鉴定”这个词。我的意思是“完全的,明确的和唯一的识别”。在上面的示例中,有两个端点的地址/端口组合为54.252.94.236:80。如果你只有地址和端口,你没有足够的信息来区分这些套接字。没有足够的信息识别一个套接字。

齿顶高

RFC793第2.7节第2段说

连接完全由两端的套接字对指定。一个本地套接字可能参与到不同外部的多个连接套接字。< / p >

从编程的角度来看,socket的这个定义没有帮助,因为它与socket 对象不同,后者是特定连接的端点。对于程序员(这个问题的大多数读者都是程序员)来说,这是一个至关重要的功能差异。

@plugwash提出了一个显著的观察。

最根本的问题是TCP RFC对socket的定义与所有主流操作系统和库所使用的socket的定义相冲突。

根据定义,RFC是正确的。当一个标准库误用术语时,它不会取代RFC。相反,它给该库的用户带来了一种责任负担,即理解两种解释,并小心用词和上下文。如果RFC不一致,则最新的和最直接适用的RFC优先。

参考文献

  1. TCP-IP图解卷1协议, W. Richard Stevens, 1994 Addison Wesley

  2. RFC793,信息科学研究所,南加州大学DARPA

  3. RFC147,插座的定义,Joel M. Winett,林肯实验室

似乎有很多答案将socket等同于2台PC之间的连接。我认为这是完全错误的。套接字一直是一台PC上的端点,可能连接也可能不连接-当然我们都在某些时候使用侦听器或UDP套接字*。重要的部分是它是可寻址的和活跃的。向1.1.1.1:1234发送消息不太可能起作用,因为没有为该端点定义套接字。

套接字是特定于协议的-所以唯一性的实现,TCP/知识产权UDP/知识产权都使用* (ipaddress:port),不同于eg。, IPX(网络,节点,和…嗯哼,套接字——但是一个不同的套接字是指一般的“套接字”术语。IPX套接字号相当于IP端口)。但是,它们都提供了唯一的可寻址端点。

由于IP已成为主导协议,端口(在网络术语中)已成为UDP或TCP端口号的同义词——后者是套接字地址的一部分。

  • UDP是无连接的-这意味着在两个端点之间没有虚拟电路被创建。但是,我们仍然引用UDP套接字作为端点。API函数清楚地表明,两者只是不同类型的套接字——SOCK_DGRAM是UDP(只是发送消息),SOCK_STREAM是TCP(创建虚拟电路)。

  • 从技术上讲,IP报头保存IP地址,IP之上的协议(UDP或TCP)保存端口号。这使得有可能有其他协议(例如。ICMP没有端口号,但有IP地址信息)。

在广义上,插座——就是一个插座,就像你的电器、电缆或电话插座一样。一个“必要的东西”(电源、信号、信息)可以进出的点。它隐藏了很多细节,而这些细节对于使用“必要的东西”来说是不需要的。用软件术语来说,它提供了一种定义两个实体之间通信机制的通用方法(这些实体可以是任何东西——两个应用程序,两个物理上独立的设备,用户&操作系统中的内核空间,等等)

端口是端点标识符。它区分一个端点和另一个端点。在网络级别,它将一个应用程序与另一个应用程序区分开来,以便网络堆栈可以将信息传递给适当的应用程序。

连接套接字(fd)用于本地地址+本地端口+对端地址+对端端口。通过套接字抽象处理recv/发送数据。一个监听套接字(fd)用于本地地址+本地监听端口。进程可以通过socket接受新的连接

首先,我认为我们应该先了解一下什么构成了从a到B的数据包。

网络的一个常见定义是使用OSI模型,它根据目的将网络分离为许多层。有几个重要的,我们将在这里介绍:

  • # 0。这一层负责将数据包从一个网络设备传送到另一个网络设备,位于实际进行传输的层之上。它谈论MAC地址,知道如何根据MAC(硬件)地址找到主机,仅此而已。
  • 网络层是允许跨机器和物理边界(如物理设备)传输数据的层。网络层必须从本质上支持附加的基于地址的机制,该机制以某种方式与物理地址相关;进入互联网协议(IPv4)。一个IP地址可以让你的包在互联网上从A到B,但不知道如何遍历各个跳。这是由上面一层根据路由信息处理的。
  • # 0。这一层负责定义信息从A到B的方式,以及对该行为的任何限制、检查或错误。例如,TCP在数据包中添加额外的信息,这样就可以推断出数据包是否丢失。

TCP包含了港口的概念。它们实际上是Internet Socket(AF_INET)可以绑定到的同一IP地址上的不同数据端点。

UDP也是如此和其他传输层协议。从技术上讲,它们并不是首要的功能端口,但这些端口确实为以上层中的多个应用程序提供了一种使用同一台计算机接收(实际上是发出)传出连接的方法。

这就把我们带到了TCP或UDP连接的解剖。每个都有一个源端口和地址,以及一个目标端口和地址。这样,在任何给定的会话中,目标应用程序都可以从源进行响应和接收。

因此,端口本质上是一种规范强制的方式,允许多个并发连接共享相同的地址。

现在,我们需要看看如何从应用程序的角度与外部世界通信。要做到这一点,你需要询问你的操作系统,因为大多数操作系统都支持伯克利套接字的方式来做事情,我们看到我们可以从应用程序创建包含端口的套接字,像这样:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socketint fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket// later we bind...

太棒了!因此,在sockaddr结构中,我们将指定我们的端口和bam!完成工作!嗯,差不多了,除了:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

也是可能的。啊,这可真是个麻烦!

好吧,实际上并没有。我们所需要做的就是想出一些合适的定义:

  • internet套接字是IP地址、协议及其相关端口号的组合,服务可以在其上提供数据。tcp端口80,stackoverflow.com是一个互联网套接字。
  • unix套接字是在文件系统中表示的IPC端点,例如/var/run/database.sock
  • 套接字API是一种请求应用程序能够向套接字读写数据的方法。

瞧!这样就把事情整理好了。在我们的方案中,

  • 端口是一个数字标识符,作为传输层协议的一部分,标识应该响应给定请求的服务号。

因此,端口实际上是形成互联网套接字所需的一个子集。不幸的是,“套接字”这个词的意思恰好被应用到几个不同的概念中。所以我衷心建议你为你的下一个项目命名套接字,只是为了增加混乱;)

套接字由三部分组成:

  1. IP地址
  2. 传输协议
  3. 端口号

端口是1到65535之间的数字,表示设备中的一个逻辑门。客户端和服务器端之间的每一个连接都需要一个唯一的套接字

例如:

  • 1030为端口。
  • (10.1.1.2, TCP,端口1030)是一个套接字。

在阅读了这些优秀的向上投票的答案后,我发现对于我这个网络编程新手来说,有以下几点需要强调:

TCP-IP连接是连接一个地址:端口组合和另一个地址:端口组合的双向路径。因此,每当您打开从本地计算机到远程服务器上的端口的连接(例如www.google.com:80)时,您也将计算机上的一个新端口号与该连接关联起来,以允许服务器将内容发回给您(例如127.0.0.1:65234)。使用netstat查看你机器的连接是很有帮助的:

> netstat -nWp tcp (on OS X)Active Internet connectionsProto Recv-Q Send-Q  Local Address          Foreign Address        (state)tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED...

端口是网络协议用来访问连接的主机的实体。端口可以是特定于应用程序的,也可以是与特定通信媒介相关的。不同的协议使用不同的端口访问主机,如HTTP使用80端口或FTP使用23端口。您可以在应用程序中分配用户定义的端口号,但这些端口号应该大于1023。

端口打开到所需主机的连接,而套接字是网络间或进程间通信的端点。套接字是由系统通过api(应用程序编程接口)分配的。< / p >

更微妙的区别是,当系统重新启动时,端口将出现,而套接字将被销毁。

这个问题已经有了理论上的答案。我想举一个实际的例子来解释这个问题,让大家对Socket和Port有一个更清晰的理解。

我发现它是0号

这个示例将引导您完成连接到网站(如Wiley)的过程。你可以打开你的网络浏览器(如Mozilla Firefox),在地址栏中输入www.wiley.com。您的web浏览器使用域名系统(DNS)服务器来查找名称www.wiley.com以确定其IP地址。在本例中,地址为192.0.2.100。

Firefox连接到192.0.2.100地址和端口应用层web服务器运行的位置。Firefox知道期待什么港口,因为它是一个著名的港口。著名的web服务器的端口是TCP端口80

Firefox试图连接的目标套接字被写入Socket:端口,本例中为192.0.2.100:80。这是服务器端连接,但是服务器需要知道发送到哪里你想要在Mozilla Firefox中查看的网页,所以你有一个套接字

.连接的客户端

客户端连接由您的IP地址组成,例如192.168.1.25和随机选择的动态端口号。与Firefox相关联的套接字看起来像192.168.1.25:49175。因为网络服务器在TCP端口80上运行,这两个套接字都是TCP套接字,而如果你连接到一个运行在UDP端口上的服务器,服务端和客户端套接字都是UDP套接字

套接字是内核为用户应用程序提供的数据I/O的抽象。套接字类型由它处理的协议、IPC通信等定义。因此,如果有人创建了一个TCP套接字,他可以通过简单的方法将数据读取到套接字,并将数据写入套接字,而较低级别的协议处理,如TCP转换和将数据包转发到较低级的网络协议,则由内核中的特定套接字实现完成。其优点是用户不需要担心处理协议特定的数据,只需像普通缓冲区一样读取和写入数据到套接字。在IPC的情况下也是如此,用户只是读取和写入数据到套接字,内核根据创建的套接字类型处理所有较低级别的细节。

端口和IP一起就像给套接字提供一个地址,虽然不是必需的,但它有助于网络通信。

一般来说,你会得到很多理论,但区分这两个概念的最简单方法之一是:

为了获得服务,你需要一个服务号码。这个服务号码称为端口。就这么简单。

例如,HTTP as a service运行在端口80上。

现在,许多人都可以请求该服务,并建立了来自客户机-服务器的连接。会有很多联系。每个连接代表一个客户端。为了维护每个连接,服务器为每个连接创建一个套接字来维护其客户端。

简短的回答。

港口可以描述为主机中的内部地址,用于标识程序或进程。

套接字可以描述为编程接口,允许程序在internet上或本地与其他程序或进程通信。

从# 0:

套接字是网络上运行的两个程序之间双向通信链路的一个端点。套接字与端口号绑定,以便TCP层可以识别数据要发送到的应用程序。

套接字是一种特殊类型的文件句柄,进程使用它从操作系统请求网络服务。套接字地址是三元组:

. {protocol, local-address, local-process},其中本地进程用端口号标识

在TCP/IP套件中,例如:

{tcp, 193.44.234.3, 12345}

会话是两个进程之间的通信链路,因此描述了两个进程之间的关联。关联是一个5元组,它完全指定了组成连接的两个进程:{protocol, local-address, local-process, foreign-address, foreign-process}

在TCP/IP套件中,例如:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

可能是一个有效的关联。

半关联是:{protocol, local-address, local-process}

{protocol, foreign-address, foreign-process}

它们指定连接的每一半。

半关联也称为套接字或传输地址。也就是说,套接字是可以在网络中命名和寻址的通信端点。套接字接口是通信协议的几个应用程序编程接口(api)之一。它被设计为一个通用的通信编程接口,最初由4.2BSD UNIX系统引入。虽然它还没有被标准化,但它已经成为事实上的行业标准

一个套接字允许两个应用程序在一个单独的通信机器还是两台机器。实际上它就像门。如果门开了,就可以是门内进程或应用程序之间的连接在门外。< / p >

套接字有4种类型:

  • 流套接字
  • 数据报套接字
  • 原始套接字
  • 顺序数据包套接字。

套接字主要用于客户机-服务器应用程序。端口标识网络地址上的不同端点。它包含一个数值。总的来说,套接字是端口和网络地址的组合。

尽可能简单地说,套接字和端口之间没有物理区别,就像PATA和SATA之间的区别一样。它们只是一些读写网卡的软件。

端口本质上是一个公共套接字,其中一些是众所周知的/被广泛接受的,通常的例子是80,专门用于HTTP。任何想要使用某种协议(在本例中是HTTP)交换流量的人,通常都会到端口80。当然,80并不是专门用于HTTP的(它不是物理上的任何东西,它只是一个数字,一个逻辑值),并且可以在某些特定的机器上随意用于其他协议,只要试图连接的人知道使用哪种协议(这可能是相当私密的)。

套接字本质上是一个私人端口,为连接方知道但其他人不一定知道的特定目的而建立。底层的传输层通常是TCP或UDP,但也不一定。最基本的特征是两端都知道发生了什么,不管发生了什么。

这里的关键是,当在某个端口上接收到连接请求时,应答握手包括有关为服务特定请求者而创建的套接字的信息。后续通信通过该(私有)套接字连接进行,而不是服务继续侦听连接请求的公共端口连接。

单个端口可以有一个或多个连接不同外部IP的插座,如多个电源插座。

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312

端口是最简单的部分,它只是套接字的唯一标识符。套接字是进程可以用来建立连接和相互通信的东西。高个子杰夫有一个很好的电话比喻,但并不完美,所以我决定修正它:

  • IP和端口~电话号码
  • 插座~电话设备
  • 连接~电话
  • 建立连接~拨打号码
  • 流程,远程应用程序~人员
  • 留言~语音

打个比方

虽然上面已经给出了套接字的很多技术内容……我想加上我的答案,以防万一,如果有人还不能区分ip, port和socket

# 0,

比方说人X, Y, Z需要服务器的年代提供的服务(比如聊天服务)

然后

< em >谁?是X,Y,Z想要联系的聊天服务器'S'

好的,你有"谁是服务员"

但假设服务器'S'也为其他人提供一些其他服务,比如S为A、B、C提供存储服务

然后

港口告诉——> (X, Y, Z)需要的哪个?服务,即聊天服务,而不是存储服务

好吧. .,你让服务器知道“聊天服务”是你想要的,而不是存储

你是3号,0号

0号来了

现在套接字对—> < em >哪一个?特定连接

也就是说,

socket 1用于X人

Y的socket 2

Z的插座3

我希望它能帮助那些仍然困惑的人:) < / p >

我知道有很多解释。但是,还有一个更容易理解的方法与实际例子。我们都可以连接到 HTTP 端口80,但这是否意味着每次只有一个用户可以连接到该端口?.答案显然是“不”。出于多种目的的多个用户可以访问 HTTP 端口80,但是他们仍然可以从服务器获得正确的响应,不是吗?.现在好好想想,怎么做到的?. 是的,你是正确的,它的 IP 地址唯一标识不同的用户谁联系不同的目的。如果您在到达这里之前已经阅读了前面的答案,您就会知道 IP 地址是套接字组成的信息的一部分。想想看,有没有可能有一个没有插座的通信?.答案是‘ Yes’,但是您不能在一个端口中运行多个应用程序,但是我们知道我们不是一个只在硬件上运行的‘ Dump’开关。

应用程序由一对进程组成,这对进程通过网络进行通信(客户机-服务器对)。这些进程通过称为 插座的软件接口向网络发送和接收消息。考虑到在“计算机网络: 自上而下的方法”一书中提出的类比。有一个房子想要与其他房子交流。在这里,房子类似于一个过程,而门是一个插座。发送过程假设门的另一边有一个基础设施,它将把数据传输到目的地。一旦消息到达另一端,它通过接收器的门(插座)进入房子(进程)。同一本书中的插图可以帮助你:
enter image description here
套接字是传输层的一部分,它为应用程序提供逻辑通信。这意味着从应用程序的角度来看,两台主机是直接相连的,即使它们之间有许多路由器和/或交换机。因此套接字本身不是连接,而是连接的终点。传输层协议仅在主机上实现,而不在中间路由器上实现。
端口 提供了对机器进行内部寻址的方法。它的主要用途是允许多个进程通过网络发送和接收数据,而不会干扰其他进程(它们的数据)。所有套接字都提供了端口号。当一个段到达主机时,传输层检查该段的目标端口号。然后它将段转发到相应的套接字。将传输层段中的数据传输到正确的套接字的工作称为 解复用。然后,段的数据被转发到连接到套接字的进程。

套接字地址是一个 IP 地址和端口号

123.132.213.231         # IP address
:1234    # port number
123.132.213.231:1234    # socket address

当两个套接字绑定在一起时发生连接。

端口和套接字可以与银行分行进行比较。

“银行”的建筑编号类似于 IP 地址。 银行有不同的部门,比如:

  1. 储蓄账户部
  2. 个人贷款部
  3. 居所贷款部
  4. 投诉部

因此,1(储蓄帐户部门) ,2(个人贷款部门) ,3(住房贷款部门)和4(申诉部门)是港口。

现在让我们假设你去开一个储蓄账户,你去银行(IP 地址) ,然后你去“储蓄账户部门”(端口号1) ,然后你遇到一个在“储蓄账户部门”工作的员工。让我们叫他 SAVINGACCOUNT _ EMPLOYE1开户。

SAVINGACCOUNT _ EMPLOYEE1是您的套接字描述符,因此可能存在 这些都是套接字描述符。

同样,其他部门也会有雇员在他们下面工作,他们类似于套接字。

Socket 是网络端点的 SW 抽象,用作应用程序的接口。在 Java 中,C # 是由对象表示的,在 Linux 中,Unix 是一个文件。

端口只是套接字的一个属性,如果要建立通信,您需要指定该属性。要从套接字接收数据包,必须将其绑定到特定的本地端口和 NIC (带有本地 IP 地址)或所有 NIC (绑定调用中指定了 INADDR _ any)。要发送数据包,必须指定远程套接字的端口和 IP。

这些都是基本的网络概念,所以我将以一种简单而全面的方式详细解释它们。

  • Socket 就像电话(即用于通信的端到端设备)
  • IP 类似于您的电话号码(即您的套接字的地址)
  • Port 类似于您想要与之交谈的人(即您想要从该地址订购的服务)
  • 套接字可以是客户端或服务器端(例如,在公司,客户支持的电话是服务器,而家里的电话大多是客户端)

因此,网络中的套接字是绑定到一对(ip,port) = (address,service)的虚拟通信设备。

注:

  • 一台机器、一台计算机、一台主机、一部移动电话或一台 PC 机可以有多个地址、多个打开的端口,因此也就有多个套接字。就像在办公室里一样,你可以有多个电话号码和多个人可以交谈。
  • 存在一个打开的/活动的端口必须有一个与之绑定的套接字,因为正是这个套接字使端口可访问。但是,您可能暂时有未使用的端口。
  • 还要注意的是,在服务器插座中,你可以将它绑定到(一个端口,一台机器的特定地址)或(一个端口,一台机器的所有地址) ,就像在电话中一样,你可以将许多电话线(电话号码)连接到一台电话上,或者将一条特定的电话线连接到一台电话上,但是你仍然可以通过所有这些电话线或者一条特定的电话线与一个人取得联系。
  • 你不能将一个插座与两个端口相关联(绑定) ,因为在电话中通常不能总是让两个人同时使用同一部电话。
  • 高级: 在同一台机器上,不能有两个具有相同类型(客户端或服务器)和相同端口和 ip 的套接字。但是,如果你是一个客户端,你可以打开两个连接,用两个套接字,到一个服务器,因为这些客户端的每个套接字的本地端口是不同的)

希望这能消除你的疑虑

太多人将套接字概念链接到两端通信,大多数是 TCP/IP 协议。但是:

  • NO -Socket 与两端通信无关。它是本地端点,可以在另一端连接,也可以不连接(考虑一个监听传入连接的服务器套接字)
  • NO -Socket 与 TCP/IP 没有严格的关系。它是用一个协议定义的,该协议可以是 TCP/IP,也可以是其他任何协议。例如,您可以拥有通过文件进行通信的套接字。您也可以自己实现一个新的协议,通过 USB 灯进行通信,通过闪烁发送数据: 从应用程序的角度来看,这仍然是一个插座。

关于端口的概念,你在其他答案中读到的是正确的。端口主要用于 TCP 或 UDP 数据包中的数值(2字节,0-65535)。只是让我强调一下,TCP 或 UPD 不一定是在 IP 之上使用的。所以:

  • 说端口是 TCP/IP 或 UDP/IP 的一部分是不正确的。它是 TCP 或 UDP 的一部分,或者是定义和使用它的任何其他协议的一部分。IP 不知道什么是端口。

港口的定义

文顿 · G · 瑟夫和罗伯特 · E · 卡恩(1974年5月)。一种分组网络互通协议。IEEE 通信会刊,第22卷,第5期。IEEE.

端口是“一对(实体)在一段时间内交换一条或多条消息”的单位

“ ... ... 我们可以将一个端口产生的消息序列视为嵌入在一个无限长的字节流中... ... 我们强调,与一个给定数据包相关的序列号仅对正在通信的两个端口是唯一的... ... 到达的数据包将被检查以确定它们打算用于哪个端口... ... 应该为目的地进程做好准备,指定它愿意监听某个特定端口或‘任何’端口。”

“端口只是一个... 双工... 消息流... [在一个或多个]消息流中... 与进程相关联的指示器。”

信息科学研究所: 南加利福尼亚大学(1981年9月)。 RFC 793: 传输控制协议: 美国国防部高级研究计划局互联网程序协议规范。

端口是一个或多个实体的一个实体,进程通过该实体通过一个或多个通信流与一个或多个其他进程进行通信。

由于一个进程可能需要区分它自己和另一个进程(或进程)之间的多个通信流,我们想象每个进程可能有多个端口,它通过这些端口与其他进程的端口进行通信

其意图是,只允许在安全性和舱室值完全相同并且在两个端口所要求的优先级别的较高级别上运行的端口之间建立连接 注意,这个检查是在顺序检查之后放置的,以防止这些端口之间具有不同安全性或优先级的旧连接的段导致当前连接中止

“端口是一个地址,它指定进程的哪个逻辑输入或输出通道与[一个]数据流相关联。” 为了允许单个主机中的多个进程同时使用 TCP 通信设施,TCP 在每个主机中提供了一组地址或端口

套接字中指定进程的哪个逻辑输入或输出通道与数据相关联的部分

Socket 的定义

Oracle (2020)。类套接字。 Java 平台,标准版7 API 规范。

套接字是两台机器之间通信的端点

信息科学研究所: 南加利福尼亚大学(1981年9月)。 RFC 793: 传输控制协议: 美国国防部高级研究计划局互联网程序协议规范。

套接字是一个字符串,它包含一个 Internet 地址[即,网络地址的前8位数(例如123)(例如123.45.78.0)、一个句点、网络地址的第二个8位数(例如45)、一个句点、网络地址的第三个8位数(例如78)、一个句点和一个主机地址(例如90)]、一个冒号和一个 TCP 端口(例如1234)。套接字是“一对[实体]唯一标识[ a ]连接[ ,并且]可以在多个连接中同时使用”的单元

”为了允许单个主机中的多个进程同时使用 TCP 通信设施,TCP 在每个主机中提供了一组地址或端口。与来自 Internet 通信层的网络和主机地址连接在一起,形成一个套接字。一对套接字唯一地标识每个连接。也就是说,一个套接字可以同时用于多个连接。” 为了在每个 TCP 中提供唯一的地址,我们将一个标识 TCP 的互联网地址与一个端口标识符连接起来,以创建一个套接字,这个套接字在所有连接在一起的网络中都是唯一的

”上面描述的可靠性和流控制机制要求 TCP 初始化并维护每个数据流的某些状态信息。这些信息(包括套接字、序列号和窗口大小)的组合称为连接。每个连接都由一对标识其两端的套接字唯一指定。”