数据包发送与邻居子系统

本文详细解析了IP数据包从L4传输到IP层后的处理流程,包括如何通过路由子系统查找路由并创建邻居项(struct neigh)。文章进一步解释了处于INCOMPLETE状态下的邻居项如何处理发送的数据包,特别是当发送的数据包数量超过缓存队列容量时的丢弃机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据包从L4传到IP后,IP调用路由子系统来查询路由,并且在查询到路由后,创建一个新的邻居项(struct neigh)

与该路由项绑定。该neigh的初始状态为INCOMPLETE,此时在调用发送函数ip_finish_output2中调用

if (dst->hh)
  return neigh_hh_output(dst->hh, skb);
 else if (dst->neighbour)
  return dst->neighbour->output(skb);

 

处于INCOMPLETE状态下,output函数为neigh_resolve_output

该函数为:

if (!dst || !(neigh = dst->neighbour))
  goto discard;

 __skb_pull(skb, skb_network_offset(skb));

 if (!neigh_event_send(neigh, skb))

 

在__neigh_event_send函数中,数据包被存入缓存队列

if (neigh->nud_state == NUD_INCOMPLETE) {
  if (skb) {
   if (skb_queue_len(&neigh->arp_queue) >=
       neigh->parms->queue_len) {
    struct sk_buff *buff;
    buff = __skb_dequeue(&neigh->arp_queue);
    kfree_skb(buff);
    NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards);
   }
   __skb_queue_tail(&neigh->arp_queue, skb);
  }
  rc = 1;
 }

 

可以看出,如果在neigh的ARP未收到应答包前,如果发出了多个数据包,且个数超过了缓存队列的大小,则会直接丢弃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值