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

没有正确的解决方案

其他提示

摘要

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

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

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

可以与服务端点建立并发连接,因为的本地和远程端点都会识别连接,从而允许将流量路由到特定的服务实例

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

博览会

这是一个有趣的问题,迫使我重新审视一些我认为我内心深处知道的事情。你会想到一个像“socket”这样的名字。将是不言自明的:显然选择它来唤起你插入网络电缆的端点的图像,有强大的功能相似之处。然而,在网络用语中,单词“socket”表示“套接字”。带着这么多的包袱,需要仔细的重新检查。

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

为了讨论的目的,我将限制考虑TCP-IP网络的背景。 OSI模型非常好,但从未完全实现,在高流量高压力条件下部署得更少。

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

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

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

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

  

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

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

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

这一切都有点混乱,让你相信套接字是一个连接,这是一个连接。我在这个误导下工作直到Richard Dorman提出这个问题为止。

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

在其他方面也会提高清晰度。套接字由IP地址和端口组合标识:

  

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

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

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_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

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

附录

RFC793第2.7节第2段说

  

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

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

参考

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

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

  3. RFC147 ,套接字的定义,林肯拉博拉的Joel M. Winett

一个插座包括三件事:

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

一口之间的数字1and65535包容性,标志着一个逻辑门在设备。每之间的连接客户和服务需要一个独特的座。

例如:

  • 1030是一个端口。
  • (10.1.1.2,TCP port1030)是一个插座。

一个插座 代表一个单一的连接两个网络应用程序。这两个应用程序名义上在不同的计算机上运行,但插座,也可以用于进程通信在一个单一的计算机。应用程序可以创建多个插座互相沟通。是双向插座,意味着任何一方的连接能够发送和接收数据。因此,一个插座可以创建的理论上在任何级别的现场视察的模式,从2以上。程序员通常使用的插座在网络程序设计的,尽管是间接的。编程等库Winsock隐藏的许多低级别的详细信息的座节目。插座已经在广泛使用自1980年代初以来.

一口 代表一个终点,或"通道"网络的通信。口数字,允许不同的应用程序在相同的计算机上使用网络资源而互相干扰。口数字的最常出现在网络程序,特别插程序。然而,有时候,口号是可以随便用户。例如,有些网站的人访问,在互联网上使用URL如下:

http://www.mairie-metz.fr:8080/ 在这个例子中,数8080指的是港口量使用的网络浏览器连接的网络服务器。通常情况下,一个网站使用港口80号和这个数字不需要被包括与网址(虽然它可能是)。

在IP网络、港口的数字可以从理论上的范围从0到65535.最受欢迎的网络应用程序,不过,使用口数字中的低端的范围(例如80HTTP)。

注:术语港口还是指其他几个方面的网络技术。一个港口可以参考的物理连接点周围设备,如串行、并行和USB接口。术语港口还是指定以太网的连接点,例如那些在集线器、交换机、路由器或.

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

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

有些类比

虽然上面已经为套接字提供了很多技术内容 ... 我想补充一下我的答案,以防万一,如果有人仍然感觉不到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

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

Firsty,我认为我们应该开始有一点了解什么构成了获取一个分组,从A到B

一个共同的定义对网络的使用 OSI模型 分隔的一个网络出入的层数据的目的。有一些重要的,我们会罩在这里:

  • 数据链接层.这一层负责的分组数据从一个网络设备,另一个是上层,实际上没有发射。它谈MAC地址,并且知道如何找到主人基于自己的MAC(硬件)地址,但是没有更多。
  • 网络层 是的层,让你传输数据的机器和物理边界,如物理设备。该网络层必须基本上支持一个附加的地址基础的机制,其中涉及以某种方式的物理地址;进入互联网协议(IPv4)。一个IP地址可以得到你的包从A到B的通过互联网,但什么都不知道怎样穿越的个人跳。这是处理上一层按照路由信息。
  • 运输层.这层负责界定信息的方式获取,从A到B和任何限制,检查或上的错误,行为。例如,TCP增加了额外的信息的一个分组,这样它可以推断,如果分组已经丢失。

TCP包含,除其他事项外,这一概念的 港口.这些都是不同的有效数据的终端在同一IP地址互联网插座(AF_INET)可以结合。

因为它发生, 所以也没UDP, 和其他运输层的协议。他们不在技术上 需要 特港口的,但是这些港口提供一种方式为多种应用在以上各层使用相同的计算机接收的(并的确)拨出连接。

这给我们带来的剖析TCP或UDP connection.每个功能源港口和地址,以及一个目标港口和地址。这是这样,在任何给定的会议,目标应用程序可以作出响应,以及接收、从来源。

所以港口的基本上是说明书中规定的方式,允许多个并行连接,共享相同的地址。

现在,我们需要看一看在你如何进行通信从一个应用程序的角度看外面的世界。要做到这一点,你需要请请你的操作系统和由于大多数的操作系统支持的伯克利分校的座的做事方式,我们看到,我们可以创建插座,涉及港口从一个应用程序是这样的:

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);

也是可能的。呃,这是扔扳手在工作!

好吧,好吧,事实上它没有。我们所需要做的就是拿出了一些适当的定义:

  • 一个互联网插口的组合是一个IP地址、协议及其相关的港口量在这个服务可以提供的数据。所以tcp port80,stackoverflow.com 是一个互联网座。
  • 一个unix socket是一个IPC端点表示在文件系统,例如 /var/run/database.sock.
  • Socket API方法的要求的应用程序能够阅读和写入数据为一个插座。

瞧!这整容的事情。因此,在我们的计划后,

  • 一的港口是一个数字标识符,作的一部分运输层协议、标识服务的数量,它应该回应给予的请求。

所以真的港口是一个子集的要求形成一个互联网座。不幸的是,它只是发生,这个词的含义座已被应用于几个不同的想法。所以我衷心的建议你的名字你的下一个项目座,只是添加到混乱;)

套接字= IP地址+端口(数字地址)
它们共同确定了计算机上网络连接的终点。 (我刚刚在网络上失败了吗?)

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

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

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

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

似乎有很多的答案将插与2之间的连接的电脑是..我想这是绝对不正确的。一座具有直是 终结点 在1的电脑,就可以或不可以连接-当然,我们都使用监听或UDP sockets*在某一点。重要的是,它是寻址和活动的。发送消息是1.1.1.1:1234是不是有可能的工作,因为没有插座的定义,终结点。

套接字协议的具体所执行情况的独特性,两者 TCP/IPUDP/IP 使用*(ip地址:端口),是不同的,比如: IPX (网络的节点,而且...嗯,socket-但是不同的座比是一般的"插"一词。IPX座数字相当于IP端口)。但是,他们都提供了一个独特的址的终点。

由于IP已成为占主导地位的议定书》,一个港口(在网络而言)已成为同义词用UDP或TCP port number-这是一个部分的座地址。

  • UDP connection-小意思不虚拟线路之间的2端点是有史以来创造的。然而,我们仍然参考 UDP sockets 作为终点。API功能清楚表明,两者都是就不同类型插座 SOCK_DGRAM 是UDP(只发送一个信息)和 SOCK_STREAM 是TCP(创建一个虚拟的路)。

  • 从技术上讲,IP头拥有的IP地址,并且该协议之上的IP(UDP或TCP)拥有的口号。这使得它可能有其他的协议(例如。 ICMP 没有任何口号,但没有IP地址信息)。

简短的回答。

端口可以在标识程序或进程的主机中被描述为内部地址

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

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

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

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
...

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

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

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

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

港口是最简单的一部分,它仅仅是一个独特的标识符为一个插座。一个插座的是什么程序可以利用建立连接并互相沟通。高杰夫有一个伟大的电话的比喻,这并不完美,所以我决定来解决:

  • ip和港口~电话号码
  • 插座~电话设备
  • 连接~电话
  • 建立连接~叫一个号码
  • 进程、远程应用程序~的人
  • 消息~音

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

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

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

看看 TCP / IP术语

一个应用程序包括对进程通过网络进行通信(客户机-服务器对)。这些进程的发送和接收信息,进而从该网络通过一个软件接口 插座.考虑到这个类比提交书"计算机网络:上而下办法"。有一所房子,希望与其他房子。在这里,房子是类似于一个过程,以及门到插座。在发送过程中假定,有一个基础设施在另一边的门,将运输的数据的目的地。一旦这消息被赶到另一边,它通过接收器的门(socket)进屋子(处理)。这个图从同一本书可以帮助你:
enter image description here
插座的一部分运输层,其中提供了逻辑通信应用。这意味着从应用程序的角度来看两台主机是直接相互连接,尽管有许多路由器和/或交换机之间。因此,一个座是不连接的本身,它的结束点的连接。运输层协议的实施只有在主人,而不是在中间路由器。
港口 提供内部解决一个机。主要目的,它允许多个进程的发送和接收的数据通过网络而不干扰其他进程(他们的数据)。所有插座都提供了一个口号。当一段达到的一个主、运输层审查的目的地港口号的部分。它然后将该分段,以相应的座。这项工作提供数据传输层段正确的窝被称为 去复.本段的数据随后被转发给处理附于该座。

来自 Oracle Java教程

  

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

  
    

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

  

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

  1. 储蓄帐户部门
  2. 个人贷款部门
  3. 房屋贷款部门
  4. 申诉部门
  5. 所以1(储蓄账户部门),2(个人贷款部门),3(住房贷款部门)和4(申诉部门)是港口。

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

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

    同样地,其他部门将在其下工作,他们类似于插座。

这些基本网络的概念,所以我会解释他们在一个简单而全面的方式来理解有关细节。

  • 一个插座 就像是一个电话(即端对端通信的设备)
  • IP 就像是你的电话号码(即地址为你的插座)
  • 是喜欢的人你想要帮你(即你想要的服务,以便从该地址)
  • 一座可以是一个客户或一种服务插座(即在一家公司的电话的客户支持服务器,但一个电话在你的家是主要的客户)

所以,一座在联网是一个虚拟的通信设备开一个对(ip、港口)=(地址、服务)。

注:

  • 一台机器,一个计算机主机、手机,或者电脑可以有多个地址,多个开放的港口,因此多个插座。喜欢在一个办公室,你可以有多个电话,有多个电话号码和个人交谈。
  • 存在一个开放的/积极端口的需要,必须有一个插座开它,因为它是插座,使港口的访问。但是,你可以有未使用的港口。
  • 还注意到,在服务器上插座,你可以结合它以(一个港口,一个特定地址的机)或(一个港口,所有的地址的机)作为在电话你可能连接的许多电话线路(电话)的电话或一个特定电话线电话和你仍然可以达到一个人通过所有这些电话线或通过特定电话线路。
  • 你不能联系(结合)一个插座有两个港口的电话,通常你不能总是有两个人使用相同的电话在同一时间。
  • 高级:在同一台机器不能有两个插座同类型(客户或服务器)及相同的港口和知识产权。但是,如果你是个客户可以打开两个连接,有两个插座,以服务器,因为当地的港口中的每一个这些客户的座是不同的)

希望它清除你的疑虑

相关的TCP / IP术语是我假设的问题所暗示的。通俗地说:

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

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

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

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

一座是一个数据I/O机制。一的港口是一个 合同 概念 通信协议.一个插座可能存在没有一个端口。一个港口可能存在witout一个具体的插座(例如如果几个插座上活动的同港口,可以允许对某些协议)。

一个港口被用来确定哪座的接收器应路线的分组,有许多协议,但它并不总是需要及接收座选择可以通过其他装置的一端口,完全是一个工具,用于通过协议处理程序的网络系统。例如如果协议不使用一个端口,包可以去听座或任何插槽。

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

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

这个问题已经得到了理论上的答案。我想对这个问题给出一个实际的例子,这将清楚你对Socket和Port的理解。

我发现它这里

  

此示例将引导您通过连接到网站(例如Wiley)的过程。您可以打开Web浏览器(如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:port,或者在本例中为192.0.2.100:80。这是服务器   连接的一面,但服务器需要知道在哪里发送   您想要在Mozilla Firefox中查看的网页,因此您有一个套接字   连接的客户端也是。

     

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

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

与IP一起使用端口就像为套接字提供地址一样,虽然没有必要,但它有助于网络通信。

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

  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

套接字基本上是网络通信的端点,至少包括IP地址和端口。在Java / C#中,套接字是双向连接一端的更高级实现。

此外, Java文档

端口:

端口可以指代物理连接点 用于外围设备,如串行,并行和USB端口。  术语端口也指某些以太网连接点,s 与集线器,交换机或路由器上的那些相同。

插口:

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

我知道有很多解释。但是,通过实际例子,还有一种更容易理解的方法。我们都可以连接到HTTP端口80,但它是否意味着一次只有一个用户可以连接到该端口?答案显然是'不'。出于多种目的的多个用户可以访问HTTP端口80,但是他们仍然可以从服务器获得他们正在等待的正确响应,他们不能吗?现在考虑一下,怎么样?    是的,您的 IP地址是唯一标识为不同目的而联系的不同用户的。如果您在到达此处之前已经阅读了之前的答案,您就会知道IP地址是套接字所包含的信息的一部分。想一想,是否可以进行没有插座的通信?答案是“是”,但您不能在端口中运行多个应用程序但我们知道我们不是仅在硬件上运行的“转储”开关。

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

另见:

Stevens,W.R.1998,UNIX网络编程:网络API:套接字和XTI;第1卷,Prentice Hall。
Stevens,W.R。,1994,TCP / IP Illustrated,第1卷:协议,Addison-Wesley。

scroll top