linux网络分析
文章平均质量分 78
wangpengqi
这个作者很懒,什么都没留下…
展开
-
Linux内核分析 - 网络[十一]:ICMP模块
内核版本:2.6.34 ICMP模块比较简单,要注意的是icmp的速率限制策略,向IP层传输数据ip_append_data()和ip_push_pending_frames()。在net/ipv4/af_inet.c中的inet_init()注册icmp协议,从这里也可以看出,ICMP模块是绑定在IP模块之上的。inet_add_protocol()会将icmp_protocol加入到转载 2013-07-10 22:13:07 · 1388 阅读 · 0 评论 -
内核网络设备的注册与初始化
首先来看如何分配内存给一个网络设备。 内核通过alloc_netdev来分配内存给一个指定的网络设备: Java代码 #define alloc_netdev(sizeof_priv, name, setup) \ alloc_netdev_mq(sizeof_priv, name, setup, 1) struct net_d转载 2013-08-01 18:30:47 · 1444 阅读 · 0 评论 -
内核中的中断处理
首先来看当网络接收帧到达时,设备如何唤醒驱动。 1 轮询 也就是内核不断的监测相应的寄存器,从而得到是否有网络帧到来。 2中断 当有数据时,设备执行一个硬件中断,然后内核调用相应的处理函数。这种处理当网络在高负载的情况时,效率会很低(中断太频繁)。并且会引起receive-livelock.这是因为内核处理输入帧分为了两部分,一部分是驱动复制帧到输入队列,一部分是内核执转载 2013-08-01 18:32:20 · 1300 阅读 · 0 评论 -
内核中的notification chain浅析
内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些事件,其他多个子系统都很感兴趣,此时就需要用到notification chain. 举个具体的例子,比如说一台主机由于某个网卡的损坏或其他原因不能使用,从而导致连接此网卡的网络不能使用,这个时侯就是notification chain.来通知路由表去除这个网络的路由表项。 notification chain就是一个链转载 2013-08-01 17:10:18 · 662 阅读 · 0 评论 -
tcp_v4_connect函数分析
当创建了TCP协议套接字后,客户端再调用connect()函数请求建立TCP链接。该函数通过系统调用触发tcp_v4_connect函数的执行,产生一个包含SYN标志和一个32位的序号的连接请求包,并发送给服务器端。这是TCP三次握手的第一步。我们知道,两个不同主机间的进程要进行通信,他们所发送的数据包所经过的路径为:应用层→传输层→网络层→网络介质层所以tcp_v转载 2013-07-25 19:27:12 · 3150 阅读 · 0 评论 -
Linux内核分析 - 网络[十五]:陆由表[再议]
内核版本:2.6.34 陆由表作为三层协议的核心数据结构,理解它是至关重要的。前面已经分析过路由表,有兴趣的可以参考: 第一篇:路由表 http://blog.csdn.net/qy532846454/article/details/6423496 分析了路由表的基本数据结构和基本操作 第二篇:路由表使用 http:/转载 2013-07-25 13:35:50 · 979 阅读 · 0 评论 -
深入浅出多网卡绑定技术
在存储系统中为了提高后端设备的吞吐量,往往需要采用多网卡绑定技术。例如,后端存储最大能够提供300MB/s的吞吐量,因此需要采用3块1Gps的网卡并发传输才可以达到峰值性能。那么,从研发的角度来看如何实现多网卡绑定呢?这里对提高吞吐量用途的多网卡绑定技术进行深入分析。多网卡绑定一方面能够提高网络吞吐量,另一方面也可以增强网络高可用。这里对高可用应用的多网卡绑定技术不做讨论。从软件的角度来看转载 2013-07-30 21:01:56 · 923 阅读 · 0 评论 -
Linux内核分析 - 网络[十四]:IP选项
内核版本:2.6.34 在发送报文时,可以调用函数setsockopt()来设置相应的选项,本文主要分析IP选项的生成,发送以及接收所执行的流程,选取了LSRR为例子进行说明,主要分为选项的生成、选项的转发、选项的接收三部分。 先看一个源站路由选项的例子,下文的说明都将以此为例。 主机IP:192.168.1.99 源路由:192.168转载 2013-07-24 08:51:37 · 1054 阅读 · 0 评论 -
linux内核网络栈代码的准备知识
1. linux内核ipv4网络部分分层结构 BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件 主要有:/net/socket.c /net/protocols.c etc INET socket层:BSD socket是个可以用于各种网络协议的接口转载 2013-07-03 21:32:34 · 817 阅读 · 0 评论 -
linux网络代码结构
linux网络代码结构:四层1、设备驱动,Linux/drivers/net/3c501.c2、网络核心,linux/net/core/dev.c,struct net_device,3、网络协议族,包括tcp/ip、ipx等协议,linux/net/ipv44、网络接口socket层,linux/net/socket.c1->2: 第一层调用netif_rx()(net/转载 2013-07-03 21:29:25 · 943 阅读 · 0 评论 -
Linux内核分析 - 网络[五]:vlan协议-802.1q
内核版本:2.6.34802.1q1. 注册vlan网络系统子空间,[cpp] view plaincopyerr = register_pernet_subsys(&vlan_net_ops); static struct pernet_operations vlan_net_ops = { .init = v转载 2013-07-02 20:48:12 · 1103 阅读 · 0 评论 -
Linux内核分析 - 网络[十三]:校验和
内核版本:2.6.34报文的IP校验和、ICMP校验和、TCP/UDP校验和使用相同的算法,在RFC1071中定义,网上这方面的资料和例子很多,就不解释算法流程了,而是侧重于在实现的变化和技巧。The checksum algorithm is simply to add up all the 16-bit words in one's complement and then to t转载 2013-07-17 19:53:53 · 710 阅读 · 0 评论 -
Linux内核分析 - 网络[十七]:NetFilter之连接跟踪
内核版本:2.6.34转载请注明 博客:http://blog.csdn.net/qy532846454 by yoyo 前面章节介绍过Netfilter的框架,地址见:http://blog.csdn.net/qy532846454/article/details/6605592,本章节介绍的连接跟踪就是在Netfilter的框架上实现的,连接跟踪是实现DNAT,SNA转载 2013-07-28 15:09:50 · 840 阅读 · 0 评论 -
Linux内核分析 - 网络[十六]:TCP三次握手
内核:2.6.34 TCP是应用最广泛的传输层协议,其提供了面向连接的、可靠的字节流服务,但也正是因为这些特性,使得TCP较之UDP异常复杂,还是分两部分[创建与使用]来进行分析。这篇主要包括TCP的创建及三次握手的过程。 编程时一般用如下语句创建TCP Socket:[cpp] view plaincopysocke转载 2013-07-27 22:26:56 · 953 阅读 · 0 评论 -
Linux-kernel网桥代码分析(二)
第三部分: ioctl管理网桥3.1 通过ioctl系统调用创建网桥 仍然以前的配置作为例,我们分用户空间程序brctl是如何通过ioctl系统调用在kernel空间内创建上述的数据结构。创建网桥,我们不需要预知任何网络设备信息,因此我们通过ioctl来创建网桥时不应该与任何网络设备绑定到一起。网桥模块为此ioctl函数提供了一个恰如其分的名字 br_ioctl_deviceles转载 2013-07-03 21:26:54 · 1117 阅读 · 0 评论 -
Linux内核分析 - 网络[六]:网桥
看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的内容。[cpp] view plaincopyskb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,转载 2013-07-02 22:13:20 · 773 阅读 · 0 评论 -
Linux-kernel 网桥代码分析(一)
本文分析的kernel版本为:2.6.24.4,网桥代码目录为:linux-2.6.24.4/net/bridge。 网桥是kernel网络模块中相于独立的module,读者具有简单的kernel网络设备驱动开发和kerenl网络协议的基础知识即可。我在2007年就开始接触网桥了,当时有位同事为了测试网桥的功能,还特地查看了网桥的代码,还特意转告我一定要看看这部分的代码,他说比较转载 2013-07-03 21:25:29 · 1000 阅读 · 0 评论 -
linux下ip协议(V4)的实现(一)
首先来看校验相关的一些结构: 1 net_device结构: 包含一个features的域,这个表示设备的一些特性(比如控制校验),下面的几个flag就是用来控制校验: #define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ #define NETIF_F_NO_CSUM 4 /转载 2013-08-23 09:45:38 · 1275 阅读 · 0 评论 -
linux下ip层的一些概念
首先来看这个ip层的结构: 这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。 ip层的主要任务有下面5个方面: 1 ip数据包的校验 2 防火墙的处理(也就是netfilter子系统) 3 处理options(这里的options包含了一些可选的信息。比如时间戳或者源路由option). 4 切转载 2013-08-22 12:15:00 · 1160 阅读 · 0 评论 -
链路层到网络层的数据传递
我们知道在tcp/ip模型中,基本每一层都可以处理多重协议类型,那么当一个输入帧到达后,内核的每一层是如何来取得相应的处理函数呢?也就是说当我要把包传递给上层的时候,如何取得相应协议的处理函数。 我们这里先来看从二层如何把把数据传递给三层。struct sk_buff { .................................... __be16转载 2013-08-20 15:04:49 · 1416 阅读 · 0 评论 -
网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
1、先说一下sk_buff结构体这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。下面是他的定义,挺长[cpp] view plaincopystruct sk_buff { /* These two members must be first. */转载 2013-08-06 18:53:24 · 1360 阅读 · 0 评论 -
内核中接收网络帧的处理
我这里描述的只是2层的处理。 首先,我们来看softnet_data这个结构,每个cpu都有这样的一个队列,它主要是用来存储incoming frame。由于他是每个cpu都有一个队列,因此在不同的cpu之间我们就不要任何锁来控制并发的处理这个帧队列。我们在操作系统层要取得帧数据,都是通过这个数据来读取。 Java代码 /* * Incoming转载 2013-08-18 17:13:57 · 858 阅读 · 0 评论 -
内核网络输出帧的处理
首先来看如何打开和关闭一个输出队列。 帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的。而打开和关闭队列也就是通过这个状态位来处理。 Java代码 static inline void netif_start_queue(struct net_device *dev) { netif_tx_st转载 2013-08-19 11:58:57 · 860 阅读 · 0 评论 -
ip层和4层的接口实现分析
首先来看一下基于3层的ipv4以及ipv6实现的一些4层的协议: 这里要注意并没有IGMPV6,这是因为在ipv6中,它是作为iCMPv6的一部分实现的. 首先我们要知道输入数据包的ip头中的protocol域标识了,将要传递的4层协议. 我们这里主要介绍的是ip数据包从3层传递到4层的接口(也就是输入帧接口).而输出帧的处理,我前面的blog都已经转载 2013-08-05 19:29:03 · 863 阅读 · 0 评论 -
2.6的网络数据包时间戳
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。msn: yfydz_no1@hotmail.com来源:http://yfydz.cublog.cn1. 前言在linux 2.6内核中对于网络数据包中的时间戳处理和2.4相比有了不少变化,如果原样照搬2.4就要出错了。转载 2013-07-29 21:37:23 · 3359 阅读 · 0 评论 -
Linux内核分析 - 网络[八补]:IP协议补充
内核版本:2.6.34在前一篇”IP协议”中对报文接收时IP层的处理进行了分析,本篇分析将针对报文发送时IP层的处理。 传输层处理完后,会调用ip_push_pending_frames()将报文传递给IP层: ip_push_pending_frames() -> ip_local_out() -> __ip_local_out() 在ip_pu转载 2013-07-17 20:38:32 · 849 阅读 · 0 评论 -
Linux内核分析 - 网络[四]:路由表
路由表 在内核中存在路由表fib_table_hash和路由缓存表rt_hash_table。路由缓存表主要是为了加速路由的查找,每次路由查询都会先查找路由缓存,再查找路由表。这和cache是一个道理,缓存存储最近使用过的路由项,容量小,查找快速;路由表存储所有路由项,容量大,查找慢。首先,应该先了解路由表的意义,下面是route命令查看到的路由表:Desti转载 2013-07-01 21:54:50 · 918 阅读 · 0 评论 -
Linux内核分析 - 网络[一]:收发数据包的调用
什么是NAPINAPI是linux一套最新的处理网口数据的API,linux 2.5引入的,所以很多驱动并不支持这种操作方式。简单来说,NAPI是综合中断方式与轮询方式的技术。数据量很低与很高时,NAPI可以发挥中断方式与轮询方式的优点,性能较好。如果数据量不稳定,且说高不高说低不低,则NAPI会在两种方式切换上消耗不少时间,效率反而较低一些。 下面会用到netdev_priv()这个转载 2013-06-29 17:46:47 · 889 阅读 · 0 评论 -
Linux内核分析 - 网络[十]:ARP杂谈
内核版本:2.6.34杂谈一:重复地址检测 Linux协议栈中处理重复地址检测报文的是arp_process()中的一段代码,RFC2131是DHCP的草案,相应的sip==0是DHCP服务器用来检测它所分发的地址是否重复的。 [cpp] view plaincopy/* Special case: IPv4 duplicate addre转载 2013-07-10 21:01:05 · 1050 阅读 · 0 评论 -
内核中的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 · 2997 阅读 · 0 评论 -
内核中的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 阅读 · 0 评论 -
内核中的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 · 1080 阅读 · 0 评论 -
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 阅读 · 0 评论 -
Linux内核分析 - 网络[九]:邻居表
内核版本:2.6.34这部分的重点是三个核心的数据结构-邻居表、邻居缓存、代理邻居表,以及NUD状态转移图。 总的来说,要成功添加一条邻居表项,需要满足两个条件:1. 本机使用该表项;2. 对方主机进行了确认。同时,表项的添加引入了NUD(Neighbour Unreachability Detection)机制,从创建NUD_NONE到可用NUD_REACHABLE需要经历转载 2013-07-09 22:12:05 · 4182 阅读 · 5 评论 -
内核中的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 · 3177 阅读 · 0 评论 -
内核中的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 阅读 · 0 评论 -
内核中的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 阅读 · 0 评论 -
Linux内核分析 - 网络[八]:IP协议
内核版本:2.6.34这篇是关于IP层协议接收报文时的处理,重点说明了路由表的查找,以及IP分片重组。ip_rcv进入IP层报文接收函数 丢弃掉不是发往本机的报文,skb->pkt_type在网卡接收报文处理以太网头时会根据dst mac设置,协议栈的书会讲不是发往本机的广播报文会在二层被丢弃,实际上丢弃是发生在进入上层之初。[cpp] view pl转载 2013-07-08 22:15:35 · 1418 阅读 · 0 评论 -
Linux内核分析 - 网络[四补]:路由表补充
内核版本:2.6.34 前篇路由表http://blog.csdn.net/qy532846454/article/details/6423496说明了路由表的结构及路由表的创建。下面是一些路由表的使用的细枝末节,作补充说明。 路由可以分为两部分:路由缓存(rt_hash_table)和路由表() 路由缓存顾名思义就是加速路由查找的,路由缓存的插入是由内核转载 2013-07-08 13:10:18 · 717 阅读 · 0 评论 -
Linux内核分析 - 网络[十二]:UDP模块 - 收发
内核版本:2.6.34UDP报文接收 UDP报文的接收可以分为两个部分:协议栈收到udp报文,插入相应队列中;用户调用recvfrom()或recv()系统调用从队列中取出报文,这里的队列就是sk->sk_receive_queue,它是报文中转的纽带,两部分的联系如下图所示。第一部分:协议栈如何收取udp报文的。 udp模块的注册在inet_转载 2013-07-14 20:38:02 · 1007 阅读 · 0 评论