- 博客(692)
- 资源 (3)
- 收藏
- 关注
转载 Nginx基本数据结构之ngx_queue_t
ngx_queue_t是nginx中的双向链表,在nginx源码目录src/core下面的ngx_queue.h|c里面。它的原型如下:typedef struct ngx_queue_s ngx_queue_t;struct ngx_queue_s { ngx_queue_t *prev; ngx_queue_t *next;};不同于教科书
2013-12-10 17:20:33 1224
转载 Nginx基本数据结构之ngx_list_t
ngx_list_t顾名思义,看起来好像是一个list的数据结构。这样的说法,算对也不算对。因为它符合list类型数据结构的一些特点,比如可以添加元素,实现自增长,不会像数组类型的数据结构,受到初始设定的数组容量的限制,并且它跟我们常见的list型数据结构也是一样的,内部实现使用了一个链表。那么它跟我们常见的链表实现的list有什么不同呢?不同点就在于它的节点,它的节点不像我们常见的lis
2013-12-10 17:19:52 964
转载 Nginx基本数据结构之ngx_buf_t
这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据。该结构实际上是一种抽象的数据结构,它代表某种具体的数据。这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分,也可能是一些纯元数据(元数据的作用在于指示这个链表的读取者对读取的数据进行不同的处理)。该数据结构位于src/core/ngx_buf.h|c文件中。我们来看一下它的定义。s
2013-12-10 17:19:15 7873
转载 Nginx基本数据结构之ngx_chain_t
nginx的filter模块在处理从别的filter模块或者是handler模块传递过来的数据(实际上就是需要发送给客户端的http response)。这个传递过来的数据是以一个链表的形式(ngx_chain_t)。而且数据可能被分多次传递过来。也就是多次调用filter的处理函数,以不同的ngx_chain_t。该结构被定义在src/core/ngx_buf.h|c。下面我们来看一下n
2013-12-10 17:18:23 3710
转载 Nginx基本数据结构之ngx_hash_keys_arrays_t
大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理。这个处理起来比较麻烦。而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候。我们就需要构建三个hash表,一个包含普通的key的hash表,一个包含前向通配符的hash表,一个包含后向通配符的hash表(或者也可以把这三个hash表组合成一个ngx_hash_combined
2013-12-10 17:17:33 1244
转载 Nginx基本数据结构之ngx_hash_combined_t
组合类型hash表,该hash表的定义如下:typedef struct { ngx_hash_t hash; ngx_hash_wildcard_t *wc_head; ngx_hash_wildcard_t *wc_tail;} ngx_hash_combined_t;从其定义显见,该类型实际上包含了三个hash表
2013-12-10 17:16:50 1000
转载 Nginx基本数据结构之ngx_hash_wildcard_t
nginx为了处理带有通配符的域名的匹配问题,实现了ngx_hash_wildcard_t这样的hash表。他可以支持两种类型的带有通配符的域名。一种是通配符在前的,例如:“*.abc.com”,也可以省略掉星号,直接写成”.abc.com”。这样的key,可以匹配www.abc.com,qqq.www.abc.com之类的。另外一种是通配符在末尾的,例如:“mail.xxx.*”,请特别注意通配
2013-12-10 17:16:14 2049
转载 Nginx基本数据结构之ngx_hash_t
ngx_hash_t是nginx自己的hash表的实现。定义和实现位于src/core/ngx_hash.h|c中。ngx_hash_t的实现也与数据结构教课书上所描述的hash表的实现是大同小异。对于常用的解决冲突的方法有线性探测,二次探测和开链法等。ngx_hash_t使用的是最常用的一种,也就是开链法,这也是STL中的hash表使用的方法。但是ngx_hash_t的实现又有其几个显著
2013-12-10 16:54:35 1512
转载 Nginx基本数据结构之ngx_array_t
ngx_array_t是nginx内部使用的数组结构。nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存。但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息。下面我们从数组的定义上来详细的了解一下。ngx_array_t的定义位于src/core/ngx_array.c|h里面。typedef struct
2013-12-10 16:53:35 905
转载 Nginx基本数据结构之ngx_pool_t
ngx_pool_t是一个非常重要的数据结构,在很多重要的场合都有使用,很多重要的数据结构也都在使用它。那么它究竟是一个什么东西呢?简单的说,它提供了一种机制,帮助管理一系列的资源(如内存,文件等),使得对这些资源的使用和释放统一进行,免除了使用过程中考虑到对各种各样资源的什么时候释放,是否遗漏了释放的担心。例如对于内存的管理,如果我们需要使用内存,那么总是从一个ngx_pool_t的对象
2013-12-10 16:49:39 1001
转载 Nginx基本数据结构之ngx_str_t
nginx的作者为追求极致的高效,自己实现了很多颇具特色的nginx风格的数据结构以及公共函数。比如,nginx提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数ngx_copy等。所以,在我们写nginx模块时,应该尽量调用nginx提供的api,尽管有些api只是对glibc的宏定义。本节,我们介绍string、list、buffer、chain等一系列最基本的数据结构及相关api的使
2013-12-10 16:27:58 14312 1
转载 nginx基础概念(100%)之lingering_close
lingering_close,字面意思就是延迟关闭,也就是说,当nginx要关闭连接时,并非立即关闭连接,而是先关闭tcp连接的写,再等待一段时间后再关掉连接的读。为什么要这样呢?我们先来看看这样一个场景。nginx在接收客户端的请求时,可能由于客户端或服务端出错了,要立即响应错误信息给客户端,而nginx在响应错误信息后,大分部情况下是需要关闭当前连接。nginx执行完write()系统调用把
2013-12-10 16:09:21 6472
转载 nginx基础概念(100%)之pipe
在http1.1中,引入了一种新的特性,即pipeline。那么什么是pipeline呢?pipeline其实就是流水线作业,它可以看作为keepalive的一种升华,因为pipeline也是基于长连接的,目的就是利用一个连接做多次请求。如果客户端要提交多个请求,对于keepalive来说,那么第二个请求,必须要等到第一个请求的响应接收完全后,才能发起,也就是说,请求是串行进行的,一个请求接着下一
2013-12-10 15:50:49 2502
转载 POSIX线程专有数据的空间释放问题,pthread_key_create
下面说一下线程中特有的线程存储, Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。下面说
2013-12-10 15:48:55 849
转载 nginx基础概念(100%)之keepalive
当然,在nginx中,对于http1.0与http1.1也是支持长连接的。什么是长连接呢?我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的,如果客户端与服务端之间网络差一点,这三次交互消费的时间会比较多,而且三次交互也会带来网络流量。当然,当连接断开后,也会有四次的交互,当然对用户体验来说就不重要了。
2013-12-10 15:45:13 8285
转载 nginx基础概念(100%)之request
这节我们讲request,在nginx中我们指的是http请求,具体到nginx中的数据结构是ngx_http_request_t。ngx_http_request_t是对一个http请求的封装。 我们知道,一个http请求,包含请求行、请求头、请求体、响应行、响应头、响应体。http请求是典型的请求-响应类型的的网络协议,而http是文件协议,所以我们在分析请求行与请求头,以及输出响应行
2013-12-10 15:38:03 1689
转载 nginx基础概念(100%)之connection
在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件。利用nginx封装的connection,我们可以很方便的使用nginx来处理与连接相关的事情,比如,建立连接,发送与接受数据等。而nginx中的http请求的处理就是建立在connection之上的,所以nginx不仅可以作为一个web服务器,也可以作为邮件服务器。当然,利用nginx提供的co
2013-12-10 15:18:47 2796
转载 初探nginx架构(100%)
众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧。nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉后台模式,让nginx在前台运行,并且通过配置让nginx取消master进程,从而可以使nginx以单进
2013-12-10 15:08:03 8951
转载 nginx源码分析(2)——http模块的初始化过程
前一篇文章介绍了nginx的启动初始化过程,包括了所有模块的初始化过程,比如http模块、事件模块等。这里再详细介绍一下http模块的启动过程,还记得在前一篇文章中提到过ngx_conf_parse函数背后隐藏了大量的细节吗?这里就揭开这层神秘的面纱,去看看几个重要的http模块是如何初始化的。这里依然沿用上一篇文章的结构,首先来看几个重要的数据结构。1. 重要的数据结构
2013-12-10 14:49:06 1443
转载 Nginx经验总结
1. post方法请求静态文件默认情况下,web服务器都不允许post方法请求静态文件,会返回响应403 Not Allowed。但是有些时候确实有这种需求。可以通过配置文件来改变这种设置:在需要处理静态文件的location里这样配置即可,[plain] view plaincopyprint?location /static/ {
2013-12-10 09:55:13 1136
转载 Nginx学习之二-配置项解析及编程实现
在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息。不过,我们并不需要再编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时还支持“-s reload”命令,可以在不重启服务的情况下可使配置生效。一、Nginx配置文件简介如果编译安装Nginx时使用默认路径,那么Nginx运行目录是/usr/local/nginx,其配置文件存放目
2013-12-09 17:09:01 1079
转载 关于Nginx的配置文件解析
(大部分内容是基于作者本人的理解和在网络上搜索到的资料整合而成)由于本人理解能力有限,若有不足或错误之处还请各位看官多多指点! 关于Nginx的主配置文件(/etc/nginx/nginx.conf)Nginx 的配置文件主要分为4部分:main (全局设置) -> 此部分设置的指令将影响其它所有设置server (主机设置)
2013-12-09 15:57:31 3590
转载 Nginx 源码编译
1、首先在官网下载Nginx 发布版的源码,Nginx 官网下载的地址是 :http://www.nginx.org/en/download.html因为Nginx官网支持SVN,可以简单方便的使用svn下载的是Nginx 1.3.0 版源码编译,命令如下:svn checkout svn://svn.nginx.org/nginx/tags/release-1.3.0
2013-12-09 13:53:04 855
转载 PPP协议全面分析
什么是PPP协议?用于何种信道的链路层控制?PPP的工作原理。 PPP即用户计算机和ISP进行通信时所使用的数据链路层协议。用于点对点信道。 工作原理: 1)当用户拨号接入ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接。 2)PC 机向路由器发送一系列的LCP 分组(封装成多个 PPP 帧)。 3)这些分组及其响应选择一些PPP
2013-12-06 17:39:05 1871
转载 通过radius给ppp客户端分配ip地址
radius给ppp客户端自动分配ip地址有两种方法,一种是通过users文件,一种是使用ippool模块 第一种方法非常简单;第二种方法非常难,本人也还未实现,摸索ing; 今天介绍如何通过users文件来静态或动态分配ip地址; 使用下述方法之前,你必须确保整个radius对接过程是通过的,对接过程可以参考我博客中的radius标签下的文章;
2013-12-06 14:18:51 9429
转载 Linux PPP实现源码分析-2
detach(); //默认放在后台以daemon执行,也可配置/etc/ppp/option中的nodetach参数放在前台执行……"pppd %s started by %s, uid %d"uid); //熟悉的log,现在准备执行了 getpid()); setup_signals(); //设置信号处理函数
2013-12-06 13:51:42 2338
转载 ioctl函数详细说明
ioctl 函数 本函数影响由fd 参数引用的一个打开的文件。 #includeint ioctl( int fd, int request, .../* void *arg */ );返回0 :成功 -1 :出错 第三个参数总是一个指针,但指针的类型依赖于request 参数。我们可以把和网络相关的请求划分为6 类:套接口操作文件操作接口操作
2013-12-06 12:17:04 729
转载 Linux PPP实现源码分析-1
前言:PPP(Point to Point Protocol)协议是一种广泛使用的数据链路层协议,在国内广泛使用的宽带拨号协议PPPoE其基础就是PPP协议,此外和PPP相关的协议PPTP,L2TP也常应用于VPN虚拟专用网络。随着智能手机系统Android的兴起,PPP协议还被应用于GPRS拨号,3G/4G数据通路的建立,在嵌入式通信设备及智能手机中有着广泛的应用基础。本文主要分析Lin
2013-12-06 11:19:57 1669
转载 radius介绍
最近一直在做freedius.net,freeradius这个东西原本是在linux下的radius服务器。 可是呢现在要用到windows下,虽然有windows的版本——freeradius.net。但是很可笑的是.net竟然没有连接mssql的驱动,在google上找了很久,没有解决的办法。于是想把radius服务器放linux下的,然后联另一台window
2013-12-05 12:27:23 2962
转载 在 Linux 上构建一个 RADIUS 服务器
在 Linux 上构建一个 RADIUS 服务器将远程网络登录集中化并保证其安全作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息。但是网络设备通常只支持有限的用户管理功能。学习如何使用 Linux™ 上的一个外部 RADIUS 服务器来验证用户,具体来说是通过一个 LDAP 服务器进行验证,可以集中放置存储在 LDAP 服务器上并且由 RADI
2013-12-05 12:26:15 3435
转载 浅谈Radius协议
从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下,从RADIUS协议谈谈对身份认证的认识,也总结一下自己。 一.RADIUS协议原理 RADIUS(Remote Authentication Dial In User Service) 用户远程拨入认证服务,它主要针对的远程登录类型有:SLIP、PPP、telnet和rlogin等。RADIUS协议应用
2013-12-03 16:06:42 42626 3
转载 L2TP介绍
L2TP概述L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual Private Dial-up Network,虚拟私有拨号网)隧道协议的一种。VPDN是指利用公共网络(如ISDN或PSTN)的拨号功能接入公共网络,实现虚拟专用网,从而为企业、小型ISP、移动办公人员等提供接入服务。即,VPDN为远端用户与私有企业网之间提供了一
2013-12-03 12:02:24 1557
转载 AAA 及RADIUS协议配置
AAA 及RADIUS协议配置 1.1 简介1.1.1 AAA 简介AAA是Authentication,Authorization and Accounting(认证、授权和计费)的简称,它提供了一个对认证、授权和计费这三种安全功能进行配置的一致性框架,实际上是对网络安全的一种管理。 这里的网络安全主要是指访问控制,包括: 哪些用户可以访问网
2013-12-03 10:23:23 13471 2
转载 L2TP协议笔记2---L2TP主要协议报文分析
五、L2TP的Tunnel和Session建立过程 ① 1(SCCRQ)Start-Control-Connection-Request 控制链接发起请求,由LAC或LNS向对端发送,用来初始化LAC和LNS之间的tunnel,开始tunnel的建立过程。② 2(SCCRP)Strat-Control-Connection-Reply 表
2013-11-26 15:51:05 5912
转载 L2TP协议笔记1---L2TP概念及协议流程分析
这个协议是早前做防火墙测试工作时主要负责测试的协议,虽然只做了几个月,但感觉如果把当时的一些学习笔记和经验整理好放在网络中,不仅可以使自己的协议理解得到巩固,也让自己有机会在和别人交流中互相学习。 当初学习时,看的资料大部分都是先简介协议然后直接就开始抽象的介绍各种报文格式、报文每个字段的作用,光是大量报文名称看着头就很大了,所以在这里先介绍了L2TP的大框,知道是干什么的
2013-11-26 15:27:50 18788
转载 UDP协议及包格式
对UDP协议进行了一下复习:------------------总结起来:1.无连接,不可靠;2.出错(通过校验和检查)就丢掉此包,丢失不重传,只是给个警告;3.包的格式,有源端口和目的端口,校验和等;4.端口号,根据应用层服务的不同,可以是默认的端口,也可以自己设定。-----------------(以下转自网络)UDP协议的主要特点UDP是
2013-11-21 16:50:46 1012
转载 IP协议(RFC791)-IP包格式
IP封包格式(IPv4包首部长度为20字节)Internet Header Format 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2013-11-21 15:39:03 2575
转载 网络层(网际控制报文协议ICMP)
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
2013-11-21 15:26:27 1456
转载 Linux tcpdump命令详解
简介用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 实用命令实例默认启动tc
2013-11-21 12:12:01 1331
转载 基于tcpdump实例讲解TCP/IP协议
前言虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲解客户端和服务端的TCP/IP交互细节。TCP/IP协议IP头和TCP头格式如下:Internet Header Format 0
2013-11-21 12:02:19 1344
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人