Linux 网络子系统
yyyyyyyuande
这个作者很懒,什么都没留下…
展开
-
consume_skb 和 kfree_skb的区别
consume_skb 表示 skb是正常释放。kfree_skb 表示因为某种错误报文被丢弃。这只会带来某些网络统计数据上的区别,例如使用drop_watch查看有多少异常丢包的时候。通过源码上也可以看到,两者实现基本一致,除了调用不同的统计分析函数:trace_consume_skb, trace_kfree_skb/** * consume_skb - free an...原创 2018-12-08 14:55:48 · 4428 阅读 · 0 评论 -
Linux SKB结构体中各个长度字段的含义(len, data_len, headlen, pagelen)
结构体sk_buff是Linux内核网络子系统的一个基本结构体,关于它的长度有很多定义和操作,非常容易弄混,这里给出一个简单的说明。下面这幅图是《深入理解Linux网络技术内幕》里面的图,一个skb用于存储一个报文,如果一个报文特别大的话,线性存储区放不下就需要多个skb来存储,这就是下面frag_list的作用,保存连续的skb,但是如果内核支持分散聚集技术的话,并且报文长度刚好又不大于mt...原创 2018-12-24 19:58:07 · 6092 阅读 · 3 评论 -
tcp/ip 协议栈Linux源码分析三 IPv4分片报文重组分析三
继续上篇,上次讲到了分片队列的查找操作,剩下的就是分片队列插入和重组两个部分了,这个也是分片重组的关键部分。将收到的分片插入到分片队列是由函数inet_frag_queue()函数完成,这个函数比较长,多看几遍就好了 :-)/* Add new segment to existing queue. *//* 添加一个新的片段到分片队列里面 */static int ip_frag_q...原创 2019-01-27 16:16:20 · 1161 阅读 · 1 评论 -
tcp/ip 协议栈Linux源码分析四 IPv4分片 ip_fragment函数分析
内核版本:3.4.39很多项目涉及到IP分片的时候都是绕过去了,感觉分片挺难的。但是老这么做也不行啊,抽空分析了内核的分片处理函数ip_fragment,也不是特别复杂,感觉挺简单的,看来事情只有实际去做才知道。int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)){ struct iphdr *ip...原创 2019-04-11 17:18:25 · 1551 阅读 · 0 评论 -
tcp/ip 协议栈Linux内核源码分析六 路由子系统分析一路由缓存
内核版本:3.4.39收到报文或者发送报文的时候都需要查找路由表,频繁的路由表查找操作时需要耗费一部分CPU的,Linux提供了路由缓存来减少路由表的查询,路由缓存由hash表组织而成,路由缓存的初始化放在路由初始化函数ip_rt_init中,当路由缓存没有命中的时候会去查找路由表,查找成功则会添加到路由缓存里。有两个地方需要查找缓存,一个是ip_rcv()接收报文的时候,另一个是发送报文...原创 2019-05-27 18:45:02 · 1604 阅读 · 0 评论 -
tcp/ip 协议栈Linux内核源码分析七 路由子系统分析二 策略路由
内核版本:3.4.39策略路由就是根据配置策略查找路由表,早期的Linux版本是不支持策略路由的,默认的查找策略就是先查找local路由表,找不到再继续查找main表,当支持策略路由功能时,内核最多可以配置255个路由表,这时候根据先匹配策略,匹配后再去查找该策略指定的路由表,内核最多支持32768张策略表,初始化的时候创建了local表,main表和default表。策略表按照优先级从高到低...原创 2019-05-27 22:00:10 · 1516 阅读 · 0 评论 -
tcp/ip 协议栈Linux内核源码分析八 路由子系统分析三 路由表
内核版本:3.4.39Linux路由子系统代码量虽说不是很多,但是难度还是有的,最近在分析路由子系统这一块,对它的框架有了基本的了解,如果要想掌握的话估计还得再花点时间阅读代码,先把框架记录下来。路由子系统可以划分为三个子部分,路由缓存,路由策略和路由表,前两者已经总结过了,今天再总结下路由表。路由表和其它模块类似,都有初始化、添加、删除、查询等操作,要说区别吧,可能是数据结构组织不一样,不同...原创 2019-05-28 09:05:39 · 2350 阅读 · 0 评论 -
tcp/ip 协议栈Linux内核源码分析九 IPv6分片ip6_fragment 分析
内核版本:3.4.39IPv6的分片流程和IPv4基本一致,这一点内核源码作者也说了。流程比较简单,分片的时候判断是否满足快速分片,满足的话直接一个接一个加上分片扩展选项发送出去,不满足的话就只能走慢速分片通道了,这时候需要重新分配每一个skb,然后从原始SKB报文那里复制数据发送出去。int ip6_fragment(struct sk_buff *skb, int (*output)...原创 2019-05-28 10:29:20 · 1505 阅读 · 0 评论