存储和转发路由器的队列中的数据包位如何不混合在一起?

网络工程 路由器
2021-07-23 05:17:40

据我所知,存储和转发的工作原理是存储数据包的位,直到接收到整个数据包,然后再传输它们。此外,比特在传输前在队列中等待。由于路由器同时接收多个数据包,如何将数据包的比特排列在队列中,以免与其他数据包混合?是否有排队的队列?

3个回答

数据包的头部要么具有明确的数据包大小,例如 IPv4 头部总长度字段,要么具有足够的信息来计算数据包大小,例如 IPv6 有效载荷长度字段。

对于 IPv4,有RFC 791,互联网协议

3.1. 互联网标头格式

Internet 标题的内容摘要如下:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                 Example Internet Datagram Header

对于 IPv6,有RFC 2460,互联网协议,版本 6 (IPv6) 规范

  1. IPv6 报头格式

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |Version| Traffic Class |           Flow Label                  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
    |         Payload Length        |  Next Header  |   Hop Limit   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                                                               +
    |                                                               |
    +                         Source Address                        +
    |                                                               |
    +                                                               +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                                                               +
    |                                                               |
    +                      Destination Address                      +
    |                                                               |
    +                                                               +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

当然,还有/曾经有其他网络协议,但每个协议都有相似之处。

数据包入队后,路由器可以将其整体出队,而无需从其他数据包中抓取比特,因为数据包大小是已知的,并且仅将要出队的数据包的比特从队列中移除并转发。这意味着队列中的不同数据包都可以有不同的大小,路由器不会得到它需要的数据包,而是得到整个数据包。

这些位被组织在数据包中,由路由器自行决定是否整齐地对这些数据包进行排队和取消排队,而不会混淆任何东西。

从不同的接口接收多个数据包是绝对常见的,但(通常)每个数据包一旦被完整接收,就会在单个原子操作中传递到出口队列。

不只是一个队列,每个接口都有队列,因此不同数据包中的位没有任何混合。数据包作为整个数据包存储在队列中,内部标头包含源接口、VLAN 等信息。数据包通过指向数据的指针进行引用,然后操作系统可以使用这些数据将数据包转发到出口队列。有时使用共享缓冲区,这些缓冲区在许多接口之间共享,但同样,数据包作为整个数据包(带有标头)存储,设备通过指针跟踪它们。归根结底,队列只是操作系统管理的一块内存。