- 博客(158)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 TCP协议的性能评测工具 — Tcpdive开源啦
Tcpdive是一个专门的TCP协议性能评测工具。Github地址:https://github.com/fastos/tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化。用户接入网络的方式,除了宽带和光纤之外,还有2G/3G/4G/WiFi,5G也已经在路上了。作为使用范围最广的传输层协议,TCP诞生于固网时代,在设计之初并没有考虑到上述种种情况,这导致了
2016-01-19 21:59:45
23864
20
原创 Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
当后端是缓存服务器时,经常使用一致性哈希算法来进行负载均衡。使用一致性哈希的好处在于,增减集群的缓存服务器时,只有少量的缓存会失效,回源量较小。在nginx+ats / haproxy+squid等CDN架构中,nginx/haproxy所使用的负载均衡算法便是一致性哈希。我们举个例子来说明一致性哈希的好处。假设后端集群包含三台缓存服务器,A、B、C。
2015-12-12 23:46:40
50501
7
原创 Nginx的负载均衡 - 最少连接 (least_conn)
我们知道轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同。这有个前提,就是每个请求所占用的后端时间要差不多,如果有些请求占用的时间很长,会导致其所在的后端负载较高。在这种场景下,把请求转发给连数较少的后端,能够达到更好的负载均衡效果,这就是least_conn算法。
2015-12-12 23:42:00
33193
原创 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
34309
原创 Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇
上篇blog讲述了加权轮询算法的原理、以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具体实现。如果upstream配置块中没有指定使用哪种负载均衡算法,那么默认使用加权轮询。也就是说使用加权轮询算法,并不需要特定的指令,因此也不需要实现指令的解析函数。而实际上,和其它负载均衡算法不同(比如ip_hash),加权轮询算法并不是以模块的方式实现的,而是作为Nginx框架的一部分。
2015-12-12 23:36:45
8783
原创 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
70136
2
原创 Nginx的负载均衡 - 整体架构
Nginx版本:1.9.1我的博客:http://blog.csdn.net/zhangskd 什么是负载均衡 我们知道单台服务器的性能是有上限的,当流量很大时,就需要使用多台服务器来共同提供服务,这就是所谓的集群。负载均衡服务器,就是用来把经过它的流量,按照某种方法,分配到集群中的各台服务器上。这样一来不仅可以承担更大的流量、降低服务的延迟,还可以避免单点故障造成服务
2015-12-12 23:30:26
23691
原创 TCP的发送系列 — 发送缓存的管理(二)
主要内容:从TCP层面判断发送缓存的申请是否合法,进程因缺少发送缓存而进行睡眠等待、因为有发送缓存可写事件而被唤醒。内核版本:3.15.2上一篇blog讲述了单个Socket层面上的发送缓存管理,现在来看下整个TCP层面上的发送缓存管理。
2015-09-06 22:48:14
9056
7
原创 TCP的发送系列 — 发送缓存的管理(一)
主要内容:TCP发送缓存的管理,包括发送缓存的初始化、sock发送缓存的动态调整、sock发送缓存的申请和释放。内核版本:3.15.2。TCP对发送缓存的管理是在两个层面上进行的,一个层面是单个socket的发送缓存管理,另一个层面是整个TCP层的内存管理。先来看下单个socket的发送缓存管理。
2015-09-06 22:44:50
16374
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
8564
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
14753
5
原创 Socket层实现系列 — send()类发送函数的实现
主要内容:socket发送函数的系统调用、Socket层实现。内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd以下是send()、sendto()、sendmsg()和sendmmsg()的发送流程图,这四个函数除了在系统调用层面上有些差别,在Socket层和TCP层的实现都是相同的。
2015-09-06 22:23:56
19502
1
原创 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
12850
5
原创 TCP连接建立系列 — 客户端的端口选取和重用
主要内容:connect()时的端口选取和端口重用。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 端口选取 connect()时本地端口是如何选取的呢? 如果用户已经绑定了端口,就使用绑定的端口。如果用户没有绑定端口,则让系统自动选取,策略如下:1. 获取端口的取值区间,以及区间内端口的个数。2. 根据初始偏移量
2015-08-15 22:42:07
10106
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
6502
2
原创 linux下使用异步通知
阻塞式I/O是一直等待直到设备可以访问,非阻塞式I/O是定期轮询设备是否可以访问。异步通知则是当设备可以访问时才主动通知应用程序,有点像设备的硬中断。 并不是所有的设备都支持异步通知,应用程序通常假设只有套接字和终端才有异步通知的能力。异步通知存在一个问题,当进程收到SIGIO信号时,它并不知道是哪个文件有了新的输入,如果有多于一个的文件可以异步通知同一个进程,那么应用进程还需
2015-05-23 22:47:36
8154
原创 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
13181
原创 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
10104
原创 Socket层实现系列 — 信号驱动的异步等待
主要内容:Socket的异步通知机制。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件、有数据可读事件、有发送缓存可写事件、有IO错误事件。对于这些事件,socket中分别定义了相应的事件处理函数,也称回调函数。 Socket I/O事件的处理过程中,要使用到sock
2015-05-23 22:24:51
7417
原创 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
6280
原创 TCP的ACK确认系列 — 延迟确认
主要内容:TCP的延迟确认、延迟确认定时器的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 延迟确认模式 发送方在发送数据包时,如果发送的数据包有负载,则会检测拥塞窗口是否超时。如果超时,则会使拥塞窗口失效并重新计算拥塞窗口。如果此时距离最近接收到数据包的时间间隔足够短,说明双方处于你来我往的双向数据传输中,就
2015-04-19 21:41:38
17020
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
16221
1
原创 TCP的ACK确认系列 — 发送状态转换机
主要内容:TCP的ACK发送方式,以及ACK发送状态转换机的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 概述 TCP采用两种方式来发送ACK:快速确认和延迟确认。在快速确认模式中,本端接收到数据包后,会立即发送ACK给对端。在延迟确认模式中,本端接收到数据包后,不会立即发送ACK给对端,而是等待一段时间,如果在此
2015-04-19 21:36:07
16540
7
原创 TCP的定时器系列 — 零窗口探测定时器
主要内容:零窗口探测定时器的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据:发送方的发送速度大于接收方的接收速度。接收方的应用程序未能及时从接收缓冲区中读取数据。 当接收方的接收缓冲区满了以后,会把响应报文中的通告窗口字段置为0,从而阻止发送方的继续发送,这就
2015-04-05 22:19:29
10724
1
原创 TCP的定时器系列 — 保活定时器
主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现。内核版本:3.15.2我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepalive功能,TCP也有Keepalive功能,虽然都叫Keepalive,但是它们的目的却是不一样的。为了说明这一点,先来看下长连接和短连接的定义。 连接的“长短”是什么?
2015-04-05 10:35:06
15775
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
4525
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
21025
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
30669
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
9234
原创 GIT版本控制 — 简介与安装 (一)
简介 GIT与SVN的区别 作为当前最流行的版本控制系统,Git和SVN的几个主要不同之处在于:(1) Git是分布式的版本控制系统,SVN是集中式的版本控制系统。Git可以先把修改提交到本地仓库中, 等到可以上网或方便的时候,再提交到远程仓库中。这无疑更利于项目开发,同时也可减轻服务器负担。(2) SVN使用增量文件系统(Delta Storage Syst
2015-02-14 15:46:47
5671
原创 系统级性能分析工具 — Perf
Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。常用于性能瓶颈的查找与热点代码的定位。
2014-10-23 11:44:05
132040
1
原创 内核调试工具 — kdump & crash
kdumpkdump是系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务。如果系统一旦崩溃,那么正常的内核就没办法工作了,这个时候将由kdump产生一个用于capture当前运行信息的内核,该内核会将此时的内存中的所有运行状态和数据信息收集到一个dump core文件中以便于Red Hat工程师分析崩溃原因。一旦内存信息收集完成,系统将自动重启。kdump是RHE
2014-10-23 11:43:21
41716
1
原创 内核调试神器SystemTap — 更多功能与原理(三)
SystemTap探测用户空间程序需要utrace的支持,3.5以上的内核版本默认支持。对于3.5以下的内核版本,需要自己打相关补丁。SystemTap还有一些高级功能,比如自建脚本库、探测点重命名、嵌入C代码等。最后本文简单介绍下SystemTap的实现原理。
2014-05-28 22:24:19
8432
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
15532
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
43131
3
原创 不错的网络协议栈测试工具 — 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
11542
10
原创 Netfilter的使用和实现
本文主要内容:Netfilter的原理和实现浅析,以及示例模块。内核版本:2.6.37Author:zhangskd @ csdn blog 概述 Netfilter为多种网络协议(IPv4、IPv6、ARP等)各提供了一套钩子函数。在IPv4中定义了5个钩子函数,这些钩子函数在数据包流经协议栈的5个关键点被调用。这就像有5个钓鱼台,在每个钓鱼台放了一个鱼钩(钩子函
2014-04-02 16:54:26
33566
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
5789
原创 数据包接收系列 — 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
6729
原创 数据包接收系列 — NAPI的原理和实现
本文主要内容:简单分析NAPI的原理和实现。内核版本:2.6.37Author:zhangskd @ csdn 概述 NAPI是linux新的网卡数据处理API,据说是由于找不到更好的名字,所以就叫NAPI(New API),在2.5之后引入。简单来说,NAPI是综合中断方式与轮询方式的技术。中断的好处是响应及时,如果数据量较小,则不会占用太多的CPU事件;缺点是数
2014-03-27 17:14:40
32667
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人