这是我组织中的一位软件工程师提出的问题。我对最广泛的定义感兴趣。
答案 0 :(得分:874)
答案 1 :(得分:170)
套接字由三件事组成:
端口是介于1和65535之间的数字,表示设备中的逻辑门。 客户端和服务器之间的每个连接都需要一个唯一的套接字。
例如:
答案 2 :(得分:91)
套接字表示两个网络应用程序之间的单个连接。这两个应用程序名义上运行在不同的计算机上,但套接字也可用于单个计算机上的进程间通信。应用程序可以创建多个套接字以便相互通信。套接字是双向的,这意味着连接的任何一端都能够发送和接收数据。 因此,理论上可以在2个以上的OSI模型的任何级别创建套接字。程序员经常在网络编程中使用套接字,尽管是间接的。像Winsock这样的编程库隐藏了许多套接字编程的低级细节。自20世纪80年代初以来,插座已广泛使用。
端口表示网络通信的端点或“通道”。端口号允许同一台计算机上的不同应用程序利用网络资源而不会相互干扰。端口号最常出现在网络编程中,尤其是套接字编程。但是,有时候,临时用户可以看到端口号。例如,某人在Internet上访问的某些网站使用如下URL:
http://www.mairie-metz.fr:8080/在此示例中,数字8080是指Web浏览器用于连接到Web服务器的端口号。通常,网站使用端口号80,并且该号码不需要包含在URL中(尽管可以)。
在IP网络中,端口号理论上可以在0到65535之间。但是,大多数流行的网络应用程序使用范围低端的端口号(例如HTTP为80)。
注意:术语端口也指网络技术的其他几个方面。端口可以指外围设备的物理连接点,例如串行端口,并行端口和USB端口。术语端口还指某些以太网连接点,例如集线器,交换机或路由器上的连接点。
ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm
ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm
答案 3 :(得分:67)
有些类比
虽然上面已经为套接字提供了很多技术内容 ... 我想补充一下我的答案,以防万一,如果有人仍然感觉不到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
我希望它可以帮助那些仍然感到困惑的人 :)
答案 4 :(得分:43)
第一,我认为我们应该首先了解从A到B获取数据包的原因。
网络的一个常见定义是使用OSI Model,它根据目的将网络分成多个层。有几个重要的,我们将在这里介绍:
AF_INET
)可以绑定的同一IP地址上的不同数据端点。
碰巧,so too does UDP和其他传输层协议。它们在技术上不需要 来配置端口,但是这些端口确实为上面的层中的多个应用程序提供了一种方法,可以使用同一台计算机来接收(并且实际上)传出连接。
这使我们了解TCP或UDP连接的解剖。每个都具有源端口和地址,以及目标端口和地址。这样,在任何给定的会话中,目标应用程序都可以从源响应和接收。
因此,端口本质上是一种规范要求的方式,允许多个并发连接共享相同的地址。
现在,我们需要了解一下从应用程序角度到外部世界的沟通方式。要做到这一点,你需要请求你的操作系统,因为大多数操作系统都支持伯克利套接字的工作方式,我们看到我们可以创建一个涉及来自这样的应用程序的端口的套接字:
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);
也是可能的。呃,那是在工作中抛出一把扳手!
好吧,实际上它没有。我们需要做的就是提出一些合适的定义:
/var/run/database.sock
。瞧!整理的东西。那么在我们的方案中,
所以真正的端口是形成互联网套接字的要求的一个子集。不幸的是,恰恰相反,单词socket的含义已经应用于几个不同的想法。所以我衷心建议你为下一个项目套接字命名,只是为了增加混乱;)
答案 5 :(得分:28)
套接字= IP地址+端口(数字地址)
它们共同确定了计算机上网络连接的终点。 (我刚刚在网络上失败了吗?)
答案 6 :(得分:26)
一般来说,你会得到很多理论,但区分这两个概念的最简单方法之一如下:
要获得服务,您需要一个服务号码。此服务编号称为端口。就这么简单。
例如,HTTP作为服务正在端口80上运行。
现在,很多人都可以请求服务,并建立了来自客户端 - 服务器的连接。会有很多联系。每个连接代表一个客户端。为了维护每个连接,服务器为每个连接创建一个套接字以维护其客户端。
答案 7 :(得分:24)
似乎有很多答案将插座与2台PC之间的连接等同起来......我认为绝对不正确。套接字一直是1台PC上的端点,可能连接也可能没有连接 - 当然我们在某些时候都使用了监听器或UDP套接字*。重要的是它是可寻址和活跃的。发送消息到1.1.1.1:1234不太可能,因为没有为该端点定义套接字。
套接字是特定于协议的 - 因此TCP / IP和UDP / IP使用*(ipaddress:port)的唯一性实现与例如不同。,IPX(网络,节点和... ahem,套接字 - 但是与一般“套接字”术语不同的套接字.IPX套接字号等同于IP端口)。但是,它们都提供了一个独特的可寻址端点。
由于IP已成为主导协议,因此端口(在网络术语中)已成为UDP或TCP端口号的同义词 - 这是套接字地址的一部分。
UDP是无连接的 - 意味着永远不会在两个端点之间创建虚拟电路。但是,我们仍然将UDP sockets称为端点。 API函数清楚地表明两者都只是不同类型的套接字 - SOCK_DGRAM
是UDP(只是发送消息)而SOCK_STREAM
是TCP(创建虚拟电路)。
从技术上讲,IP标头保存IP地址,IP(UDP或TCP)之上的协议保存端口号。这使得其他协议(例如ICMP没有端口号,但确实有IP地址信息)成为可能。
答案 8 :(得分:24)
简短的回答。
端口可以在标识程序或进程的主机中被描述为内部地址。
套接字可以描述为编程接口,允许程序与其他程序或进程,Internet或本地进行通信。
答案 9 :(得分:16)
它们来自两个不同的域:'port'是TCP / IP网络的概念,'socket'是API(编程)的东西。通过获取端口和主机名或网络适配器并将它们组合成可用于发送或接收数据的数据结构,在代码中创建“套接字”。
答案 10 :(得分:12)
; using desktop calculator in hex mode
; ecx = 002030405h ;decimal 2345
; eax = 002070809h ;decimal 2789
add ecx,eax ;ecx = 0040A0C0Eh
add ecx,0F6F6F6F6h ;ecx = 0FB010304h ;F6 does carries
mov eax,ecx ;eax = 0FB010304h
and eax,060606060h ;eax = 060000000h ;eax = value to subtract
shr eax,004 ;eax = 006000000h ; for the non carries
and ecx,00F0F0F0Fh ;ecx = 00B010304h ;clear any 'F's
sub ecx,eax ;ecx = 005010304h ;fix the non carries
;ecx = decimal 5134
当2个套接字绑定在一起时发生连接。
答案 11 :(得分: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 :(得分: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系统引入的。虽然它尚未标准化,但它已成为事实上的行业标准。
答案 13 :(得分:6)
端口是最简单的部分,它只是套接字的唯一标识符。套接字是进程可用于建立连接和相互通信的东西。高杰夫有一个很好的电话类比并不完美,所以我决定解决它:
答案 14 :(得分:5)
应用程序由通过网络进行通信的一对进程(客户端 - 服务器对)组成。这些进程通过名为 socket 的软件接口向网络发送消息和从网络接收消息。考虑到“计算机网络:自上而下的方法”一书中提到的类比。有一所房子想与其他房子沟通。在这里,房子类似于一个过程,以及一个插座的门。发送过程假设门的另一侧有一个基础设施将数据传输到目的地。一旦消息到达另一侧,它就会通过接收器的门(插座)进入房屋(进程)。同一本书中的这个插图可以帮助你:
套接字是传输层的一部分,它为应用程序提供逻辑通信。这意味着从应用程序的角度来看,两个主机直接相互连接,即使它们之间有许多路由器和/或交换机。因此套接字本身不是连接,它是连接的终点。传输层协议仅在主机上实现,而不在中间路由器上实现
端口为计算机提供内部寻址方式。其主要目的是允许多个进程通过网络发送和接收数据,而不会干扰其他进程(其数据)。所有插座都提供端口号。当段到达主机时,传输层检查段的目标端口号。然后它将段转发到相应的套接字。将传输层段中的数据传递到正确套接字的工作称为解复用。然后,段的数据被转发到连接到套接字的进程。
答案 15 :(得分:5)
套接字是软件中的结构。它或多或少是一个文件;它具有读写操作。这不是物质的东西;它是您的软件引用物理内容的一种方式。
端口是类似设备的东西。每个主机都有一个或多个网络(那些是物理网络);主机在每个网络上都有一个地址。每个地址可以有数千个端口。
仅一个套接字可能正在使用地址处的端口。套接字分配端口,就像为文件系统I / O分配设备一样。分配端口后,没有其他套接字可以连接到该端口。当套接字关闭时,端口将被释放。
答案 16 :(得分:5)
套接字是网络上运行的两个程序之间的双向通信链路的一个端点。套接字绑定到端口号,以便TCP层可以识别数据发往的应用程序。
答案 17 :(得分:4)
可以将端口和套接字与银行分行进行比较。
“银行”的建筑物编号类似于IP地址。 银行有不同的部分,如:
所以1(储蓄账户部门),2(个人贷款部门),3(住房贷款部门)和4(申诉部门)是港口。
现在让我们说你去开一个储蓄账户,你去银行(IP地址),然后你去“储蓄账户部门”(端口号1),然后你遇到一个在“储蓄账户部门“。我们称他为SAVINGACCOUNT_EMPLOYEE1开户。
SAVINGACCOUNT_EMPLOYEE1是您的套接字描述符,因此可能存在 SAVINGACCOUNT_EMPLOYEE1到SAVINGACCOUNT_EMPLOYEEN。这些都是套接字描述符。
同样地,其他部门将在其下工作,他们类似于插座。
答案 18 :(得分:4)
这些是基本的网络概念,因此我将以一种简单而全面的方式来解释它们,以详细了解它们。
因此,网络中的套接字是绑定到一对(ip,port)=(address,service)的虚拟通信设备。
注意:
希望它可以消除您的疑虑
答案 19 :(得分:3)
相关的TCP / IP术语是我假设的问题所暗示的。通俗地说:
PORT就像特定邮政编码中特定房屋的电话号码。该镇的邮政编码可以被认为是该镇的IP地址和该镇的所有房屋。
另一方面,SOCKET更像是一对房屋的电话之间建立的电话呼叫。这些电话可以在同一个城镇的房屋或不同城镇的两栋房屋之间建立。这是在这对手机之间建立的临时通道,即SOCKET。答案 20 :(得分:3)
套接字是通信端点。套接字与TCP / IP协议族不直接相关,它可以与您的系统支持的任何协议一起使用。 C套接字API期望您首先从系统获取一个空白套接字对象,然后您可以绑定到本地套接字地址(直接检索无连接协议的传入流量或接受面向连接的协议的传入连接请求)或者您可以连接到远程套接字地址(对于任何一种协议)。如果要同时控制套接字绑定的本地套接字地址和套接字连接的远程套接字地址,您甚至可以同时执行这两种操作。对于无连接协议,连接套接字甚至是可选的,但是如果你不这样做,你还必须传递目标地址和你要通过套接字发送的每个数据包,因为套接字知道在哪里发送这个数据到了?优点是您可以使用单个套接字将数据包发送到不同的套接字地址。一旦配置了套接字并且甚至可以连接,请将其视为双向通信管道。您可以使用它将数据传递到某个目标,某个目标可以使用它将数据传回给您。您写入套接字的内容将被发送出去,已收到的内容可供阅读。
另一方面,端口只是TCP / IP协议栈的某些协议所具有的。 TCP和UDP数据包有端口。端口只是一个简单的数字。源端口和目标端口的组合标识两个主机之间的通信通道。例如。你可能有一台服务器,一个简单的HTTP服务器和一个简单的FTP服务器。如果现在一个数据包到达该服务器的地址,它将如何知道这是HTTP或FTP服务器的数据包?好吧,它会知道HTTP服务器将在端口80和端口21上的FTP服务器上运行,因此如果数据包到达目标端口80,则它用于HTTP服务器而不用于FTP服务器。该数据包还有一个源端口,因为没有这样的源端口,服务器一次只能有一个连接到一个IP地址。源端口使服务器可以区分其他相同的连接:它们都具有相同的目的端口,例如:端口80,相同的目标IP,始终是相同的服务器地址和相同的源IP,因为它们都来自同一客户端,但由于它们具有不同的源端口,因此服务器可以将它们彼此区分开。当服务器发回回复时,它会对请求来自的端口这样做,这样客户端也可以区分它收到的不同回复。
答案 21 :(得分:2)
这个问题已经得到了理论上的答案。我想对这个问题给出一个实际的例子,这将清楚你对Socket和Port的理解。
我发现它here
此示例将引导您通过连接到网站(例如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套接字。
答案 22 :(得分: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
答案 23 :(得分:2)
Socket是内核为数据I / O的用户应用程序提供的抽象。套接字类型由其处理的协议,IPC通信等定义。因此,如果某人创建了TCP套接字,他可以进行操作,例如将数据读取到套接字并通过简单的方法将数据写入其中,以及较低级别的协议处理,如TCP转换和将数据包转发到较低级别的网络协议是由内核中的特定套接字实现完成的。优点是用户不必担心处理特定于协议的特性,并且应该像普通缓冲区一样读取和写入数据到套接字。在IPC的情况下也是如此,用户只是读取和写入数据到套接字,内核根据创建的套接字类型处理所有较低级别的细节。
与IP一起使用端口就像为套接字提供地址一样,虽然没有必要,但它有助于网络通信。
答案 24 :(得分:2)
从广义上讲, 插座 - 只是一个插座,就像你的电器,电缆或电话插座一样。 “必要的东西”(电源,信号,信息)可以从中出来并进入的点。它隐藏了很多详细的东西,这对于使用“必需的东西”来说并不是必需的。用软件的说法,它提供了一种定义两个实体之间通信机制的通用方法(这些实体可以是任何东西 - 两个应用程序,两个物理上独立的设备,操作系统中的用户和内核空间等)
端口是端点鉴别器。它将一个端点与另一个端点区分开来在网络级别,它将一个应用程序与另一个应用程序区分开来,以便网络堆栈可以将信息传递给相应的应用程序。
答案 25 :(得分:2)
套接字是一种数据I / O机制。端口是通信协议的契约概念。没有端口的套接字可以存在。端口可以存在于特定套接字中(例如,如果同一端口上有多个套接字处于活动状态,某些协议可能允许这样做。)
一个端口用于确定接收器应该将数据包路由到哪个套接字,具有许多协议,但并不总是需要,并且接收套接字选择可以通过其他方式完成 - 端口完全是由网络子系统中的协议处理程序。例如如果协议不使用端口,数据包可以转到所有侦听套接字或任何套接字。
答案 26 :(得分:1)
我知道有很多解释。但是,通过实际例子,还有一种更容易理解的方法。我们都可以连接到HTTP端口80,但它是否意味着一次只有一个用户可以连接到该端口?答案显然是“不”。出于多种目的的多个用户可以访问HTTP端口80但他们仍然可以从服务器获得他们正在等待的正确响应吗?现在考虑一下,怎么样? 是的,您的 IP地址是唯一标识为不同目的而联系的不同用户的。如果您在到达此处之前已经阅读了之前的答案,您就会知道IP地址是套接字所包含的信息的一部分。想一想,是否可以进行没有插座的通信?答案是'是'但你不能在一个端口运行多个应用程序,但我们知道我们不是一个转储器。只在硬件上运行的交换机。
答案 27 :(得分:1)
端口:
端口可以指代物理连接点 用于外围设备,如串行,并行和USB端口。 术语端口也指某些以太网连接点,s 与集线器,交换机或路由器上的那些相同。
插口:
套接字表示两个网络应用程序之间的单个连接。 这两个应用程序名义上运行在不同的计算机上, 但是套接字也可以用于单个计算机上的进程间通信。 应用程序可以创建多个套接字以便相互通信。 套接字是双向的,这意味着连接的任何一端都能够发送和接收数据。
答案 28 :(得分:1)
套接字基本上是网络通信的端点,至少包括IP地址和端口。在Java / C#中,套接字是双向连接一端的更高级实现。
此外,Java documentation中的定义。
答案 29 :(得分:0)
端口表示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。
答案 30 :(得分:0)
Socket是网络端点的SW抽象,用作应用程序的接口。在Java中,C#由对象表示;在Linux中,Unix由文件表示。
端口只是您要建立通信时指定的套接字的属性。要从套接字接收数据包,必须将其绑定到特定的本地端口和NIC(具有本地IP地址)或所有NIC(bind调用中指定了INADDR_ANY)。要发送数据包,必须指定远程套接字的端口和IP。
答案 31 :(得分:0)
呃……太多人将套接字概念与双端点通信联系起来,主要是在 TCP/IP 协议上。但是:
关于端口概念,您在其他答案中读到的内容是正确的。端口主要用于 TCP 或 UDP 数据包中的数值(2 个字节,0-65535)。让我强调一下,TCP 或 UPD 不一定在 IP 之上使用。所以:
答案 32 :(得分:-1)
尽可能简单,套接字和端口之间没有物理差异,例如PATA和SATA之间存在差异。它们只是软件读写NIC的一部分。
端口本质上是一个 public 套接字,其中一些是众所周知/被广泛接受的,通常的例子是80,专用于HTTP。任何想要使用某种协议(在这种情况下使用HTTP)交换流量的人都会正常地转到端口80.当然,80不是物理专用于HTTP(它不是物理上的任何东西,它& #39; s只是一个数字,一个逻辑值),并且可以在某个特定的机器上用于其他一些协议随意,只要那些尝试连接的人知道使用哪个协议(可能非常私密)。 p>
套接字本质上是一个私有端口,为连接方已知的特定目的而建立,但不一定为其他人所知。底层的传输层通常是TCP或UDP,但它并非必须如此。基本特征是两端都知道发生了什么,无论可能是什么。
这里的关键是当在某个端口上收到连接请求时,回复握手包括有关为特定请求者提供服务而创建的套接字的信息。后续通信通过该(专用)套接字连接进行,而不是服务继续侦听连接请求的公共端口连接。
答案 33 :(得分:-1)
端口是网络协议用于访问连接主机的实体。端口可以是特定于应用的或与特定通信介质相关。不同的协议使用不同的端口来访问主机,例如HTTP使用端口80或FTP使用端口23.您可以在应用程序中分配用户定义的端口号,但它们应该高于1023.
端口打开与所需主机的连接,而套接字是网络间或进程间通信中的端点。 套接字由系统通过API(应用程序编程接口)分配。
可以说一个更微妙的区别,当系统重新启动时,端口将存在,而套接字将被销毁。
答案 34 :(得分:-1)
为本地地址+本地端口+对等地址+对等端口提供连接套接字(fd)。通过套接字摘要处理recv /发送数据。 为本地地址+本地侦听端口提供侦听套接字(fd)。进程可以通过套接字接受新连接。
答案 35 :(得分:-4)
套接字允许在一个应用程序中进行两个应用程序之间的通信 机器或两台机器。实际上它就像门。如果门打开可以 是门内的过程或应用程序之间的连接 在门外。
有四种类型的套接字:
套接字主要用于客户端 - 服务器应用程序。端口标识网络地址上的不同端点。它包含一个数值。总的来说,套接字是端口和网络地址的组合。