端口和协议到底是什么?

端口和协议到底是什么?

我听到人们谈论端口和协议(与计算机网络相关),他们经常为它们提供类比(例如:“端口很像航运港口,它发送和接收数据就像航运港口从其他港口发送和接收货物一样”)之类的东西。

我理解这一切意味着什么,但只是在非常人为的层面上。基本上,我知道什么是端口,我了解什么是协议,但它们到底是什么?

这些端口是物理对象吗?它们是内置于计算机的一部分吗?有多少个端口?我可以增加或减少端口数量吗?它们是物理对象吗?还是用代码编写的?这些代码在哪里?操作系统?端口到底是什么?

什么是协议?我想象它们是某种代码……你能创建自己的协议吗?如何让特定端口运行特定协议?你使用什么语言来创建协议?你如何定义或发明新协议?

答案1

进一步回答 Hello71s 的问题,通过思考数据包中地址的结构,可能会有助于形象化端口。数据包是在网络中传递的数据单元。TCP 是使用端口的传输层协议的一个示例,通常通过 IP 使用。

因此,IP 有两个寻址组件 - 源 IP 和目标 IP。TCP 通过使用源端口和目标端口对此进行了补充。端口使接收机器能够区分发往同一 IP 地址的流量 - 即,如果您的服务器在单个 IP 地址上接收 Web 请求和电子邮件,则需要确定哪个应用程序应该接收数据 - 电子邮件服务或 Web 服务。因此,如果单个用户要向同一台服务器执行 Web 请求和电子邮件请求,它们可能看起来像这样:

Source IP    Source Port       Dest IP       Dest Port       Service
10.1.1.10    23434             192.168.1.1   80              web
10.1.1.10    34343             192.168.1.1   25              incoming email

Web 服务拥有端口 80,而电子邮件服务拥有端口 25 - 它们“监听”各自的端口,这使得流量最终到达正确的位置。

源端口是“临时的” - 即它在数据包发送时就被创建。但是,它仍然有用。它使连接的两端能够跟踪单独的对话。考虑一下如果我们的用户同时发送了两个 Web 请求:

Source IP    Source Port       Dest IP       Dest Port       Service
10.1.1.10    23232             192.168.1.1   80              web request 1
10.1.1.10    23234             192.168.1.1   80              web request 2

这让网络服务知道这些是单独的请求,而且来自网络服务器的返回流量 - 网页 - 被发送回各自的源端口,这使浏览器知道服务器正在响应哪个请求。

请注意,所有这些都是指端口号,从 TCP/IP 的角度来看,跨这些端口移动的实际数据可以是任何内容。它不关心或不了解应用程序,因此如果您在端口 25 上有网络流量而在端口 80 上有电子邮件,它就不会知道。

发送和接收应用程序负责确保数据结构正确,这就是应用协议的作用所在。HTTP 是 Web 浏览器用于与 Web 服务器通信的应用协议示例。它是一种定义明确的协议,可确保浏览器向任何 Web 服务器发送请求,并且 Web 服务器将理解并做出合理响应。但它的定义中不包括有关数据包如何从 A 传输到 B 的任何信息 - 这是前面几层(传输层、互联网层和链路层)的责任。

答案2

尽管这个问题已被标记为已回答,但我还是想回答 OP 中提出的一些其他问题。

这些端口是物理对象吗?

没有端口不是物理对象。

端口号是一个 16 位无符号整数,这意味着可用的端口范围是 1 到 65535(端口号 0 是保留的,不能使用)。进程通过 Internet 套接字(一种文件描述符)将其输入或输出通道与传输协议、端口号和 IP 地址关联起来。此过程称为绑定,可通过网络发送和接收数据。

它们是内置在计算机中的部件吗?它们是物理实体吗?还是用代码编写的?这些代码在哪里?操作系统?端口到底是什么?

操作系统的网络软件的任务是将所有应用程序端口的传出数据传输到网络上,并通过匹配数据包的 IP 地址和端口号将到达的网络数据包转发给进程。

只有一个进程可以使用相同的传输协议绑定到特定的 IP 地址和端口组合。当多个程序尝试使用相同的协议绑定到同一 IP 地址上的相同端口号时,就会发生常见的应用程序故障(有时称为端口冲突)。

以上段落是理解为什么在网络中使用端口/协议的关键。如果我们没有办法指定协议,通过约定的端口号传输数据 - 您将无法同时做多件事(查看电子邮件和使用网络),因为您的计算机无法区分电子邮件客户端的数据和您正在浏览的网站的数据。

有多少个端口?

端口号的分配方式多种多样,基于以下三个范围:

  1. 知名/系统端口 (0-1023) - 此范围的端口由提供广泛使用的网络服务类型的系统进程使用(HTTP/80、HTTPS/443、Telnet/21、SSH/22)

  2. 注册/用户端口 (1024-49151) - 1024 到 49151 之间的端口号范围是注册端口。它们由 IANA 根据请求实体的申请为特定服务分配。(Webmin/10000、HTTP 代理/8080、远程桌面协议/3389 等)

  3. 临时/动态/私有端口 (49152-65535) - 范围 49152–65535 包含动态或私有端口,不能已在 IANA 注册。此范围用于自定义或临时用途以及临时端口的自动分配。

我可以增加或减少端口数量吗?

关于能够增加可用端口的数量,由于允许网络工作的数学(二进制),您无法分配超过 65535 的端口 - 所以这个问题的答案是否定的,您不能将可用端口的总数增加到 65535 以上。

什么是协议?

在计算机科学中,通信协议是计算机内部或计算机之间交换消息的数字规则系统。当通过计算机网络交换消息时,规则系统称为网络协议。协议基本上是一组约定的指令/命令/调用,两个联网设备都可以通过它们进行通信。想想看,如果我们没有约定协议,网络服务器只是随机向网络浏览器发送数据,而浏览器不知道如何处理这些数据?幸运的是,我们有 HTTP,每个创建的网络浏览器都将其内置到软件中,因此它可以与任何使用相同语言(HTTP)的网络服务器进行通信。

我猜想它们是某种代码……你能创建自己的协议吗?你使用什么语言来创建协议?

是的,您可以创建自己的协议。协议可以用多种语言编写。我不是软件开发人员,但我很确定,只要您使用的语言具有允许您编写可通过 TCP/IP 进行通信的软件的库(还有其他协议套件,但 TCP/IP 是最广泛使用的),您就可以使用该语言编写协议。编程语言“C”似乎是编写协议最常用的语言。这是因为许多最早的网络协议都是在 1970 年代在 UNIX 上开发的,而 C 恰好是 UNIX 本身的编写语言。

如何获取特定端口来运行特定协议?

不同操作系统之间的区别很大。例如,要更改 Windows 中远程桌面协议运行的端口号,您需要编辑注册表。在 Linux 上,许多网络服务可以直接从特定网络服务的 .conf 文件中配置。

如何定义或发明一种新协议?

https://journal.paul.querna.org/articles/2012/02/22/designing-network-protocols/查看最近开发了一种新网络协议的人的博客文章,以及他在此过程中必须做的事情。

答案3

嗯。我认为最好的起点是查看 IP 套件,即 TCP/IP 模型。(为了简单起见,忽略 OSI 模型的其他层。)

基本上,它由一系列层组成:

应用层 - HTTP、FTP、POP、SSH 等。
传输层 - TCP、UDP 等。
互联网层 - IP、ICMP 等。
链路层 - 以太网等。

大部分端口都是在传输层 (第 4 层 - 是的,编号是正确的) 实现的。

操作系统中实现的大多数 TCP 和/或 UDP 堆栈都使用一个基本系统,即为程序分配端口,并在数据包通过网络进入时简单地在这些程序中引发事件。但是,任何实现在理论上都可以奏效;学术界甚至可能正在考虑假设的替代堆栈。

TCP 被定义为总共有 65535 个端口,任何程序都可以使用这些端口做任何他们想做的事情(尽管许多操作系统将端口的使用限制在 1024 以下,从而赋予它们一种特殊的地位)。虽然有一些有限的列表,但没有真正的标准来定义谁使用哪个端口以及哪个端口运行哪个程序。因此,端口或多或少是一个随机数,程序的不同实现决定同意在其上进行通信。当然,这些程序的设计者会尽量避免使用其他流行程序已经选择的端口。

当然,它绝对不需要使用 TCP 运行。一些协议在裸互联网层甚至裸链路层上运行,主要是为了提高效率,或者因为这些协议是在 TCP 或 IP 存在之前发明的。当然,这样做会牺牲操作系统网络库的简单性和广泛的错误检查。

有关更多详细信息,请查看维基百科上的 OSI 模型、TCP 和 IP 页面。

相关内容