自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

但行好事 莫问前程

on the programming road

  • 博客(247)
  • 收藏
  • 关注

我的新blog地址

纠结了好久,终于弄了个独立blog。地址是:[url=http://www.pagefault.info]这里[/url]如果您有订阅我的blog,希望您能更改订阅地址,因为这里以后就不更新了,谢谢!...

2010-08-09 21:03:45 354

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 314

内核中拥塞窗口初始值对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 449

nginx中sub_request的处理

首先来看subrequest的处理。什么是subrequest,顾名思义,那就是子请求,也就是在当前的一个请求中nginx再生成一个请求。比如在nginx的HttpAddition这个filter,就有用到subrequest。这里要注意,一个subrequest是当父reuest执行完毕后才会被执行,并且它会将所有的需要进行的handler phase重新执行一遍(这个我们后面的...

2010-06-30 18:17:01 545

nginx中handler的处理(二)

这次我们来看各个phase的checker的处理。首先我们要弄明白一个事情,那就是在nginx中,一般来说,都是在NGX_HTTP_CONTENT_PHASE中调用outputfilter的,也就是说filter是在handler中调用的,这样看来只能有一个handler能够执行outputfiler.所以说在写nginx的handler模块的话,要注意不同的phase的返回值代表的不同意...

2010-05-30 18:33:39 488

原创 nginx中handler的处理(一)

nginx中的处理一个http的请求分为了8个phase,分别是下面几个阶段.其中特别要注意就是几个rewrite阶段。[code="java"]typedef enum {//读取请求phase NGX_HTTP_POST_READ_PHASE = 0,//接下来就是开始处理//这个阶段主要是处理全局的(server block)的rewrite。 ...

2010-05-20 01:09:57 701

nginx中的output chain的处理(二)

接着上次的分析继续,这次我们来看filter链中最关键的一个模块,那就是ngx_http_copy_filter_module模块,这个filter主要是用来将一些需要复制的buf(文件或者内存)重新复制一份然后发送给剩余的body filter,这里有个很重要的部分,那就是在这里nginx的剩余的body filter有可能会被调用多次,这个接下来我会一一阐述的。先来看它的初始化函数:[...

2010-05-09 13:45:42 470

nginx中锁的设计以及惊群的处理

nginx中使用的锁是自己来实现的,这里锁的实现分为两种情况,一种是支持原子操作的情况,也就是由NGX_HAVE_ATOMIC_OPS这个宏来进行控制的,一种是不支持原子操作,这是是使用文件锁来实现。首先我们要知道在用户空间进程间锁实现的原理,起始原理很简单,就是能弄一个让所有进程共享的东西,比如mmap的内存,比如文件,然后通过这个东西来控制进程的互斥。说起来锁很简单,就是共享一...

2010-05-03 02:13:15 303

nginx中的output chain的处理(一)

这里我们详细来看ngx_linux_sendfile_chain方法,这个函数也就是nginx的发送函数。一般来说,我们最终都会调用这个函数来发送最终的数据,因此我们来着重分析这个函数,这里主要就是对buf的一些参数的理解。来看函数原型:[code="java"]ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t...

2010-04-24 00:59:05 535 1

nginx的filter的处理

随笔拿一个nginx的filter模块来看,gzip模块,来看它的初始化。[code="java"]static ngx_http_output_header_filter_pt ngx_http_next_header_filter;static ngx_http_output_body_filter_pt ngx_http_next_body_filter;st...

2010-04-13 00:38:12 353

nginx中request请求的解析

ngx_http_init_request 中初始化event 的handler 为ngx_http_process_request_line,然后首先调用ngx_http_read_request_header来读取头部,然后就是开始调用函数ngx_http_parse_request_line对request line进行解析。随后如果解析的url是complex的话,就进入complex...

2010-04-04 01:15:23 940

卖书了

1 代码之美 全新 603 c++网络编程卷2 全新 308 tcp/ip 详解 第二卷中文版 全新 60这里基本全新 就是 有在里面画一些线。。价钱都好商量,只限杭州市内。 有意向给我发站内消息或者给我留个联系方式,我联系你。...

2010-03-26 23:15:46 133

linux 内核tcp拥塞处理(一)

这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应...

2010-03-12 16:17:30 316

原创 内核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 237

原创 09年看的书,电影以及听过的音乐

其实有一些是很早就看过或听过的,只不过今年加进去了,还有一些书就是没看完,比如haskell那本。。[img]http://dl.iteye.com/upload/attachment/194684/a030715f-6df4-3953-ae11-722f7d11dac8.jpg[/img][img]http://dl.iteye.com/upload/attachment...

2010-01-17 17:50:38 116

原创 内核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 221

原创 内核处理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 261

linux已经不存在惊群现象

惊群也就是指多个进程阻塞在accept,当有连接完成,会唤醒所有进程。经过测试,发现现在的内核已经修复了这个问题,当有多个进程阻塞在accept,只会唤醒一个进程。下面这个是一篇论文,就是讲这个问题的。http://www.usenix.org/event/usenix2000/freenix/full_papers/molloy/molloy.pdf这里会先测...

2010-01-02 22:10:08 200

原创 tcp协议栈处理各种事件的分析

首先我们来看socket如何将一些状态的变化通知给对应的进程,比如可读,可写,出错等等。先来看sock结构中这几个相关域:[code="java"]struct sock {..........................wait_queue_head_t *sk_sleep;.....................................void ...

2009-12-30 01:29:55 383

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 340 1

lua源码剖析(三)

这次简单的补充一下前面类型部分剩下的东西。首先我们要知道当我们想为lua来编写扩展的时候,有时候可能需要一些全局变量。可是这样会有问题,这是因为这样的话,我们就无法用于多个lua状态(也就是new 多个state).于是lua提供了三种可以代替全局变量的方法。分别是注册表,环境变量和upvalue。其中注册表和环境变量都是table。而upvalue也就是我们前面介绍的用来...

2009-12-20 17:35:54 271

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 143

nginx的内存管理

先来看内存池的实现,nginx的内存池实现的非常简单。这里内存池的一些图表可以看老朱同学的slides :http://blog.zhuzhaoyuan.com/2009/09/nginx-internals-slides-video/当内存池初始化的时候(下面会分析到)ngx_poll_s只相当于内存池的一个头,保存了当前内存池的一些必要信息而已。当从内存池存取数...

2009-12-10 01:20:19 485

lua源码剖析(二)

这次紧接着上次的,将gc类型的数据分析完毕。谢谢[url=http://www.zhuzhaoyuan.com]老朱[/url]同学的指正,这里CClosure和LClosure理解有误.先来看闭包:可以看到闭包也是会有两种类型,这是因为在lua中,函数不过是一种特殊的闭包而已。[color=red]更新:这里CClosure表示是c函数,也就是和lua外部...

2009-12-04 00:22:33 249

内核协议栈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 267

lua源码剖析(一)

先来看lua中值的表示方式。[code="java"]#define TValuefields Value value; int tttypedef struct lua_TValue { TValuefields;} TValue;[/code]其中tt表示类型,value也就是lua中对象的表示。[code="java"]typedef union {...

2009-11-15 21:38:46 284

gcc的几个自动优化

我的gcc版本是4.4.1先来看const和define以及enum定义,编译器会做什么样的优化:[code="java"]enum { constant=23 };#define CONSTANT 23static const int Static_Constant=23;const int Constant = 23;int foo() { a(...

2009-11-10 00:44:59 352

intel IA-32架构简介

[size=medium][color=darkred]IA32的cpu操作模式[/color][/size]1保护模式:这个模式是cpu的native状态.它可以在一个保护的多任务的环境中直接执行 "real-address mode"的8086的软件.这个特性叫做virtual-8086模式.这个模式也就是cpu的一般工作模式.因为这个模式基本上打开了cpu的所有特性....

2009-11-08 20:06:04 530

linux内核定时器的实现

由于linux还不是一个实时的操作系统,因此如果需要更高精度,或者更精确的定时的话,可能就需要打一些实时的补丁,或者用商用版的实时linux,.这里内的定时器最小间隔也就是1个tick.这里还有一个要注意的,我这里的分析并没有分析内核新的hrt 定时器.这个定时器是Monta Vista加入到内核的一个高精度的定时器的实现.先来看几个相关的数据结构.///这个是一个最主...

2009-10-31 01:44:31 219

常用的内存管理算法的简要介绍

主要是介绍一下常用的内存管理算法以及相关的数据结构.三种类型:[size=medium]1 sequential fit[/size]包括first fit,next fit,以及best fit这种算法的实现基本来说都是基于一个双向链表或者循环链表来保存所有的free memory.而且一般都会使用kunth的boundary tag算法来合并临近的内存(这个算法可以...

2009-10-28 20:05:21 404

原创 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 872

gdb学习笔记(一)

这里只是一个摘要。具体的细节还需要去看manual。1 info 用来描述你的程序的状态,比如info b就是显示出当前的程序的所有断点.2 set 用来设置一些环境变量的值,比如set prompt $.3 show用来描述gdb自己的状态.编译要用-g选项.然后用gdb +程序名,或者直接gdb后,用file + 文件名加载程序....

2009-10-17 14:11:54 236

linux内核tcp的定时器管理(二)

这次我们来看后面的3个定时器;首先是keep alive定时器。这个定时器主要是由于一条连接可能长时间idle,此时就需要发送探测包,来探测对端是否存活,如果对端收到这个探测包,它会立即相应一个ack,而当接受到ack之后,我们就能确认对端是存活的。否则我们会认为这个连接除了问题。这个定时器是当一个新的连接变为establish状态的时候被激活,如果在当定时器超时还没有数据...

2009-10-05 20:52:56 169

原创 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 283

linux 内核tcp接收数据的实现

相比于发送数据,接收数据更复杂一些。接收数据这里和3层的接口是tcp_v4_rcv(我前面的blog有介绍3层和4层的接口的实现).而4层和用户空间,也就是系统调用是socket_recvmsg(其他的读取函数也都会调用这个函数).而这个系统调用会调用__sock_recvmsg.下面我们就先来看下这个函数。它的主要功能是初始化sock_iocb,以便与将来数据从内核空间拷贝到用户空间。然...

2009-09-26 20:24:21 275

nginx的进程模型

nginx采用的也是大部分http服务器的做法,就是master,worker模型,一个master进程管理站个或者多个worker进程,基本的事件处理都是放在woker中,master负责一些全局初始化,以及对worker的管理。在nginx中master和worker的通信是通过socketpair来实现的,每次fork完一个子进程之后,将这个子进程的socketpaire句柄传递给前...

2009-09-13 21:11:45 175

linux 内核tcp数据发送的实现

在分析之前先来看下SO_RCVTIMEO和SO_SNDTIMEO套接口吧,前面分析代码时没太注意这两个.这里算是个补充.SO_RCVTIMEO和SO_SNDTIMEO套接口选项可以给套接口的读和写,来设置超时时间,在unix网络编程中,说是他们只能用于读和写,而像accept和connect都不能用他们来设置.可是我在阅读内核源码的过程中看到,在linux中,accept和connect可...

2009-09-10 01:41:13 289

ydb的内存模型

[url=http://arbow.iteye.com]阿宝[/url]同学推荐了这个东西,因此周末就大概看了下源码,这里就简要的分析下它的实现,下面是他的特性。项目地址在这里:http://code.google.com/p/ydb/[quote]# YDB is a key-value storage library.# Simple API, only 6 met...

2009-09-06 18:02:02 102

tcp connection setup的实现(三)

先来看下accept的实现.其实accept的作用很简单,就是从accept队列中取出三次握手完成的socket,并将它关联到vfs上(其实操作和调用sys_socket时新建一个socket类似).然后返回.这里还有个要注意的,如果这个传递给accept的socket是非阻塞的话,就算accept队列为空,也会直接返回,而是阻塞的话就会休眠掉,等待accept队列有数据后唤醒他....

2009-09-03 00:34:36 158

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 223

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除