![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Kernel
文章平均质量分 96
zhangskd
一路风雨,一路奔跑
展开
-
TCP校验和的原理和实现
TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被悄悄丢弃。TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。TCP的校验和是必需的,而UDP的校验和是可选的。原创 2013-09-24 18:29:58 · 93300 阅读 · 7 评论 -
数据包接收系列 — 上半部实现(内核接口)
本文主要内容:网络数据包接收的上半部实现,主要分析内核接口相关部分。内核版本:2.6.37Author:zhangskd @ csdn blog 上半部的实现 接收数据包的上半部处理流程为:el_interrupt() // 网卡驱动 |--> el_receive() // 网卡驱动 |--> netif_rx() // 内原创 2014-03-27 16:50:52 · 14952 阅读 · 3 评论 -
硬中断和软中断
本文主要内容:硬中断 / 软中断的原理和实现内核版本:2.6.37Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行原创 2014-03-27 16:21:59 · 113704 阅读 · 12 评论 -
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 · 6990 阅读 · 1 评论 -
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 · 6545 阅读 · 1 评论 -
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 · 14576 阅读 · 2 评论 -
TCP连接建立系列 — 连接请求块
连接请求块(request_sock)之于TCP三次握手,就如同sk_buff之于网络协议栈,都是核心的数据结构。 存储队列 连接请求块的存储队列,内含全连接队列、半连接队列。/** * @icsk_accept_queue: FIFO of established children */struct inet_connection_sock { ...原创 2014-01-06 17:02:02 · 7053 阅读 · 4 评论 -
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 · 51557 阅读 · 7 评论 -
TCP的核心系列 — ACK的处理(一)
TCP发送数据包后,会收到对端的ACK。通过处理ACK,TCP可以进行拥塞控制和流控制,所以ACK的处理是TCP的一个重要内容。tcp_ack()用于处理接收到的ACK。本文主要内容:TCP接收ACK处理,tcp_ack()的实现。原创 2013-08-12 15:58:01 · 16234 阅读 · 7 评论 -
使用钩子参与到TCP拥塞事件的处理中
TCP定义了几个拥塞事件,当这些事件发生时,我们可以通过TCP的拥塞控制算法,调用自定义的处理函数,来做一些额外的事情的。也就是说,我们可以很简便的参与到TCP对拥塞事件的处理过程中。原创 2013-10-09 10:40:04 · 4958 阅读 · 3 评论 -
TCP拥塞控制算法内核实现剖析(十)
Veno结合了Vegas和Reno,故得此名。Veno的主要目的在于区分随机丢包和无线丢包。Vegas能够测量网络瓶颈路由器中属于此连接的数据包个数,Veno正是利用这一变量来区分随机丢包和拥塞丢包,并采取不同的措施。Veno也改进了窗口增长函数,当网络瓶颈路由器中属于此连接的数据包个数超过一定值时,放缓窗口增长速度。原创 2013-09-13 17:30:53 · 6652 阅读 · 4 评论 -
数据包接收系列 — NAPI的原理和实现
本文主要内容:简单分析NAPI的原理和实现。内核版本:2.6.37Author:zhangskd @ csdn 概述 NAPI是linux新的网卡数据处理API,据说是由于找不到更好的名字,所以就叫NAPI(New API),在2.5之后引入。简单来说,NAPI是综合中断方式与轮询方式的技术。中断的好处是响应及时,如果数据量较小,则不会占用太多的CPU事件;缺点是数原创 2014-03-27 17:14:40 · 32668 阅读 · 7 评论 -
Netfilter的使用和实现
本文主要内容:Netfilter的原理和实现浅析,以及示例模块。内核版本:2.6.37Author:zhangskd @ csdn blog 概述 Netfilter为多种网络协议(IPv4、IPv6、ARP等)各提供了一套钩子函数。在IPv4中定义了5个钩子函数,这些钩子函数在数据包流经协议栈的5个关键点被调用。这就像有5个钓鱼台,在每个钓鱼台放了一个鱼钩(钩子函原创 2014-04-02 16:54:26 · 33566 阅读 · 4 评论 -
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 · 10809 阅读 · 5 评论 -
sk_buff 剖析
基于内核版本2.6.37本文主要剖析:sk_buff结构体、sk_buff操作函数、各协议层对其处理 主要源文件:linux-2.6.37/ include/ linux/ skbuff.h linux-2.6.37/ include/ linux/ skbuff.c ==============================原创 2011-12-28 18:04:48 · 13657 阅读 · 0 评论 -
强力卸载内核模块
概述 内核为2.6.32。卸载模块target时,不管是否为强制卸载,都输出:ERROR:Module target is in use.用lsmod查看target,发现Used by计数为1,而据我所知,没有其它模块依赖target。编写模块检查target的module结构,发现:target->state == 0 // 模块存活module_refcoun原创 2012-09-09 16:38:41 · 16041 阅读 · 3 评论 -
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 · 8177 阅读 · 2 评论 -
数据包接收系列 — 下半部实现(软中断)
本文主要内容:下半部的实现,分析数据包从上半部结束后到L3的处理过程。内核版本:2.6.37Author:zhangskd @ csdn blog 下半部的实现 接收数据包的下半部处理流程为:net_rx_action // 软中断 |--> process_backlog() // 默认poll |--> __netif_re原创 2014-03-27 17:06:12 · 11856 阅读 · 1 评论 -
数据包接收系列 — 上半部实现(网卡驱动)
本文主要内容:网络数据包接收的上半部实现,主要分析网卡驱动相关部分。内核版本:2.6.37Author:zhangskd @ csdn blog 网卡概述 (1) 网卡收包网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。然后网卡芯片将物理帧头去掉,得到MAC包。网卡芯片会检查MAC包内的目的MAC地址,如果和本网卡的MAC地址不一样则原创 2014-03-27 16:40:06 · 11938 阅读 · 1 评论 -
数据包接收系列 — 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 阅读 · 0 评论 -
数据包接收系列 — 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 阅读 · 0 评论 -
内核符号表问题
问题描述 有两个模块,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 · 6598 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(七)
我们发送重传包时,重传包也可能丢失,如果没有检查重传包是否丢失的机制,那么只能依靠超时来恢复了。37版本把检查重传包是否丢失的部分独立出来,这就是tcp_mark_lost_retrans()。在处理SACK块的同时,会检测是否有出现乱序,如果有乱序,那么会计算乱序的长度并更新。本文主要内容:检查重传包是否丢失,以及乱序的检测和更新。原创 2013-08-12 16:33:34 · 4566 阅读 · 2 评论 -
Linux内核链表实现剖析
Linux内核使用环形双向链表,无所谓头结点和尾节点。内核链表详细信息见 include/ linux / list.h 。 1. 定义和初始化内核链表 struct list_head { struct list_head *prev, *next ;} ;list_head不包含数据,一般内嵌于其它数据结构中。定义list_head stru原创 2011-11-24 15:17:29 · 2497 阅读 · 0 评论 -
linux内核定时器
struct list_head { struct list_head *next, *prev;} 定时器(内核定时器、动态定时器)由结构timer_list表示,定义在文件linux/timer.h中。struct timer_list { struct list_head entry; /* 定时器链表的入口 */原创 2011-10-15 16:40:35 · 1531 阅读 · 0 评论 -
Linux最简单内核模块编写
hello.h/* * head file of hello.ko * location of following files : /usr/src/$(uname -r)/include/ */#include //module_init(),module_exit()#include //MODULE_AUTHOR(),MODULE_LICENSE()#includ原创 2011-10-09 17:42:34 · 2981 阅读 · 0 评论 -
Cannot set device tcp segmentation offload settings: Invalid argument
错误描述 ethtool -K eth0 tso onCannot set device tcp segmentation offload settings: Invalid argumentTSO选项开启失败。 网卡驱动 显示网卡驱动ethtool -i | --driver ethX 例:ethtool -i eth0driver: tg3v原创 2013-01-17 10:05:46 · 5177 阅读 · 0 评论 -
linux文件系统变化通知机制—inotify
概述 inotify — a powerful yet simple file change notification system.inotify是linux内核2.6.13以后支持的一种特性,功能是监视文件系统的变化,在监视到文件系统发生变化以后,会向相应的应用程序发送变化事件。inotify是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户得知,该机制是著原创 2012-05-18 13:06:06 · 12601 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(四)
和18版本不同,37版本把DSACK的检测部分独立出来,可读性更好。37版本在DSACK的处理中也做了一些优化,对DSACK的两种情况分别进行处理。本文主要内容:DSACK的检测、DSACK的处理。原创 2013-08-12 16:21:43 · 5912 阅读 · 0 评论 -
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 · 5021 阅读 · 2 评论 -
TCP的核心系列 — SACK和DSACK的实现(六)
上篇文章中我们主要说明如何skip到一个SACK块对应的开始段,如何walk这个SACK块包含的段,而没有涉及到如何标志一个段的记分牌。37版本把给一个段打标志的内容独立出来,这就是tcp_sacktag_one()。本文主要内容:tcp_sacktag_one(),给一个段打上标志。原创 2013-08-12 16:31:21 · 3935 阅读 · 0 评论 -
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 · 4020 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(三)
不论是18版,还是37版,一开始都会从TCP的控制块中取出SACK选项的起始地址。SACK选项的起始地址是保存在tcp_skb_cb结构的sacked项中的,那么这是在什么时候做的呢?SACK块并不是总是合法的,非法的SACK块可能会引起处理错误,所以还需要进行SACK块的合法性检查。本文主要内容:TCP首部中SACK选项的解析和地址的获取,SACK块的合法性检查。原创 2013-08-12 16:20:30 · 7103 阅读 · 1 评论 -
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 · 11221 阅读 · 1 评论 -
TCP的核心系列 — 重传队列的更新和时延的采样(二)
在tcp_clean_rtx_queue()中,并非对每个ACK都进行时延采样。是否进行时延采样,跟这个ACK是否为重复的ACK、这个ACK是否确认了重传包,以及是否使用时间戳选项都有关系。本文主要内容:tcp_clean_rtx_queue()的一些细节,时延采样的条件。原创 2013-08-12 16:11:31 · 4873 阅读 · 0 评论 -
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 · 5781 阅读 · 0 评论 -
TCP的核心系列 — ACK的处理(二)
本文主要内容:tcp_ack()中的一些细节,如发送窗口的更新、持续定时器等。原创 2013-08-12 16:04:15 · 9487 阅读 · 0 评论 -
sysctl使用方法的变化
内核版本:3.6Author:zhangskd @ csdn blogChange在v3.4中包含一个patch,提交者Eric W. Biederman描述如下:Rewrite of sysctl for speed and charity.Insert/remove/Lookup in sysctl are now O(NlogN) operations,原创 2013-04-21 14:36:32 · 5729 阅读 · 0 评论