自定义博客皮肤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的专栏

鱼跃此时海,花开彼岸天

  • 博客(158)
  • 收藏
  • 关注

原创 数据包接收系列 — 下半部实现(软中断)

本文主要内容:下半部的实现,分析数据包从上半部结束后到L3的处理过程。内核版本:2.6.37Author:zhangskd @ csdn blog 下半部的实现 接收数据包的下半部处理流程为:net_rx_action // 软中断    |--> process_backlog() // 默认poll               |--> __netif_re

2014-03-27 17:06:12 11874 1

原创 数据包接收系列 — 上半部实现(内核接口)

本文主要内容:网络数据包接收的上半部实现,主要分析内核接口相关部分。内核版本:2.6.37Author:zhangskd @ csdn blog 上半部的实现 接收数据包的上半部处理流程为:el_interrupt() // 网卡驱动    |--> el_receive() // 网卡驱动                |--> netif_rx() // 内

2014-03-27 16:50:52 14971 3

原创 数据包接收系列 — 上半部实现(网卡驱动)

本文主要内容:网络数据包接收的上半部实现,主要分析网卡驱动相关部分。内核版本:2.6.37Author:zhangskd @ csdn blog 网卡概述 (1) 网卡收包网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。然后网卡芯片将物理帧头去掉,得到MAC包。网卡芯片会检查MAC包内的目的MAC地址,如果和本网卡的MAC地址不一样则

2014-03-27 16:40:06 11947 1

原创 硬中断和软中断

本文主要内容:硬中断 / 软中断的原理和实现内核版本:2.6.37Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行

2014-03-27 16:21:59 114057 12

原创 排队时延(Queuing delay)

网络时延的构成 Network delay including four parts:Processing delay - time routers take to process the packet header.Queuing delay - time the packet spends in routing queuesTransmission delay - time

2014-01-21 18:04:16 17768

原创 TCP连接建立系列 — 服务端接收ACK段(二)

本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径。内核版本:3.6Author:zhangskd @ csdn blog 创建新sock 协议族相关的操作函数,我们要看的是TCP/IPv4的实例ipv4_specific。const struct inet_connection_sock_af_ops ipv4_specific = { ..

2014-01-07 09:49:08 7002 1

原创 TCP连接建立系列 — 服务端接收ACK段(一)

本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径。内核版本:3.6Author:zhangskd @ csdn blog 接收入口 1. 状态为ESTABLISHED时,用tcp_rcv_established()接收处理。2. 状态为LISTEN时,说明这个sock处于监听状态,用于被动打开的接收处理,包括SYN和ACK。3. 当状态不为ESTA

2014-01-07 09:46:55 10823 5

原创 TCP连接建立系列 — 服务端发送SYNACK段

tcp_v4_send_synack()用于发送SYNACK段,在tcp_v4_conn_request()中被调用。首先调用tcp_make_synack()构造SYNACK段,主要是构造TCP报头和初始化skb中的一些字段。然后调用ip_build_and_send_pkt()添加IP报头后发送出去。

2014-01-06 18:04:36 6565 1

原创 TCP连接建立系列 — 服务端接收SYN段

状态为ESTABLISHED时,用tcp_rcv_established()接收处理。状态为LISTEN时,说明这个sock处于监听状态,用于被动打开的接收处理,包括SYN和ACK。当状态不为ESTABLISHED或TIME_WAIT时,用tcp_rcv_state_process()处理。经由接收入口后,主要由tcp_v4_conn_request()进行处理。

2014-01-06 17:34:03 8209 2

原创 TCP连接建立系列 — 连接请求块

连接请求块(request_sock)之于TCP三次握手,就如同sk_buff之于网络协议栈,都是核心的数据结构。 存储队列 连接请求块的存储队列,内含全连接队列、半连接队列。/** * @icsk_accept_queue: FIFO of established children */struct inet_connection_sock { ...

2014-01-06 17:02:02 7073 4

原创 TCP连接建立系列 — TCP选项解析

TCP选项解析 清零TCP选项。static inline void tcp_clear_options(struct tcp_options_received *rx_opt){ rx_opt->tstamp_ok = rx_opt->sack_ok = 0; rx_opt->wscale_ok = rx_opt->snd_wscale = 0; r

2014-01-06 16:59:40 14610 2

原创 SYN Cookie的原理和实现

SYN Cookie 判断是否使用SYN Cookie。如果SYN Cookie功能有编译进内核(CONFIG_SYN_COOKIE),且选项tcp_syncookie不为0,那么可使用SYN Cookie。同时设置SYN Flood标志(listen_opt->synflood_warned)。/* Return true if a syncookie should be sen

2014-01-06 16:56:15 52194 7

原创 速度之王 — LZ4压缩算法(三)

LZ4是一个快速的无损压缩算法,单核的压缩速度超过400MB/s,单核的解压速度超过1GB/s。LZ4也适用于多核的情况,压缩速度能成倍的提高,解压速度几乎达到RAM的速度限制。文本主要分析LZ4的原理和实现。

2013-12-19 17:46:24 20790 2

原创 速度之王 — LZ4压缩算法(二)

LZ4是一个快速的无损压缩算法,单核的压缩速度超过400MB/s,单核的解压速度超过1GB/s。LZ4也适用于多核的情况,压缩速度能成倍的提高,解压速度几乎达到RAM的速度限制。文本主要分析LZ4的原理和实现。

2013-12-19 17:44:04 28427

原创 速度之王 — LZ4压缩算法(一)

LZ4是一个快速的无损压缩算法,单核的压缩速度超过400MB/s,单核的解压速度超过1GB/s。LZ4也适用于多核的情况,压缩速度能成倍的提高,解压速度几乎达到RAM的速度限制。文本主要分析LZ4的原理和实现。

2013-12-19 17:35:55 95619 1

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

本文主要分析accept()的阻塞等待和唤醒。内核版本:3.6Author:zhangskd @ csdn blog 等待队列 (1)socket的等待队列/* * @sk_wq: sock wait queue head and async head */struct sock { ... struct socket_wq __rcu

2013-11-18 18:18:16 5604 1

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

本文主要介绍了accept()的系统调用、Socket层实现,以及TCP层实现。内核版本:3.6Author:zhangskd @ csdn blog应用层int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

2013-11-18 18:15:44 12832

原创 Socket层实现系列 — getsockname()和getpeername()的实现

本文主要介绍了getsockname()和getpeername()的内核实现。内核版本:3.6Author:zhangskd @ csdn blog 应用层 int getsockname(int s, struct sockaddr *name, socklen_t *namelen);

2013-11-18 18:12:45 15741

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

本文主要分析listen()的内核实现,包括它的系统调用、Socket层实现、半连接队列,以及监听哈希表。内核版本:3.6Author:zhangskd @ csdn blog

2013-11-11 16:54:38 13399 3

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

本文主要内容:bind()的TCP层实现、端口的冲突处理,以及不同内核版本的实现差异。内核版本:3.6Author:zhangskd @ csdn

2013-11-11 16:52:57 6817 1

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

bind()函数的使用方法很简单,但是它是怎么实现的呢?笔者从应用层出发,沿着网络协议栈,分析了bind()的系统调用、Socket层实现,以及它的TCP层实现。本文主要内容:bind()的系统调用、bind()的Socket层实现。内核版本:3.6Author:zhangskd @ csdn

2013-11-11 16:50:47 19205 1

原创 使用钩子参与到TCP拥塞事件的处理中

TCP定义了几个拥塞事件,当这些事件发生时,我们可以通过TCP的拥塞控制算法,调用自定义的处理函数,来做一些额外的事情的。也就是说,我们可以很简便的参与到TCP对拥塞事件的处理过程中。

2013-10-09 10:40:04 4970 3

原创 TCP校验和的原理和实现

TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被悄悄丢弃。TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。TCP的校验和是必需的,而UDP的校验和是可选的。

2013-09-24 18:29:58 93550 7

原创 TCP拥塞控制算法内核实现剖析(十)

Veno结合了Vegas和Reno,故得此名。Veno的主要目的在于区分随机丢包和无线丢包。Vegas能够测量网络瓶颈路由器中属于此连接的数据包个数,Veno正是利用这一变量来区分随机丢包和拥塞丢包,并采取不同的措施。Veno也改进了窗口增长函数,当网络瓶颈路由器中属于此连接的数据包个数超过一定值时,放缓窗口增长速度。

2013-09-13 17:30:53 6661 4

原创 Windows的TCP协议参数

本文主要介绍Windows的几个TCP协议参数,我们可以自行修改这些参数的值。这些参数为:窗口扩大因子选项、时间戳选项、SACK选项、TcpMaxDupAcks、拥塞控制算法、最大接收窗口和全局最大接收缓存。

2013-09-11 22:59:03 19515 2

原创 程序员的绘图利器 — Gnuplot

介绍 gnuplot is a command-line program that can generate two- and three-dimensional plots.It is frequently used for publication-quality graphics as well as education.The program can be used both

2013-09-11 22:47:48 8452

原创 内核符号表问题

问题描述 有两个模块,mod1和mod2。在mod1中定义了func()函数,并且经EXPORT_SYMBOL()导出。在mod2中extern func(),调用func()。 编译模块mod2,成功。加载mod2时,输出:insmod: error inserting 'mod2.ko': -1 Invalid parametersdmesg查看:mod

2013-09-11 22:46:15 6616

原创 哈希链表及其变种

本文主要分析哈希链表(hash list)的设计原理和实现,以及哈希链表的一种变种(hash nulls list)的原理和实现。

2013-09-09 18:34:06 15865 2

原创 Exploring TCP state machine by graphs

In this article, we explore TCP state machine by graphs. TCP includes 11 states, they are:LISTENSYN_SENTSYN_RECVESTABLISHEDFIN_WAIT1CLOSE_WAITFIN_WAIT2LAST_ACKTIME_WAITCLOSEDCLOSING

2013-09-06 10:10:28 3958

原创 胡思乱想

我们知道机器CPU的温度过高时,机器就会运行缓慢。而我惊奇的发现,当我思维激荡时,脑袋也会开始升温,接着思维开始紊乱,必须要冷静下才能继续正常思考。 我们知道机器的虚拟存储器VM是按需调度的,当CPU需要某些虚拟页时,VM会把它们调入内存,当CPU不再需要它们的时候,VM又会把它们调出内存。这和我们的记忆何其相似?我们平时学习新知识的时候,相当于创建了若干虚拟页。当我们要用到相

2013-08-14 10:51:51 1709 1

原创 TCP的核心系列 — SACK和DSACK的实现(七)

我们发送重传包时,重传包也可能丢失,如果没有检查重传包是否丢失的机制,那么只能依靠超时来恢复了。37版本把检查重传包是否丢失的部分独立出来,这就是tcp_mark_lost_retrans()。在处理SACK块的同时,会检测是否有出现乱序,如果有乱序,那么会计算乱序的长度并更新。本文主要内容:检查重传包是否丢失,以及乱序的检测和更新。

2013-08-12 16:33:34 4569 2

原创 TCP的核心系列 — SACK和DSACK的实现(六)

上篇文章中我们主要说明如何skip到一个SACK块对应的开始段,如何walk这个SACK块包含的段,而没有涉及到如何标志一个段的记分牌。37版本把给一个段打标志的内容独立出来,这就是tcp_sacktag_one()。本文主要内容:tcp_sacktag_one(),给一个段打上标志。

2013-08-12 16:31:21 3952

原创 TCP的核心系列 — SACK和DSACK的实现(五)

18版本对于每个SACK块,都是从重传队列头开始遍历。37版本则可以选择性的遍历重传队列的某一部分,忽略SACK块间的间隙、或者已经cache过的部分。这主要是通过tcp_sacktag_skip()和tcp_sacktag_walk()完成的。tcp_sacktag_skip()可以直接找到包含某个序号的skb,通常用于定位SACK块的开头。tcp_sacktag_walk()则遍历两个序号之间的skb,通常用于遍历一个SACK块。

2013-08-12 16:29:04 4029

原创 TCP的核心系列 — SACK和DSACK的实现(四)

和18版本不同,37版本把DSACK的检测部分独立出来,可读性更好。37版本在DSACK的处理中也做了一些优化,对DSACK的两种情况分别进行处理。本文主要内容:DSACK的检测、DSACK的处理。

2013-08-12 16:21:43 5926

原创 TCP的核心系列 — SACK和DSACK的实现(三)

不论是18版,还是37版,一开始都会从TCP的控制块中取出SACK选项的起始地址。SACK选项的起始地址是保存在tcp_skb_cb结构的sacked项中的,那么这是在什么时候做的呢?SACK块并不是总是合法的,非法的SACK块可能会引起处理错误,所以还需要进行SACK块的合法性检查。本文主要内容:TCP首部中SACK选项的解析和地址的获取,SACK块的合法性检查。

2013-08-12 16:20:30 7112 1

原创 TCP的核心系列 — SACK和DSACK的实现(二)

37版SACK和DSACK的实现。和18版本相比,37版本的SACK和DSACK的实现做了很多改进,最明显的就是需要遍历的次数少了,减少了CPU的消耗。37版的性能提升了,代码有大幅度的改动,逻辑也更加复杂了。本文主要内容:37版tcp_sacktag_write_queue()的实现,也即37版SACK和DSACK的实现。

2013-08-12 16:18:13 5035 2

原创 TCP的核心系列 — SACK和DSACK的实现(一)

TCP的实现中比较重要的一部分就是:SACK和DSACK的实现。SACK和DSACK的处理部分由Ilpo Järvinen (ilpo.jarvinen@helsinki.fi) 维护。为了便于理解,笔者先后分析了18版、37版的具体实现。相对而言,18版本的逻辑清晰,但效率较低;37版本的逻辑复杂,但效率较高。

2013-08-12 16:16:35 11262 1

原创 TCP的核心系列 — 重传队列的更新和时延的采样(二)

在tcp_clean_rtx_queue()中,并非对每个ACK都进行时延采样。是否进行时延采样,跟这个ACK是否为重复的ACK、这个ACK是否确认了重传包,以及是否使用时间戳选项都有关系。本文主要内容:tcp_clean_rtx_queue()的一些细节,时延采样的条件。

2013-08-12 16:11:31 4877

原创 TCP的核心系列 — 重传队列的更新和时延的采样(一)

重传队列实际上就是发送队列(sk->sk_write_queue),保存着发送且未确认的数据段。当有新的数据段被确认时,需要把这些段从重传队列中删除,同时更新一些变量,包括packets_out、sacked_out、lost_out、retrans_out等。对于非重复的ACK,会进行RTT采样,用于更新srtt和rto等时延信息。本文主要内容:tcp_clean_rtx_queue()的实现。

2013-08-12 16:05:55 5793

原创 TCP的核心系列 — ACK的处理(二)

本文主要内容:tcp_ack()中的一些细节,如发送窗口的更新、持续定时器等。

2013-08-12 16:04:15 9491

空空如也

空空如也

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

TA关注的人

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