用Bollger记录技术之路的点滴...

关注高性能linux网络编程,NoSQL, c/c++/java ~~~ weibo @语_行 http://weibo.com/201281062~~~ twitter @JerryVector https://twitter.com/JerryVector
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2013年6月30日

摘要: 说起TCP,我们一般都需要知道发起一个tcp连接和终止一个tcp连接是所发生的事情,下边,我将跟大家介绍下tcp的三次握手及四次挥手的过程。 TCP三路握手 (1)服务器必须准备好接受外来的连接。这通常在调用socket,bind,listen这三个函数来完成,我们称之为被动打开(passive open)。 (2)客户通过调用socket,connect发起主动打开(active open)。这导致客户tcp发送一个SYN(同步)分节,它告诉服务器客户将在待建立的tcp连接中发送数据的初始序列号。通常SYN分节不携带数据,其所在的IP数据报只包含有一个IP首部、一个TCP首部及可能有的TC. 阅读全文

posted @ 2013-06-30 11:10 语行 阅读(4322) 评论(0) 推荐(0) 编辑

2013年6月28日

摘要: 信号(signal)就是通知某个进程发生了某个事件,有时也称为软件中断(software interrupt)。信号通常是异步发生的,也就是说进程预先不知道信号准确发生的时刻。 信号可以: 由一个进程发送给另一个进程(或自身)。 由内核发给某个进程。 每个信号都有一个与之关联的处置(disposition),也称为行为(action)。我们通过sigaction函数来设定一个信号的处置,并有三种选择。 1. 我们提供一个函数,他将在特定信号发生的任何时刻被调用。 2. 我们可以发某个信号设置为SIG_IGN来忽略(ignore)它。SIGKILL和SIGSTOP这两个信号不能被忽略。 3. . 阅读全文

posted @ 2013-06-28 13:50 语行 阅读(3482) 评论(0) 推荐(0) 编辑

2013年6月8日

摘要: 第16章:非阻塞I/O 1: connect一个对端server,当连接成功建立的时候,套接字变为可写;当连接发生错误的时候,套接字变得既可读又可写。 阅读全文

posted @ 2013-06-08 11:14 语行 阅读(228) 评论(0) 推荐(0) 编辑

2013年6月6日

摘要: 我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的。所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去。 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。 2:在select中阻塞等待I/O(select有内置的时间限制),依次代替直接阻塞在read或writ... 阅读全文

posted @ 2013-06-06 13:35 语行 阅读(3413) 评论(0) 推荐(0) 编辑

2013年6月5日

摘要: 非阻塞型同步 (Non-blocking Synchronization) 简介如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。阻塞型同步是指当一个线程到达临界区时,因另外一个线程已经持有访问该共享数据的锁,从而不能获取锁资源而阻塞,直到另外一个线程释放锁。常见的同步原语有 mutex、semaphore 等。如果同步方案采用不当,就会造成死锁(deadlock),活锁(livelock)和优先级反转(priori 阅读全文

posted @ 2013-06-05 13:22 语行 阅读(4307) 评论(0) 推荐(1) 编辑

2013年5月30日

摘要: 最近在追查一个代理服务器请求后端业务逻辑服务时,出现地址不可达的bug,反映到tcp这边的提示是 connection reset by peer。后来通过查看代理服务器这边的代码和业务逻辑服务器那边的代码后,发现是由于业务逻辑server那边在对一个端口设置监听的时候,对打开的socket设置了TCP_DEFER_ACCEPT这个选项,同时业务逻辑server这端对到来的tcp连接会在一个时间段后关闭这个连接。正常情况下,代理server这边有重连机制,当发现业务逻辑server那边关闭连接后,他会立即启动重连机制;但由于业务逻辑server这边对打开的socket设置了TCP_DEFE.. 阅读全文

posted @ 2013-05-30 12:59 语行 阅读(3519) 评论(0) 推荐(0) 编辑

2013年5月17日

摘要: 通常,我们会需要知道一台linux服务器内存总量,内存使用量以及内存剩余量,那么我们一般会想到free命令:(free默认显示的数值是以KB为单位的,如果想要以MB为单位显示,可以用free -m)以上图为例,看到输出后, 我们可能就会认为这台机器:内存总量为:7968712KB, 已使用:7852204, 剩余:116508(之前我就是这样认为的)不过今天在检查一台线上服务器的时候,发现通过free看到的已使用的内存总量,我们根本就没有使用那么多,而free所给我们展示的值是肯定不会错的,那这是为什么呢?答案只有从man free中寻找了,通过man我们发现free给我们提供了一些选项:-b 阅读全文

posted @ 2013-05-17 22:40 语行 阅读(475) 评论(0) 推荐(0) 编辑

2013年5月3日

摘要: 1:大小写转换: 大写->小写: tr A-Z a-z 小写->大写: tr a-z A-Z2:进制转换: 十进制->16进制: echo "ibash=10;obase=16;num"|bc 16进制->10进制: echo "ibash=16;obase=10;num"|bc 注意16进制数要用大写。否则会出错。 阅读全文

posted @ 2013-05-03 13:41 语行 阅读(699) 评论(0) 推荐(0) 编辑

2013年4月24日

摘要: 今天用php连接最近新开发的一个服务做测试,发现命令行打印出:Cannot assign requested address网上找了下原因,大致上是由于客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。网上的解决方法:执行命令修改如下2个内核参数 (需要root权限)s 阅读全文

posted @ 2013-04-24 16:18 语行 阅读(79261) 评论(0) 推荐(1) 编辑

2013年4月18日

摘要: 写C++程序的都知道,标准库STL给我们提供了大量容器供我们使用,如list,set, list能提供高效的插入删除操作,而set能提供高效的查询操作,但是当我们需要一个既能保证搞笑查询又能高效插入删除的时候该如何选择呢,显然,单纯的使用list或set是无法满足我们的需求的。基于近期一个项目的业务特点,选用了list.h这个数据结构,这里对list.h做一点介绍,也是自己的一个总结。基于linux内核版本2.6.9的list.h。(网上看到有说2.6和2.4内核存在一些差异, 我自己还看到2.6.9的list.h跟2.6.18的list.h的实现也有一些差异,2.6.18里边提供了hlist 阅读全文

posted @ 2013-04-18 16:19 语行 阅读(602) 评论(0) 推荐(0) 编辑