什么是端口和协议?

Bob*_*Bob 14 port network-protocols

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

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

这些端口是物理对象吗?它们是否内置于我的计算机中?有多少个端口?我可以增加或减少端口数吗?它们甚至是物理的东西吗?还是用代码写的?这个代码在哪里?操作系统?什么是真正的港口?

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

Pau*_*aul 11

除了 Hello71s 的回答之外,通过考虑数据包中地址的结构来可视化端口可能会有所帮助。数据包是在网络中传递的数据单元。TCP 是使用端口的传输层协议的一个示例,并且通常通过 IP 使用。

因此 IP 有两个寻址组件 - 源 IP 和目标 IP。TCP 通过使用源端口和目标端口对此进行添加。端口使接收机器能够区分发往同一 IP 地址的流量 - 即,如果您的服务器在单个 IP 地址上接收 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

请注意,这都是指端口号,从 TCP/IP 的角度来看,通过这些端口移动的实际数据可以是任何东西。它不关心或不了解应用程序,因此如果您在端口 25 上有网络流量而在端口 80 上有电子邮件,那将是不明智的。

由发送和接收应用程序来确保数据是正确的结构,这就是应用程序协议的用武之地。HTTP 是 Web 浏览器用来与 Web 服务器通信的应用程序协议的一个示例。这是一个定义明确的协议,可确保浏览器将请求发送到任何 Web 服务器,并且该 Web 服务器将理解并做出明智的响应。但是它的定义中没有包括任何关于数据包如何从 A 到 B 的内容——这是前面层的责任——传输层、互联网层和链路层。


Ric*_*086 5

尽管此问题已标记为已回答,但我想解决 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 Proxy/8080、远程桌面协议/3389等)

  3. 临时/动态/私有端口 (49152-65535) - 49152-65535 范围包含无法向 IANA 注册的动态或私有端口。此范围用于自定义或临时目的以及临时端口的自动分配。

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

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

什么是协议?

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

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

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

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

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

您如何定义或发明新协议?

请参阅https://journal.paul.querna.org/articles/2012/02/22/designing-network-protocols/,了解最近开发新网络协议的人的博客文章以及他必须做的事情一路上。