Linux网络协议栈--IP

开场白:

IP是什么就不介绍了,不清楚的请自行百度。

这篇文章的定位

(1)说明下网络层中IPV4协议收发数据的流程

(2)不涉及太多细节

(3)一些关键数据结构

(4)一部分关于路由系统

(5)为更清晰看清楚中间的流程,可能不会去涉及分片重组,MTU发现等一些机制。

建议:

(1)一定要对着下面的参考资料中提到的一起看,不然会看的很晕

(2)为了便于理解,已经尽量少的减少细节描述,每个块中的内容都可以慢慢展开,但是感觉还是希望有个全貌后再展开会看的更清楚一些

(3)为了加深印象,大量的引用了代码,第一次看肯定会很晕,我尽量在引用前后说明代码中需要注意的字段,之后记住这个字段做什么的就可以了,代码具体内容可以跳过,毕竟不完全的代码肯定看的不明不白的

(4)我使用的资料的内核版本都不一样,所以中间肯定会有一些不同的地方,但是我可以保证,它们的思路绝对是一样的。

(5)给了一张图,里面包含的信息很多,我尽自己最大能力去挖掘里面的信息了,看后面的内容的时候不妨多返回看看这张图,可以很好的加深印象。

(6)网上也可以找到下面资料的电子版,不过我还是希望能支持下正版,毕竟作者写的不容易。


参考资料

(1)《Understand Linux Kernel Internel》

(2)《Linux内核源码剖析-TCP/IP实现》

(3)linux内核源码--我使用的版本是3.2.4



一、大蓝图


图1-1 IP协议协议栈函数流程(见《Understand Linux Kernel Internel》图18-1

这个图包含了许多的信息,书上没有给出图的介绍,下面简要介绍,以后会慢慢详细说明

(A)记住,每个函数在进入到出口,中间可能代码会很长很长,中间其实一般只在做以下4个事情中的某几个

  • 正确性检测(主要是接收和转发的数据报)
  • 发送参数检测(主要是本地要发送的数据报)
  • 路由选择(接收数据报,注:这里或许会让人很疑惑,后面会慢慢说明)
  • 包头封装(发送和转发的数据报)

(B)注意图中5个带数字圈圈,在图中代表的就是Netfilter防火墙子系统,其中分为5种类型,图中左方给出了这5种的类型。

注:只有在开启了防火墙的情况下,数据包才会通过这5个部分的检测,否则就直接穿过了

(C)注意左下方颜色比较深的方框部分,这两个部分分别是邻居子系统和流量控制子系统,这两个部分实现都比较复杂,但是不需要太多关注。

注:流量子系统看名字就知道是什么意思。邻居子系统可以暂时把它看成ARP协议的实现(当然事实肯定不是了),这样就知道了ARP协议所在的部位了。

(D)注意图中skb->dst->input和 ip->dst->output,这两个是函数指针,数据包经过路由子系统后会把相应的函数赋值给该值。

注:输入的数据报是在ip_rcv_finish函数中经过路由子系统,输出的数据报则是在第4层经过路由子系统

注2:常用第四层数据传输协议一般为TCP和UDP,UDP协议如果没有进行connect连接,每个数据报都会经过路由子系统。UDP协议通过了connect链接和已经建立链接的TCP不需要经过路由子系统,因为路由项已经存储在套接字中。


二、一些约定:

(A)在代码中可能有些地方会看到NF_HOOK(),这个宏定义是关于防火墙的hook接口,防火墙的内容这篇文章不讨论,所以都假定关闭了防火墙。具体遇

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值