IP数据包的输入与输出

本文详细介绍了Linux内核中IP数据包的输入与输出过程。从ip_rcv()作为输入入口,经过netfilter钩子点,路由查找,分片处理,到ip_local_deliver()和ip_queue_xmit()进行输出。内容涵盖数据包接收时的合法性检查、路由查找、分片组装,以及输出时的MTU检查和分片操作。

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

IP层主要函数之间的调用关系如下图所示:

上面的图主要是拷贝的《Linux内核源码剖析----TCP/IP实现上册》中的图11.3,原图中有部分错误,所以这里重新绘制了一下,并且去掉了一些冗余的部分。
下面简述一下数据包传递的大致过程:
一、IP数据包的输入
ip_rcv()是网络层(IPv4,以下同)接收数据包的入口函数,链路层在接收到数据包后调用netif_receive_skb()将数据包传递到网络层。网络层的packet_type实例为ip_packet_type,在Internet协议族的初始化函数inet_init()中调用dev_add_pack()来注册到ptype_base散列表中。
ip_rcv()中接收到数据包后会检查是否是一个完整的、没有错误的数据包。如果是合法的数据包,会传递到netfilter的NF_INET_PRE_ROUTING钩子点进行处理,如果钩子处理函数中没有截获数据包,则传递到ip_rcv_finish()进行下一阶段的处理。
ip_rcv_finish()会检查是否已设置路由缓存项,如果没有,则调用ip_route_input()来查找路由,如果查找失败,则丢弃数据包。如果找到路由项,在路由缓存项描述结构dst_entry的input和outpu接口中设置下一个阶段的处理函数。
如果是要转发的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值