`
simohayha
  • 浏览: 1383353 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论
文章列表
纠结了好久,终于弄了个独立blog。 地址是: 这里 如果您有订阅我的blog,希望您能更改订阅地址,因为这里以后就不更新了,谢谢!
1 代码之美 全新 60 3 c++网络编程卷2 全新 30 8 tcp/ip 详解 第二卷中文版  全新  60 这里基本全新 就是 有在里面画一些线。。 价钱都好商量,只限杭州市内。 有意向给我发站内消息或者给我留个联系方式,我联系你。
Receive packet steering简称rps,是google贡献给linux kernel的一个patch,主要的功能是解决多核情况下,网络协议栈的软中断的负载均衡。这里的负载均衡也就是指能够将软中断均衡的放在不同的cpu核心上运行。 简介在这里: http://lwn.net/ ...
这个是google的人提出的概念,那就是对tcp的拥塞窗口的初始值进行增大可以显著的提高http的性能,这个主要是针对tcp的slow start(我前面的blog有介绍)的. 下面是相关的paper和ppt: paper: http://code.google.com/speed/articles/tcp_initcwnd_paper ...
首先来看subrequest的处理。 什么是subrequest,顾名思义,那就是子请求,也就是在当前的一个请求中nginx再生成一个请求。比如在nginx的HttpAddition这个filter,就有用到subrequest。 这里要注意,一个subrequest是当父reuest执行完毕后才会被执行,并且它会将所有的需要进行的handler phase重新执行一遍(这个我们后面的代码会看到). 这里还涉及到一个很关键的filter,那就是postpone filter,这个filter就用来缓存住父request,这里的缓存就是将需要发送的数据保存到一个链表中。这个是因为会先执行su ...
这次我们来看各个phase的checker的处理。 首先我们要弄明白一个事情,那就是在nginx中,一般来说,都是在NGX_HTTP_CONTENT_PHASE中调用outputfilter的,也就是说filter是在handler中调用的,这样看来只能有一个handler能够执行outputfiler.所以说 ...
nginx中的处理一个http的请求分为了8个phase,分别是下面几个阶段. 其中特别要注意就是几个rewrite阶段。 typedef enum { //读取请求phase NGX_HTTP_POST_READ_PHASE = 0, //接下来就是开始处理 //这个阶段主要是处理全局的(server block)的rewrite。 NGX_HTTP_SERVER_REWRITE_PHASE, //这个阶段主要是通过uri来查找对应的location。然后将uri和location的数据关联起来 NGX_HTTP_FIND_CONFIG_PHASE, ...
接着上次的分析继续,这次我们来看filter链中最关键的一个模块,那就是ngx_http_copy_filter_module模块,这个filter主要是用来将一些需要复制的buf(文件或者内存)重新复制一份然后发送给剩余的body filter,这里有个很重要的部分,那就 ...
nginx中使用的锁是自己来实现的,这里锁的实现分为两种情况,一种是支持原子操作的情况,也就是由NGX_HAVE_ATOMIC_OPS这个宏来进行控制的,一种是不支持原子操作,这是是使用文件锁来实现。 首先我们要知道在用户空间进程间锁实现的原理,起始原理很简单,就是能弄一个让所有进程共享的东西,比如mmap的内存,比如文件,然后通过这个东西来控制进程的互斥。 说起来锁很简单,就是共享一个变量,然后通过设置这个变量来控制进程的行为。 我们先来看核心的数据结构,也就是说用来控制进程的互斥的东西。 这个数据结构可以看到和我上面讲得一样,那就是通过宏来分成两种。 1 如果支持原子操作,则我们可 ...
这里我们详细来看ngx_linux_sendfile_chain方法,这个函数也就是nginx的发送函数。 一般来说,我们最终都会调用这个函数来发送最终的数据,因此我们来着重分析这个函数,这里主要就是对buf的一些参数的理解。 来看函数原型: ngx_chain_t * ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) 第一个参数是当前的连接,第二个参数是所需要发送的chain,第三个参数是所能发送的最大值。 然后来看这里的几个重要的变量: send 表示将要发送的buf已 ...
随笔拿一个nginx的filter模块来看,gzip模块,来看它的初始化。 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; static ngx_http_output_body_filter_pt ngx_http_next_body_filter; static ngx_int_t ngx_http_gzip_filter_init(ngx_conf_t *cf) { ngx_http_next_header_filter = ngx_http_top_header_ ...
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的解析,最后进入headers的解析。 static void ngx_http_process_request_line(ngx_event_t *rev) { ............... ...
这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应. 可以看到这里会有个问题的,那就是我们如何来之到对端是否支持ECN,在内核中一般都是在握手的时候就会确定对端是否支持ECN.这里可以看到我们ip头里面必须用到2位,因为这里我们会有3个状态: 第一 ...
上一篇处理ack的blog中我们知道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段。 SACK是包含在tcp的option中的,由于tcp的头的长度的限制,因此SACK也就 ...
其实有一些是很早就看过或听过的,只不过今年加进去了,还有一些书就是没看完,比如haskell那本。。
Global site tag (gtag.js) - Google Analytics