如果我们两端都有一个共同的协议端口..假设源点是443,目标端口是80(假设的情况,我知道这种端口组合可能没有意义)..我们如何确定数据包的协议整体?
就像wireshark告诉我们协议一样,我们如何确定数据包的协议呢?我们为此使用源端口还是目标端口?
如果我们两端都有一个共同的协议端口..假设源点是443,目标端口是80(假设的情况,我知道这种端口组合可能没有意义)..我们如何确定数据包的协议整体?
就像wireshark告诉我们协议一样,我们如何确定数据包的协议呢?我们为此使用源端口还是目标端口?
你好像把它弄反了。一些传输协议,例如 TCP 和 UDP,使用更好地知道的地址作为端口。其他传输协议使用其他地址或不使用地址。TCP 和 UDP 都为它们的端口使用相同的编号范围,但它们不是相同的端口。例如,TCP 端口 12345不是UDP 端口 12345。仅给定端口号,您无法知道是哪个协议。
IPv4 数据包头中的协议号字段,或 IPv6 数据包头的 Next Header 字段(与 IPv4 协议号相同)会告诉您正在使用哪种协议,它可能是 TCP 或 UDP 以外的协议。IANA 维护协议编号页面,该页面解释了哪个协议编号是哪个协议。
从网络堆栈中的层的角度来看这一点。每个较低层都将较高层的数据报封装为其数据报的有效载荷。在层的协议头中会有一个字段,告诉它应该将其有效负载发送到哪个进程。
数据链路层:
例如,以太网可以承载许多不同的协议作为有效载荷,它不知道也不关心这些协议,那么它如何将有效载荷中的 IPv4 数据包交给 IPv4 进程而不是 IPX、IPv6 等进程? 以太网标头具有以太网类型字段,如果该字段包含0x0800,则它将帧有效负载发送到为该号码注册的进程(IPv4),或者如果数字是0x86DD,则它将帧有效负载发送到该号码的进程( IPv6)。IANA为 IEEE 协议(以太网、Wi-Fi、令牌环等)维护具有以太网类型的IEEE 802 编号。
网络层:
正如我在答案的第一部分中解释的那样,IPv4 和 IPv6 使用 IANA 维护的协议号来确定它们应该将数据包有效负载发送到的过程。
传输层:
TCP 和 UDP 使用通常称为端口的寻址。应用程序向 TCP 或 UDP 注册应用程序想要使用的协议(TCP 或 UDP)的端口号。任何传入的 UDP 数据报或 TCP 段都将具有目标端口号,协议将查看该端口号,以查看哪个进程已向其注册该端口号,并将有效负载传递给该进程,或者如果没有进程则丢弃它注册该端口号。
有已向 IANA 注册的服务(请参阅服务名称和传输协议端口号注册对于众所周知的端口号。不幸的是,这并不能阻止应用程序使用众所周知的端口号,如果该端口未被声明,则该服务将用作不同的服务。例如,Web 服务器通常向 TCP 注册 HTTP 端口 80 和 HTTPS 端口 443。如果主机未运行已注册这些端口的 Web 服务器,则任何应用程序都可以自由请求使用这些端口。有时人们会使用端口 80 注册 SSH,因为防火墙阻止了端口 22(SSH 的知名端口),但防火墙允许端口 80 流量。出于各种原因,有些人会在与众所周知的 HTTP 端口不同的端口上设置 Web 服务器。这会迫使任何试图浏览该 Web 服务器的人显式枚举 URI 中的端口号。
+1 对罗恩的回答。“协议”对网络工程师来说具有非常精确的含义,因为它是 TCP/IP 网络堆栈中的一个特定领域。
更一般地说,软件工程师将“协议”称为一组通信规则。
通常,套接字启动方向上的目标端口,结合 IP 协议(tcp 或 udp),决定了数据的解释方式(有 256 个协议号,tcp 和 udp 是最常见的两个,并且具有“端口”概念)。
因此,如果 tcp 套接字具有源端口 443 和目标端口 80,则将数据解释为 http 最有可能成功。
当然,响应流量会是源端口 80 和目标端口 443。但我说的是“启动套接字的方向”。
正如 Ron 所说,没有什么可以阻止进程侦听 tcp/80 并将传入数据解释为 DNS 或 NFS 或其他任何内容。