首先,当数据包到达交换机的输入端口时,端口会首先检查数据包是否有错误。这包括对数据包的格式、长度、校验和等方面的检查。如果数据包没有错误,交换机将根据数据包中的路由信息来决定如何处理这个数据包。这个过程通常包括以下三种情况:
1. 交换机接受这个数据包,并自己使用它。这种情况通常发生在数据包的目的地就是交换机自身的情况下,例如,数据包可能是交换机的配置信息或者控制指令。
2. 交换机将数据包通过对应的输出端口转发到下一级设备。如果数据包的目的地不是交换机自身,而是连接在交换机上的其他设备,交换机就会根据数据包中的路由信息,选择正确的输出端口,将数据包转发出去。
3. 交换机拒绝接受这个数据包。如果数据包在检查过程中被发现有错误,或者数据包的目的地无法识别,交换机就会拒绝接受这个数据包。
在网络通信中,数据包通常分为三种类型:命令集包(Ordered Sets),数据链路层包(DLLPs)和事务层包(TLPs)。命令集包只在相邻设备的物理层之间进行传递,不会被转发到其他设备。数据链路层包只在相邻设备的数据链路层之间进行传递,同样不会被转发到其他设备。而事务层包可以根据包中的路由信息被转发到其他设备。
当涉及到数据包的路由方式时,通常有三种方式:ID路由(ID routing),地址路由(Address Routing),以及模糊路由(Implicitly Routing)。ID路由是根据设备在系统中的唯一标识符来路由数据包,地址路由则是根据数据包中的地址信息来路由数据包,而模糊路由则是对数据包进行广播,使其能够被所有设备接收到。
最后,我们需要了解的是,交换机是如何判断数据包的类型和传输方向的。这通常是通过数据包头部中的格式和类型信息来确定的。数据包头部包含了数据包的来源、目的地、类型、长度等重要信息,交换机通过分析这些信息,才能正确地处理和转发数据包。
总的来说,交换机在处理和转发数据包的过程中,需要完成一系列的检查和处理,才能确保数据包能够正确地到达目的地。这些过程看似简单,实则包含了大量的逻辑和规则,使得交换机能够高效地完成数据包的转发任务。
首先来分析一个例子,如下图所示:
当包(Packet)到达Switch的输入端口(Ingress Port)时,端口首先会检查包是否有错误,然后根据包的路由(Routing)信息,来做出以下三种处理方式之一:
1、 接受这个包,并自己(Switch)使用它(Internal Use);
2、 将其通过响应的输出端口(Egress Port)转发到下一级Endpoint(或者下一级Switch);
3、 拒绝接受这个包。
在前面的文章中多次介绍过,PCIe总线中一共有三种类型的包:Ordered Sets(命令集包,只在相邻的设备的物理层之间进行传递,不会被转发到其他的设备中)、DLLPs(数据链路层包,只在相邻的设备的数据链路层之间进行传递,不会被转发到其他设备中)和TLPs(事务层包,可以根据包中的路由信息被转发到其他的设备中)。
注:实际上不论是TLPs还是DLLPs都会经过物理层,这里说的TLP和DLLP指的是包的最初来源分别是事务层和数据链路层,即DLLP和上一层的事务层没有什么关系,其内容和作用完全是由数据链路层自己决定的。
注:Endpoint不仅可以发送TLP给其上层的设备(如Root),也可以发送TLP给其他的Endpoint,当然这需要借助Switch来实现。这种传输方式叫做Peer-to-Peer。
TLP一共有三种路由方式,分别是ID路由(ID Routing,即BDF Routing)、地址路由(Address Routing,包括Memory和IO)以及模糊路由(Implicitly Routing)。本文将简单介绍一些关于TLP路由的基础知识,具体的路由方式将会在接下来的三篇文章中依次进行介绍。
具体采用哪一种路由方式是由TLP的类型所决定的,如下表所示:
注:AtomicOp是PCIe Spec V2.1新增的内容,有兴趣的可以自行阅读V2.1的相关内容。
注:一般情况下,Message都是使用模糊路由(Implicitly Routing)的,但是也有PCIe设备厂商自定义的Message会使用地址路由或者ID路由。
可能有的人要有疑惑了,既然Message可以使用地址路由或者ID路由,为什么还要单独搞出来一个模糊路由呢?原因很简单,使用模糊路由可以广播Message到每一个设备,采用其他的路由方式必须明确指定是哪一个设备。
那么PCIe中是如何来判断TLP的类型的呢?又是如何判断其为Request还是Completion的呢?实际上是通过TLP Header的Format和Type部分来确定的,如下图所示: