自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhangskd的专栏

鱼跃此时海,花开彼岸天

原创 TCP协议的性能评测工具 — Tcpdive开源啦

Tcpdive是一个专门的TCP协议性能评测工具。Github地址:https://github.com/fastos/tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化。用户接入网络的方式,除了宽带和光纤之外,还有2G/3G/4G/WiFi,5G也已经在路上了。作为使用范围最广的传输层协议,TCP诞生于固网时代,在设计之初并没有考虑到上述种种情况,这导致了

2016-01-19 21:59:45 21523 19

原创 Nginx的负载均衡 - 一致性哈希 (Consistent Hash)

当后端是缓存服务器时,经常使用一致性哈希算法来进行负载均衡。使用一致性哈希的好处在于,增减集群的缓存服务器时,只有少量的缓存会失效,回源量较小。在nginx+ats / haproxy+squid等CDN架构中,nginx/haproxy所使用的负载均衡算法便是一致性哈希。我们举个例子来说明一致性哈希的好处。假设后端集群包含三台缓存服务器,A、B、C。

2015-12-12 23:46:40 41983 5

原创 Nginx的负载均衡 - 最少连接 (least_conn)

我们知道轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同。这有个前提,就是每个请求所占用的后端时间要差不多,如果有些请求占用的时间很长,会导致其所在的后端负载较高。在这种场景下,把请求转发给连数较少的后端,能够达到更好的负载均衡效果,这就是least_conn算法。

2015-12-12 23:42:00 22413

原创 Nginx的负载均衡 - 保持会话 (ip_hash)

Nginx版本:1.9.1我的博客:http://blog.csdn.net/zhangskd 算法介绍 ip_hash算法的原理很简单,根据请求所属的客户端IP计算得到一个数值,然后把请求发往该数值对应的后端。所以同一个客户端的请求,都会发往同一台后端,除非该后端不可用了。ip_hash能够达到保持会话的效果。ip_hash是基于round robin的,判断后端是否

2015-12-12 23:39:23 28198

原创 Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇

上篇blog讲述了加权轮询算法的原理、以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具体实现。如果upstream配置块中没有指定使用哪种负载均衡算法,那么默认使用加权轮询。也就是说使用加权轮询算法,并不需要特定的指令,因此也不需要实现指令的解析函数。而实际上,和其它负载均衡算法不同(比如ip_hash),加权轮询算法并不是以模块的方式实现的,而是作为Nginx框架的一部分。

2015-12-12 23:36:45 7932

原创 Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 上篇

当在upstream配置块中没有指定使用的负载均衡算法时,默认使用的是加权轮询。按照上述配置,Nginx每收到7个客户端的请求,会把其中的5个转发给后端a,把其中的1个转发给后端b,把其中的1个转发给后端c。这就是所谓的加权轮询,看起来很简单,但是最早使用的加权轮询算法有个问题,就是7个请求对应的后端序列是这样的:{ c, b, a, a, a, a, a },会有5个连续的请求落在后端a上,分布不太均匀。

2015-12-12 23:33:21 46371 2

原创 Nginx的负载均衡 - 整体架构

Nginx版本:1.9.1我的博客:http://blog.csdn.net/zhangskd 什么是负载均衡 我们知道单台服务器的性能是有上限的,当流量很大时,就需要使用多台服务器来共同提供服务,这就是所谓的集群。负载均衡服务器,就是用来把经过它的流量,按照某种方法,分配到集群中的各台服务器上。这样一来不仅可以承担更大的流量、降低服务的延迟,还可以避免单点故障造成服务

2015-12-12 23:30:26 22026

原创 TCP的发送系列 — 发送缓存的管理(二)

主要内容:从TCP层面判断发送缓存的申请是否合法,进程因缺少发送缓存而进行睡眠等待、因为有发送缓存可写事件而被唤醒。内核版本:3.15.2上一篇blog讲述了单个Socket层面上的发送缓存管理,现在来看下整个TCP层面上的发送缓存管理。

2015-09-06 22:48:14 8079 7

原创 TCP的发送系列 — 发送缓存的管理(一)

主要内容:TCP发送缓存的管理,包括发送缓存的初始化、sock发送缓存的动态调整、sock发送缓存的申请和释放。内核版本:3.15.2。TCP对发送缓存的管理是在两个层面上进行的,一个层面是单个socket的发送缓存管理,另一个层面是整个TCP层的内存管理。先来看下单个socket的发送缓存管理。

2015-09-06 22:44:50 13387 7

原创 TCP的发送系列 — tcp_sendmsg()的实现(二)

主要内容:Socket发送函数在TCP层的实现内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 在上篇blog中分析了tcp_sendmsg()这个主要函数的实现,现在来看下之前略过的一些细节,包括等待连接的建立、tcp_push()的实现、tcp_autocorking和数据的复制。

2015-09-06 22:38:36 7688 4

原创 TCP的发送系列 — tcp_sendmsg()的实现(一)

主要内容:Socket发送函数在TCP层的实现内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd上一篇blog讲的是send()、sendto()、sendmsg()和sendmmsg()这些发送函数的系统调用和Socket层实现,现在来看下它们的TCP层实现tcp_sendmsg()。

2015-09-06 22:30:13 11311 4

原创 Socket层实现系列 — send()类发送函数的实现

主要内容:socket发送函数的系统调用、Socket层实现。内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd以下是send()、sendto()、sendmsg()和sendmmsg()的发送流程图,这四个函数除了在系统调用层面上有些差别,在Socket层和TCP层的实现都是相同的。

2015-09-06 22:23:56 16150

原创 TCP连接建立系列 — 客户端接收SYNACK和发送ACK

主要内容:客户端接收SYNACK、发送ACK,完成连接的建立。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 客户端主动建立连接时,发送SYN段后,连接的状态变为SYN_SENT。此时如果收到SYNACK段,处理函数为tcp_rcv_state_process()。

2015-08-15 22:47:56 10689 5

原创 TCP连接建立系列 — 客户端的端口选取和重用

主要内容:connect()时的端口选取和端口重用。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 端口选取 connect()时本地端口是如何选取的呢? 如果用户已经绑定了端口,就使用绑定的端口。如果用户没有绑定端口,则让系统自动选取,策略如下:1. 获取端口的取值区间,以及区间内端口的个数。2. 根据初始偏移量

2015-08-15 22:42:07 7228 2

原创 TCP连接建立系列 — 客户端发送SYN段

主要内容:客户端调用connect()时的TCP层实现。内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd connect的TCP层实现 SOCK_STREAM类socket的TCP层操作函数集实例为tcp_prot,其中客户端使用tcp_v4_connect()来发送SYN段。struct proto tcp_prot = {

2015-08-15 22:35:23 5455 2

原创 linux下使用异步通知

阻塞式I/O是一直等待直到设备可以访问,非阻塞式I/O是定期轮询设备是否可以访问。异步通知则是当设备可以访问时才主动通知应用程序,有点像设备的硬中断。 并不是所有的设备都支持异步通知,应用程序通常假设只有套接字和终端才有异步通知的能力。异步通知存在一个问题,当进程收到SIGIO信号时,它并不知道是哪个文件有了新的输入,如果有多于一个的文件可以异步通知同一个进程,那么应用进程还需

2015-05-23 22:47:36 7063

原创 Socket层实现系列 — connect()的实现

主要内容:connect()的Socket层实现、期间进程的睡眠和唤醒。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 应用层 int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);Connects the socket ref

2015-05-23 22:29:12 11474

原创 Socket层实现系列 — I/O事件及其处理函数

主要内容:Socket I/O事件的定义、I/O处理函数的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd I/O事件定义 sock中定义了几个I/O事件,当协议栈遇到这些事件时,会调用它们的处理函数。struct sock { ... struct socket_wq __rcu *sk_wq; /*

2015-05-23 22:25:25 8875

原创 Socket层实现系列 — 信号驱动的异步等待

主要内容:Socket的异步通知机制。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件、有数据可读事件、有发送缓存可写事件、有IO错误事件。对于这些事件,socket中分别定义了相应的事件处理函数,也称回调函数。 Socket I/O事件的处理过程中,要使用到sock

2015-05-23 22:24:51 6271

原创 Socket层实现系列 — 睡眠驱动的同步等待

主要内容:Socket的几个I/O事件、Socket的同步等待机制。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件、有数据可读事件、有发送缓存可写事件、有IO错误事件。对于这些事件,socket中分别定义了相应的事件处理函数,也称回调函数。 Socket I/O事件

2015-05-23 22:24:35 5343

原创 TCP的ACK确认系列 — 延迟确认

主要内容:TCP的延迟确认、延迟确认定时器的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd  延迟确认模式 发送方在发送数据包时,如果发送的数据包有负载,则会检测拥塞窗口是否超时。如果超时,则会使拥塞窗口失效并重新计算拥塞窗口。如果此时距离最近接收到数据包的时间间隔足够短,说明双方处于你来我往的双向数据传输中,就

2015-04-19 21:41:38 15388 1

原创 TCP的ACK确认系列 — 快速确认

主要内容:TCP的快速确认、TCP_QUICKACK选项的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 快速确认模式 (1) 进入快速确认模式设置快速确认模式标志,设置在快速确认模式中可以发送的ACK数量。static void tcp_enter_quickack_mode (struct sock *sk)

2015-04-19 21:36:39 13431 1

原创 TCP的ACK确认系列 — 发送状态转换机

主要内容:TCP的ACK发送方式,以及ACK发送状态转换机的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 概述 TCP采用两种方式来发送ACK:快速确认和延迟确认。在快速确认模式中,本端接收到数据包后,会立即发送ACK给对端。在延迟确认模式中,本端接收到数据包后,不会立即发送ACK给对端,而是等待一段时间,如果在此

2015-04-19 21:36:07 12089 6

原创 TCP的定时器系列 — 零窗口探测定时器

主要内容:零窗口探测定时器的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据:发送方的发送速度大于接收方的接收速度。接收方的应用程序未能及时从接收缓冲区中读取数据。 当接收方的接收缓冲区满了以后,会把响应报文中的通告窗口字段置为0,从而阻止发送方的继续发送,这就

2015-04-05 22:19:29 8376 1

原创 TCP的定时器系列 — 保活定时器

主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepalive功能,TCP也有Keepalive功能,虽然都叫Keepalive,但是它们的目的却是不一样的。为了说明这一点,先来看下长连接和短连接的定义。 连接的“长短”是什么?

2015-04-05 10:35:06 12478 2

原创 TCP的定时器系列 — SYNACK定时器

主要内容:SYNACK定时器的实现,TCP_DEFER_ACCPET选项的实现。内核版本:3.15.2Author:zhangskd @ csdn blog 在上一篇博客中,已经连带介绍了SYNACK定时器的创建、激活和删除,所以本文直接从它的超时处理函数写起。 超时处理函数 sk->sk_timer可以同时扮演几个角色:保活定时器,SYNACK定时器,FIN_WA

2015-03-30 22:54:01 4099 1

原创 TCP的定时器系列 — 超时重传定时器

主要内容:TCP定时器开篇,超时重传定时器、ER延迟定时器、PTO定时器的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd Q:一条TCP连接会使用多少个定时器呢?A:目前的答案是9个:超时重传定时器,持续定时器,ER延迟定时器,PTO定时器,ACK延迟定时器,SYNACK定时器,保活定时器,FIN_WAIT2定时器,CL

2015-03-30 22:53:28 18461 4

原创 GIT版本控制 — GIT与SVN的相互转换 (三)

git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可。详细介绍可见[1],或者命令行输入git-svn。 Bidirectional operation between a Subversion repository and git.git svn can track a standard Subversion reposito

2015-02-14 15:48:37 28176 3

原创 Git版本控制 — 日常使用(二)

本地使用 以下是我的一些日常操作。 (1) 创建版本库# cd /proj# git initInitialized empty Git repository in /proj/.git/ (2) 查看状态# git statusstaged:文件被暂存了modified, unstaged:文件被修改了但是没有被暂存untracked:文件没有

2015-02-14 15:47:29 8138

原创 GIT版本控制 — 简介与安装 (一)

简介 GIT与SVN的区别 作为当前最流行的版本控制系统,Git和SVN的几个主要不同之处在于:(1) Git是分布式的版本控制系统,SVN是集中式的版本控制系统。Git可以先把修改提交到本地仓库中,      等到可以上网或方便的时候,再提交到远程仓库中。这无疑更利于项目开发,同时也可减轻服务器负担。(2) SVN使用增量文件系统(Delta Storage Syst

2015-02-14 15:46:47 5494

原创 系统级性能分析工具 — Perf

Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。常用于性能瓶颈的查找与热点代码的定位。

2014-10-23 11:44:05 116681 1

原创 内核调试工具 — kdump & crash

kdumpkdump是系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务。如果系统一旦崩溃,那么正常的内核就没办法工作了,这个时候将由kdump产生一个用于capture当前运行信息的内核,该内核会将此时的内存中的所有运行状态和数据信息收集到一个dump core文件中以便于Red Hat工程师分析崩溃原因。一旦内存信息收集完成,系统将自动重启。kdump是RHE

2014-10-23 11:43:21 36075

原创 内核调试神器SystemTap — 更多功能与原理(三)

SystemTap探测用户空间程序需要utrace的支持,3.5以上的内核版本默认支持。对于3.5以下的内核版本,需要自己打相关补丁。SystemTap还有一些高级功能,比如自建脚本库、探测点重命名、嵌入C代码等。最后本文简单介绍下SystemTap的实现原理。

2014-05-28 22:24:19 7507 1

原创 内核调试神器SystemTap — 探测点与语法(二)

SystemTap脚本主要是由探测点和探测点处理函数组成的,来看下都有哪些探测点可用。The essential idea behind a systemtap script is to name events, and to give them handlers.Systemtap works by translating the script to C, running the system C compiler to create a kernel module from that.When t

2014-05-28 22:20:44 14047 1

原创 内核调试神器SystemTap — 简介与使用(一)

SystemTap是我目前所知的最强大的内核调试工具,有些家伙甚至说它无所不能:)Debuted in 2005 in Red Hat Enterprise Linux 4 Update 2 as a technology preview.After four years in development, System 1.0 was released in 2009.As of 2011 SystemTap runs fully supported in all Linux distributions

2014-05-28 22:14:51 36917 2

原创 不错的网络协议栈测试工具 — Packetdrill

Packetdrill - A network stack testing tool developed by Google.The packetdrill scripting tool enables quick, precise tests for entire TCP/UDP/IPv4/IPv6 network stacks,from the system call layer down to the NIC hardware.截至2013年开源时,Packetdrill已经在Google内部使

2014-05-28 22:01:37 10403 9

原创 Netfilter的使用和实现

本文主要内容:Netfilter的原理和实现浅析,以及示例模块。内核版本:2.6.37Author:zhangskd @ csdn blog 概述 Netfilter为多种网络协议(IPv4、IPv6、ARP等)各提供了一套钩子函数。在IPv4中定义了5个钩子函数,这些钩子函数在数据包流经协议栈的5个关键点被调用。这就像有5个钓鱼台,在每个钓鱼台放了一个鱼钩(钩子函

2014-04-02 16:54:26 29351 4

原创 数据包接收系列 — IP协议处理流程(二)

本文主要内容:在接收数据包时,IP协议的处理流程。内核版本:2.6.37Author:zhangskd @ csdn blog  我们接着来看数据包如何发往本地的四层协议。 ip_local_deliver 在ip_local_deliver()中,如果发现数据报有被分片,则进行组装。然后调用NF_INET_LOCAL_IN处的钩子函数,如果数据包被钩子函数放行

2014-04-02 16:44:19 5100

原创 数据包接收系列 — IP协议处理流程(一)

本文主要内容:在接收数据包时,IP协议的处理流程。内核版本:2.6.37Author:zhangskd @ csdn blog  IP报头 IP报头:struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4;#elif defined(__BI

2014-04-02 16:32:56 5949

原创 数据包接收系列 — NAPI的原理和实现

本文主要内容:简单分析NAPI的原理和实现。内核版本:2.6.37Author:zhangskd @ csdn 概述 NAPI是linux新的网卡数据处理API,据说是由于找不到更好的名字,所以就叫NAPI(New API),在2.5之后引入。简单来说,NAPI是综合中断方式与轮询方式的技术。中断的好处是响应及时,如果数据量较小,则不会占用太多的CPU事件;缺点是数

2014-03-27 17:14:40 25507 6

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