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


928

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


19
重申一下,套接字不限于网络IO。它们可以在各种情况下用于在各种应用程序之间流传输数据。
奥利

Answers:


976

摘要

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

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

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

可以存在到服务端点的并发连接,因为连接由其本地端点和远程端点标识,从而允许将流量路由到特定的服务实例。

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

展览会

这是一个有趣的问题,迫使我重新审视我以为内在的一些事情。您会认为“ socket”之类的名字是不言而喻的:显然,它被选择来唤起插入网络电缆的端点的图像,因为它们具有强大的功能并行性。然而,用网络术语来说,“ socket”一词承载着太多的行李,因此有必要进行仔细的重新检查。

从最广泛的意义上讲,端口是入口或出口。尽管未在网络环境中使用,法语单词porte的字面意思是门或网关,进一步强调了以下事实:无论是运输数据还是运输大型钢制集装箱,港口都是运输的终点。

出于讨论的目的,我将考虑限制在TCP-IP网络的上下文中。OSI模型非常好,但从未完全实现,在高流量高应力条件下的部署范围则要小得多。

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

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

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

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

套接字对(由客户端IP地址,客户端端口号,服务器IP地址和服务器端口号组成的4元组)指定了两个端点,这些端点唯一地标识了Internet中的每个TCP连接。(TCP-IP图解卷1,W。Richard Stevens)

在大多数C派生的语言中,TCP连接是使用Socket类实例上的方法建立和处理的。尽管通常在更高级别的抽象上进行操作(通常是NetworkStream类的实例),但这通常公开对套接字对象的引用。对于程序员而言,此套接字对象似乎代表连接,因为使用套接字对象的方法创建和操纵了连接。

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

所有这些都使您感到困惑,并使您相信套接字是一个连接,这是个错误。我一直在这种误解之下努力,直到理查德·多曼(Richard Dorman)问了这个问题。

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

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

TCP使用组成本地和外部地址的所有四个值对输入的段进行多路分解:目标IP地址,目标端口号,源IP地址和源端口号。TCP无法仅通过查看目标端口来确定哪个进程获取传入的段。同样,在[给定端口号]上的[各种]端点中唯一将接收传入连接请求的端点是处于侦听状态的端点。(p255,TCP-IP插图集1,W。Richard Stevens)

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

Hagrawal不相信我(请参阅评论),所以这是一个真实的样本。我将Web浏览器连接到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的误解是由于我非常小心地使用了“ identified”一词。我的意思是“完全,明确且唯一地标识”。在以上示例中,有两个端点具有地址/端口组合54.252.94.236:80。如果仅有地址和端口,则没有足够的信息来区分这些套接字。尚不足以标识套接字。

附录

RFC793的第2.7节第二段说

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

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

参考文献

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

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

  3. RFC147,套接字的定义,林肯实验室Joel M. Winett


6
也许,现实世界中类似于关键字socket和port的做法会帮助那些投票支持该问题的人。仍然是一个很好的解释!
rohitverma

5
@rationalcoder-阅读整个答案。被某物定义和被某物标识之间是有区别的。例如,类的实例由该类定义。它们部分但不是全部被它识别。
彼得·沃尼

6
我没有投票,因为我不同意以下说法-“ 套接字无法通过IP地址和端口的组合来标识: ” ..阅读TCP RFC-tools.ietf.org/html/rfc793 ..很明显,套接字是IP和端口的组合,如果您知道IP和端口,那么您已经确定了套接字或端点,如果知道了一对套接字,即客户端IP +端口和服务器IP +端口,那么您已经确定了唯一的连接..
hagrawal

6
“在上面的示例中,有两个终结点,它们的地址/端口组合为54.252.94.236:80。如果您只拥有地址和端口,则没有足够的信息来区分这些套接字。插座。” 在两个连接之间不是那些相同的套接字,而是不同的连接,您有3个套接字,2个本地变量和一个相同的服务器套接字连接到了;还是实际上是两个不同的插座?因为它们是相同的,所以不会分开,但是要分开连接,您将需要不同的本地套接字。
Andrew Clavin

6
-1您的答案是完全错误的。您:“ TCP套接字是... 特定连接的端点。” RFC 793:“一个套接字可以同时用于多个连接中。” 我不确定您使用的是什么库,但是在我使用的库中,套接字对象是由IP和端口唯一定义的,并为每个远程套接字生成了连接对象。
Zaz

187

一个套接字包括三件事:

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

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

例如:

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

80
否。套接字包含五种内容:{协议,本地地址,本地端口,远程地址,远程端口}。
2013年

19
@EJP不,再次。有关更多信息,请参见所选答案。
Kehlan Krumme

2
@KorayTugay在IP标头中。是什么让您认为TCP层看不到呢?
user207421

1
正如我在上面投票最多的答案中看到的那样,@ EJP套接字不是连接本身,而是连接的终点,那么它将如何同时包含本地和远程端口以及ip地址。套接字仅代表连接的一侧,即本地端口和本地ip地址或远程端口和远程ip地址。如果我错了,请纠正我。
RBT

7
@EJP仍然是RFC 793:“一对套接字唯一地标识每个连接。也就是说,一个套接字可以同时用于多个连接。” 如果一个插座已经由五样东西组成,那么我的引用中怎么会有“一对插座”呢?
加布是好人

100

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

端口代表用于网络通信的端点或“通道”。端口号允许同一台计算机上的不同应用程序利用网络资源而不会互相干扰。端口号最常出现在网络编程中,尤其是套接字编程中。但是,有时候,临时用户可以看到端口号。例如,一个人在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
OSI模型上的第2层是节点之间的连接,它没有连接进程的机制。我不认为您可以考虑OSI l2上存在的套接字。
安东尼奥·海莉

18
电路是连接-套接字是端点。一个连接包括2个插座。
Mark Brackett

套接字表示两个网络应用程序之间的单个连接。 ”与RFC 793不匹配的传输控制协议解释:“ 为了允许单个主机中的多个进程同时使用TCP通信工具,TCP提供了一组地址或每个主机中的端口。与Internet通讯层中的网络和主机地址相连,形成一个套接字。一对套接字唯一地标识每个连接。
Ron Maupin

84

打个比方

尽管上面已经为套接字提供了很多技术资料……我想补充一下我的答案,以防万一,如果有人仍然感觉不到ip,port和sockets之间的区别

考虑服务器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的。
巨石

44

首先,我认为我们应该从对从A到B的数据包的构成的理解开始。

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

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

除其他事项外,TCP包含端口的概念。这些实际上是Internet套接字(AF_INET)可以绑定到的同一IP地址上的不同数据终结点。

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

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

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

现在,我们需要看一下如何从应用程序的角度与外界进行通信。为此,您需要询问您的操作系统,并且由于大多数操作系统都支持Berkeley Sockets的工作方式,因此我们看到我们可以通过以下应用程序创建涉及端口的套接字:

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是一个Internet套接字。
  • Unix套接字是文件系统中表示的IPC端点,例如/var/run/database.sock
  • 套接字API是一种请求应用程序能够向套接字读取和写入数据的方法。

瞧!那把事情整理了。因此,在我们的方案中,

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

因此,实际上,端口是形成Internet套接字的要求的一部分。不幸的是,恰好发生了“插座”一词的含义被应用到几种不同的想法。因此,我衷心建议您为下一个项目套接字命名,以免造成混乱;)


这就是为什么子弹不会离开,也不会离开Powerpoint的原因。他们工作!
Anurag Kalia

关于tcp-ip和网络通信的很好的介绍。初学者,请先阅读此内容。
柯林

32

套接字= IP地址+端口(数字地址)
它们共同标识了计算机上网络连接的端点。(我刚刚使网络101失效了吗?)


7
我相信port的含义比您的定义更广泛。
理查德·多曼

2
套接字不仅受TCP / IP堆栈的约束。通常,请参见UNIX域套接字或进程间通信套接字。
matthias krull

不知道这个答案。您可以使用HTTP通过套接字与另一个进程进行通信,而无需分配端口。
SeF

31

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

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

例如,HTTP即服务在端口80上运行。

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


每个插座都需要它自己的端口吗?
2014年

太棒了 呈现山区知识的最简单方法。
Asif Mehmood,2015年

5
我不确定您的说法是否正确:“服务器为每个连接创建套接字以维护其客户端”。
Rushi Agrawal

1
@RushiAgrawal然后我建议你查一下。具体来说,看男人接受。
user207421

1
这意味着对于服务器为每个连接创建的用于维护其客户端的每个套接字,可以具有相同的端口号(例如用于HTTP连接继续的端口80),但是具有从其发送连接请求的客户端的不同IP地址。对?
Randika Vishman

25

似乎有很多答案将插座等同于两台PC之间的连接。我认为这是绝对不正确的。套接字一直是1台PC上的端点,它可以连接也可以不连接-肯定在某个时候我们都使用了监听器或UDP套接字*。重要的是它是可寻址且活跃的。向1.1.1.1:1234发送消息不太可能,因为没有为该端点定义套接字。

套接字是特定于协议的-因此TCP / IPUDP / IP使用的唯一性实现*(ipaddress:port)与IPX(网络,节点和... ahem,套接字)不同-但有所不同而不是一般的“套接字”一词所表示的IPX套接字号。但是,它们都提供了唯一的可寻址端点。

由于IP已成为主要协议,因此端口(以网络术语而言)已与UDP或TCP端口号(该套接字地址的一部分)同义。

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

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


25

简短简短的回答。

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

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


3
在端口描述中,“内部”一词在我看来听起来像是“非公开”。
乔纳斯N

那么我们能说:套接字在端口内部运行吗?还是Port在Socket内部运行?
Gucho Ca

@GuchoCa我们不能说套接字或端口都在运行,更不用说一个在另一个内部了。不清楚你在问什么。
user207421 '16

16

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


对于最一般的答案,请选择“通过获取端口和主机名或网络适配器并将它们组合成一个。” 例如,UNIX套接字(以代码形式)是可用于发送或接收数据的数据结构(或对象)。
JosiahYoder无效,.. 16/09/22

14

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

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

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

注意:

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

希望它消除您的疑虑


有趣的是,在此问题下,对套接字/端口/ ip地址的所有这些理解和类比非常有趣。我喜欢这个答案。
Bloodmoon

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

12

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

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

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


没有将两个套接字绑定在一起的事情。“绑定”一词表示带有端口的其他内容。
user207421 '19

10

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

在TCP / IP套件中,例如:

{tcp,193.44.234.3,12345}

对话是两个过程之间的通信链接,因此描述了两个过程之间的关联。关联是5元组,它完全指定了组成连接的两个进程:{协议,本地地址,本地进程,外部地址,外部进程}

在TCP / IP套件中,例如:

{tcp,193.44.234.3,1500,193.44.234.5,21}

可能是有效的关联。

半关联为:{协议,本地地址,本地进程}

要么

{协议,外来地址,外来程序}

指定每个连接的一半。

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


这个答案就是为我做的。我猜是因为没有人提到联想这个词。很好的解释。
Rationalcoder

您的任何示例中都没有进程号。您要查找的单词是“端口”。
user207421 '16

阅读第一段。那里有明确提及。引用确切的短语让我知道是否有任何歧义。
克里希纳

7

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

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


2
这是不正确的。套接字不是端点。一个套接字由两个端点定义。每个端点由网络地址和端口定义。端口的目的是区分同一网络地址上的多个端点,以便可以支持多个并发套接字。
Peter Wone

1
我注意到RFC793(原始TCP规范)确实将网络地址和端口的组合称为套接字,因此我可以看到在何处获得此套接字,但这仍然是不正确的,因为套接字必须由两个端点定义。
Peter Wone

2
经过反思,文学是矛盾的,我对此表示歉意。严格来说,只有在两个端点(也称为套接字)之间建立TCP连接后,才会发生通信,每个端点都由网络地址和端口标识。我放弃。
Peter Wone

6

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

  • ip和端口〜电话号码
  • 插座〜手机设备
  • 连接〜电话
  • 建立联系〜拨打电话
  • 流程,远程应用〜人
  • 讯息〜言语

明确说明(尤其是当您考虑电话交换历史记录是网络术语基础的一部分时。)
oɔɯǝɹ2016年

看一下netstat显示器。从侦听套接字接受的所有套接字共享同一端口。因此,端口不是套接字的唯一标识符。
user207421 '17

6

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


5

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

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

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

看一看TCP / IP术语


3
这个套接字的描述很不合理。套接字是关于一对元组之间的连接的,其中元组指的是IP ADDR和端口对。另外,许多插座可以连接到同一端口。您如何看待Web服务器在端口80上建立多个连接?这是一个不好的答案
高个子杰夫(Jeff)

1
抱歉。多个套接字未连接到端口80。一个套接字已连接,并在实际传输发生的地方生成了其他套接字。参见opengroup.org/onlinepubs/009695399/functions/listen.html
S.Lott

1
实际上,opengroup.org / onlinepubs / 009695399 / functions / connect.html上的描述更好。由连接返回的对等套接字
不在

1
该帖子在某些细节上是错误的,并且在几个方面都具有误导性。
Peter Wone

@Peter Wone:哪些细节?哪些方面?希望从我的错误中学习。
S.Lott

5

Oracle Java教程

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


那只是一个教程,当然不是规范性参考。
user207421

“套接字是双向通信链接的一个端点”这不是套接字定义,不是Java教程吗?
祈祷之

@prayagupd当然,这是一个定义,但这是来自教程而不是规范。
user207421

4

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

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

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

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

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

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

同样,其他部门也将雇用员工在其下工作,它们类似于套接字。


3

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

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


3

问题所隐含的是我假设的相对TCP / IP术语。用外行的话来说:

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

另一方面,SOCKET更像是一对彼此通话的房屋的电话之间建立的电话。可以在同一城镇的房屋之间或不同城镇的两座房屋之间建立这些呼叫。SOCKET就是这对相互通话的电话之间的临时建立路径。


2
套接字是端点。它在建立连接(TCP)之前或不存在连接(UDP)时存在。因此,它本身不是连接。
user207421

2

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

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


2

已经对该问题给出了理论答案。我想为这个问题提供一个实际的例子,这将清除您对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。因为Web服务器在TCP端口80上运行,所以这两个套接字都是TCP套接字,而如果要连接到在UDP端口上运行的服务器,则服务器套接字和客户端套接字都将是UDP套接字。


质量引用非常差。第三段误用了“套接字”一词,就好像它意味着“ IP地址”一样。没有。
2016年

2

套接字是内核为用户应用程序提供的用于数据I / O的抽象。套接字类型是由协议的处理方式,IPC通信等定义的。因此,如果有人创建了TCP套接字,他可以通过简单的方法以及较低级别的协议处理(例如TCP转换和将数据包转发到较低级别的网络协议是由内核中的特定套接字实现完成的。优点是用户不必担心处理协议特定的问题,而应该像普通缓冲区一样向套接字读取和写入数据。对于IPC,情况也是如此,用户只需向套接字读取和写入数据,内核便会根据创建的套接字类型处理所有较低级别的详细信息。

与IP一起使用的端口就像为套接字提供地址,尽管它不是必需的,但它有助于网络通信。


2

单个端口可以具有一个或多个与不同外部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

2

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

端口只是您要建立通信时指定的套接字的属性。要从套接字接收数据包,必须将其绑定到特定的本地端口和NIC(具有本地IP地址)或所有NIC(bind调用中指定了INADDR_ANY)。要发送数据包,您必须指定远程套接字的端口和IP。



1

港口:

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

插座:

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


TCP或UDP端口既不引用任何物理端口,也不引用以太网连接点。您尚未回答问题。
user207421

1

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

也可以看看:

史蒂文斯(WR),1998年,UNIX网络编程:网络API:套接字和XTI;第1卷,Prentice Hall。
史蒂文斯(WR),1994年,《 TCP / IP图解》,第1卷:协议,Addison-Wesley。

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.