自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (4)
  • 收藏
  • 关注

转载 在ubuntu下编译linux版客户端遇__GNUC_PREREQ编译错误的解决方法

使用linux编译调试,今天尝试编译发现如下错误:error: missing binary operator before token "("__BEGIN_DECLS does not name a type第一个错误位置为系统的string.h的这个位置:#if defined __cplusplus && __GNUC_PREREQ (4, 4)让人困惑,于是在

2016-06-16 10:22:05 2451 1

原创 linux内核学习笔记------ARP:地址解析协议

当发送ARP请求时,发送方填入发送方以太网地址、发送方ip地址以及目标ip地址。目标主机接收到这个ARP广播包时,会在响应报文中填上自己的以太网地址。ARP报文格式如下:硬件类型协议类型硬件地址长度协议地址长度操作码src硬件地址src ip地址dst硬件地址目标ip地址1、硬件类型都是以ARPHDR_开头2、操作码包

2014-01-07 20:58:05 4597

原创 linux内核学习笔记------邻居子系统(一)

在学习之前,可以先读读这两篇博客,特别是第一篇:http://blog.csdn.net/minghe_uestc/article/details/7794852http://blog.csdn.net/qy532846454/article/details/6806197邻居子系统的结构由多个数据结构组成:1、neigh_table结构:该结构主要用来存储与邻居协议相关的参数

2014-01-05 21:09:36 3027

原创 linux内核学习笔记------ip报文组装

ip报文有分片就会有组装。在接收方,只有报文的所有分片被重新组合后才会提交到上层协议。内核组装ip报文用到了ipq结构体:(注,这系列源码中的注释都来自:http://blog.csdn.net/justlinux2010)struct ipq { struct inet_frag_queue q; /* * 标识分片来源,取值为IP_DEFRAG_LOCAL_DELIVER等。

2014-01-01 21:14:22 2994 1

原创 nginx的文件异步io

nginx使用的文件异步io的基于linux内核的,而并不是glibc库提供的。glibc通过的异步io是基于多线程实现的,并不是真正意义上的异步io。nginx只是在读文件时使用了异步io。那么有的童鞋就会问:那nginx为什么在写文件时不使用异步io?原因是这样的:linux内核的文件异步io是不支持缓存操作的,而正常的写入文件时往往是写入内存中就立刻返回,这样效率就比较高,而使用异步io写入

2013-12-29 22:57:08 3858

原创 linux内核学习笔记------ip报文的分片

对网络比较熟悉的童鞋都知道,当发送的ip报文长度超出了最大的传输单位MTU,且允许分片的情况下,就会对ip报文进行分片。在上层要发送数据时就会调用dst_output,dst_output就会调用ip_output,而ip_output就会调用ip_finish_output,在ip_finish_output把数据发送出去之前就会判断该报文是否进行分片。static int ip_finis

2013-12-29 21:09:25 8806

原创 linux内核学习笔记------ip选项处理(二)

在以前的笔记中讲过ip数据报的处理,里面提到过ip_rcv_finish这个函数,这个函数会调用ip_rcv_options来解析并处理iP首部中的ip选项。if (iph->ihl > 5 && ip_rcv_options(skb)) goto drop;在ip_rcv_finish中会判断ip首部长度是否大于5,只有首部长度大于20的情况下才会有ip选项,并调用ip_rcv_opti

2013-12-26 21:03:04 2339

原创 linux内核学习笔记------iP选项处理(一)

ip首部分为固定部分和选项部分;固定部分为20个字节,而选项部分则是变长的,最长不超过40个字节。选项的格式分为单字节和多字节两种。单字节只包括一个字节的选项类型,而多字节则除一个字节的类型之外,还包括选项长度以及选项数据。包括以下几种ip选项:1、选项列表的结束符此选项标识了选项列表的结束,所有选项的结束,而不是一个选项的结束。如下图000000

2013-12-25 21:17:20 2734

原创 linux内核学习笔记------ip数据报的输入处理

链路层接收到数据包后会通过netif_receive_skb将数据包丢给网络层,而网络层处理接口就是ip_rcv。网络层接口都是通过网络层协议号从ptype_base散列表中找到相应的接收函数。ipv4的数据包类型为ip_packet_type,通过dev_add_pack注册到系统的ptype_base中。ip_rcv功能:1、首先会丢弃不是发往本地的数据报;2、如果数据报是一个共享

2013-12-24 21:29:22 1710

原创 linux内核学习笔记------对端信息块

首先,什么是对端信息块?在linux内核源码剖析——tcp/ip实现这本书中是真么介绍的:对端信息块主要用于组装ip数据包时防止分片攻击,在建立tcp连接时检测连接请求段是否有效以及其序列号是否回绕在linux内核中是通过inet_peer结构体描述的:struct inet_peer{ /* group together avl_left,avl_right,v4daddr to

2013-12-23 20:38:52 1392

原创 nginx运行期间修改配置文件的处理

今天在群里讨论到一个问题就是:如果在nginx运行期间,修改了配置文件,这个时候是重启nginx还是有别的办法呢?对nginx比较熟的童鞋,脑子立马肯定会有答案。执行下面的命令就好了./nginx -s reload那么nginx是怎么处理reload的呢?是像squid那样停止所有的任务后再重读配置文件还是别的处理呢?nginx是不需要停止服务去读取配置文件的,下面来看nginx具体的处理。

2013-12-11 22:14:04 8519

原创 nginx的sendfile指令的作用

linux为了解决对读文件产生的从应用空间到内核空间复制数据产生的效率影响引进了零拷贝。什么是零拷贝?这里就不多说了,请参考http://blog.csdn.net/crazyguang/article/details/2423708,我们主要是讲述nginx怎么是用sendfile的。nginx通过使用sendfile指令来控制是不是用linux提供的零拷贝功能。具体配置如下:sendf

2013-09-06 17:31:45 7761

原创 redis数据库之VM(虚拟内存)

reids数据库是一种内存数据库,也提供了两种持久化的方式。作为内存数据库, 访问数据的速度肯定是杠杠的。但是随着数据的不断增加,消耗的内存也就越来越多直到内存消耗完。这种问题要么增加内存,要么就是将内存中的很少用到的数据替换到硬盘中。redis采用的就是第二种方法,也就是redis中的虚拟内存实现的功能。redis采用了阻塞式更替和非阻塞式更替,这个等会再讲。先来看下虚拟内存的初始化:voi

2013-09-02 10:47:42 3284 1

原创 redis数据库之主从复制

redis除了基本功能外,还提供了主从复制功能。一个redis服务可以有多个slave服务,而这个slave服务又可以有slave服务。

2013-08-28 11:03:26 3269 1

原创 redis数据库之rdb持久化

redis是一种内存数据库,也就是redis的数据在正常工作的情况下都是存储在内存中。但并不是说redis只能把数据存储在内存中,redis提供了两种数据持久化机制:rdb和aof。rdb持久化有三种方式被启动:用户向redis发送save或者bgsave命令。save和bgsave的不同就在于save会阻塞redis服务器,而bgsave不会。这样bgsave就在不影响redis服务器正常工作的

2013-08-20 11:06:02 2912 1

原创 nginx脚本引擎

前面讲了nginx的变量机制,今天来讲讲nginx的脚本引擎。我们以一个比较简单的例子来讲述nginx的脚本引擎。例如,我们自己定以一个变量:set $file t_a;这个set指令就会调用ngx_http_rewrite_set函数,下面来看下ngx_http_rewrite_set:static char *ngx_http_rewrite_set(ngx_conf_t *cf,

2013-08-14 23:17:04 1761

原创 nginx变量机制

在设置nginx配置文件的时候,配置文件中会出现$file等以$开头的字符串。这些以$开头的字符串在nginx中就是所谓的变量。nginx的变量分为nginx自定义的变量以及用户自定义的变量。nginx自定义的变量有很多,每个模块也可以定义自己的变量,例如ngx_http_core_variables这个就包含了很多nginx自定义的变量:static ngx_http_variable_t

2013-08-13 23:08:38 2153

原创 redis数据库之订阅和发布

订阅和发布的介绍以及原理在redis设计与实现以及讲述清楚,这里就不啰嗦了。我们的任务主要还是根据原理来分析源码。先来看下订阅和发布会用到的结构体:struct redisServer {...... dict *pubsub_channels; /* Map channels to list of subscribed clients */ list *pubsub_pa

2013-08-13 10:49:41 2003 1

原创 nginx超时事件的处理

几乎每个比较大型的系统都会有自己的一套超时事件的处理方式,nginx也不例外。nginx出于高性能的考虑,使用红黑树来管理超时的事件。这里红黑树的原理在网络中有很多文档去介绍,这里就不讲述红黑树的原理了。这篇博客值讲述nginx是怎么把事件与红黑树联系到一起的。大家都知道nginx处理事件有一个结构体:typedef struct ngx_event_s ngx_event_tstruct

2013-08-12 22:47:01 2302

原创 redis数据库之事务

redis事务的原理介绍在redis设计与实现这本书中已经讲述的非常清楚,这里就不浪费更多的时间去讲述了。这篇博客的目的主要还是结合源码来讲述redis事务的实现。如果大家对redis有点熟悉,都知道redis客户端和服务器之间的通信都是通过命令+key+值来进行通信的(内部协议的格式在以后的博客中讲述)。redis的事务也是通过命令来实现的。MULTI 事务的开始EXEC

2013-08-12 11:46:09 1679 1

原创 nginx事件模块之IO多路复用的选择

nginx是基于事件驱动的,也就是说nginx内部都是通过事件的发生来驱动的,如果没有事件,nginx就是阻塞在epoll_wait,select,sigsuspend等这样的系统调用上。各种操作系统对事件的处理及管理都是不同的。而且每种操作系统的IO多路复用的实现方式也是各不相同。而nginx是一种跨平台的高性能的web server,那它是怎样把各种操作系统的IO多路复用集合在一起,又是怎样让

2013-08-11 22:51:10 2300

原创 ipv6协议报文格式

一、ipv6的基本格式ipv6报文格式从简单性来看,比ipv4较简单,而且ipv6的基本头部的长度是固定的。相较与ipv4,ipv6去掉了一些头部,把这些头部全部弄到了后面的扩展投不中。ipv6的报文格式如下:version:4bits 版本号  ipv6为6Traffic Class: 8 bits,传输类别,可用于源节点或转寄路由器标识和区分IPV6包中的不同类

2013-08-11 10:49:50 20712

原创 ipv6协议学习----概述及地址

1、ipv6特点:解决了ipv4地址少的问题提高网络的整体吞吐量,改善服务质量,安全性更好保证,支持即插即用,支持移动性,更好实现多播功能ipv6采用128位地址长度,几乎可以不受限制地提供地址ipv6则通过内部功能利用IP Security提供数据保护。ipv6提供了安全扩展报头, 配置:访问控制列表(ACL)用于控制IPV6流量的状态化过滤或防火墙设置单播反向路径转

2013-08-11 10:42:08 1460

转载 TCP协议疑难问题集锦

原文出自:http://blog.csdn.net/dog250/article/details/66124961.网络协议设计ISO提出了OSI分层网络模型,这种分层模型是理论上的,TCP/IP最终实现了一个分层的协议模型,每一个层次对应一组网络协议完成一组特定的功能,该组网络协议被其下的层次复用和解复用。这就是分层模型的本质,最终所有的逻辑被编码到线缆或者电磁波。

2013-08-10 11:44:32 1280

原创 redis数据结构之对象

redis是一种nosql数据库,redis操作数据库都是通过相关命令来进行的。而且由于redis内存实现很多底层的数据结构,数据库存储的值也是这些数据结构。redis 每个命令都是对应相应的数据结构实现的。例如:LPUSH 和LLEN 只能用于列表键,而SADD 和SRANDMEMBER 只能用于集合键。从上面可以看出来,Redis 必须让每个键都带有类型信息,使得程序可以检查键的类型,并为它选

2013-08-09 17:37:29 2257 2

原创 redis数据结构之压缩列表

压缩列表用于存储长度受限的字符串和整数。废话不多说,直接上redis压缩列表的内存结构示意图:从图中可以看出,redis压缩列表由表示压缩列表占总内存的字节数的zlbytes,表示到达ziplist 表尾节点的偏移量的zltail,表示ziplist 中节点的数量的zllen,各个节点以及用于标记ziplist的末端的zlend。注意:zllen并不是一直表示节点的数量,只有zll

2013-08-09 13:33:35 2654 1

原创 redis数据结构之整数集合

redis的整数集合实质上是动态的数组。reids的整数集合是可以根据整数的值,自动选择用什么长度来存储的。例如:如果插入的值可以用int16_t类型来保存,那所有的元素都可以用int16_t类型来保存。所以可以看出保存的类型应该有这几种:#define INTSET_ENC_INT16 (sizeof(int16_t))#define INTSET_ENC_INT32 (sizeof(

2013-08-08 17:23:17 2148 1

原创 redis数据结构之字符串

redis字符串相对比标准c的字串是二进制安全的,也就是说如果redis的字符串中包含'\0'字符的话,还是能计算出相应字符串的长度。下面来看下redis字符串的定义:typedef char *sds;struct sdshdr { // buf 已占长度 int len; // buf 剩余可用的长度 int free; // 实际存放字符

2013-08-08 10:38:51 2386 1

原创 redis源码分析----序言

一直在redis的源码,但是很少形成笔记,理解感觉不是很深,所以决定把自己看过的源码形成文字,加深自己的理解。也希望能给想学习redis的童鞋一点帮组,如果在博文中有错误,希望大家能指出来,谢谢。

2013-08-08 10:12:01 2308 1

原创 消息队列

消息队列分两种:posix消息队列和system v消息队列。消息队列是随系统内核存在的,也就是说只要系统不重启,已经创建的消息队列是不会消失的。下面一对比的形式来说明posix和system v消息队列。两种消息队列创建的时候指定的路径文件是必须存在的,否则报错创建消息队列:1、posix消息队列:#include mqid_t mq_open(const char

2013-04-23 14:25:32 1054

原创 linux fork()函数的解析

fork()基本意思Unix环境高级编程已经讲述的很清楚了,下面来讲下循环创建多个子进程的情况。直接上代码:int main(int argc, char **argv){ int ret, i; pid_t pid; for(i=0; i<2; i++){ pid = fork(); if(pid < 0) return -1; else if(pid ==

2013-03-26 14:10:23 1094

转载 rtl8139网卡驱动源码解析

学习应该是一个先把问题简单化,在把问题复杂化的过程。一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉。读Linux网卡驱动也是一样。那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏便是理所当然的了。不要担心,事情总有解决的办法,先把一些我们管不着的代码切割出去,留下必须的部分,把框架掌握了,哪其他的事情自然就水到渠成了,这是笔者的心得。一般在使用的Linux网卡驱动代码动辄3

2013-01-28 11:16:54 2624

转载 struct rlimit

1、rlimit介绍在Linux系统中,Resouce limit指在一个进程的执行过程中,它所能得到的资源的限制,比如进程的core file的最大值,虚拟内存的最大值等。Resouce limit的大小可以直接影响进程的执行状况。其有两个最重要的概念:soft limit 和 hard limit。struct rlimit {rlim_t rlim_cur;

2012-09-20 18:59:53 761

转载 CPU AFFINITY

cpu 亲和力就是指linux系统中能够将一个或多个进程绑定到一个或者多个处理器上运行。一个进程的cpu亲合力掩码决定了该进程将在哪个或者哪几个CPU上运行,在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能。一个CPU的亲和力掩码用一个cpu_set_t结构来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:1、CPU_ZERO()清空一个集合2、C

2012-09-20 18:55:34 1077

转载 iovec结构体定义及使用

#include struct iovec { ptr_t iov_base; /* Starting address */ size_t iov_len; /* Length in bytes */};struct iovec定义了一个向量元素。通常,这个结构用作一个多元素的数组。对于每一个传输的元素,指针成员iov_base指向一个缓冲区,这个缓冲区是存放的是read

2012-09-20 10:44:25 34727 1

转载 va_start, va_end, va_list

1,当无法确定函数的所有实参的类型和数目时,可用省略号指定参数表void foo(int i, ...)printf(fmt, .....)2、函数参数的传递原理函数参数是以数据结构:栈的形式存取的,从右至左入栈#include void fun(int a, ...){ int *tmp = &a; tmp ++; for(int i=0; i<a;

2012-09-20 10:30:23 1361

原创 CentOS安装vmware tools

1、在虚拟机下方点击安装vmware tools,这时就会自动下载vmware tools.2、下载好的vmware tools是在cdrom里面,所以需要挂载到/mnt目录下,命令如下:mount /dev/cdrom /mnt/3、复制tar包到根目录下4、执行vmware_install.pl安装过程中遇到的问题及解决办法1、/usr/lib

2012-09-16 20:38:03 2112

转载 linux单网卡上配置双IP

linux单网卡上配置双IP/sysconfig/network-scripts在network-scripts下有一个ifcfg-eth0复制ifcfg-eth0 为ifcfg-eth0:1然后用vi编辑进行编辑vi ifcfg-eth0:1# Intel Corporation 82566DC Gigabit Network ConnectionDEVICE=eth

2012-07-05 17:42:18 4287

原创 鸟哥私房菜笔记二(硬件设备名及磁盘的分区)

硬件设备名在linux系统中,每个设备都是当做文件来对待的。各设备在linux的文件名如下: 磁盘分区磁盘是由盘片,机械手臂,磁头和主轴马达组成,而数据就是写在盘片上。盘片又可分为扇区和柱面两种单位,其中扇区每个为512bytes。磁盘的第一个扇区是最重要的,因为它会记录两个重要的信息:1、主引导分区(MBR):可以安装引导加载程序的地方,445bytes;2、分区表:

2012-04-07 22:48:23 1055

原创 鸟哥私房菜笔记一(计算机基础)

计算机的组成计算机是接受用输入的指令和数据,经过中央处理器的数据和逻辑单元元算处理后,以产生或存储为有用的数据。计算机主要分为三大部分:1、输入设备;2、CPU;3、输出设备,示意图如下:注:从图中可以看出数据都是通过内存转出去的CPU的种类:1、精简指令集(RISC);2、复杂指令集(CISC)精简指令集的微指令集较为精简,每个指令的执行时间很短,而复杂指令集花费的时间较长

2012-04-07 22:21:53 1198

nginx配置学习

nginx的配置文件源码解析

2013-02-19

linux驱动详解

linux驱动设计

2012-03-23

Linux系统下的网络编程

可以学习Linux系统下的网络编程,这样就不仅可以知道网络编程,还可以学到Linux系统

2011-07-08

空空如也

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

TA关注的人

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