这是我组织中的一位软件工程师提出的问题.我对最广泛的定义感兴趣.
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提出这个问题之前,我一直在这种误解中努力工作.
经过大量的阅读和思考,我现在相信,使用带有两个参数LocalEndpoint和RemoteEndpoint的构造函数来创建类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
由于套接字是连接的端点,因此有两个带有地址/端口组合的套接字,207.38.110.62:80
另外两个带有地址/端口组合54.252.94.236:80
.
我认为Hagrawal的误解源于我非常谨慎地使用"识别"这个词.我的意思是"完全,明确和唯一地识别".在上面的示例中,有两个端点与地址/端口组合54.252.94.236:80
.如果只有地址和端口,则没有足够的信息来区分这些插槽.识别套接字的信息不足.
RFC793第2.7节第2段说
连接由末端的一对插座完全指定.本地套接字可以参与到不同外部套接字的许多连接.
从编程角度来看,套接字的这种定义是没有用的,因为它与套接字对象不同,套接字对象是特定连接的端点.对于程序员而言,这个问题的大多数观众都是程序员,这是一个至关重要的功能差异.
TCP-IP Illustrated Volume 1 The Protocols,W.Richard Stevens,1994 Addison Wesley
RFC793,南加州大学信息科学研究所,DARPA
RFC147,插座的定义,Joel M. Winett,林肯实验室
套接字由三件事组成:
一个IP地址
传输协议
端口号
端口是1到65535之间的数字,表示设备中的逻辑门.客户端和服务器之间的每个连接都需要唯一的套接字.
例如:
1030是一个港口.
(10.1.1.2,TCP,端口1030)是一个套接字.
套接字表示两个网络应用程序之间的单个连接.这两个应用程序名义上运行在不同的计算机上,但套接字也可用于单个计算机上的进程间通信.应用程序可以创建多个套接字以便相互通信.套接字是双向的,这意味着连接的任何一端都能够发送和接收数据.因此,理论上可以在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
用一些比喻
虽然上面已经为插座提供了很多技术方面的东西......我想补充一下我的答案,以防万一,如果有人仍然感觉不到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
我希望它可以帮助仍然困惑的人:)
第一,我认为我们应该首先了解从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...
大!所以在sockaddr
结构中,我们将指定我们的端口和bam!任务完成!差不多,除了:
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
也是可能的.呃,那是在工作中抛出一把扳手!
好吧,实际上它没有.我们需要做的就是提出一些适当的定义:
互联网套接字是IP地址,协议及其相关端口号的组合,服务可以在其上提供数据.所以tcp端口80,stackoverflow.com是一个互联网套接字.
unix套接字是文件系统中表示的IPC端点,例如/var/run/database.sock
.
套接字API是一种请求应用程序能够读取和写入数据到套接字的方法.
瞧!整理的东西.那么在我们的方案中,
端口是数字标识符,作为传输层协议的一部分,它标识应响应给定请求的服务号.
所以真正的端口是形成互联网套接字的要求的一个子集.不幸的是,恰恰相反,单词socket的含义已经应用于几个不同的想法.所以我衷心建议你为下一个项目套接字命名,只是为了增加混乱;)
套接字= IP地址+端口(数字地址)
它们一起标识计算机上网络连接的端点.(我刚刚收到网络101?)
通常,您将获得大量理论,但区分这两个概念的最简单方法之一如下:
要获得服务,您需要一个服务号码.此服务编号称为端口.就那么简单.
例如,HTTP作为服务在端口80上运行.
现在,许多人可以请求服务并且建立了来自客户端 - 服务器的连接.会有很多联系.每个连接代表一个客户端.为了维护每个连接,服务器为每个连接创建一个套接字以维护其客户端.
似乎有很多答案将插座与2台PC之间的连接等同起来......我认为绝对不正确.套接字一直是1台PC上的端点,可能连接也可能没有连接 - 当然我们在某些时候都使用过监听器或UDP套接字*.重要的是它是可寻址和活跃的.发送消息到1.1.1.1:1234不太可能,因为没有为该端点定义套接字.
套接字是特定于协议的 - 因此TCP/IP和UDP/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寻址信息).
简短的回答.
甲端口可以被描述为一个内部地址标识的程序或处理的宿主内.
甲插座可以被描述为一个编程接口,允许一个程序来与其他程序或进程,或局部通信,在互联网上.
它们来自两个不同的域:'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 ...
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就像您的电话号码(即插座的地址)
港口就像您要与之交谈的人(即您要从该地址订购的服务)
套接字可以是客户端或服务器套接字(即,在公司中,客户支持的电话是服务器,但是您家中的电话主要是客户端)
因此,网络中的套接字是绑定到一对(ip,port)=(address,service)的虚拟通信设备。
注意:
机器,计算机,主机,移动设备或PC可以具有多个地址,多个打开的端口,因此可以具有多个插槽。就像在办公室中一样,您可以使用多部电话同时使用多个电话号码和多个人进行通话。
开放/活动端口的存在必须使您绑定一个套接字,因为它是使端口可访问的套接字。但是,您可能暂时没有使用端口。
还要注意,在服务器套接字中,您可以将其绑定到(端口,机器的特定地址)或(端口,机器的所有地址),就像在电话中,您可以将许多电话线(电话号码)连接到一个电话或一条特定的电话线连接到电话,您仍然可以通过所有这些电话线或特定的电话线与某人联系。
您不能像在电话中那样将插座与两个端口关联(绑定),通常不能总是让两个人同时使用同一部电话。
高级:在同一台计算机上,您不能拥有两个具有相同类型(客户端或服务器)以及相同端口和IP的套接字。但是,如果您是客户端,则可以打开到服务器的两个连接(带有两个套接字),因为这些客户端的每个套接字中的本地端口都不相同)
希望它消除您的疑虑
端口是最简单的部分,它只是套接字的唯一标识符.套接字是进程可用于建立连接和相互通信的东西.高杰夫有一个很好的电话类比,这是不完美的,所以我决定解决它:
ip和port~电话号码
socket~电话设备
连接〜电话
建立连接〜呼叫号码
流程,远程应用〜人
消息〜言论
套接字是软件中的结构.它或多或少是一个文件; 它具有读写操作.这不是物质的东西; 这是您的软件引用物理事物的一种方式.
端口是类似设备的东西.每个主机都有一个或多个网络(那些是物理网络); 主机在每个网络上都有一个地址.每个地址可以有数千个端口.
一个插槽只能使用一个地址的端口.套接字分配端口,就像为文件系统I/O分配设备一样.分配端口后,没有其他套接字可以连接到该端口.当套接字关闭时,将释放该端口.
看一下TCP/IP术语.
来自Oracle Java教程:
套接字是网络上运行的两个程序之间的双向通信链路的一个端点.套接字绑定到端口号,以便TCP层可以标识要发送到的数据的应用程序.
应用程序由通过网络进行通信的一对进程(客户端 - 服务器对)组成.这些进程通过称为套接字的软件接口向网络发送消息和从网络接收消息.考虑到"计算机网络:自上而下的方法"一书中提到的类比.有一所房子想与其他房子沟通.在这里,房子类似于一个过程,以及一个插座的门.发送过程假设门的另一侧有一个基础设施将数据传输到目的地.一旦消息到达另一侧,它就会通过接收器的门(插座)进入房屋(进程).同一本书中的这个插图可以帮助您:
套接字是传输层的一部分,它为应用程序提供逻辑通信.这意味着从应用程序的角度来看,两个主机直接相互连接,即使它们之间有许多路由器和/或交换机.因此套接字本身不是连接,它是连接的终点.传输层协议仅在主机上实现,而不在中间路由器上实现.
端口为机器提供内部寻址方式.其主要目的是允许多个进程通过网络发送和接收数据,而不会干扰其他进程(其数据).所有插座都提供端口号.当段到达主机时,传输层检查段的目标端口号.然后它将段转发到相应的套接字.将传输层段中的数据传递到正确的套接字的这项工作称为解复用.然后,段的数据被转发到连接到套接字的进程.