linux2.6.24内核源代码分析(1)——扒一扒sk_buff
最近研究了linux内核的网络子系统上的网络分组的接收与发送的流程,发现这个叫sk_buff的东西无处不在,内核利用了这个结构来管理分组,在各个层中传递这个结构,因此sk_buff可以说是linux内核网络子系统的基石,所以我决定在这篇文章中好好扒一扒这个sk_buff。
下面列出我我认为比较重要的sk_buff中的成员变量:

内核是利用一个双链表来管理sk_buff的,不过不使用内核的标准双链表而是自己实现了双链表:
struct sk_buff *next;
struct sk_buff *prev;
struct sock *sk是sk_buff关联的socket
ktime_t tstamp是分组到达的时间
struct net_device *dev是相关联的网络硬件设备
struct dst_entry *dst这个成员很重要,分组在ip层处理时sk_buff会被传入一个ip_route_input函数中,这个函数会判断这个分组是要在本地接收呢还是要转发出去,这时函数就会填充这个dst成员让其内的成员来代表目的地,例如:
struct dst_entry
{
……
int (*input)(struct sk_buff*);
int (*output)(struct sk_buff*);
}; 在接收分组时input被填充为ip_local_deliver或ip_forward,在发送分组时被填充为ip_output

内核会分配一块内存来存储sk_buff,head和end指示了这块内存的头和尾,data和tail则指示了这块内存中具体的数据的头和尾
mac_header、network_header和transport_header分别指向了分组的mac、ip和tcp(或udp)首部

内核在利用sk_buff管理分组时是利用了sk_buff里的指针成员来指向分组的不同部分,这样有一个好处就是在传递该分组时不用复制整个分组而是在整个分组发送与接收过程中传递sk_buff指针即可,节省了复制分组的开销。再一个就是内核在解包和组包时只需要调整sk_buff的指针就可以了,例如要在TCP首部前增加IP首部只需要在预分配的内存里拿出一小块内存在存放IP首部,再将network_header指向那个小块内存即可,注意拿出的小块内存是在TCP首部内存之前的,两者紧密相连。
最后来看看内核管理sk_buff的双链表吧:

sk_buff_head为链表的头,链表为双向循环链表,next指向了下一个sk_buff,prev指向了最后一个sk_buff,qlen保存了链表的sk_buff个数

linux2.6.24内核源代码分析(1)——扒一扒sk_buff的更多相关文章
- linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一
在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...
- Suse环境下编译linux-2.6.24内核
Suse环境下编译linux-2.6.24内核 1.下载linux-2.6.24内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/ ...
- Linux内核源代码分析方法
Linux内核源代码分析方法 一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux ...
- 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】
转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
- ARMv8 Linux内核源代码分析:__flush_dcache_all()
1.1 /* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ EN ...
- Linux 内核源代码分析 chap 2 存储管理 (5)
物理页面分配 linux 内核 2.4 中有 2 个版本号的物理页面分配函数 alloc_pages(). 一个在 mm/numa.c 中, 还有一个在 mm/page_alloc.c 中, 依据条件 ...
- linux 内核源代码分析 - 获取数组的大小
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 測试程序: #include<stdio.h> #include<stdlib. ...
- Linux内核源代码情景分析系列
http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统 5.1 概述 构成一个操作系统最重要的就 ...
随机推荐
- JAVA学习绘图颜色及其笔画属性设置字体显示文字
package com.graphics; import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.Date; im ...
- Which Clang Warning Is Generating This Message?
Which Clang Warning Is Generating This Message? 根据前面页面制作的pdf:clangwarninglist.pdf 百度网盘:http://pan.ba ...
- python爬虫代码
原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...
- NMAP 基础教程
原文地址: http://drops.wooyun.org/tips/2002 0x00 nmap 介绍 Nmap (网络映射器)是由 Gordon Lyon设计,用来探测计算机网络上的主机和服务的 ...
- iOS设备类型
通常App都会采集用户的设备信息,比如设备类型.网络类型.内存大小等,而拿到的数据比如:iPhone 8,1是什么意思?代表iOS 8.1吗,非也.这里放二个网站大家可以上去查一查,在统计分析的系统里 ...
- When cloning on with git bash on Windows, getting Fatal: UriFormatException encountered
I am using git bash $ git --version git version .windows. on Windows 7. When I clone a repo, I see: ...
- 曲率已驱动了头发——深度分析谷歌AlphaGo击败职业棋手
这篇是我们自开设星际随笔以来写得最长的一篇.我们也花了不少力气.包括把那5盘棋各打了两遍的谱,包括从Nature官网上把那篇谷歌的报告花了200元下载下来研究它的算法(后来发现谷 歌网站上可以免费下载 ...
- Python 之range 和 xrange
我目前使用的版本是2.7.6 >>> help (range)Help on built-in function range in module __builtin__: range ...
- spring和ehcache整合,实现基于注解的缓存实现
要实现基于注解的缓存实现,要求Spring的版本在3.1或以上版本. 首先需要在spring的配置文件中添加对缓存注解的实现: <?xml version="1.0" enc ...
- “Adobe Flash Player因过期而遭到阻止”的解决办法
谷歌浏览器总是提示“Adobe Flash Player因过期而遭到阻止”,然后点进去,又更新不了,因为伟大的TC已经把谷歌屏蔽了. 解决办法就是到flash官网更新到最新的Flash https:/ ...