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

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

答案

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

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

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

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

例如:

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

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

打个比方

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

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

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
int fd = socket(AF_UNIX, SOCK_STREAM, 0);

套接字 = IP 地址 + 端口(数字地址)
它们一起确定了机器上网络连接的端点。 (我刚刚使网络 101 失效了吗?)

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

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

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

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

似乎有很多答案将插座等同于两台 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_STREAM是 TCP(创建虚拟电路)。

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

简短简短的回答。

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

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

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