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接口 中设置下一个阶段的处理函数。
       如果是要转发的数据包,input接口设置的是 ip_forward()函数 ,output接口设置的是ip_output()。ip_forward()中会检查数据包的IP选项,并做相应处理。如果没有问题,将数据包的TTl值减1,然后将数据包传递到NF_INET_FORWARD钩子点进行处理。如果钩子处理函数没有截获数据包,则调用路由缓存项的output接口输出数据包,即ip_output()函数。
        如果是要交给本地的数据包,input接口设置的 ip_local_deliver()函数 ,output接口设置的ip_rt_bug()。ip_local_deliver()中会检查接收到的数据包是否是IP报文的分片,如果是,则调用ip_defrag()组装分片的各个部分。如果分片没有到齐或出错,则直接返回,当前报文不再向传输层传递。如果不是IP报文的分片或IP报文的所有分片组装成功,则将报文传递到netfilter的NF_INET_LOCAL_IN钩子点进行处理。如果钩子处理函数没有截获报文,则 调用ip_local_deliver_finish()将报文传递到传输层 。在传递到传输层之前,ip_local_deliver_finish()中会将sk_buff中的成员指向传输层报文的位置。
二、IP数据包的输出
        传输层向IP层输出数据包主要是调用ip_queue_xmit()和ip_push_pending_frames() 。TCP协议主要使用ip_queue_xmit()来发送数据,UDP协议主要使用ip_push_pending_frames(),不过这两者都是由本地发送的数据包,需要转发的数据包也需要IP层来处理。本地发送的数据包需要传递到netfilter的NF_INET_LOCAL_OUT钩子点处理,转发的数据包则不需要。如果没有钩子处理函数截获数据包,则继续进行处理。
       如果是组播数据包,则output接口设置的是ip_mc_output()接口;如果是单播数据包,则output接口设置的ip_output。这里只讨论单播数据包。             ip_output()中只是简单地将路由缓存项中存储的网络设备设置到数据包的dev成员中 ,并且设置三层的协议类型(protocol成员),然后将数据包传递到netfilter的NF_INET_POST_ROUTING钩子点。如果没有钩子处理函数截获数据包,则将数据包传递到ip_finish_output()中处理。
        ip_finish_output()中会检查报文的长度是否大于MTU如果大于MTU,则调用ip_fragment()对数据包进行分片 ,然后再调用ip_finish_output2()将数据包通过邻居子系统传递到网络设备。 如果不需要分片,则直接调用ip_finish_output2()处理

linux内核中IP数据包的输入与输出相关推荐

  1. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事: 1.数据包到来后的通知 2.收到通知并从数据包中获取数据这两件事发生 ...

  2. Linux内核中网络数据包的接收框架

    与网络数据包的发送不同,网络收包是异步的的,因为你不确定谁会在什么时候突然发一个网络包给你,因此这个网络收包逻辑其实包含两件事: 1.数据包到来后的通知 2.收到通知并从数据包中获取数据 这两件事发生 ...

  3. linux内核网络协议栈--数据包的接收过程(二十)

    本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例. 本示例里列出的函数调用关系来自于kerne ...

  4. linux内核网络协议栈--数据包的发送过程(二十一)

    继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. socket层 +-------------+| Application |+- ...

  5. Linux内核网络UDP数据包发送(三)——IP协议层分析

    1. 前言 Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,并分 ...

  6. linux内核网络协议栈--数据包的网卡缓冲区(二十四)

    程序员可能关心的基本网卡知识 网卡相关介绍:http://www.linuxidc.com/Linux/2012-12/77132.htm 一.什么是网卡? 它是主机的网络设备,本身是LAN(局域网) ...

  7. Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  8. linux内核网络协议栈--数据包的接收过程(二十二)

    与其说这篇文章分析了网卡驱动中中数据包的接收,还不如说基于Kernel:2.6.12,以e100为例,对网卡驱动编写的一个说明.当然,对数据包的接收说的很清楚. 一.从网卡说起 这并非是一个网卡驱动分 ...

  9. linux内核网络协议栈--数据包的接收流程(二十三)

    网卡在接受数据包时会产生中断,即当 有一个以太网帧到来时,网卡向内核产生一次中断: CPU收到中断信号后,执行中断处理程序,中断处理程序会设置 缓冲区地址.DMA 地址等信息: 网卡通过DMA 方式将 ...

最新文章

  1. linux--memcache的安装和使用(转)
  2. 百倍提升张量计算:谷歌开源TensorNetwork
  3. MFC界面库BCGControlBar v25.0新功能详解六:属性网格和其他
  4. 直播 | 旷视研究院最新理论成果:批归一化和权重衰减的球面优化机制
  5. JavaWeb课程复习资料(六)——DAO与DAOImpl层封装
  6. python合法标识符_python_判断标识符的合法性
  7. Android使用NDK OpenGL ES3.0绘制一个三角形
  8. 【Android】如何查看android cpu是32位还是64位
  9. 十大最常见的Java性能问题
  10. js将时间转换为时间戳
  11. BZOJ1114 : [POI2008]鲁滨逊逃生Rob
  12. 信息论的基本概念和熵的计算
  13. CentOS7安装谷歌浏览器
  14. GAMS编写综合能源程序
  15. 嵌入式蓝桥杯又一个神之BUG Keil4 ADC仿真值出不来
  16. visio中将图片改为平行四边形_如何用Photoshop将一张长方形的照片变成平行四边形?...
  17. 简单逆向10(z3-solver)
  18. html表格打印边框不全,解决table边框在打印中不显示的问题 (转)
  19. 异步复位信号的 recovery和removal
  20. 成都IT云图:安逸生活撞上十倍速度

热门文章

  1. 记录自己看selenium源码的一些收获(五)RemoteWebDriver类
  2. UI设计中最重要的颜色
  3. 如何做自媒体在一个月内赚到2万?
  4. android变焦,Android开发:控制镜头变焦
  5. 【C语言实现五子棋、三子棋人机对战,包含电脑人工智能对战(可攻可守)】(非标题党)
  6. android spinner 按钮,android sqlite和spinner的用法示例
  7. qrcoder和zxing哪个好_聊聊zxing的qrcode
  8. [论文笔记]Episodic Curiosity through Reachability
  9. 夏普s2 Android p,荣耀V9Play和夏普S2全面评测对比 看完这些在决定
  10. 祝大家国庆、中秋双节快乐!!!