据我所知,存储和转发的工作原理是存储数据包的位,直到接收到整个数据包,然后再传输它们。此外,比特在传输前在队列中等待。由于路由器同时接收多个数据包,如何将数据包的比特排列在队列中,以免与其他数据包混合?是否有排队的队列?
存储和转发路由器的队列中的数据包位如何不混合在一起?
网络工程
路由器
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) 规范:
IPv6 报头格式
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| Traffic Class | Flow Label | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Payload Length | Next Header | Hop Limit | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Source Address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Destination Address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
当然,还有/曾经有其他网络协议,但每个协议都有相似之处。
数据包入队后,路由器可以将其整体出队,而无需从其他数据包中抓取比特,因为数据包大小是已知的,并且仅将要出队的数据包的比特从队列中移除并转发。这意味着队列中的不同数据包都可以有不同的大小,路由器不会得到它需要的数据包,而是得到整个数据包。
这些位被组织在数据包中,由路由器自行决定是否整齐地对这些数据包进行排队和取消排队,而不会混淆任何东西。
从不同的接口接收多个数据包是绝对常见的,但(通常)每个数据包一旦被完整接收,就会在单个原子操作中传递到出口队列。
不只是一个队列,每个接口都有队列,因此不同数据包中的位没有任何混合。数据包作为整个数据包存储在队列中,内部标头包含源接口、VLAN 等信息。数据包通过指向数据的指针进行引用,然后操作系统可以使用这些数据将数据包转发到出口队列。有时使用共享缓冲区,这些缓冲区在许多接口之间共享,但同样,数据包作为整个数据包(带有标头)存储,设备通过指针跟踪它们。归根结底,队列只是操作系统管理的一块内存。
其它你可能感兴趣的问题