1061

This was a question raised by one of the software engineers in my organisation. I'm interested in the broadest definition.

4

36 回答 36

1096

概括

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

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

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

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

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

博览会

这是一个有趣的问题,它迫使我重新审视一些我认为我完全了解的事情。您可能会认为“socket”之类的名称是不言自明的:显然选择它是为了唤起您插入网络电缆的端点的图像,具有强大的功能相似性。然而,用网络术语来说,“socket”这个词承载了太多的包袱,以至于需要仔细重新检查。

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

出于讨论的目的,我将把考虑限制在 TCP-IP 网络的上下文中。OSI 模型非常好,但从未完全实施,更不用说在高流量高压力条件下广泛部署。

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

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

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

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

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

在大多数 C 派生语言中,TCP 连接是使用 Socket 类实例上的方法建立和操作的。尽管在更高的抽象级别上操作很常见,通常是 NetworkStream 类的实例,但这通常会公开对套接字对象的引用。对于编码人员来说,这个套接字对象似乎代表了连接,因为连接是使用套接字对象的方法创建和操作的。

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

所有这一切都有点令人困惑,并让您相信套接字是一个连接,这是胡说八道。在理查德·多尔曼问这个问题之前,我一直在这种误解下苦苦挣扎。

经过大量阅读和思考,我现在确信拥有一个带有构造函数的类TcpConnection会更有意义,该构造函数带有两个参数,LocalEndpointRemoteEndpoint。当本地端点可以接受默认值时,您可能支持单个参数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.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 节的第二段说

连接完全由两端的套接字对指定。本地套接字可能参与到不同外部套接字的许多连接。

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

@plugwash 做了一个突出的观察。

根本问题是 TCP RFC 对 socket 的定义与所有主要操作系统和库使用的 socket 定义相冲突。

根据定义,RFC 是正确的。当图书馆滥用术语时,这不会取代 RFC。相反,它给该图书馆的用户施加了理解两种解释并小心措辞和上下文的责任负担。如果 RFC 不同意,则最新且最直接适用的 RFC 优先。

参考

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

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

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

于 2008-09-30T12:40:19.480 回答
200

一个套接字由三部分组成:

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

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

例如:

  • 1030是一个端口。
  • (10.1.1.2 , TCP , 端口 1030) 是一个套接字。
于 2012-08-02T17:10:13.293 回答
121

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. Therefore a socket can be created theoretically at any level of the OSI model from 2 upwards. Programmers often use sockets in network programming, albeit indirectly. Programming libraries like Winsock hide many of the low-level details of socket programming. Sockets have been in widespread use since the early 1980s.

A port represents an endpoint or "channel" for network communications. Port numbers allow different applications on the same computer to utilize network resources without interfering with each other. Port numbers most commonly appear in network programming, particularly socket programming. Sometimes, though, port numbers are made visible to the casual user. For example, some Web sites a person visits on the Internet use a URL like the following:

http://www.mairie-metz.fr:8080/ In this example, the number 8080 refers to the port number used by the Web browser to connect to the Web server. Normally, a Web site uses port number 80 and this number need not be included with the URL (although it can be).

In IP networking, port numbers can theoretically range from 0 to 65535. Most popular network applications, though, use port numbers at the low end of the range (such as 80 for HTTP).

Note: The term port also refers to several other aspects of network technology. 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, such as those on a hub, switch, or router.

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

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

于 2008-09-30T10:07:47.630 回答
106

打个比方

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

考虑一个服务器 S

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

然后

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

好的,你得到了“谁是服务器”

但是假设服务器'S'也向其他人提供一些其他服务,比如'S'为人A、B、C提供存储服务

然后

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

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

你是三岁,服务器可能想以不同的方式识别这三个

插座来了

现在socket告诉->哪一个?特定连接

也就是说,说,

用于人员 X 的插座 1

Y 人插座 2

和用于人 Z 的插座 3

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

于 2016-06-20T09:57:32.480 回答
49

首先,我认为我们应该首先了解从 A 到 B 获取数据包的构成。

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

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

除其他外,TCP 还包含端口的概念。这些实际上是 Internet Socket ( 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);

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

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

  • 互联网套接字是 IP 地址、协议及其相关端口号的组合,服务可以在该端口号上提供数据。所以 tcp 端口 80,stackoverflow.com 是一个互联网套接字。
  • unix 套接字是文件系统中表示的 IPC 端点,例如/var/run/database.sock.
  • 套接字 API 是一种请求应用程序能够读取和写入数据到套接字的方法。

瞧!那收拾东西了。所以在我们的计划中,

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

所以实际上,端口是形成互联网套接字的要求的一个子集。不幸的是,碰巧socket这个词的含义已经被应用于几种不同的想法。所以我衷心建议你命名你的下一个项目套接字,只是为了增加混乱;)

于 2012-04-07T20:17:03.470 回答
43

A socket = IP Address + a port (numeric address)
Together they identify an end-point for a network connection on a machine. (Did I just flunk network 101?)

于 2008-09-30T10:05:47.213 回答
42

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

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

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

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

于 2013-12-13T10:09:45.317 回答
32

这些是基本的网络概念,因此我将以简单而全面的方式对其进行解释,以便详细了解。

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

因此网络中的套接字是绑定到一对(ip,端口)=(地址,服务)的虚拟通信设备。

笔记:

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

希望能解开你的疑惑

于 2019-02-19T07:17:59.970 回答
31

似乎有很多答案将套接字等同于两台 PC 之间的连接。我认为这是绝对不正确的。套接字一直是 1 台 PC 上的端点,它可能已连接也可能未连接 - 当然,我们都曾在某些时候使用过侦听器或 UDP 套接字*。重要的部分是它是可寻址的和活跃的。向 1.1.1.1:1234 发送消息不太可能工作,因为没有为该端点定义套接字。

套接字是特定于协议的——因此TCP / IPUDP / IP使用的唯一性的实现*(ipaddress:port)与例如IPX(网络、节点和...啊哼、套接字)不同——但不同套接字而不是一般“套接字”术语的含义。IPX 套接字号等同于 IP 端口)。但是,它们都提供了一个独特的可寻址端点。

由于 IP 已成为主导协议,端口(在网络术语中)已成为 UDP 或 TCP 端口号的同义词——它是套接字地址的一部分。

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

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

于 2008-09-30T13:26:46.700 回答
29

简短的回答。

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

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

于 2014-03-19T01:31:51.733 回答
22

They are terms from two different domains: 'port' is a concept from TCP/IP networking, 'socket' is an API (programming) thing. A 'socket' is made (in code) by taking a port and a hostname or network adapter and combining them into a data structure that you can use to send or receive data.

于 2008-09-30T10:08:29.703 回答
17

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

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
...
于 2013-03-14T19:57:29.000 回答
14

A socket is a communication endpoint. A socket is not directly related to the TCP/IP protocol family, it can be used with any protocol your system supports. The C socket API expects you to first get a blank socket object from the system that you can then either bind to a local socket address (to directly retrieve incoming traffic for connection-less protocols or to accept incoming connection requests for connection-oriented protocols) or that you can connect to a remote socket address (for either kind of protocol). You can even do both if you want to control both, the local socket address a socket is bound to and the remote socket address a socket is connected to. For connection-less protocols connecting a socket is even optional but if you don't do that, you'll have to also pass the destination address with every packet you want to send over the socket as how else would the socket know where to send this data to? Advantage is that you can use a single socket to send packets to different socket addresses. Once you have your socket configured and maybe even connected, consider it to be a bi-directional communication pipe. You can use it to pass data to some destination and some destination can use it to pass data back to you. What you write to a socket is send out and what has been received is available for reading.

Ports on the other hand are something that only certain protocols of the TCP/IP protocol stack have. TCP and UDP packets have ports. A port is just a simple number. The combination of source port and destination port identify a communication channel between two hosts. E.g. you may have a server that shall be both, a simple HTTP server and a simple FTP server. If now a packet arrives for the address of that server, how would it know if that is a packet for the HTTP or the FTP server? Well, it will know so as the HTTP server will run on port 80 and the FTP server on port 21, so if the packet arrives with a destination port 80, it is for the HTTP server and not for the FTP server. Also the packet has a source port since without such a source port, a server could only have one connection to one IP address at a time. The source port makes it possible for a server to distinguish otherwise identical connections: they all have the same destination port, e.g. port 80, the same destination IP (the IP of the server), and the same source IP, as they all come from the same client, but as they have different source ports, the server can distinguish them from each other. And when the server sends back replies, it will do so to the port the request came from, that way the client can also distinguish different replies it receives from the same server.

于 2008-09-30T10:24:16.920 回答
13

套接字是一种特殊类型的文件句柄,进程使用它向操作系统请求网络服务。套接字地址是三元组:{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}

或者

{协议,外国地址,外国进程}

指定连接的每一半。

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

于 2014-06-09T12:18:36.993 回答
13

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

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

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

于 2017-01-24T17:04:15.653 回答
9

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

于 2016-10-04T08:14:26.107 回答
9

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

  • ip和端口~电话号码
  • 插座〜电话设备
  • 连接~电话
  • 建立连接~呼叫号码
  • 进程,远程应用程序〜人
  • 消息~讲话
于 2015-10-11T22:57:28.883 回答
7

A socket is a structure in your software. It's more-or-less a file; it has operations like read and write. It isn't a physical thing; it's a way for your software to refer to physical things.

A port is a device-like thing. Each host has one or more networks (those are physical); a host has an address on each network. Each address can have thousands of ports.

One socket only may be using a port at an address. The socket allocates the port approximately like allocating a device for file system I/O. Once the port is allocated, no other socket can connect to that port. The port will be freed when the socket is closed.

Take a look at TCP/IP Terminology.

于 2008-09-30T10:09:33.180 回答
7

来自Oracle Java 教程

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

于 2014-04-12T14:03:11.117 回答
7

端口和套接字可以比作银行分行。

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

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

所以1(储蓄账户部门)、2(个人贷款部门)、3(房贷部门)和4(申诉部门)是端口。

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

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

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

于 2017-04-11T12:21:55.780 回答
5

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.

于 2008-09-30T10:23:50.773 回答
5

我认为这个问题暗示了相对 TCP/IP 术语。通俗地说:

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

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

于 2008-09-30T12:12:06.240 回答
4

A socket is a data I/O mechanism. A port is a contractual concept of a communication protocol. A socket can exist without a port. A port can exist witout a specific socket (e.g. if several sockets are active on the same port, which may be allowed for some protocols).

A port is used to determine which socket the receiver should route the packet to, with many protocols, but it is not always required and the receiving socket selection can be done by other means - a port is entirely a tool used by the protocol handler in the network subsystem. e.g. if a protocol does not use a port, packets can go to all listening sockets or any socket.

于 2008-09-30T10:08:55.303 回答
4

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

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

于 2008-12-31T07:47:21.167 回答
3

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.

于 2008-09-30T10:08:53.290 回答
3

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.

See also:

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

于 2008-09-30T10:28:36.253 回答
3

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

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

于 2013-10-16T10:08:44.013 回答
2

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

我在这里找到了

此示例将引导您完成连接到网站(例如 Wiley)的过程。您将打开您的网络浏览器(如 Mozilla Firefox)并在地址栏中输入 www.wiley.com。您的网络浏览器使用域名系统 (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 套接字。

于 2013-06-26T12:57:17.100 回答
2

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

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

于 2018-10-22T14:59:51.290 回答
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
于 2015-08-31T03:43:01.800 回答
1

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

于 2016-08-21T17:33:17.823 回答
0

Uff .. 太多人将套接字概念与两个端点通信联系起来,主要是在 TCP/IP 协议上。但:

  • NO - 套接字与两个端点通信无关。它是本地端点,可以或不能在另一端连接(考虑一个服务器套接字侦听传入连接)
  • NO - 套接字它与 TCP/IP 没有严格的关系。它是用一个协议定义的,它可以是 TCP/IP,但也可以是其他任何东西。例如,您可以拥有通过文件进行通信的套接字。您还可以自己实现一个新协议,通过 USB 灯进行通信,该灯通过闪烁发送数据:从应用程序的角度来看,这仍然是一个套接字。

关于端口概念,您在其他答案中阅读的内容是正确的。端口主要是 TCP 或 UDP 数据包中的数值(2 个字节,0-65535)。让我强调一下,TCP 或 UPD 不一定在 IP 之上使用。所以:

  • - 说端口是 TCP/IP 或 UDP/IP 的一部分是不正确的。它是 TCP 或 UDP 或定义和使用它的任何其他协议的一部分。IP不知道端口是什么。
于 2021-06-17T09:13:59.357 回答
-1

端口是网络协议用来访问连接主机的实体。端口可以​​是特定于应用程序的或与某种通信介质相关的。不同的协议使用不同的端口访问主机,例如 HTTP 使用端口 80 或 FTP 使用端口 23。您可以在应用程序中分配用户定义的端口号,但它们应该在 1023 以上。

端口打开与所需主机的连接,而套接字是网络间或进程间通信中的端点。套接字由系统通过 API(应用程序编程接口)分配。

一个更微妙的区别可以说是,当系统重新启动时,端口将存在,而套接字将被破坏。

于 2013-03-18T14:56:27.880 回答
-1

尽可能简单,插座和端口之间没有物理区别,就像 PATA 和 SATA 之间的方式一样。它们只是读取和写入 NIC 的一些软件。

端口本质上是一个公共套接字,其中一些是众所周知的/被广泛接受的,通常的例子是 80,专用于 HTTP。任何想要使用某种协议(在本例中为 HTTP)交换流量的人都典型地转到端口 80。当然,80 在物理上并不专用于 HTTP(它在物理上不是任何东西,它只是一个数字,一个逻辑值),并且可以可以在某些特定机器上随意使用其他协议,只要那些尝试连接的人知道要使用哪个协议(可能是非常私有的)。

套接字本质上是一个私有端口,它是为连接方已知但其他人不一定知道的特定目的而建立的。底层传输层通常是 TCP 或 UDP,但并非必须如此。基本特征是两端都知道发生了什么,无论发生什么。

这里的关键是,当在某个端口上接收到连接请求时,应答握手包含有关为服务特定请求者而创建的套接字的信息。随后的通信通过该(私有)套接字连接进行,而不是服务继续侦听连接请求的公共端口连接。

于 2015-08-19T18:30:35.247 回答
-2

为本地地址 + 本地端口 + 对等地址 + 对等端口呈现连接套接字 (fd)。通过套接字抽象处理接收/发送数据。为本地地址+本地侦听端口提供侦听套接字(fd)。进程可以通过套接字接受新连接。

于 2010-01-28T08:37:08.993 回答
-4

套接字允许在单台机器或两台机器中的两个应用程序之间进行通信。实际上它就像门一样。如果门打开,则门内和门外的进程或应用程序之间可能存在联系。

有 4 种类型的套接字:

  • 流套接字
  • 数据报套接字
  • 原始套接字
  • 顺序数据包套接字。

套接字主要用于客户端-服务器应用程序。端口标识网络地址上的不同端点。它包含一个数值。总的来说,套接字是端口和网络地址的组合。

于 2015-03-05T08:57:55.320 回答