- 博客(42)
- 资源 (3)
- 收藏
- 关注
转载 路由相关的初始化(二)
myipv4_dst_ops.gc_thresh是一个无符号数,当路由的哈希表的表项达到这个值时,需要进行理清,从代码来看,它正好被设为 rt_hash_table的入口数,在我们的my_inet模块中为4096。 myip_rt_max_size是rt_hash_table的大小。myrt_cache_stat是一个struct rt_cache_stat的数组,每个CPU对应数组的
2013-06-30 17:46:57 797
转载 路由表(FIB)的初始化
宏CONFIG_IP_MULTIPLE_TABLES表示配置路由策略(对路由器而言?),如果定义了该宏,系统可以创建多达256张路由表,全部存放在数组struct fib_table *fib_tables[RT_TABLE_MAX+1]中。 如果配置了路由策略,在FIB的初始化函数中,首先创建了两张路由表myip_fib_local_table, myip_fib_main_table
2013-06-30 17:46:23 1616
转载 初始化跟路由相关的定时器
结构体struct timer_list是内核中的一个实时计时器。其定义如下: struct timer_list { struct list_head entry; unsigned long expires; unsigned long magic; void (*
2013-06-30 17:35:20 664
转载 路由表(FIB)内容的生成(一)
前面已经讲到过路由表的初始化,路由表是一个比较复杂的数据结构,一下子并不好理解。下面我们通过模块初始化时Linux的notify机制所触发的网络设备事件回调myfib_netdev_event,来逐步分析如何向FIB插入路由项,来进一步理解FIB。 每一个网络设备接口在启动时或者模块my_inet被插入到内核空间时,都会有NETDEV_UP事件发生,通知内核,设备启动。 myfib_ne
2013-06-30 17:32:01 1402
转载 两张路由表(FIB)的内容
local表: the fib table id: RT_TABLE_LOCAL, stamp: 0: the array of zone in hash table:: hash 8: have an fib_node list:: entries: 1: hash divisor: 16: hash mask: f: zo
2013-06-30 17:24:18 1224
转载 路由表(FIB)详解
宏CONFIG_IP_MULTIPLE_TABLES表示路由策略,当定义了该宏,也即意味着内核配置了“路由策略”。产生的最大的不同就是内核可以使用多达256张FIB。其实,这256张FIB在内核中的表示是一个全局数组: struct fib_table *myfib_tables[RT_TABLE_MAX+1];而宏RT_TABLE_MAX定义如下: enu
2013-06-30 15:48:11 7662 1
转载 路由表的查询
我们已经了解了整个路由表的数据结构,下面看看如何在路由表中查询一个路由信息。my_inet模块提供的路由查询接口定义如下: int myfn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_result *res) 参数tb指定查询哪一张
2013-06-30 15:23:34 1527
转载 路由规则
前面我们提到过路由策略的问题,策略性是指对于IP包的路由是以网络管理员根据需要定下的一些策略为主要依据进行路由的。例如我们可以有这样的策略:“所有来直自网A的包,选择X路径;其他选择Y路径”,或者是“所有TOS为A的包选择路径F;其他选者路径K”。 策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。关于多路由表,我们前面已经讲过,当内核配置了“路由策略”后,就可以使用
2013-06-30 15:15:16 1953
转载 创建struct fib_info
在协议栈的FIB(Forwarding Information Base)模块中,结构体struct fib_info是一个很基本的单位,它表示一个路由信息,一个路由信息可以被多个路由共享。下面是其完整的定义: struct fib_info { struct hlist_node fib_hash; struct hlist_node fib
2013-06-30 14:55:30 1026
转载 接收路由查找
IP层接到一个数据包以后,如果需要进行路由,就调用函数myip_route_input, myip_route_input先在缓存里寻找路由,如果失败则调用myip_route_input_slow, myip_route_input_slow调用myfib_lookup在路由表里寻找路由,如果命中,首先在缓存里添加这个路由,然后返回结果。 路由缓存的数据结构是一个全局哈希表myrt_h
2013-06-30 14:20:37 776
转载 查询一个路由
前面已经分析了FIB表中的单位:路由表,路由哈希表,路由域,路由节点,路由别名,路由信息。拿到一张具体的路由表,根据其提供的成员方法tb_lookup,可以为一个具体的目的地址查询到一条路由。tb_lookup的函数定义如下: int fn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_resu
2013-06-30 13:50:48 926
转载 路由域和路由表
前面讲到过,FIB里的最基本单位是路由信息(struct fib_info),它保存了关于路由的下一跳信息,本地接口的IP地址等,一个路由项对应一个路由别名(struct fib_alias),路由别名由路由信息再加上tos,type,scope,state等信息组成。目的地址相同的路由项的路由别名共享一个路由节点 (struct fib_node),路由节点的作用就是用于管理路由别名。
2013-06-30 11:49:54 1336
转载 创建一个路由节点struct fib_node
在为一个网络设备接口的IP地址创建四个路由项(本地接收,子网广播,子网单播,本地接收的广播)的时候,需要为每个路由项创建一个路由节点,struct fib_node结构体表示一个路由节点,下面是其定义: struct fib_node{ struct hlist_node fn_hash; struct list_head fn_alias;
2013-06-30 11:30:39 1518
转载 创建struct fib_info函数分析
在协议栈的FIB(Forwarding Information Base)模块中,结构体struct fib_info是一个很基本的单位,它表示一个路由信息,一个路由信息可以被多个路由共享。下面是其完整的定义: struct fib_info { struct hlist_node fib_hash; struct hlist_node fib
2013-06-30 11:25:31 1539
转载 目的入口(dst_entry)
最终生成的IP数据报的路由称为目的入口(dst_entry),目的入口反映了相邻的外部主机在主机内部的一种“映象”,目的入口在内核中的定义如下: struct dst_entry { struct dst_entry *next; atomic_t __refcnt; int __use;
2013-06-30 10:54:04 4470
转载 查询一个输入路由
INET域中有两个地方需要查询输入路由,一个是当收到一个IP数据报,ip_rcv将其交给ip_rcv_finish后,ip_rcv_finish 判断skb->dst是否为NULL(因为对于环回接口上收到的数据报,其dst是存在的,不需要查询输入路由),如果为NULL,则需要查询得到 输入路由。另一个地方是当收到一个ARP数据报,arp_rcv将其交给arp_process处理时,arp_proc
2013-06-30 10:35:09 1149
转载 Linux内核分析 - 网络[三]:从netif_receive_skb()说起
在netif_receive_skb()函数中,可以看出处理的是像ARP、IP这些链路层以上的协议,那么,链路层报头是在哪里去掉的呢?答案是网卡驱动中,在调用netif_receive_skb()前,skb->protocol = eth_type_trans(skb, bp->dev);该函数对处理后skb>data跳过以太网报头,由mac_header指示以太网报头:
2013-06-29 22:13:31 1232
转载 netif_receive_skb 函数解析
int netif_receive_skb(struct sk_buff *skb){ //略去一些代码 rcu_read_lock(); //第一步:先处理 ptype_all 上所有的 packet_type->func() //所有包都会调func,对性能影响严重!内核默认没挂任何钩子函数 list_for_each_
2013-06-29 22:00:37 5066
转载 eth_type_trans的处理流程图
Linux Version:2.6.33提示:本文是关于L2的Ethernet分析L3协议的过程! Flow图如下: 如何判断目的地地址是multicast 和broadcast呢?Ethernat的地址其实就是Mac地址。所以长度是6byte。其中有一位为multicast bit位。格式如下当unicast/mu
2013-06-29 21:38:20 5496
转载 Linux内核分析 - 网络[二]:网卡驱动接收报文
纠结了好多天,终于弄懂了B440X的处理。上篇讲到通过中断,最终网卡调用了b44_rx()来接收报文 对这个函数中的一些参数,可以这样理解:bp->rx_cons – 处理器处理到的缓冲区号bp->rx_pending – 分配的缓冲区个数bp->rx_prod – 当前缓冲区的最后一个缓冲号 这里要参数B440X的手册了解下寄存器的作用:#defi
2013-06-29 21:31:03 949
转载 Linux内核分析 - 网络[一]:收发数据包的调用
什么是NAPINAPI是linux一套最新的处理网口数据的API,linux 2.5引入的,所以很多驱动并不支持这种操作方式。简单来说,NAPI是综合中断方式与轮询方式的技术。数据量很低与很高时,NAPI可以发挥中断方式与轮询方式的优点,性能较好。如果数据量不稳定,且说高不高说低不低,则NAPI会在两种方式切换上消耗不少时间,效率反而较低一些。 下面会用到netdev_priv()这个
2013-06-29 17:46:47 889
转载 TCP/IP数据包结构详解
一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解网络数据包的结构,以及协议分析。如:网络监控,故障排查等…… IP包是不安全的,但是它是互联网的基础,在各方面都有广泛的应用。由IP协议衍生的协议族有10数种(据我所知),以后还会出现更多的基于IP的协议… 先从实际出发吧!一般
2013-06-29 14:02:29 738
转载 HTTP协议 (七) Cookie
Cookie是HTTP协议中非常重要的东西, 之前拜读了Fish Li 写的【细说Cookie】, 让我学到了很多东西。Fish的这篇文章写得太经典了。 所以我这篇文章就没有太多内容了。 最近我打算写一个系列的HTTP文章,我站在HTTP协议的角度, 说说我对Cookie的理解。 阅读目录Cookie是什么,有什么用,为什么要用到CookieCookie的分类Coo
2013-06-29 11:39:33 574
转载 HTTP协议 (六) 状态码详解
HTTP状态码,我都是现查现用。 我以前记得几个常用的状态码,比如200,302,304,404, 503。 一般来说我也只需要了解这些常用的状态码就可以了。 如果是做AJAX,REST,网络爬虫,机器人等程序。还是需要了解其他状态码。 本文我花了一个多月的时间把所有的状态码都总结了下,内容太多,看的时候麻烦耐心点了。HTTP状态码的学习资料到处都有,但是都是理论上讲解。 本文介绍H
2013-06-29 11:33:28 575
转载 HTTP协议 (四) 缓存
阅读目录缓存的概念缓存的好处Fiddler可以方便地查看缓存的header如何判断缓存新鲜度通过最后修改时间,判断缓存新鲜度与缓存相关的headerETag浏览器不使用缓存直接使用缓存,不去服务器端验证如何设置IE不使用缓存公有缓存和私有缓存的区别 缓存的概念缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页
2013-06-29 11:18:15 694
转载 HTTP协议 (三) 压缩
之前写过一个篇 【HTTP协议详解】 ,这次继续介绍HTTP协议中的压缩。本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教程]HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件。 能大大减少网
2013-06-29 11:04:24 508
转载 HTTP协议 (二) 基本认证
HTTP协议 (二) 基本认证http协议是无状态的, 浏览器和web服务器之间可以通过cookie来身份识别。 桌面应用程序(比如新浪桌面客户端, skydrive客户端)跟Web服务器之间是如何身份识别呢? 阅读目录什么是HTTP基本认证HTTP基本认证的过程HTTP基本认证的优点每次都要进行认证HTTP基本认证和HTTPS一起使用就很安全HTTP OAuth认
2013-06-29 10:04:59 554
转载 Wireshark基本介绍和学习TCP三次握手
之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS。 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括http,TCP,UDP,等网络协议包。记得大学的时候就学习过TCP的三次握手协议,那时候只是知道,虽然在书上看过很多TCP和UDP的资料,但是从来没有真正见过这些数据包, 老是感觉在云上飘一样,学得不踏实。有了wireshark就能截获这些网
2013-06-27 19:05:30 706
转载 超级详细Tcpdump 的用法
第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
2013-06-27 18:57:26 793
转载 Squid设置
目录 [隐藏]1 安装2 刷新3 启动4 配置4.1 一.反向代理的概念4.2 二. 反向代理和其它代理的比较4.3 四.代理服务器软件squid简介4.4 五.使用Squid配置反向代理(HTTP 加速器)5 日志6 新增留言安装./configure --prefix=/usr/local/squid #编译make ma
2013-06-27 16:15:58 782
转载 内核中的UDP socket流程(7)——udp_sendmsg
sock_sendmsg的代码很简单int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size){ struct kiocb iocb; struct sock_iocb siocb; int ret; init_s
2013-06-24 19:14:18 2999
转载 内核中的UDP socket流程(6)——sendto
现在开始新的API sendto,那么就重新回到了socket.c文件。SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len, unsigned, flags, struct sockaddr __user *, addr, int, add
2013-06-24 18:51:25 1559
转载 内核中的UDP socket流程(5)——inet_create
进入函数inet_createstatic int inet_create(struct net *net, struct socket *sock, int protocol, int kern){ struct sock *sk; struct inet_protosw *answer; struct inet_
2013-06-24 11:01:14 1137
转载 内核中的UDP socket流程(3)(4)——sock_create
好了,闲话少说。上次看到了sys_socket调用sock_create的地方了。下面开始研究sock_create了。sys_socket将自己的参数family, type, protocol传给sock_create,而sock为sock_create的输出值。retval = sock_create(family, type, protocol, &sock
2013-06-23 19:56:16 3178
转载 内核中的UDP socket流程(2)——API “sys_socket”
前面已经列出了UDP常用的4个API,那么下面从第一个API “sys_socket”开始1272 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)1273 {1274 int retval;1275 struct socket *sock;1276
2013-06-23 19:50:17 1081
转载 内核中的UDP socket流程(1)
内核中的UDP socket流程(1) 相对于TCP,UDP协议要简单的多。所以我决定由简入繁,先从UDP协议入手。前一遍文章已经确定了struct sk_buff被用于socket的接受和发送缓冲。那么为了摸清linux发送数据的流程,我们就可以顺着socket中的变量sk_write_queue来从最上层的发送函数开始,一直追溯到最底层。在追
2013-06-23 18:17:41 1917
转载 struct sk_buff与struct socket及struct sock 结构体分析
sk_buff是Linux网络协议栈最重要的数据结构之一,该数据结构贯穿于整个数据包处理的流程。由于协议采用分层结构,上层向下层传递数据时需要增加包头,下层向上层数据时又需要去掉包头。sk_buff中保存了L2,L3,L4层的头指针,这样在层传递时只需要对数据缓冲区改变头部信息,并调整sk_buff中的指针,而不需要拷贝数据,这样大大减少了内存拷贝的需要。/** * struct sk
2013-06-23 17:50:55 5240
转载 linux-2.6内核模块引用计数的实现(try_module_get和module_put)
linux-2.6内核模块引用计数的实现作者:刘洪涛,华清远见嵌入式学院金牌讲师。 一、模块使用计数的背景知识 模块是一种可以在内核运行过程中动态加载、卸载的内核功能组件。2.6内核中模块的命名方式为*.ko。模块在被使用时,是不允许被卸载的。编程时需要用“使用计数”来描述模块是否在被使用。二、2.4内核使用计数的实现方法 2.4内核中,
2013-06-09 17:46:07 755
转载 varnish关于Grace mode和Saint mode这两中模式配置
Varnish的一个关键特色就是它有能力防御 web和应用服务器宕机。Grace mode当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让那个其他几个请求挂起等待返回结果,返回结果后,复制请求的结果发送给客户端。如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他
2013-06-05 14:54:40 3494
转载 linux中request_region()函数的分析
linux中request_region()函数的分析 struct resource ioport_resource = {.name= "PCI IO",.start= 0,.end= IO_SPACE_LIMIT, //IO_SPACE_LIMIT = 0xffffffff.flags= IORESOURCE_IO,
2013-06-05 11:14:33 6293
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人