kernel
文章平均质量分 86
interhanchi
这个作者很懒,什么都没留下…
展开
-
linux 内核tcp数据发送的实现
在分析之前先来看下SO_RCVTIMEO和SO_SNDTIMEO套接口吧,前面分析代码时没太注意这两个.这里算是个补充.SO_RCVTIMEO和SO_SNDTIMEO套接口选项可以给套接口的读和写,来设置超时时间,在unix网络编程中,说是他们只能用于读和写,而像accept和connect都不能用他们来设置.可是我在阅读内核源码的过程中看到,在linux中,accept和connect可...2009-09-10 01:41:13 · 310 阅读 · 0 评论 -
内核处理time_wait状态详解
这次来详细看内核的time_wait状态的实现,在前面介绍定时器的时候,time_wait就简单的介绍了下。这里我们会先介绍tw状态的实现,然后来介绍内核协议栈如何处理tw状态。首先我们要知道在linux内核中time_wait的处理是由tcp_time_wait这个函数来做得,比如我们在closing状态收到一个fin,就会调用tcp_time_wait.而内核为time_wait状态的...原创 2010-01-10 17:39:21 · 287 阅读 · 0 评论 -
linux下ip协议(V4)的实现(三)
这次我们来看数据包如何从4层传递到3层。先看下面的图,这张图表示了4层和3层之间(也就是4层传输给3层)的传输所需要调用的主要的函数:[img]/upload/attachment/124314/373c862c-6e5c-3ace-b190-9041ef8b03ca.jpg[/img]我们注意到3层最终会把帧用dst_output函数进行输出,而这个函数,我们上一次已...2009-07-12 18:22:11 · 158 阅读 · 0 评论 -
tcp协议栈处理各种事件的分析
首先我们来看socket如何将一些状态的变化通知给对应的进程,比如可读,可写,出错等等。先来看sock结构中这几个相关域:[code="java"]struct sock {..........................wait_queue_head_t *sk_sleep;.....................................void ...原创 2009-12-30 01:29:55 · 416 阅读 · 0 评论 -
linux内核sk_buff的结构分析
我看的内核版本是2.6.32.在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是...2009-12-25 00:42:06 · 360 阅读 · 1 评论 -
linux下ip协议(V4)的实现(二)
这次主要介绍下forward和local delivery。上次我们提到当ip_rcv_finish完成后后调用相关的发送函数ip_forward或者ip_local_deliver.这次就主要介绍这两个函数。先来看forward。forward一般由下面几部组成:1 执行ip option2 确定这个包能被forward3 减小ttl,当ttl为0时,丢掉...2009-07-05 11:28:29 · 137 阅读 · 0 评论 -
tcp的输入段的处理
tcp是全双工的协议,因此每一端都会有流控。一个tcp段有可能是一个数据段,也有可能只是一个ack,异或者即包含数据,也包含ack。如果是数据段,那么有可能是in-sequence的段,也有可能是out-of-order的段。如果是in-sequence的段,则马上加入到socket的receive队列中,如果是out-of-order的段,则会加入到socket的ofo队列。一旦当我们接收到数据...2009-12-18 00:56:54 · 158 阅读 · 0 评论 -
linux下ip协议(V4)的实现(一)
首先来看校验相关的一些结构:1 net_device结构:包含一个features的域,这个表示设备的一些特性(比如控制校验),下面的几个flag就是用来控制校验:[code="java"]#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */#define NETIF_F_NO_CSUM 4 ...2009-06-28 16:55:45 · 200 阅读 · 0 评论 -
minix引导程序剖析之masterboot
大体的引导过程可以看我前面写的博客:http://simohayha.iteye.com/blog/269093masterboot的主要功能是从硬盘的一个已激活分区装载引导分区的第1个扇区的引导信息,并将控制权交给此引导程序。引导过程中,未分区磁盘和已分区磁盘的布局是不同的,已分区磁盘的话,第一个扇区是主引导记录和分区表,而masterboot就存放在这里,将由它来查...2009-01-15 21:45:06 · 366 阅读 · 0 评论 -
linux下ip协议(V4)的实现(四)
这次主要介绍的是ip层的切片与组包的实现。首先来看一下分片好的帧的一些概念:1 第一个帧的offset位非0并且MF位为12 所有的在第一个帧和最后一个帧之间的帧都拥有长度大于0的域3 最后一个帧MF位为0 并且offset位非0。(这样就能判断是否是最后一个帧了).这里要注意在linux中,ip头的frag_off域包含了 rfcip头的定义中的nf,df...2009-07-26 13:08:11 · 414 阅读 · 0 评论 -
linux下ip协议(V4)的实现(五)
这次主要介绍一些ip层管理以及统计相关的东西.首先来看 long-living ip peer information.我们知道ip协议是无状态的协议.这里内核为了提升性能.为每个目的ip地址(换句话说,也就是和本机进行通信过的主机)保存了一些信息.peer子系统一般是被tcp,或者routing子系统所使用.这个信息的数据结构是inet_peer,它是一棵avl树...2009-08-01 21:40:46 · 219 阅读 · 0 评论 -
内核tcp的ack的处理
我们来看tcp输入对于ack,段的处理。先是ack的处理,在内核中,处理ack段是通过tcp_ack来进行的。这个函数主要功能是:1 update重传队列,并基于sack来设置skb的相关buf。2 update发送窗口。3 基于sack的信息或者重复ack来决定是否进入拥塞模式。在看之前我们要知道tcp是累积确认的。为了解决带来的缺点,我们才需...原创 2010-01-17 03:06:43 · 236 阅读 · 0 评论 -
tcp connection setup的实现(三)
先来看下accept的实现.其实accept的作用很简单,就是从accept队列中取出三次握手完成的socket,并将它关联到vfs上(其实操作和调用sys_socket时新建一个socket类似).然后返回.这里还有个要注意的,如果这个传递给accept的socket是非阻塞的话,就算accept队列为空,也会直接返回,而是阻塞的话就会休眠掉,等待accept队列有数据后唤醒他....2009-09-03 00:34:36 · 180 阅读 · 0 评论 -
tcp connection setup的实现(二)
首先来看下内核如何处理3次握手的半连接队列和accept队列(其实也就是server端的三次握手的状态变换).而半连接队列和accept队列在内核如何表示,我们上次已经介绍过了,这里就不介绍了.首先我们知道当3层的数据包到达之后会调用4层的协议handle,tcp的话就是tcp_v4_rcv.如何调用可以看我前面的[url=http://simohayha.iteye.com/blog...2009-09-01 00:46:05 · 247 阅读 · 0 评论 -
tcp connection setup的实现(一)
bind的实现:先来介绍几个地址结构.struct sockaddr 其实相当于一个基类的地址结构,其他的结构都能够直接转到sockaddr.举个例子比如当sa_family为PF_INET时,sa_data就包含了端口号和ip地址(in_addr结构).[code="java"]struct sockaddr { sa_family_t sa_family; ...2009-08-23 04:10:17 · 346 阅读 · 0 评论 -
Receive packet steering patch详解
Receive packet steering简称rps,是google贡献给linux kernel的一个patch,主要的功能是解决多核情况下,网络协议栈的软中断的负载均衡。这里的负载均衡也就是指能够将软中断均衡的放在不同的cpu核心上运行。简介在这里:http://lwn.net/Articles/362339/linux现在网卡的驱动支持两种模式,一种是NAPI,一种是...2010-07-25 16:46:23 · 353 阅读 · 0 评论 -
内核中拥塞窗口初始值对http性能的影响分析
这个是google的人提出的概念,那就是对tcp的拥塞窗口的初始值进行增大可以显著的提高http的性能,这个主要是针对tcp的slow start(我前面的blog有介绍)的.下面是相关的paper和ppt:paper: http://code.google.com/speed/articles/tcp_initcwnd_paper.pdfppt:http://www.ietf...2010-07-11 00:20:21 · 483 阅读 · 0 评论 -
linux内核中socket的实现
首先来看整个与socket相关的操作提供了一个统一的接口sys_socketcall.下面就是它的代码片段:[code="java"]asmlinkage long sys_socketcall(int call, unsigned long __user *args){ unsigned long a[6]; unsigned long a0, a1; int e...2009-08-15 04:38:32 · 292 阅读 · 0 评论 -
内核tcp协议栈SACK的处理
上一篇处理ack的blog中我们知道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段。SACK是包含在tcp的option中的,由于tcp的头的长度的限制,因此SACK也就是最多包含4个段,也就是32个字节。我们先来看tcp中的SACK段的表示:[code="java"]struct tcp...原创 2010-01-24 21:13:44 · 252 阅读 · 0 评论 -
ip层和4层的接口实现分析
首先来看一下基于3层的ipv4以及ipv6实现的一些4层的协议:[img]/upload/attachment/133435/473e1b8c-da7e-3177-9fb2-ab467a8e0739.jpg[/img]这里要注意并没有IGMPV6,这是因为在ipv6中,它是作为iCMPv6的一部分实现的.首先我们要知道输入数据包的ip头中的protocol域标识...2009-08-08 03:50:43 · 179 阅读 · 0 评论 -
linux下ip层的一些概念
首先来看这个ip层的结构:[img]/upload/attachment/117377/434dc733-af31-3c35-8163-2d0325b4f7a3.jpg[/img]这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。ip层的主要任务有下面5个方面:1 ip数据包的校验2 防火墙的处理(也就是netf...2009-06-21 22:57:20 · 218 阅读 · 0 评论 -
网桥在内核的实现
我们知道netdevice有一个priv域,这个域用来保存设备的私有数据,当这个设备是一个网桥的时候,priv域也就指向一个struct net_bridge.接下来看net_bridge以及相关的数据结构:[code="java"]struct net_bridge{///自旋锁 spinlock_t lock;///网桥所有端口的链表,其中每个元素都是一个net...2009-06-14 18:18:37 · 156 阅读 · 0 评论 -
boot sequence overview
原文在这里:http://www.os-forum.com/minix/boot/bootsequence.php当pc启动的时候,pc将会搜索磁盘(其实也就是你bois设置的启动顺序)上的一个magic number(0xAA55),这个number是在磁盘第一个扇区的起始510字节位移处。当magic number被发现,磁盘的第一个扇区将会被装载进地址为LOAD0FF(0...2008-11-17 21:28:56 · 322 阅读 · 0 评论 -
linux内核组件初始化体系
先来看下内核初始化时调用的一些函数:[img]/upload/attachment/95457/fe56754f-15d8-39f6-aee8-10e8777c035a.jpg[/img]这里主要的初始化有三类:1 boot比如grub,u-boot传递给内核的参数,内核的处理。这里是调用parse_args.2 中断和时钟的初始化。3 初始化的函数,这里主...2009-04-19 02:42:01 · 134 阅读 · 0 评论 -
pci设备的初始化
我们先来看下pci_driver结构,它的id_table是一个指向当前驱动所能处理的pci设备的id列表,由于每个pci设备都有一个唯一的标记,因此我们通过pci_device_id结构就可以标记不同的pci设备。driver则指向下一个pci驱动。[code="java"]struct pci_driver { struct list_head node; char *...2009-04-13 00:06:43 · 182 阅读 · 0 评论 -
linux内核tcp的定时器管理(二)
这次我们来看后面的3个定时器;首先是keep alive定时器。这个定时器主要是由于一条连接可能长时间idle,此时就需要发送探测包,来探测对端是否存活,如果对端收到这个探测包,它会立即相应一个ack,而当接受到ack之后,我们就能确认对端是存活的。否则我们会认为这个连接除了问题。这个定时器是当一个新的连接变为establish状态的时候被激活,如果在当定时器超时还没有数据...2009-10-05 20:52:56 · 186 阅读 · 0 评论 -
linux内核tcp的定时器管理(一)
在内核中tcp协议栈有6种类型的定时器:1 重传定时器。2 delayed ack定时器3 零窗口探测定时器上面三种定时器都是作为tcp状态机的一部分来实现的。4 keep-alive 定时器主要是管理established状态的连接。5 time_wait定时器主要是用来客户端关闭时的time_wait状态用到。6 syn-...原创 2009-10-04 23:29:02 · 318 阅读 · 0 评论 -
内核启动用户态的程序
内核启动用户态的应用程序是通过call_usermodehelper来调用的,比较常见的调用,比如modprobe. [code="java"]static inline intcall_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)[/code]参数说明;path : 应...2009-04-06 01:40:47 · 155 阅读 · 0 评论 -
网络设备的中断处理
我们这里描述的是硬件中断。设备和内核之间的交互有两种方法。1 polling(轮询)也就是kernel来操作交互,由kernel来检测某一个状态,看是否需要让设备做什么。2 interrupt(中断)设备来发起交互,设备发出一个硬件中断请求给kernel当他需要kernel的注意时。当中断来的时候被调用的函数称为interrupt handler...2009-04-06 01:19:01 · 348 阅读 · 0 评论 -
linux 内核tcp接收数据的实现
相比于发送数据,接收数据更复杂一些。接收数据这里和3层的接口是tcp_v4_rcv(我前面的blog有介绍3层和4层的接口的实现).而4层和用户空间,也就是系统调用是socket_recvmsg(其他的读取函数也都会调用这个函数).而这个系统调用会调用__sock_recvmsg.下面我们就先来看下这个函数。它的主要功能是初始化sock_iocb,以便与将来数据从内核空间拷贝到用户空间。然...2009-09-26 20:24:21 · 297 阅读 · 0 评论 -
linux内核中tcp连接的断开处理
我们这次主要来分析相关的两个断开函数close和shotdown以及相关的套接口选项SO_LINGER。这里要注意SO_LINGER对shutdown无任何影响。它只对close起作用。先来坎SO_LINGER所对应的数据结构:[code="java"]struct linger {///linger的开关 int l_onoff; /* Linger active *...原创 2009-10-25 21:47:32 · 935 阅读 · 0 评论 -
linux内核定时器的实现
由于linux还不是一个实时的操作系统,因此如果需要更高精度,或者更精确的定时的话,可能就需要打一些实时的补丁,或者用商用版的实时linux,.这里内的定时器最小间隔也就是1个tick.这里还有一个要注意的,我这里的分析并没有分析内核新的hrt 定时器.这个定时器是Monta Vista加入到内核的一个高精度的定时器的实现.先来看几个相关的数据结构.///这个是一个最主...2009-10-31 01:44:31 · 238 阅读 · 0 评论 -
内核网络设备的注册与初始化
首先来看如何分配内存给一个网络设备。内核通过alloc_netdev来分配内存给一个指定的网络设备:[code="java"]#define alloc_netdev(sizeof_priv, name, setup) \ alloc_netdev_mq(sizeof_priv, name, setup, 1)struct net_device *alloc_netde...2009-05-01 02:49:09 · 261 阅读 · 0 评论 -
Spanning Tree Protocol介绍
Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性).这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D STP的文档。先看下面的图:[img]/upload/attachment/111941/731a1ffc-da28-34ef-b0e2-3124116783bc.jpg[...2009-06-07 19:48:43 · 2562 阅读 · 1 评论 -
linux 内核tcp拥塞处理(一)
这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应...2010-03-12 16:17:30 · 335 阅读 · 0 评论 -
内核协议栈tcp层的内存管理
我们先来看tcp内存管理相关的几个内核参数,这些都能通过proc文件系统来修改:[code="java"]///内核写buf的最大值.extern __u32 sysctl_wmem_max;///协议栈读buf的最大值extern __u32 sysctl_rmem_max;[/code]这两个值在/proc/sys/net/core 下。这里要注意,这两个值的单位是...2009-11-28 17:13:15 · 286 阅读 · 0 评论 -
linux下的网桥介绍
网桥用来连接不同的网段。使不同的网段能够相互通信,看起来很像三层的路由。它能够有多个port,从而能够将数据帧从一个port复制到另一个port。这里要注意一点,linux下的网桥只能用于以太网。来看下示意图:[img]/upload/attachment/109009/59e160dd-4741-3749-86d1-c129997c34ab.jpg[/img]其中...2009-05-29 04:07:19 · 363 阅读 · 0 评论 -
链路层到网络层的数据传递
我们知道在tcp/ip模型中,基本每一层都可以处理多重协议类型,那么当一个输入帧到达后,内核的每一层是如何来取得相应的处理函数呢?也就是说当我要把包传递给上层的时候,如何取得相应协议的处理函数。我们这里先来看从二层如何把把数据传递给三层。[code="java"]struct sk_buff {.................................... __b...2009-05-23 02:17:54 · 242 阅读 · 0 评论 -
内核网络输出帧的处理
首先来看如何打开和关闭一个输出队列。帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的。而打开和关闭队列也就是通过这个状态位来处理。[code="java"]static inline void netif_start_queue(struct net_device *dev){ netif_tx_start_queue(netdev...2009-05-16 03:20:25 · 166 阅读 · 0 评论 -
内核中接收网络帧的处理
我这里描述的只是2层的处理。首先,我们来看softnet_data这个结构,每个cpu都有这样的一个队列,它主要是用来存储incoming frame。由于他是每个cpu都有一个队列,因此在不同的cpu之间我们就不要任何锁来控制并发的处理这个帧队列。我们在操作系统层要取得帧数据,都是通过这个数据来读取。[code="java"]/* * Incoming packets...2009-05-11 01:57:02 · 228 阅读 · 0 评论