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

Ric*_*man 880 sockets port networking

这是我组织中的一位软件工程师提出的问题.我对最广泛的定义感兴趣.

Pet*_*one 922

摘要

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

端口是定义服务端点的虚拟化标识符(与服务实例端点即会话标识符不同).

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

可以与服务端点建立并发连接,因为连接由其本地和远程端点标识,允许将流量路由到特定服务实例.

对于给定的地址/端口组合,只能有一个侦听器套接字.

解释

这是一个有趣的问题,迫使我重新审视一些我认为我内心深处知道的事情.您认为像"socket"这样的名称是不言自明的:显然选择它来唤起您插入网络电缆的端点的图像,具有强大的功能相似性.然而,在网络用语中,"插座"这个词带来了太多的包袱,需要仔细的重新检查.

在最广泛的意义上,端口是入口或出口的点.虽然没有在网络环境中使用,但法语单词porte字面意思是门或网关,进一步强调了无论您运送数据还是大型钢制容器,港口都是运输终点的事实.

出于本讨论的目的,我将限制考虑TCP-IP网络的背景.OSI模型非常好,但从未完全实现,在高流量高压力条件下更不广泛部署.

IP地址和端口的组合严格称为端点,有时称为套接字.此用法源自RFC793,即原始TCP规范.

TCP 连接由两个端点(即套接字)定义.

端点(套接字)由网络地址和端口标识符的组合定义.请注意,地址/端口不能完全识别套接字(稍后将详细介绍).

端口的目的是区分给定网络地址上的多个端点.您可以说端口是虚拟化端点.此虚拟化可在单个网络接口上实现多个并发连接.

它是套接字对(由客户端IP地址,客户端端口号,服务器IP地址和服务器端口号组成的4元组),它指定唯一标识Internet中每个TCP连接的两个端点.(TCP-IP Illustrated Volume 1,W.Richard Stevens)

在大多数C派生语言中,使用Socket类实例上的方法建立和操作TCP连接.虽然通常在更高级别的抽象上操作(通常是NetworkStream类的实例),但这通常会暴露对套接字对象的引用.对于编码器,此套接字对象似乎表示连接,因为使用套接字对象的方法创建和操作连接.

在C#中,首先要建立TCP连接(对现有的侦听器),然后创建一个TcpClient.如果没有为TcpClient构造函数指定端点,则它使用默认值 - 以这种或那种方式定义本地端点.然后 在您创建的实例上调用Connect方法.此方法需要一个描述另一个端点的参数.

这一切都有点令人困惑,让你相信套接字是一个连接,这是一个连接.在Richard Dorman提出这个问题之前,我一直在这种误解中努力工作.

经过大量的阅读和思考,我现在相信,使用带有两个参数LocalEndpointRemoteEndpoint的构造函数来创建类TcpConnection会更有意义.当本地端点可以接受默认值时,您可能支持单个参数RemoteEndpoint.这在多宿主计算机上是不明确的,但是通过选择具有到远程端点的最短路由的接口,可以使用路由表来解决模糊性.

清晰度在其他方面也会得到加强.IP地址和端口的组合标识套接字:

[...] TCP使用包含本地和外部地址的所有四个值对传入段进行解复用:目标IP地址,目标端口号,源IP地址和源端口号.TCP无法通过仅查看目标端口来确定哪个进程获取传入的段.此外,[给定端口号]的[各种]端点中唯一一个将接收传入连接请求的端点是处于监听状态的端点.(p255,TCP-IP插图第1卷,W.Richard Stevens)

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

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

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

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

我认为Hagrawal的误解源于我非常谨慎地使用"识别"这个词.我的意思是"完全,明确和唯一地识别".在上面的示例中,有两个端点与地址/端口组合54.252.94.236:80.如果只有地址和端口,则没有足够的信息来区分这些插槽.识别套接字的信息不足.

附录

RFC793第2.7节第2段说

连接由末端的一对插座完全指定.本地套接字可以参与到不同外部套接字的许多连接.

从编程角度来看,套接字的这种定义是没有用的,因为它与套接字对象不同,套接字对象是特定连接的端点.对于程序员而言,这个问题的大多数观众都是程序员,这是一个至关重要的功能差异.

参考

  1. TCP-IP Illustrated Volume 1 The Protocols,W.Richard Stevens,1994 Addison Wesley

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

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

  • 或许,对关键字套接字和端口进行真实世界的比喻可以帮助那些提出问题的人.还是一个很好的解释! (5认同)
  • 我没有投票,因为我不同意这个说法 - "*套接字不能通过IP地址和端口的组合来识别:*"..阅读TCP RFC - https://tools.ietf.org/html/rfc793.很明显套接字是IP和端口的组合,如果你知道IP和端口,那么你已经识别出一个套接字或端点,如果你知道一对套接字即客户端IP +端口和服务器IP +端口,那么你已经确定了独特的连接.. (5认同)
  • "在上面的示例中,有两个端点与地址/端口组合54.252.94.236:80.如果您拥有的只是地址和端口,则没有足够的信息来区分这些插槽.这些信息不足以识别插座." 两个连接之间是不是同一个插座,而是不同的连接,你有3个插座,2个本地和一个相同的服务器插座连接; 或者它们实际上是两个不同的插座?不会分开它们因为它们是相同的,但是为了区分连接,你需要不同的本地套接字. (5认同)
  • @rationalcoder - 阅读整个答案.由某事物定义并由其识别之间存在差异.例如,类的实例由类定义.它们部分但未完全被它识别. (4认同)
  • -1你的答案完全错了.您:"TCP套接字是......***特定连接的端点***." [RFC 793](https://tools.ietf.org/html/rfc793#page-5):"套接字可以同时用于***多个连接***".我不确定你正在使用哪些库,但是在我使用的库中,套接字对象由IP和端口唯一定义,并为每个远程套接字生成连接对象. (4认同)
  • @PeterWone这里的摘要很好,很清楚你理解这些问题.博览会,示例和此评论讨论都很尴尬,可以通过阐明在已建立的连接上建立连接和数据传输之间的区别来改进.我认为这是争论/混淆的主要问题.正在侦听的套接字由IP和端口号唯一标识.只有已建立的连接才需要远程IP和端口进行解复. (4认同)
  • “端点(套接字)由网络地址和端口标识符的组合定义。请注意,地址/端口并不能完全识别套接字(稍后会详细介绍)。” 它是否定义为网络地址和端口标识符? (2认同)
  • 那么,套接字基本上是“端口和IP号码的组合”吗?因为他先这样说,然后说“套接字不是通过IP地址和端口的组合来标识的”。有人请解释。 (2认同)
  • *部分*由IP和端口标识。这足以创建一个。但是,只要另一端不同,就可以创建具有相同IP和端口的另一个 (2认同)
  • 如 RFC763 中所定义:连接:上述可靠性和流量控制机制要求 TCP 为每个数据流初始化和维护某些状态信息。这些信息(包括套接字、序列号和窗口大小)的组合称为连接。**每个连接都由识别其两侧的一对套接字唯一指定。** (2认同)
  • @AndrewClavin - 完全相同:相同的地址/端口*对*,不同的套接字*对象*和不同的连接,其重要性在于地址/端口对不能完全识别端点.如果这发生在您编写的单个应用程序中,则您的代码将具有两个不同的对象引用. (2认同)
  • @Zaz如果您的库在多个连接中使用相同的套接字对象,您如何知道在任何给定时刻您正在使用哪个连接?您所拥有的只是一个套接字对象引用,并且根据您的说法,对于共享该逻辑端点的所有连接来说,它是同一个对象。 (2认同)
  • 除了“套接字不是由 IP 和端口识别的”之外,非常好的答案。您将套接字对象(使用 Java、C# 等创建)与操作系统提供的套接字原语混淆了。在更高的抽象级别,您可能有许多具有相同 IP 和端口的对象,但在操作系统级别,它们映射到相同的套接字。因此,您可以使用 IP 和端口识别套接字(OS 原语,而不是 xyz 语言中的某些对象)。 (2认同)
  • @erikbwork 请不要混淆套接字和文件描述符。_在 Linux 中,一切都是文件或进程。_ 因此套接字被实现为文件描述符,但这在其他平台上不是必需的。 (2认同)
  • 有用的答案!我认为通过在 TCP 连接的上下文中区分 **_socket address_** 和 **_socket_** 可以避免很多混淆。**_socket 地址_** 是 IP+端口,而 **_socket_** 代表连接的一个端点。**_socket_** 具有 **_socket 地址_**,但 **_socket 地址_** 本身并不是 **_socket_**。 (2认同)

RT_*_*RT_ 173

套接字由三件事组成:

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

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

例如:

  • 1030是一个港口.
  • (10.1.1.2,TCP,端口1030)是一个套接字.

  • 不是.套接字由*五个*东西组成:{协议,本地地址,本地端口,远程地址,远程端口}. (76认同)
  • @EJP不,再说一次.有关详细信息,请参阅所选答案. (19认同)
  • @EJP仍然是RFC 793:"一对套接字唯一地标识每个连接.也就是说,套接字可以同时用于多个连接." 如果一个插座已经由五件事组成,我的引文中怎么会有"一对插座"? (7认同)
  • @KorayTugay它在IP标题中.是什么让你认为TCP层无法看到? (2认同)
  • @EJP,正如我在上面投票最多的答案中看到的那样,套接字不是连接本身,而是连接的终点,那么它为什么可以包含本地和远程端口以及 IP 地址。套接字仅代表连接的一侧,即本地端口和本地 IP 地址或远程端口和远程 IP 访问。如果我错了,请纠正我。 (2认同)
  • @RBT 连接由元组定义,因此形成其端点的套接字也是如此。请参阅 RFC 793。 (2认同)
  • @EJB套接字只能通过IP:端口来识别,而不是5元素元组。RFC 793:*为了允许单个主机内的多个进程同时使用 TCP 通信设施,TCP 在每个主机内提供一组地址或端口。与来自互联网通信层的网络和主机地址连接,形成**一个套接字***。 (2认同)

Gal*_*ian 94

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

端口表示网络通信的端点或"通道".端口号允许同一台计算机上的不同应用程序利用网络资源而不会相互干扰.端口号最常出现在网络编程中,尤其是套接字编程.但是,有时候,临时用户可以看到端口号.例如,某人在Internet上访问的某些网站使用如下URL:

http://www.mairie-metz.fr:8080/在此示例中,数字8080是指Web浏览器用于连接到Web服务器的端口号.通常,网站使用端口号80,并且该号码不需要包含在URL中(尽管可以).

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

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

参考http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

参考http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

  • 电路是连接 - 套接字是端点.连接包括2个插座. (17认同)
  • “_套接字代表两个网络应用程序之间的单个连接。_”这与解释的_[RFC 793,传输控制协议](https://tools.ietf.org/html/rfc793)_不匹配:“_允许单个主机内的许多进程同时使用 TCP 通信设施,TCP 在每个主机内提供一组地址或端口。与互联网通信层的网络和主机地址连接起来,形成一个套接字。一对套接字唯一标识每个连接._” (6认同)
  • OSI模型上的第2层是节点之间的连接,它没有连接进程的机制.我不相信你可以考虑在OSI l2上存在一个套接字. (2认同)

eRa*_*ToX 79

用一些比喻

虽然上面已经为插座提供了很多技术方面的东西......我想补充一下我的答案,以防万一,如果有人仍然感觉不到ip,端口和套接字之间的区别

考虑服务器S,

并说人X,Y,Z需要来自该服务器S的服务(比如说聊天服务)

然后

IP地址告诉 - > 谁?是X,Y,Z想要联系的聊天服务器'S'

好吧,你有"谁是服务器"

但是假设服务器'S'也在向其他人提供其他服务,比如'S'为A,B,C提供存储服务

然后

端口告诉 ---> 哪个?服务你(X,Y,Z)需要聊天服务,而不是那个存储服务

好吧..,你让服务器来了解'聊天服务'是你想要的而不是存储

你是三个,服务器可能想要以不同方式识别所有三个

插座来了

现在套接字告诉 - > 哪一个?特别的联系

也就是说,

X的插座1

人Y的插座2

和Z的插座3

我希望它可以帮助仍然困惑的人:)

  • 那么 X、Y、Z 会连接到相同的端口,即相同的服务,但在服务器端有不同的套接字?因此,当 X 向服务器发送一些数据包时,它会说:“找到我的(协议、X 的 IP、X 的端口、S 的 IP、S 的端口)套接字”并发送到聊天应用程序。我假设某些特定于应用程序的对象和套接字对象之间必须存在绑定?例如,当我从套接字 1 获取一些数据时,我想将其显示为用户消息,但应用程序需要知道来自套接字 A 的消息来自用户 X。 (3认同)

小智 44

第一,我认为我们应该首先了解从A到B的数据包的构成.

网络的通用定义是使用OSI模型,该模型根据目的将网络分成多个层.有几个重要的,我们将在这里介绍:

  • 数据链路层.该层负责将数据包从一个网络设备传送到另一个网络设备,并且位于实际进行传输的层之上.它讨论MAC地址,并知道如何根据其MAC(硬件)地址查找主机,但仅此而已.
  • 网络层是允许跨机器和在物理边界,比如物理设备传输数据的层.网络层必须基本上支持基于地址的附加机制,该机制以某种方式与物理地址相关联; 输入Internet协议(IPv4).IP地址可以通过互联网从A到B获取数据包,但对如何遍历单个跃点一无所知.这由上面的层根据路由信息处理.
  • 传输层.该层负责定义信息从A到B的方式以及对该行为的任何限制,检查或错误.例如,TCP向数据包添加附加信息,以便可以推断数据包是否已丢失.

除其他外,TCP包含端口的概念.这些实际上是Internet Socket(AF_INET)可以绑定的同一IP地址上的不同数据端点.

碰巧,UDP和其他传输层协议也是如此.它们在技术上不需要具有端口功能,但这些端口确实为上面的层中的多个应用程序提供了一种方法,可以使用同一台计算机来接收(实际上是)传出连接.

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

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

现在,我们需要看一下从应用程序的角度到外部世界的沟通方式.要做到这一点,你需要请求你的操作系统,因为大多数操作系统都支持Berkeley套接字的工作方式,我们看到我们可以创建一个涉及来自应用程序端口的套接字,如下所示:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
Run Code Online (Sandbox Code Playgroud)

大!所以在sockaddr结构中,我们将指定我们的端口和bam!任务完成!差不多,除了:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);
Run Code Online (Sandbox Code Playgroud)

也是可能的.呃,那是在工作中抛出一把扳手!

好吧,实际上它没有.我们需要做的就是提出一些适当的定义:

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

瞧!整理的东西.那么在我们的方案中,

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

所以真正的端口是形成互联网套接字的要求的一个子集.不幸的是,恰恰相反,单词socket的含义已经应用于几个不同的想法.所以我衷心建议你为下一个项目套接字命名,只是为了增加混乱;)


Gis*_*shu 29

套接字= IP地址+端口(数字地址)
它们一起标识计算机上网络连接的端点.(我刚刚收到网络101?)

  • 我相信port比你的定义有更广泛的意义. (6认同)
  • 套接字不仅受TCP / IP堆栈的约束。通常,请参见UNIX域套接字或进程间通信套接字。 (2认同)

kta*_*kta 29

通常,您将获得大量理论,但区分这两个概念的最简单方法之一如下:

要获得服务,您需要一个服务号码.此服务编号称为端口.就那么简单.

例如,HTTP作为服务在端口80上运行.

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

  • 我不确定你的声明:"服务器为每个连接创建套接字以维护它的客户端"是正确的. (5认同)
  • 服务器为每个连接创建一个套接字 _instance_。这里的问题是英语中的类和实例不明确。 (2认同)

Mar*_*ett 25

似乎有很多答案将插座与2台PC之间的连接等同起来......我认为绝对不正确.套接字一直是1台PC上的端点,可能连接也可能没有连接 - 当然我们在某些时候都使用过监听器或UDP套接字*.重要的是它是可寻址和活跃的.发送消息到1.1.1.1:1234不太可能,因为没有为该端点定义套接字.

套接字是特定于协议的 - 因此TCP/IPUDP/IP使用*(ipaddress:port)的唯一性的实现不同于例如IPX(网络,节点和... ahem,socket - 但是不同套接字比一般"套接字"术语的含义.IPX套接字号等同于IP端口).但是,它们都提供了一个独特的可寻址端点.

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

  • UDP是无连接的 - 意味着永远不会在两个端点之间创建虚拟电路.但是,我们仍然将UDP套接字称为端点.API函数清楚地表明两者都只是不同类型的套接字 - SOCK_DGRAM是UDP(只是发送消息)而且SOCK_STREAM是TCP(创建虚拟电路).

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


And*_*ndy 25

简短的回答.

端口可以被描述为一个内部地址标识的程序或处理的宿主内.

插座可以被描述为一个编程接口,允许一个程序来与其他程序或进程,或局部通信,在互联网上.

  • 端口描述中的"内部"一词对我而言听起来就像"非公开". (3认同)

Roe*_*oel 16

它们来自两个不同的域:'port'是来自TCP/IP网络的概念,'socket'是API(编程)的东西.通过获取端口和主机名或网络适配器并将它们组合成可用于发送或接收数据的数据结构,(代码中)生成"套接字".


Mec*_*cki 12

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

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

  • 这是不正确的。套接字不是端点。一个套接字由两个端点定义。每个端点由网络地址和端口定义。端口的目的是区分同一网络地址上的多个端点,从而可以支持多个并发套接字。 (4认同)
  • 反思文学是矛盾的,我道歉。严格来说,只有在两个端点(又名套接字)之间建立 TCP 连接后,才会发生通信,每个端点都由网络地址和端口标识。我放弃。 (2认同)

Col*_*lin 12

在阅读了优秀的最高投票答案之后,我发现以下几点需要强调我,网络编程的新手:

TCP-IP连接是连接一个地址的双向路径:端口组合与另一个地址:端口组合.因此,无论何时打开从本地计算机到远程服务器端口的连接(例如www.google.com:80),您还要将计算机上的新端口号与连接关联,以允许服务器发送回到你的东西,(例如127.0.0.1:65234).使用netstat查看机器的连接会很有帮助:

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...
Run Code Online (Sandbox Code Playgroud)


Zaz*_*Zaz 12

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

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address
Run Code Online (Sandbox Code Playgroud)

当2个套接字绑定在一起时发生连接.


Kri*_*hna 10

套接字是一种特殊类型的文件句柄,进程使用它来从操作系统请求网络服务.套接字地址是三元组:{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系统引入的.虽然它尚未标准化,但它已成为事实上的行业标准.


Mos*_*een 10

这些是基本的网络概念,因此我将以一种简单而全面的方式对其进行解释,以详细了解它们。

  • 插座就像电话(即用于通信的端到端设备)
  • IP就像您的电话号码(即插座的地址)
  • 港口就像您要与之交谈的人(即您要从该地址订购的服务)
  • 套接字可以是客户端或服务器套接字(即,在公司中,客户支持的电话是服务器,但是您家中的电话主要是客户端)

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

注意:

  • 机器,计算机,主机,移动设备或PC可以具有多个地址,多个打开的端口,因此可以具有多个插槽。就像在办公室中一样,您可以使用多部电话同时使用多个电话号码和多个人进行通话。
  • 开放/活动端口的存在必须使您绑定一个套接字,因为它是使端口可访问的套接字。但是,您可能暂时没有使用端口。
  • 还要注意,在服务器套接字中,您可以将其绑定到(端口,机器的特定地址)或(端口,机器的所有地址),就像在电话中,您可以将许多电话线(电话号码)连接到一个电话或一条特定的电话线连接到电话,您仍然可以通过所有这些电话线或特定的电话线与某人联系。
  • 您不能像在电话中那样将插座与两个端口关联(绑定),通常不能总是让两个人同时使用同一部电话。
  • 高级:在同一台计算机上,您不能拥有两个具有相同类型(客户端或服务器)以及相同端口和IP的套接字。但是,如果您是客户端,则可以打开到服务器的两个连接(带有两个套接字),因为这些客户端的每个套接字中的本地端口都不相同)

希望它消除您的疑虑


小智 7

端口和套接字可以比作银行分行。

“银行”的楼号类似于IP地址。银行有不同的部分,例如:

  1. 储蓄账户部
  2. 个人贷款部
  3. 房贷部
  4. 申诉部

所以1(储蓄账户部门)、2(个人贷款部门)、3(房屋贷款部门)和4(申诉部门)是端口。

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

SAVINGACCOUNT_EMPLOYEE1 是您的套接字描述符,因此可能有 SAVINGACCOUNT_EMPLOYEE1 到 SAVINGACCOUNT_EMPLOYEEN。这些都是套接字描述符。

同样,其他部门也会有员工在他们之下工作,他们类似于socket。


inf*_*rno 6

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

  • ip和port~电话号码
  • socket~电话设备
  • 连接〜电话
  • 建立连接〜呼叫号码
  • 流程,远程应用〜人
  • 消息〜言论


San*_*der 5

套接字是一种数据 I/O 机制。端口是通信协议契约概念。套接字可以在没有端口的情况下存在。端口可以​​在没有特定套接字的情况下存在(例如,如果多个套接字在同一端口上处于活动状态,这对于某些协议来说是允许的)。

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


S.L*_*ott 5

套接字是软件中的结构.它或多或少是一个文件; 它具有读写操作.这不是物质的东西; 这是您的软件引用物理事物的一种方式.

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

一个插槽只能使用一个地址的端口.套接字分配端口,就像为文件系统I/O分配设备一样.分配端口后,没有其他套接字可以连接到该端口.当套接字关闭时,将释放该端口.

看一下TCP/IP术语.

  • 套接字的这种描述非常不合适.套接字是关于一对元组之间的连接,其中元组指的是IP ADDR和端口对.此外,许多插座可以连接到同一个端口.您认为Web服务器如何在端口80上进行多个连接?这是一个糟糕的答案 (3认同)
  • 对不起。多个套接字未连接到端口 80。一个套接字已连接,并在实际传输发生时生成其他套接字。请参阅http://www.opengroup.org/onlinepubs/009695399/functions/listen.html。 (2认同)

bal*_*log 5

港口:

端口可以​​指串行、并行和 USB 端口等外围设备的物理连接点。术语“端口”还指某些以太网连接点,例如集线器、交换机或路由器上的连接点。

插座:

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


Tal*_*eff 5

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

端口就像特定邮政编码中特定房屋的电话号码。城镇的邮政编码可以被认为是城镇以及该城镇中所有房屋的 IP 地址。

另一方面,套接字更像是相互通话的两栋房子的电话之间建立的电话呼叫。这些呼叫可以在同一城镇的房屋之间或不同城镇的两栋房屋之间建立。SOCKET 是相互通话的两部手机之间临时建立的通道。

  • 套接字是一个端点。它在连接建立之前 (TCP) 或连接不存在 (UDP) 时存在。因此,它本身并不是连接。 (3认同)

yon*_*doo 5

来自Oracle Java教程:

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


Ugn*_*nes 5

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