如何知道一个协议是使用 TCP 还是 UDP

网络工程 通讯协议 UDP 第4层 传输协议
2021-07-17 18:26:21

好吧,我知道这听起来可能是一个愚蠢的问题,我相信最正确的答案应该是随着我的经验积累和对协议的了解越来越多,我将能够说出。

然而,我是一名学生,我在该领域没有太多的实践经验。虽然我可以用谷歌搜索任何给定的协议,但我想知道是否有任何经验法则。我仍然觉得要求“经验法则”是愚蠢的,但我仍然在寻找一个。

在维基百科上遇到了这个列表,其中列出了协议以及它们以表格格式使用 TCP 还是 UDP。但是,我无法理解当特定协议的行同时包含具有单个端口号的 TCP 和 UDP 时,这意味着什么。例如,在 Telnet 行中,它有23-TCP-UDP. 这是什么意思?Telnet 可以在TCP 23 端口和UDP 23 端口上运行吗?

我还发现在我的教科书中,它说 TFTP 使用 UDP,但是如果我们查看上表,TFTP 行是69-TCP-UDP. 所以只是猜测上表中发生了什么。

4个回答

你问了一个很好的问题。不要让任何人告诉你其他情况。

遗憾的是,对于使用 TCP 的协议类型与使用 UDP 的协议类型没有经验法则。

协议是使用一种协议还是另一种协议取决于编写/创建协议的人。

如果他们不想为编写自己的“可靠交付”系统而烦恼,那么他们可以简单地使用 TCP 来提供所有的可靠性。

如果他们认为(天生就知道自己的协议)可以编写更好或更合适的“可靠交付”系统,那么他们可以将其构建到协议本身中,并简单地使用 UDP 作为传输。

例如,查看 UDP TFTP 示例捕获,您会注意到 TFTP 本身内置了确认系统——在 TCP 中同时拥有这些系统和附加确认系统将是多余的。

而在 TCP 上运行的 FTP 没有内置的确认系统。用户只需请求一个文件,然后发送者发送它。有一个“文件传输完成”通知,但没有任何东西可以保证收到文件的每一位。FTP 依靠 TCP 的可靠性来确保文件一直通过。

也就是说,我查看了您链接的 wiki 页面上的端口列表,看到了数量惊人的协议,这些协议据称使用 TCPUDP。这对我来说很陌生,我只知道很少有人同时使用两者(即 DNS)。不过也有可能是有一个TFTP实现使用了TCP,如果有的话,恐怕我也没有接触过。

域名系统 (DNS) 是传统上在讨论使用 TCP 和 UDP 的协议时所指的协议。请注意,它不会同时使用这些。但是 DNS 中的不同功能可能需要 TCP 与 UDP。

例如,在进行简单的 A 记录解析请求时,“请求”和“响应”非常轻量级,都需要一个数据包。因此,这通常是通过 UDP 完成的。

但是如果请求或响应需要更大的传输(超过一定数量的字节),那么 DNS 选择使用 TCP 来确保“所有位”到达那里。这在完整的区域传输请求中很常见。

维基百科页面不是最好的。IANA 维护端口号注册表(请注意,目前有 138 页):服务名称和传输协议端口号注册表

应用层协议可以自由使用任何传输层协议和端口号。按照惯例,大多数使用注册表中的特定端口号,但这并不意味着它们也不能使用其他端口号。例如,Web 服务器将默认使用 TCP 端口 80,但可以将其设置为使用任何其他端口号,如果在 URI 上给出端口号,Web 浏览器仍然可以使用它。

有许多应用程序可以设置为使用 TCP 或 UDP,并且可以更改端口号。这在处理冲突和奇怪的实现时提供了一些灵活性。

在现实生活中,您会发现很容易分辨使用的是哪种传输协议。另外,如果您正在寻找“经验法则”,那么请考虑:

UDP是一种“无连接”/不可靠协议,它不像 TCP 那样恢复丢失的数据包,并且开销比 TCP 少得多,因此它用作对延迟敏感的应用程序(如流音频/视频)的传输。

TCP是一种“面向连接”/可靠的协议,它会在数据包丢失时恢复数据包,并且具有更高的开销,但在数据包丢失会导致问题的情况下使用。

您可以使用以下多种方法来确定应用程序在现实生活中使用的传输层协议:

  • netstat -an从 Windows 命令提示符运行
  • 下载并运行 TCPView(也列出 UDP)以获得 GUI 视图。
  • 运行Wireshark
  • nmap针对有问题端口的服务器运行(默认情况下仅扫描 TCP 端口)

维基百科列表的来源似乎主要是https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt,偶尔会根据协议特定的引用更新行。

看起来对于较旧的分配,TCP 和 UDP 端口号都分配给了一个协议,即使该协议实际上只使用了一个或另一个。例如,FTP 在 IANA 表中有 TCP 和 UDP 的条目。这些条目都引用了 RFC 959,但 RFC 959 没有提到 UDP。

通常,用于找出应用程序协议实际使用的底层协议的首选资源是定义协议的标准。

某些协议可以根据用户选择(例如 NFS)或根据请求的详细信息(例如 DNS)使用 TCP 或 UDP