- 在 URL 中,我们可以指定主机名或 IP 地址。同样,虽然我们可以指定端口号,但我们可以指定服务名称而不是端口号吗?如果不能,我们如何在需要时指定服务名称(例如,如果我们不记得服务的端口号)?
我们可以指定吗传输协议在网址中?如果我们无法在 URL 中指定传输协议,那么在需要时如何指定传输协议呢?这样做的需要是一个服务名称可能对应于两个传输协议,例如,
/etc/services
http 80/tcp # Hypertext Transfer Protocol http 80/udp ssh 22/tcp # Secure Shell ssh 22/udp telnet 23/tcp # Telnet telnet 23/udp smtp 25/tcp # Simple Mail Transfer Protocol smtp 25/udp
谢谢。
答案1
您的问题不清楚您将使用这些 URL 做什么。在不知道它们的用途的情况下,我们必须假设它们需要符合标准。如果我们开始使用不符合标准的 URL,则可能会出现问题。
RFC 3986是 URL 的标准。和 ...
- 它没有指定协议。然而它确实指定了一个方案。通常,该方案用于指定协议。例如
http://example.com/blah.html
. - 它不指定服务。然而它确实指定了一个数字港口。通常这个端口号足以指定服务。那是因为服务是注册的互联网号码分配机构。
如果您需要解决由于端口号不足而导致服务缺失的问题,我见过的最常见的方法是为每个协议/端口对定义一个唯一的方案。
答案2
服务名称是操作系统级别的应用程序级别概念/服务,仅转换为端口号。归根结底,它只是一个被翻译成数字的名字。
然而,RFC RFC 3986 § 3.2.3 不允许这样做(感谢@JdeBP),但如果浏览器/应用程序允许您这样做,您可能会在 URL 中使用服务名称。
大多数常见 URL/浏览器实用程序的解析器将不允许您(正确地)执行此操作。
为了说明这个异常,出于好奇,我们使用文本模式浏览器 lynx,它接受带有服务名称的 URL:
lynx https://www.cnn.com:https
或者
lynx http://www.sapo.pt:http
它可以工作,并且 ip 似乎可以正确浏览相应的网站。根据定义,lynx 实用程序/协议使用 TCP,不会获取服务号 UDP 定义。