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

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

概要

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

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

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

可以有一个到服务端点的并发连接 ,因为连接由其本地和远程端点标识,允许将stream量路由到特定的服务实例。

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

解释

这是一个有趣的问题,迫使我重新审视一些我认为自己内部知道的事情。 你会认为像“socket”这样的名字是不言而喻的:显然,它被选为唤起你插入networking电缆的端点的图像,function强大。 尽pipe如此,用networking的说法来说,“套接字”这个词有很多的包袱,所以需要仔细的重新审视。

从最广泛的意义上讲,港口是进出口的一个点。 虽然没有在networking环境中使用,但是法文字porte字面意思是门或网关 ,进一步强调了无论您是运送数据还是大型钢铁集装箱,港口都是运输终点。

为了讨论的目的,我将考虑到TCP-IPnetworking的情况。 OSI模型是非常好的,但是从来没有被完全实现过,在高stream量高压力条件下部署得不那么广泛。

IP地址和端口的组合被称为端点,有时称为套接字。 这个用法源于原始的TCP规范RFC793。

TCP 连接由两个端点(也就是套接字 )定义。

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

端口的目的是区分给定networking地址上的多个端点。 你可以说一个端口是一个虚拟端点。 这种虚拟化可以在单个networking接口上进行多个并发连接。

它是套接字对(由客户端IP地址,客户端端口号,服务器IP地址和服务器端口号组成的四元组),指定在互联网中唯一标识每个TCP连接的两个端点。 ( TCP-IP说明卷1 ,W. Richard Stevens)

在大多数C派生语言中,TCP连接是使用Socket类的实例上的方法build立和操作的。 虽然通常在更高的抽象层次(通常是NetworkStream类的一个实例)上进行操作,但这通常会暴露对套接字对象的引用。 对于编码器来说,这个套接字对象似乎表示连接,因为连接是使用套接字对象的方法创build和操纵的。

在C#中,build立一个TCP连接(到一个现有的监听器),首先创build一个TcpClient 。 如果您不指定TcpClient构造函数的端点,则使用默认值 – 定义本地端点。 然后在你创build的实例上调用Connect方法。 该方法需要描述另一个端点的参数。

这一切都有点混乱,并导致你相信一个套接字是一个连接,这是bollocks。 理查德·多曼(Richard Dorman)提出这个问题之前,我一直在这种误解之下工作。

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

清晰度在其他方面也会增强。 一个套接字不能被IP地址和端口的组合识别:

TCP使用构成本地和外部地址的所有四个值来解复用传入段:目标IP地址,目标端口号,源IP地址和源端口号。 TCP只能通过查看目的端口来确定哪个进程得到了一个入站段。 此外,在[给定的端口号]中将接收传入连接请求的[各种]端点中唯一一个处于监听状态的端点。 (p255, TCP-IP Illustrated Volume 1 ,W. Richard Stevens)

正如你所看到的,这不仅仅是可能的,但是networking服务很可能有多个具有相同地址/端口的套接字,但是在特定的地址/端口组合上只有一个监听套接字。 典型的库实现提供了一个套接字类,它的一个实例被用来创build和pipe理一个连接。 这是非常不幸的,因为这会造成混乱,导致这两个概念的广泛混淆。

海格拉尔不相信我(见评论),所以这里是一个真正的样本。 我连接了一个Web浏览器到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 

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

我认为海格劳尔的误解来源于我非常小心地使用“识别”一词。 我的意思是“完全,明确和唯一的标识”。 在上面的示例中,有两个端点的地址/端口组合为54.252.94.236:80 。 如果您所拥有的只是地址和端口,则没有足够的信息来区分这些套接字。 没有足够的信息来识别套接字。

附录

RFC793第2.7节的第二段说

连接完全由端点处的一对sockets指定。 本地套接字可以参与到不同的外部套接字的许多连接。

从编程的angular度来看,这个套接字的定义是没有用的,因为它不同于作为特定连接端点的套接字对象 。 对程序员来说,这个问题的大部分是程序员,这是一个重要的function差异。

参考

  1. TCP-IP图解卷1 The Protocols ,W. Richard Stevens,1994 Addison Wesley

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

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

一个套接字由三件事组成:

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

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

例如:

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

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

端口代表networking通信的端点或“通道”。 端口号允许同一台计算机上的不同应用程序利用networking资源而不会相互干扰。 端口号通常出现在networking编程中,特别是套接字编程。 但是,有时端口号对于临时用户是可见的。 例如,一个人在互联网上访问的网站使用如下的URL:

http://www.mairie-metz.fr:8080/在这个例子中,数字8080是指Web浏览器用于连接到Web服务器的端口号。; 通常情况下,一个网站使用的端口号是80,这个号码不需要包含在URL中(虽然可以)。

在IPnetworking中,端口号理论上可以在0到65535的范围内。然而,大多数stream行的networking应用使用范围低端的端口号(例如HTTP为80)。

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

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

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

首先,我想我们应该从A到B的分组开始有一点了解。

networking的一个通用定义是使用OSI模型 ,它根据目的将networking划分成若干层。 有几个重要的,我们将在这里介绍:

  • 数据链路层 。 该层负责从一个networking设备获取数据包到另一个networking设备,并且恰好在实际传输的层之上。 它介绍了MAC地址,知道如何根据MAC(硬件)地址find主机,但仅此而已。
  • networking层是允许您跨机器和物理边界(如物理设备)传输数据的层。 networking层必须支持基于地址的机制,该机制与物理地址有某种关系; inputInternet协议(IPv4)。 一个IP地址可以通过互联网将你的数据包从A传送到B,但是对于如何遍历单个跳数却一无所知。 根据路由信息,这由上面的层处理。
  • 传输层 。 该层负责定义信息从A到B的方式以及对该行为的任何限制,检查或错误。 例如,TCP将附加信息添加到数据包,以便有可能推断数据包是否已经丢失。

除了别的以外,TCP还包含端口的概念。 这些实际上是Internet套接字( AF_INET )可以绑定到的相同IP地址上的不同数据端点。

碰巧, UDP和其他传输层协议也是如此。 他们在技术上不需要特征端口,但是这些端口确实提供了在上面的层中的多个应用程序使用相同的计算机来接收(并且实际上是)传出连接的方式。

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

所以端口本质上是允许多个并发连接共享相同地址的规范要求的方式。

现在,我们需要看看从应用程序angular度到外部世界的沟通方式。 要做到这一点,你需要好好问你的操作系统,因为大多数操作系统都支持Berkeley套接字的方式,我们可以看到我们可以创build一个涉及到应用程序端口的socket:

 int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket int 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是一种请求应用程序能够读写数据到套接字的方法。

瞧! 整理一下。 那么在我们的scheme中,

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

所以真正的端口是形成互联网套接字的一个要求。 不幸的是,socket这个词的含义恰恰被应用于几个不同的想法。 所以我衷心build议你给你的下一个项目套接字命名,只是为了增加混淆;)

用一些比喻

虽然上面已经给出了很多技术性的东西,但是我想补充一下我的答案,以防万一, 如果有人仍然感觉不到IP,端口和套接字之间的区别

考虑一个服务器S

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

然后

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

好吧,你有“谁是服务器”

但是假设服务器“S”也提供了一些其他的服务给别人,比如说“S”为人A,B,C提供存储服务

然后

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

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

你是三个, 服务器可能想识别所有三个不同的

来了sockets

现在套接字告诉 – > 哪一个? 特定的连接

也就是说,

人X的sockets1

人Y的sockets2

和人Z的sockets3

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

似乎有很多答案等同于两个PC之间的连接套接字,我认为是绝对不正确的。 一个套接字一直是一台PC上的端点 ,可能连接也可能不连接 – 当然,我们在某个时候都使用了监听或UDP套接字*。 重要的是它是可寻址和主动的。 发送消息到1.1.1.1:1234是不可能的,因为没有为该端点定义的套接字。

套接字是协议特定的 – 所以TCP / IP和UDP / IP使用的唯一性的实现*( IP地址:端口)与例如IPX (networking,节点和…端口,套接字 – 不同,但不同套接字比一般的“套接字”术语意味着IPX套接字号码相当于IP端口)。 但是,它们都提供了一个独特的可寻址端点。

由于IP已经成为主要协议,所以端口(在networking方面)已经变得与UDP或TCP端口号(这是套接字地址的一部分)是同步的。

  • UDP是无连接的 – 这意味着在两个端点之间没有创build虚拟电路。 但是,我们仍然将UDP套接字称为端点。 API函数清楚地表明,两者都是不同types的套接字 – SOCK_DGRAM是UDP(只是发送消息), SOCK_STREAM是TCP(创build虚拟电路)。

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

简短的回答。

一个端口可以被描述为主机内的一个内部地址 ,用来识别一个程序或进程。

套接字可以被描述为允许程序与其他程序或进程,互联网或本地通信的编程接口

一个套接字= IP地址+一个端口(数字地址)
他们一起确定了一台机器上networking连接的终点。 (我刚刚没有使用networking101?)

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

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

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

现在,很多人可以请求服务,并build立了从客户端 – 服务器的连接。 会有很多连接。 每个连接代表一个客户端。 为了维护每个连接,服务器为每个连接创build套接字来维护它的客户端。

希望这有帮助,谢谢。

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

在阅读了精彩的答案之后,我发现以下几点需要强调:networking编程的新手:

TCP-IP连接是连接一个地址:端口组合与另一个地址:端口组合的双向path。 因此,无论何时从本地计算机打开到远程服务器端口的连接(例如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 ... 

套接字是一种特殊types的文件句柄,被进程用来从操作系统请求networking服务。 套接字地址是三元组:{协议,本地地址,本地进程},其中本地进程由端口号标识。

在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,foreign-address,foreign-process}

其中指定了每个连接的一半。

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

套接字是通信端点。 套接字不绑定到TCP / IP,它可以是任何协议。 通过定义一个本地地址来创build一个套接字(在TCP / IP的情况下,地址是一个IP地址,通常情况下,如果是TCP或UDP套接字,端口号都可以是ANY),然后将套接字绑定到它只是使用它的服务器套接字,或者你可以通过定义一个远程地址,然后连接套接字创build一个套接字(另外,你可以绑定到本地地址提前,如果你想保持本地地址的控制和端口),并将其用作客户端套接字。 一旦你有一个套接字,把它看作一个通信pipe道。 您向其发送数据,另一端(您连接的或与您连接的)接收您在那里发送的数据。 一个套接字的两端可以在同一个主机上,也可以在百万英里之外。 一旦套接字完全连接,你不需要关心什么样的套接字。 如果是TCP / IP套接字,无论是IPv4还是IPv6还是其他任何协议,只需通过套接字发送stream量,其他任何事情都由系统为您处理。

这与港口无关。 端口是TCP / IP协议族用来区分互联网上主机间多个通信隧道的概念。 例如,如果没有端口,我可以连接到server1.example.net来获取一个网页,或者我可以连接到那里获取邮件,但从来没有在同一时间。 如果我同时执行这两个操作,并且server1.example.net向我发送了一些数据,那么如何知道这些数据是属于我刚刚请求的网页还是属于获取新邮件请求的一部分? 我不能使用IP地址,在任何情况下,数据包将具有相同的源地址和目标地址。 但是端口允许它进一步区分两台互联网主机之间的通信pipe道。 这样,我知道我的网页的stream量将来自端口80,并在这里到达港口4130,来自我的取信邮件的stream量将来自端口143,并在本地到达5322.如果你用套接字编程,唯一一次你进入与端口的联系是当你绑定或连接套接字,一旦绑定和/或连接,你不再关心端口。

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

  • IP和端口〜电话号码
  • 套接字〜电话设备
  • 连接〜电话
  • build立连接〜拨打号码
  • 进程,远程应用程序〜人员
  • 消息〜语音

来自Oracle Java教程 :

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

这个问题暗示了我所假设的相对TCP / IP术语。 通俗地说:

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

另一方面,SOCKET更像是一对房屋的电话之间build立的电话通话。 这些电话可以在同一城镇的房屋或不同城镇的两间房屋之间build立。 这是一对电话之间临时build立的通道,彼此交谈,就是SOCKET。

套接字是软件中的一个结构。 这或多或less是一个文件; 它具有读写等操作。 这不是一个物理的东西; 这是您的软件参考实物的一种方式。

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

一个套接字只能在一个地址使用一个端口。 套接字分配端口大致就像为文件系统I / O分配一个设备一样。 一旦端口被分配,其他套接字就不能连接到该端口。 当socketsclosures时,端口将被释放。

看看TCP / IP术语 。

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

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

一个端口用来确定接收者应该使用多种协议来将数据包路由到哪个套接字,但并不总是必需的,接收套接字的select可以通过其他方式来完成 – 一个端口完全是协议处理程序使用的工具networking子系统。 例如,如果一个协议不使用一个端口,数据包可以去所有的侦听套接字或任何套接字。

In a broad sense, Socket – is just that, a socket, just like your electrical, cable or telephone socket. A point where "requisite stuff" (power, signal, information) can go out and come in from. It hides a lot of detailed stuff, which is not required for the use of the "requisite stuff". In software parlance, it provides a generic way of defining a mechanism of communication between two entities (those entities could be anything – two applications, two physically separate devices, User & Kernel space within an OS, etc)

A Port is an endpoint discriminator. It differentiates one endpoint from another. At networking level, it differentiates one application from another, so that the networking stack can pass on information to the appropriate application.

Already theoretical answers have been given to this question. I would like to give a practical example to this question, which will clear your understanding about Socket and Port.

I found it here

This example will walk you thru the process of connecting to a website, such as Wiley. You would open your web browser (like Mozilla Firefox) and type http://www.wiley.com into the address bar. Your web browser uses a Domain Name System (DNS) server to look up the name http://www.wiley.com to identify its IP address is. For this example, the address is 192.0.2.100.

Firefox makes a connection to the 192.0.2.100 address and to the port where the application layer web server is operating. Firefox knows what port to expect because it is a well-known port . The well-known port for a web server is TCP port 80.

The destination socket that Firefox attempts to connect is written as socket:port, or in this example, 192.0.2.100:80. This is the server side of the connect, but the server needs to know where to send the web page you want to view in Mozilla Firefox, so you have a socket for the client side of the connection also.

The client side connection is made up of your IP address, such as 192.168.1.25, and a randomly chosen dynamic port number. The socket associated with Firefox looks like 192.168.1.25:49175. Because web servers operate on TCP port 80, both of these sockets are TCP sockets, whereas if you were connecting to a server operating on a UDP port, both the server and client sockets would be UDP sockets.

Socket is an abstraction provided by kernel to user applications for data I/O. A socket type is defined by the protocol its handling, an IPC communication etc. So if somebody creates a TCP socket he can do manipulations like reading data to socket and writing data to it by simple methods and the lower level protocol handling like TCP conversions and forwarding packets to lower level network protocols is done by the particular socket implementation in the kernel. The advantage is that user need not worry about handling protocol specific nitigrities and should just read and write data to socket like a normal buffer. Same is true in case of IPC, user just reads and writes data to socket and kernel handles all lower level details based on the type of socket created.

Port together with IP is like providing an address to the socket, though its not necessary, but it helps in network communications.

A socket is basically an endpoint for network communication, consisting of at least an IP-address and a port. In Java/C# a socket is a higher level implementation of one side of a two-way connection.

Also, a definition in the Java documentation .

Port:

A port can refer to a physical connection point for peripheral devices such as serial, parallel, and USB ports. The term port also refers to certain Ethernet connection points, s uch as those on a hub, switch, or router.

Socket:

A socket represents a single connection between two network applications. These two applications nominally run on different computers, but sockets can also be used for interprocess communication on a single computer. Applications can create multiple sockets for communicating with each other. Sockets are bidirectional, meaning that either side of the connection is capable of both sending and receiving data.

Port and socket can be compared to the Bank Branch.

The building number of the "Bank" is analogous to IP address . Bank has got different sections like :1) SAVINGS ACCOUNT DEPARTMENT 2) PERSONAL LOAN DEPARTMENT 3) HOME LOAN DEPARTMENT 4) GRIEVANCE DEPARTMENT .

so 1(SAVINGS ACCOUNT DEPARTMENT) ,2 ( PERSONAL LOAN DEPARTMENT) ,3(HOME LOAN DEPARTMENT) and 4(GRIEVANCE DEPARTMENT) are Ports.

Now let us say you go to open a savings account , you go to Bank(IP address) then you go to "SAVINGS ACCOUNT DEPARTMENT" (Port number 1) then you meet one of the employee working under "SAVINGS ACCOUNT DEPARTMENT" let us call him as SAVINGACCOUNT_EMPLOYEE1 for opening account .

SAVINGACCOUNT_EMPLOYEE1 is your socket descriptor , so there may be SAVINGACCOUNT_EMPLOYEE1 to SAVINGACCOUNT_EMPLOYEEN these are all socket descriptors.

Likewise other departments will be having employess working under them and they are analogous to socket.

Hope this helps !!

A port denotes a communication endpoint in the TCP and UDP transports for the IP network protocol. A socket is a software abstraction for a communication endpoint commonly used in implementations of these protocols (socket API). An alternative implementation is the XTI/TLI API.

也可以看看:

Stevens, WR 1998, UNIX Network Programming: Networking APIs: Sockets and XTI; Volume 1, Prentice Hall.
Stevens, WR, 1994, TCP/IP Illustrated, Volume 1: The Protocols, Addison-Wesley.

A single port can have one or more sockets connected with different external IP's like a multiple electrical outlet.

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

I know that there are lot of explanations. But, there is one more easy way to understand with practical example. We all can connect to HTTP port 80, but does it mean only one user can connect to that port at a time?. The answer is obviously 'no'. Multiple users for multiple purposes can access HTTP port 80 but they still get proper response they are waiting for, from the server, can't they?. Now think about it for a minute, how?. Yes you are correct, its IP address that uniquely identifies different users who contacts for different purposes. If you would have read the previous answers before reaching here, you would know that IP address is a part of information that socket consists. Think about it, is it possible to have a communication without sockets?. The answer is 'Yes' but you cannot run more than one application in a port but we know that we are not a 'Dump' switch that runs on just hardware.

A socket address is an IP address & port number

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

A connection occurs when 2 sockets are bound together.

A port is an entity that is used by networking protocols to attain access to connected hosts. Ports could be application-specific or related to a certain communication medium. Different protocols use different ports to access the hosts, like HTTP uses port 80 or FTP uses port 23. You can assign user-defined port numbers in your application, but they should be above 1023.

Ports open up the connection to the required host while sockets are an endpoint in an inter-network or an inter-process communication. Sockets are assigned by APIs(Application Programming Interface) by the system.

A more subtle difference can be made saying that, when a system is rebooted ports will be present while the sockets will be destroyed.