自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 解析Nginx对HTTP2的支持

HTTP2协议:https://httpwg.org/specs/rfc7540.htmlHTTP2关键词:分帧,多路复用,HPACK,优先级,应用层流控,等文章相关的Nginx版本为1.12.2,该版本Nginx支持下游HTTP2卸载。一、数据结构数据结构图重点结构体ngx_http_v2_connection_t元素含义*connection下游连接...

2019-09-26 00:33:26 4666

原创 TCP拥塞控制:从NewReno到PRR

在面临TCP丢包时,标准的拥塞控制[RFC5681]要求减小cwnd。本文描述的快速回复,也会减小cwnd,这种算法,通过DeliveredData:目前ACK表示的已经传给对端的总字节数。如果没在恢复阶段,DeliveredData表示snd.una的变化。使能SACK,DeliveredData将计算的更加准确,即用snd.una加SACKd的变化表示。在没有使能SACK的恢复阶段,每...

2019-06-19 21:54:27 1369 2

原创 Nginx系列(二十一):HTTP Cache机制

一、配置proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;proxy_cache_path 缓存文件路径levels 设置缓存文件目录层次;levels=1:2 表示两级目录keys_zone 设置缓存名字和共享内存大小inactive 在...

2019-06-11 20:48:40 2696

原创 QUIC随笔

说QUIC前,先说说TCP的拥塞控制。在短瘦管道的时代,小并发、窄带宽和短距离传输使传输层不用过多关注传输速率和响应速度,传输层需要做的是保证数据的可靠到达,有一定的带宽探测能力,保证多条连接之间的绅士(拥塞控制)和公平(AIMD),这也是RENO所实现的。随着网络的发展,管道由短变长,带宽由窄变宽,人们开始关注长管道的传输速度,因为管道变长,RENO基于ACK反馈的AIMD特性造成了慢启动速度慢...

2019-10-10 22:48:24 446

原创 一个问题引发的Linux端口选择算法思考

问题是这样的:在并发并不高的反向代理环境下,用户连接出现失败。因为服务器主动关闭上游连接,并处于TIMEWAIT状态,代理在新建上游连接时,复用了服务器上处于TIMEWAIT状态的五元组源端口。虽然代理上游客户端没有bind操作,但为什么代理上刚被释放的端口这么快又被复用了,查代码,原因是系统使用的某应用层协议栈在不bind端口情况下,采用random随机去选择端口,那么即使可用端口很多,仍存在刚...

2019-07-24 23:20:02 589

原创 谈Timewait和NAT环境下的TW快速回收

关于NAT后端服务端使能TW(Timewait)连接快速回收造成用户连接成功率降低的问题,来捋一捋。TW的意义对于主动关闭连接的一方,总是在FIN_WAIT2状态收到FIN并回复ACK(或在FIN_WAIT1收到FIN/ACK并回复ACK),因为回复的ACK无序列号无法得到对端的确认,所以主动关闭一方无法知道最后的ACK是否到达对端。所以主动关闭一端在回复ACK后进入TW状态,保留2MSL时间...

2019-07-21 13:31:42 995

原创 谈多模匹配算法-AC状态机

谈一下基于trie树的AC匹配算法。trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。AC匹配算法,由关键字组成的集合构成一个有限状态机,将要匹配的text作为输入(触发),输出命中哪些关键字。trie树以{he, she, his, he...

2019-07-20 13:54:30 935

原创 谈TCP BBR拥塞控制算法

说是tcp拥塞控制,也不完全是,因为quic也使用bbr作为拥塞控制算法。quic当道,其而bbr发布前,也已经在google和youtube证明了其在吞吐和延迟上优良的性能,标准TCP的问题基于丢包的拥塞控制算法,来说标准TCP拥塞控制存在的问题。标准TCP将网络丢包的原因归结为拥塞,而忽略链路错误造成的丢包,这在高速网络环境中是不可取的。而传统的拥塞控制算法为了保证其公平性,采用了“加性增...

2019-07-17 00:48:46 13040 1

原创 解析Snort的TCP流重组

关于TCP重组TCP报文段在网络中传输常见的问题包括,因丢包造成的重传,因网络情况造成的报文乱序,为增加性能重传更大的报文段造成报文重叠,等等,通常情况下,内核TCP协议栈会解决这些问题,保证应用层数据的可靠有序。但对于运行在非应用层模块例如传输层以下或不经过内核的功能模块,就应该考虑是否需要解决TCP重传、重叠、乱序等问题,例如这些功能模块希望http协议被正常解析,那么必然要解决上述问题。...

2019-07-11 23:04:17 3324

原创 TCP缓存设置及自调节

工作的原因,同事在单条流的性能测试中出现性能值低的问题,最后的问题点确认为缓存设置不合理。为什么要设置缓存?如何设置缓存?缓存和带宽时延积读缓存的上限应该由TCP接收窗口的最大值确定,过大或过小的接收窗口(通告窗口),都会造成网络问题。发送端可以发送的一窗数据大小,由拥塞窗口(cwmd)和通告窗口的最小值决定,如果接收窗口过小,将使发送端发送速度缓慢,即使再理想的带宽和网络状况,也无法增加连接...

2019-07-02 21:59:34 5295

原创 零拷贝和Nginx的阻塞处理

工作原因,这几天将注意力重新放在了Nginx的文件发送上。在下游使能request_body_no_buffering的情况下,又或者,Nginx提供静态文件缓存的情况下,Nginx如何在保证并发的基础上,将磁盘文件高效的传给对端?Linxu的零拷贝代理和负载均衡中常出现TCP粘合的概念,当需要根据连接的七层数据(比如一个HTTP GET请求)进行负载均衡时,负载均衡器不得不和客户端建立连接,...

2019-06-28 20:29:28 2449

原创 Nginx系列(二十):HTTP Store机制

一、配置location / { //这里的location是要换成自己经过精确匹配的location, ...

2019-06-11 20:47:53 568

原创 Nginx系列(十九):URI转义机制(部分转载)

一、URI和特殊字符源文档 https://www.cnblogs.com/upyun/p/8267334.html1. URIURI,全称是 Uniform Resource Identifiers,即统一资源标识符,用于在互联网上标识一个资源,比如 https://www.upyun.com/products/cdn 这个 URI,指向的是一张漂亮的,描述又拍云 CDN 产品特性的网...

2019-06-11 20:47:37 12737 1

转载 Nginx:“惊群”和负载均衡

一、“惊群”问题概念Nginx的master进程开始监听web端口,fork出多个worker子进程,这些子进程开始监听同一个端口,假定一段时间没有用户连入服务器,某一时刻恰好所有的子进程都进入休眠等待新连接的到来(阻塞在epoll_wait),这时有一个用户向服务器发来了连接,内核在收到SYN包后激活所有子进程,但是此时只有一个进程成功执行accept建立新连接,其它子进程accept失败,...

2019-06-11 20:47:22 216

原创 Nginx(十八):DNS模块

一、请求阶段ngx_resolve_start(1)分配ctx结构体;(2)赋值DNS结束后的回调函数。ngx_resolve_name->ngx_resolve_name_locked如果该域名在resolver中已存在节点:a.如果该节点仍有效,则更新node超时时间,将resolver中的DNS解析结果赋值给ctx,调用ctx的回调;b.如果该节点已失效。若因DNS...

2019-06-11 20:46:51 815

原创 Nginx系列(十七):HTTP subrequest子请求

一个主请求无论产生多少子请求,epoll中始终只包含一个连接的写事件,当该连接的可写事件触发时,该连接所有父子请求都会被处理一遍。c->data 始终指向后序遍历的首个节点位置。顺序从下往上,从左往右,即先产生的子请求要求先发送。一、子请求建立ngx_http_subrequestr->postponed:该请求子请求和已产生数据的树状结构。r->posted_req...

2019-06-11 20:46:36 1113

原创 Nginx系列(十六):HTTP Vary机制

一、概念apache在响应头中返回了一个vary:Accept-encoding ,则squid在存储缓存文件时需要将“我的浏览器”发出的请求头信息中的Accept-encoding字段的值(大多情况就是gzip,deflate之类的)作为缓存key的一部分,因此对于不同的Accept-encoding字段值,都需要保存不同的文件。二、请求阶段在通过key值获取到缓存文件后(ngx_http...

2019-06-11 20:46:21 2073

原创 Nginx系列(十五):epoll机制

nginx的epoll默认是边缘触发。即epoll_ctrl都会传入NGX_CLEAR_EVENT(EPOLLET)参数对于监听套接字,触发方式为水平触发。for (i = 0; i < cycle->listening.nelts; i++) { c = ls[i].connection; if (c == NULL || c->read->acti...

2019-06-11 20:45:59 1604

原创 Nginx系列(十四):支持通配符的散列表

大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理。这个处理起来比较麻烦。而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候。我们就需要构建三个hash表,一个包含普通的key的hash表,一个包含前向通配符的hash表,一个包含后向通配符的hash表(或者也可以把这三个hash表组合成一个ngx_hash_combined...

2019-06-11 13:58:04 438

原创 Nginx系列(十三):变量机制

1. 内部变量:preconfiguration阶段,调用ngx_http_variables_add_core_vars:1)初始化cmcf->variables_keys结构体;2)遍历ngx_http_core_variables核心变量数组,创建ngx_http_variable_t结构体作为value,变量名为key加入cmcf->variables_keys-&g...

2019-06-11 13:48:12 528

原创 Nginx系列(十二):script脚本机制

脚本可分为两类,一类是赋值类,即将变量值放入e->sp;另一类是操作类,常见的是获取e->sp中的值,并进行处理。1. ngx_http_script_compile_t 复杂变量typedef struct { ngx_conf_t *cf; //配置信息 ngx_str_t *source; /...

2019-06-11 13:32:38 1722

原创 Nginx系列(十一):互斥锁的实现

数据结构typedef struct {#if (NGX_HAVE_ATOMIC_OPS) ngx_atomic_t *lock;#if (NGX_HAVE_POSIX_SEM) ngx_atomic_t *wait; ngx_uint_t semaphore; sem_t sem;#endif#else ngx_fd...

2019-06-11 13:18:50 624

原创 Nginx系列(十):启动流程

一、主启动流程流程图主要函数ngx_get_options解析命令参数ngx_process_options配置前缀、前缀、配置文件、配置参数等字符串ngx_add_inherited_sockets在进行平滑升级时,将通过“NGINX”环境变量将监听的fd传递给新的进程,用于初始化新进程的cycle->listening结构体。ngx_init_cycle更...

2019-06-11 13:08:20 653

原创 Nginx系列(九):location快速查询

一、location解析location共分为三种:1)exact_match:“=”类型,全匹配;2)noregx:“^~”类型,前缀匹配;3)regex:“”或“*”类型,正则匹配;4)named:“@”类型,内部跳转匹配。对于存在父子关系的location:1)父只能是noregex或regex类型;2)子不能使named类型;3)子的name不能包含父。二...

2019-06-11 12:11:26 520

原创 Nginx系列(八):server快速查询

一、基于名字的虚拟主机Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始:server { listen 80; server_name example.org www.example.org; ...} server { listen 80; server_n...

2019-06-11 12:06:43 687

原创 Nginx系列(七):HTTP请求释放

upstream资源释放(ngx_http_upstream_finalize_request)调用u->peer.free释放上游TCP连接,详见upstream文档;删除上游响应的文件缓存;发送r->out中缓存的内容。无论是non_buffer或pipe进行上游响应的发送,都使用r->pool分配的内存(u->buffer/u->pipe->...

2019-06-11 11:55:16 1643 1

原创 Ngxin系列(六):HTTP响应发送-上游网速优先

一、READ阶段preread_bufs预读取的响应包体,在读响应头时获取到,存放在u->buffer;接收空间的分配从free_raw_bufs中获取。single_buf:为1时只获取一个chain,为0时获取所有chain。重新分配。(1)申请的内存块数量和大小受p->bufs(proxy_buffers指令大小)的限制;(2)分配ngx_chain_...

2019-06-11 11:24:47 216

原创 Nginx系列(五):HTTP响应发送-下游网速优先

响应报文接收:ngx_http_upstream_process_non_buffered_request()n = upstream->recv(upstream, b->last, size);保存于u->buffer(proxy_buffer_size指令大小)中。u->free_bufs申请:1)分配ngx_chain_t;2)分配ngx_bu...

2019-06-11 10:09:52 402

原创 Nginx系列(四):upstream模块

配置解析阶段init_main阶段在init_upstream时,因为upstream的每个server在DNS后可能存在多个IP,所以init_upstream生成的peer是所有解析结果的集合,例如,一个server的权值为10,解析后由5个IP,那么,将申请5个rrp,每个的权值都是10。调用kcf->original_init_upstream(ngx_http_upstre...

2019-06-10 18:09:12 2075

原创 Nginx系列(三):rewrite重写模块

一、配置rewrite目的为“http://”或“https://”:rewrite的handler结束后将直接返回302临时重定向。last:具有last的一行指令解析结束后,会在codes数组最后填充NULL,所以同一块区域后面的rewrite相关指令都不再生效。break:r->uri_changed会被赋值为0,在POST_REWRITE阶段,执行r->phase_ha...

2019-06-10 17:40:58 1210

原创 Nginx系列(二):HTTP头部处理

一、请求头conf->headers->hash将proxy_set_header指令设置的头字段,以及ngx_http_proxy_headers结构体指定的字段,形成哈希表,用于头字段查找。如果两者内容冲突,以proxy_set_header为准。自定义部分,必须发送。conf->headers->lengths:形成nginx脚本,计算上述头字段长度。con...

2019-06-10 17:01:23 2094

原创 Nginx系列(一):HTTP处理流程概述

accept阶段(ngx_http_init_connection):分配ngx_http_connection_t结构体;根据fd的端口和地址,为hc->addr_conf赋值,以供后续server块查询;新的fd加入epoll,设置读超时,超时时间为post_accept_timeout,设置连接可重用。rev:ngx_http_wait_request_handle...

2019-06-10 16:34:19 1587 1

空空如也

空空如也

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

TA关注的人

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