<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[但行好事 莫问前程]]></title><description><![CDATA[on the programming road ]]></description><link>https://blog.youkuaiyun.com/interhanchi</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; interhanchi]]></copyright><item><title><![CDATA[我的新blog地址]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83682095</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83682095</guid><author>interhanchi</author><pubDate>Mon, 09 Aug 2010 21:03:45 +0800</pubDate><description><![CDATA[纠结了好久，终于弄了个独立blog。

地址是:
[url=http://www.pagefault.info]这里[/url]

如果您有订阅我的blog，希望您能更改订阅地址，因为这里以后就不更新了，谢谢！...]]></description><category></category></item><item><title><![CDATA[Receive packet steering patch详解]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83674593</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83674593</guid><author>interhanchi</author><pubDate>Sun, 25 Jul 2010 16:46:23 +0800</pubDate><description><![CDATA[Receive packet steering简称rps，是google贡献给linux kernel的一个patch，主要的功能是解决多核情况下，网络协议栈的软中断的负载均衡。这里的负载均衡也就是指能够将软中断均衡的放在不同的cpu核心上运行。

简介在这里：
http://lwn.net/Articles/362339/

linux现在网卡的驱动支持两种模式，一种是NAPI，一种是...]]></description><category></category></item><item><title><![CDATA[内核中拥塞窗口初始值对http性能的影响分析]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83668113</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83668113</guid><author>interhanchi</author><pubDate>Sun, 11 Jul 2010 00:20:21 +0800</pubDate><description><![CDATA[这个是google的人提出的概念，那就是对tcp的拥塞窗口的初始值进行增大可以显著的提高http的性能，这个主要是针对tcp的slow start（我前面的blog有介绍)的.

下面是相关的paper和ppt：

paper： http://code.google.com/speed/articles/tcp_initcwnd_paper.pdf
ppt：http://www.ietf...]]></description><category></category></item><item><title><![CDATA[nginx中sub_request的处理]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83663828</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83663828</guid><author>interhanchi</author><pubDate>Wed, 30 Jun 2010 18:17:01 +0800</pubDate><description><![CDATA[首先来看subrequest的处理。

什么是subrequest，顾名思义，那就是子请求，也就是在当前的一个请求中nginx再生成一个请求。比如在nginx的HttpAddition这个filter，就有用到subrequest。

这里要注意，一个subrequest是当父reuest执行完毕后才会被执行，并且它会将所有的需要进行的handler phase重新执行一遍(这个我们后面的...]]></description><category></category></item><item><title><![CDATA[nginx中handler的处理(二)]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83636288</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83636288</guid><author>interhanchi</author><pubDate>Sun, 30 May 2010 18:33:39 +0800</pubDate><description><![CDATA[这次我们来看各个phase的checker的处理。

首先我们要弄明白一个事情，那就是在nginx中，一般来说，都是在NGX_HTTP_CONTENT_PHASE中调用outputfilter的，也就是说filter是在handler中调用的，这样看来只能有一个handler能够执行outputfiler.所以说在写nginx的handler模块的话，要注意不同的phase的返回值代表的不同意...]]></description><category></category></item><item><title><![CDATA[nginx中handler的处理(一)]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83631450</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83631450</guid><author>interhanchi</author><pubDate>Thu, 20 May 2010 01:09:57 +0800</pubDate><description><![CDATA[nginx中的处理一个http的请求分为了8个phase,分别是下面几个阶段.

其中特别要注意就是几个rewrite阶段。
[code=&quot;java&quot;]typedef enum {
//读取请求phase
    NGX_HTTP_POST_READ_PHASE = 0,
//接下来就是开始处理

//这个阶段主要是处理全局的(server block)的rewrite。
   ...]]></description><category></category></item><item><title><![CDATA[nginx中的output chain的处理(二)]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83611443</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83611443</guid><author>interhanchi</author><pubDate>Sun, 09 May 2010 13:45:42 +0800</pubDate><description><![CDATA[接着上次的分析继续，这次我们来看filter链中最关键的一个模块，那就是ngx_http_copy_filter_module模块，这个filter主要是用来将一些需要复制的buf(文件或者内存)重新复制一份然后发送给剩余的body filter，这里有个很重要的部分，那就是在这里nginx的剩余的body filter有可能会被调用多次，这个接下来我会一一阐述的。先来看它的初始化函数：

[...]]></description><category></category></item><item><title><![CDATA[nginx中锁的设计以及惊群的处理]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83608741</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83608741</guid><author>interhanchi</author><pubDate>Mon, 03 May 2010 02:13:15 +0800</pubDate><description><![CDATA[nginx中使用的锁是自己来实现的，这里锁的实现分为两种情况，一种是支持原子操作的情况，也就是由NGX_HAVE_ATOMIC_OPS这个宏来进行控制的，一种是不支持原子操作，这是是使用文件锁来实现。

首先我们要知道在用户空间进程间锁实现的原理，起始原理很简单，就是能弄一个让所有进程共享的东西，比如mmap的内存，比如文件，然后通过这个东西来控制进程的互斥。

说起来锁很简单，就是共享一...]]></description><category></category></item><item><title><![CDATA[nginx中的output chain的处理(一)]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83604753</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83604753</guid><author>interhanchi</author><pubDate>Sat, 24 Apr 2010 00:59:05 +0800</pubDate><description><![CDATA[这里我们详细来看ngx_linux_sendfile_chain方法，这个函数也就是nginx的发送函数。

一般来说，我们最终都会调用这个函数来发送最终的数据，因此我们来着重分析这个函数，这里主要就是对buf的一些参数的理解。

来看函数原型：
[code=&quot;java&quot;]
ngx_chain_t *
ngx_linux_sendfile_chain(ngx_connection_t...]]></description><category></category></item><item><title><![CDATA[nginx的filter的处理]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83599025</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83599025</guid><author>interhanchi</author><pubDate>Tue, 13 Apr 2010 00:38:12 +0800</pubDate><description><![CDATA[随笔拿一个nginx的filter模块来看，gzip模块，来看它的初始化。

[code=&quot;java&quot;]
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...]]></description><category></category></item><item><title><![CDATA[nginx中request请求的解析]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83595505</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83595505</guid><author>interhanchi</author><pubDate>Sun, 04 Apr 2010 01:15:23 +0800</pubDate><description><![CDATA[
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...]]></description><category></category></item><item><title><![CDATA[卖书了]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83570290</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83570290</guid><author>interhanchi</author><pubDate>Fri, 26 Mar 2010 23:15:46 +0800</pubDate><description><![CDATA[1 代码之美 全新 60


3 c++网络编程卷2 全新 30


8 tcp/ip 详解 第二卷中文版  全新  60


这里基本全新 就是 有在里面画一些线。。

价钱都好商量，只限杭州市内。 有意向给我发站内消息或者给我留个联系方式，我联系你。
...]]></description><category></category></item><item><title><![CDATA[linux 内核tcp拥塞处理(一)]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83564322</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83564322</guid><author>interhanchi</author><pubDate>Fri, 12 Mar 2010 16:17:30 +0800</pubDate><description><![CDATA[这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应...]]></description><category></category></item><item><title><![CDATA[内核tcp协议栈SACK的处理]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83533399</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83533399</guid><author>interhanchi</author><pubDate>Sun, 24 Jan 2010 21:13:44 +0800</pubDate><description><![CDATA[上一篇处理ack的blog中我们知道当我们接收到ack的时候，我们会判断sack段，如果包含sack段的话，我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段。

SACK是包含在tcp的option中的，由于tcp的头的长度的限制，因此SACK也就是最多包含4个段，也就是32个字节。我们先来看tcp中的SACK段的表示：

[code=&quot;java&quot;]
struct tcp...]]></description><category></category></item><item><title><![CDATA[09年看的书，电影以及听过的音乐]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83530550</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83530550</guid><author>interhanchi</author><pubDate>Sun, 17 Jan 2010 17:50:38 +0800</pubDate><description><![CDATA[其实有一些是很早就看过或听过的，只不过今年加进去了，还有一些书就是没看完，比如haskell那本。。


[img]http://dl.iteye.com/upload/attachment/194684/a030715f-6df4-3953-ae11-722f7d11dac8.jpg[/img]


[img]http://dl.iteye.com/upload/attachment...]]></description><category></category></item><item><title><![CDATA[内核tcp的ack的处理]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83530418</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83530418</guid><author>interhanchi</author><pubDate>Sun, 17 Jan 2010 03:06:43 +0800</pubDate><description><![CDATA[我们来看tcp输入对于ack，段的处理。

先是ack的处理，在内核中，处理ack段是通过tcp_ack来进行的。

这个函数主要功能是：

1 update重传队列，并基于sack来设置skb的相关buf。

2 update发送窗口。

3 基于sack的信息或者重复ack来决定是否进入拥塞模式。


在看之前我们要知道tcp是累积确认的。为了解决带来的缺点，我们才需...]]></description><category></category></item><item><title><![CDATA[内核处理time_wait状态详解]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83527530</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83527530</guid><author>interhanchi</author><pubDate>Sun, 10 Jan 2010 17:39:21 +0800</pubDate><description><![CDATA[这次来详细看内核的time_wait状态的实现，在前面介绍定时器的时候，time_wait就简单的介绍了下。这里我们会先介绍tw状态的实现，然后来介绍内核协议栈如何处理tw状态。

首先我们要知道在linux内核中time_wait的处理是由tcp_time_wait这个函数来做得，比如我们在closing状态收到一个fin，就会调用tcp_time_wait.而内核为time_wait状态的...]]></description><category></category></item><item><title><![CDATA[linux已经不存在惊群现象]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83524315</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83524315</guid><author>interhanchi</author><pubDate>Sat, 02 Jan 2010 22:10:08 +0800</pubDate><description><![CDATA[惊群也就是指多个进程阻塞在accept，当有连接完成，会唤醒所有进程。


经过测试，发现现在的内核已经修复了这个问题，当有多个进程阻塞在accept，只会唤醒一个进程。

下面这个是一篇论文，就是讲这个问题的。

http://www.usenix.org/event/usenix2000/freenix/full_papers/molloy/molloy.pdf

这里会先测...]]></description><category></category></item><item><title><![CDATA[tcp协议栈处理各种事件的分析]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83523284</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83523284</guid><author>interhanchi</author><pubDate>Wed, 30 Dec 2009 01:29:55 +0800</pubDate><description><![CDATA[首先我们来看socket如何将一些状态的变化通知给对应的进程，比如可读，可写，出错等等。

先来看sock结构中这几个相关域：

[code=&quot;java&quot;]struct sock {
..........................
wait_queue_head_t	*sk_sleep;
.....................................
void		...]]></description><category></category></item><item><title><![CDATA[linux内核sk_buff的结构分析]]></title><link>https://blog.youkuaiyun.com/interhanchi/article/details/83521490</link><guid>https://blog.youkuaiyun.com/interhanchi/article/details/83521490</guid><author>interhanchi</author><pubDate>Fri, 25 Dec 2009 00:42:06 +0800</pubDate><description><![CDATA[我看的内核版本是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,第三个是...]]></description><category></category></item></channel></rss>