如何区分 TCP/UDP 负载中的协议?

How to distinguish protocols in a TCP/UDP payload?

IP 数据包有一个 8 位 header(v4 为 Protocol,v6 为 Next Header),它决定了在有效负载中使用哪个 transport-layer 协议。例如,如果它是 6,则有效负载是一个 TCP 段,如果它是 17,那么它就是一个 UDP 段。

但是我们如何找到在 TCP 或 UDP 负载中使用了哪个 applicative-layer 协议?没有这样的 header 可以达到同样的目的。我们如何区分封装 HTTP 请求的负载和封装 SMTP 邮件的负载?是使用的端口吗?如果是这样,如果我在端口 80 而不是 25 上发送 SMTP 邮件,它会被解释为 HTTP 请求而不是 SMTP 邮件吗?

感谢您的帮助。

If so, if I send a SMTP mail on port 80 instead of 25, will it be interpreted as a HTTP request instead of a SMTP mail?

通常没有定义应用程序协议的特定标记。相反,这是一个通信伙伴对彼此的期望的问题。

如果您向 SMTP 服务器发送 HTTP 请求,服务器将尝试将信息解释为 SMTP - 因为这是它所期望的。由于 HTTP 请求看起来与 SMTP 不同,服务器会以某种方式抱怨,例如简单地关闭连接或发回 SMTP 错误响应——因为这是一个 SMTP 服务器,它会说话并期望 SMTP。客户端发送将尝试将服务器 SMTP 响应解释为 HTTP 响应 - 因为这是它所期望的。当然这样做会失败,因为 SMTP 看起来与 HTTP 非常不同。