01
2025
07
01:50:22

一个数据包从进入路由器到出去,怎样的过程?


先说一下我的理解,如果有误,还望不吝赐教!


首先一个数据包过来,路由器的网络接口会通过帧头和帧尾的特殊标记确定一个帧并对该帧做CRC校验,

校验不成功,则丢弃该帧,如果校验成功则剥去帧头和帧尾并放入网络层缓冲队列中,

网络层会对该IP数据报进行TTL减一,重新计算首部校验和等操作,并查询转发表,

找到该数据包应该去的网络接口,然后放入到该接口的输出缓冲区中,

数据链路层来为此IP数据报添加新的目的(下一跳)MAC地址,源(本路由器)MAC地址,

IP类型(比如IPv4),然后计算一波,在帧尾加一个FCS,再通过物理层将该帧发送出去。



图片



基本上是正确的,有些细节需要澄清。


一个10/100/1000Mbps以太网链路,接收方究竟用哪一个速率接收?


双方需要提前用所谓的auto-negotiation算法,决定何种速率、half-duplex、full-duplex工作。

纯粹物理层脉冲FLP (Fast Link Pulses) 信号encode这些参数信息。在物理链路信噪比允许的情况下,

双方协商出最快的速率(rate)、最高效的传输模式(full-duplex)。如果链路的信噪比发生了变化,

无法支撑当前速率传输。双方会重新auto-negotiation选择较低的速率传输。


速率 ≥ 10Gbps的链路,不支持auto-negotiation,双方使用固定速率传输。

但是,如果物理链路屏蔽差,信噪比低,会造成大的丢包率。


假设,双方已经auto-negotiation得到1Gbps,Full Duplex传输参数。

接收方会使用对应的采用速率采样离散信号,

用先到的离散信号(一个窗口的宽度)与后到的离散信号(同样宽度的窗口)做匹配度计算(共谐)。

如果共谐,则同步完成,说明一个packet进来了。剩下的任务就是检测SFD(Start Frame Delimiter),

用预定义的SFD与到来的离散信号进行共谐,一旦共谐,说明一个packet开始了。接收方对准了packet的开始的位置。




如果同步没有共谐,说明没有packet到来,或者packet的同步信号弱,没有触发共谐的阈值,等同于什么都没有。


当一个packet到达尾部,电压有一个剧烈的变化,接收方只要用实时功率检测到packet的尾部。


物理层将从头部开始的离散信号,一直到尾部的离散信号,做物理层的decode,得到0、1组成的字节流。


在逻辑上,物理层的任务已经完成。只要将0、1组成的字节流deliver给以太网的链路层。

事实上,以太网大部分的链路层的工作也是在物理板卡上完成的。


首先,物理板块会校验以太网的FCS,通常是32 bit位的CRC校验码。如果出错,记录一下,然后就丢弃处理。


其次,如果FCS校验通过,再检查以下三步:


第1步: packet的Destination MAC == my MACs


如果yes,就接收。也许读者会发现MAC后面还有一个“s”,这个可能是复数形式,

表示本网卡被高层配置了多个感兴趣的单播MAC地址,都需要一一检查。


第2步: packet的Destination MAC == 组播的MACs


如果yes,就接收。MAC后面还有一个“s”,这个可能是复数形式,

表示本网卡被高层配置了多个感兴趣的组播MAC地址,都需要一一检查。


第3步: packet的Destination MAC == 广播MAC(FF.FF.FF.FF.FF.FF)


如果yes,就接收。


如果以上3个判单都是No,对不起,丢弃处理!


如果packet依然健在,则根据ether-type值继续处理。

对于IPv4来说,ether-type= 0x0800,则由IPv4来继续处理。


Sanity Check 以及IP Checksum,如果没有通过,统计并丢弃。




如果packet依然健在,则需要判断packet == local?


如果yes,则根据IP协议头的protocol值来继续处理,


protocol =1,ICMP处理。


protocol =2,IGMP处理。


protocol =6, TCP处理。


protocol =17,UDP处理。




如果其它值,则调用已注册的函数处理,如果NULL,则丢弃处理。


如果packet依然健在,则需要判断packet == 本地感兴趣IP multicast?


如果yes,则依据protocol的值继续处理。


如果packet依然健在,则需要判断packet == 组播, 但不是本地感兴趣的?


如果yes,则检查组播路由(MR)是否开启,则查询组播路由表继续处理。


组播路由没有开启,则丢弃处理。


如果以上都是no,说明packet不是本地的,需要IP Forward继续处理。


对于路由器来说,IP Forward 是默认开启的,故继续处理。


以Destitnation IP查询路由表,如果查询NULL,统计并丢弃处理。


否则,TTL -1操作。


根据查询到的Route Table Cache,调用其output函数。


将packet放入出接口的缓冲队列。队列可能是FIFO或者Fair 队列,并发起一个schedule,

以触发队列发送工作的启动。但是距离packet离开主机到达网卡,然后进入网线还有一端距离。

需要网卡驱动将DMA TX Ring Buffer准备好,并通过PCIe配置网卡寄存器,

通知其DMA TX Ring Buffer is ready,网卡通过PCIe总线将DMA TX Ring Buffer搬运到自己板卡的SRAM,

剩下的工作就是将packet发送出去。发送完,将packet发送出去的消息Write Back到DMA TX Ring Buffer,

网卡驱动获悉packet已经成功发送,将后续的packet放入已经发送完毕的DMA TX Ring Buffer里。


当从outgoing接口离开时,Source MAC默认使用该接口的,Destination MAC使用接收方的MAC地址,

这个地址可能是最终目的地的MAC地址,

也仅仅可能是通向目的地的某台路由器的MAC地址,理解这点非常重要和关键!!




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/12028.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: