私信 关注
老王不让用
码龄6年

芝兰生于幽谷,不以无人而不芳; 君子修身立德,不谓穷困而改节

  • 118,465
    被访问量
  • 84
    原创文章
  • 37,735
    作者排名
  • 57
    粉丝数量
  • 于 2014-09-27 加入CSDN
获得成就
  • 获得61次点赞
  • 内容获得20次评论
  • 获得379次收藏
荣誉勋章
兴趣领域
  • #运维
    #Linux/CentOS#系统架构#网络
TA的专栏
  • linux内核
    14篇
  • shell
    3篇
  • linux系统编程
    11篇
  • AI
    1篇
  • linux内核协议栈
    72篇
  • netfilter
    12篇
  • ip协议
    10篇
  • linux 内核网络 sk_buff 结构详解
    5篇
  • tcp协议
    36篇
  • linux 网桥代码分析
    10篇
  • 工具
    18篇
  • 网络诊断
    3篇
  • 领居协议
    7篇
  • udp协议
    4篇
  • icmp协议
    3篇
  • 二叉树
    5篇
  • 防火墙
    4篇
  • 算法
    39篇
  • linux C编程
    2篇
  • linux多线程
    5篇
  • socket编程
    12篇
  • 系统IO
    1篇
  • 数据结构
    19篇
  • dpdk
    8篇
  • 数组
    7篇
  • 链表
    6篇
  • 动态规划
    5篇
  • 计算机基础
    5篇
  • spring
    9篇
  • web
    2篇
  • error
    2篇
  • hibernate
    3篇
  • linux系统
    40篇
  • java随堂笔记
    45篇
  • linux系统接口
    9篇
  • 协议栈
    44篇
  • Linux性能优化
    2篇
  • jdbc
    7篇
  • 数据库
    5篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

工控培训-基于C语言Modbus通信协议源代码.pdf

modbus协议实现接口
pdf
发布资源于 9 天前

通过在U盘上装载PE小系统清除PC机administrator用户密码.docx

忘记用户名密码也不要紧的......
docx
发布资源于 9 天前

u-boot SPL的理解

uboot分为uboot-spl和uboot两个组成部分。SPL是Secondary Program Loader的简称,第二阶段程序加载器,这里所谓的第二阶段是相对于SOC中的BROM来说的,之前的文章已经有所介绍,SOC启动最先执行的是BROM中的固化程序。BROM会通过检测启动方式来加载第二阶段bootloader。uboot已经是一个bootloader了,那么为什么还多一个uboot spl呢?这个主要原因是对于一些SOC来说,它的内部SRAM可能会比较小,小到无法装载下一个完整的uboo
转载
9阅读
0评论
0点赞
发布博客于 16 天前

linux 下 {}大括号的用法

我们平时使用Linux的时候经常遇到这样一个问题,举例有这样一种情况:执行命令$ cp /etc/apt/sources.list /etc/apt/sources.list.bak这里面有个问题,明明 /etc/apt/sources 这几个字都是一样的,为什么要打两遍?这样的还算短了,要是更深层的目录,那花的力气可就大了。跟上面例子很相似的情况是:在备份一个文件,重命名一个文 件,或是创建一个链接,都要进行类似的操作,重复一个相同的路径。通常比较明智的做法是先 cd 到那个目录,然后在那个目录
转载
45阅读
0评论
0点赞
发布博客于 17 天前

什么是.so文件

so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据linux下何谓.so文件:用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟.dll文件差不多 一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码) Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库那么.so文件是怎么用的呢?for example:(1) 动态库的编译.
转载
165阅读
0评论
0点赞
发布博客于 27 天前

处理器运算能力单位(TOPS、GOPS、MOPS)

TOPS是Tera Operations Per Second的缩写,1TOPS代表处理器每秒钟可进行一万亿次(10^12)操作。与此对应的还有GOPS(Giga Operations Per Second),MOPS(Million Operation Per Second)算力单位。1GOPS代表处理器每秒钟可进行十亿次(10^9)操作,1MOPS代表处理器每秒钟可进行一百万次(10^6)操作。TOPS同GOPS与MOPS可以换算,都代表每秒钟能处理的次数,单位不同而已。在某些情况下,还
转载
171阅读
0评论
0点赞
发布博客于 27 天前

linux 进程(线程)D 状态构造

代码如下:#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main() { if (!vfork()){ while(1){ sleep(1); } } return 0;} 实验结果:[root@localhost some_func]# gcc task_d_status.c -o task_d_status[root@localho
原创
48阅读
0评论
0点赞
发布博客于 2 月前

linux 原始套接字实现分析

目录1 原始套接字概述1.1链路层原始套接字1.2网络层原始套接字1.2.1 接收报文1.2.2 发送报文2 原始套接字实现2.1原始套接字报文收发流程2.2链路层原始套接字的实现2.2.1套接字创建2.2.2报文接收2.2.3报文发送2.2.4 小结2.3网络层原始套接字的实现2.3.1套接字创建2.3.2报文接收2.3.3报文发送2.3.4 小结3 应用及注意事项3.1 使用链路层原始套...
转载
50阅读
0评论
0点赞
发布博客于 2 月前

linux内核协议栈 协议栈收包入口 netif_receive_skb

目录1 协议栈入口__netif_receive_skb_core()2 vlan 操作2.1 vlan报文信息struct vlan_hdr2.2 vlan 剥离 vlan_untag()2.3 vlan 添加eth_type_trans()3 三层协议处理钩子注册3.1 各种三层协议处理函数注册过程3.2桥处理函数注册网络收包流程从网卡驱动开始,一直往上,涉及NAPI、GRO、RPS等特性,通常是经过硬件中断后在经由软中断处理,在内核软中断的最后一步就是调用...
转载
66阅读
0评论
0点赞
发布博客于 2 月前

linux 内核网络 sk_buff 之队列管理函数Ⅴ

1初始化函数skb_queue_head_init()首先获取到sk_buff_head结构体中自旋锁,因为队列管理函数都是原子操作(要么不操作,要不一定要操作完,操作时不能被打扰),所以获取到锁才可以操作,防止异步中断。然后创建个空的链表。函数实现如下:static inline void skb_queue_head_init(struct sk_buff_head *list){ spin_lock_init(&list->lock);//获得头结点中的自旋锁...
转载
53阅读
0评论
0点赞
发布博客于 2 月前

linux 内核网络 sk_buff 之克隆与复制Ⅳ

目录1 skb_clone() 函数2 pskb_copy() 函数3 skb_copy() 函数4 小结1 skb_clone() 函数该函数就是单单克隆下 sk_buff 结构体,对 sk_buff 结构的数据区、分片结构体 skb_shared_info、分片结构体数据区等结果进行共享。skb:将要被克隆的sk_buff结构体(后面用父skb来称); gfp_mask:向内核申请分配内存的方式; 返回:新克隆出来的skb结构体(后面称其为子skb);struct s
转载
43阅读
0评论
0点赞
发布博客于 2 月前

linux 内核网络 sk_buff 之申请和释放 Ⅲ

目录1 sk_buff 内存申请接口概述2 sk_buff 申请__alloc_skb()3 sk_buff 释放kfree_skb()1 sk_buff 内存申请接口概述因为 sk_buff 结构是比较复杂的(并不是其本身结构复杂,而是其所指的数据区以及分片结构等,合在一起就变复杂了),所以在内存申请和释放时,就要搞清楚什么函数对应的申请分配或释放什么结构内存。这里不提倡自己用 kmalloc() 和 kfree() 函数来为 sk_buff 相关结构体申请内存及销毁,而要用内核提..
转载
58阅读
0评论
0点赞
发布博客于 2 月前

linux 内核网络 sk_buff 之数据区操作函数集合Ⅱ

目录1 sk_buff 中的四大指针2 sk_buff 指针数据区操作函数集2.1 skb_put()2.2 skb_push()2.3 skb_pull()2.4 skb_reserve()1 sk_buff 中的四大指针四大指针分别是:head、data、tail、end;这四个指针都是指向了数据区的,数据区中存放的是协议头和数据。head 和 end 指针是每个数据包一样的,也是有这两个指针来确定数据区的大小的。最开始的时候 head、data、tail 三个指针都是指
转载
33阅读
0评论
0点赞
发布博客于 2 月前

linux 内核网络 sk_buff 之数据结构剖析Ⅰ

1 sk_buff 结构体内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_buff结构体中的data指针来实现,不会删除各层协议头。这样做是为了提高CPU的工作效率。sk_buff结构体中有很多条件编译,比如:...#if defined(CONFIG_NF_CONNTRACK) || defined(...
转载
45阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥代码分析之网桥数据转发函数分析Ⅵ

目录1 指定端口转发数据br_forward()1.1 是否允许转发should_deliver()1.2 转发函数 __br_forward()1.2.1 公共转发接口 br_forward_finish()2 所有端口发送数据br_flood_forward()3 本地数据指定端口发送br_deliver()3.1本地数据发送 __br_deliver()4 本地数据所有端口发送br_flood_deliver()网桥收到非本地的报文时需要将报文进行转发,...
转载
57阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥代码分析之网桥端口设备接收数据包处理分析Ⅴ

1 网桥处理报文概述网桥是一种2层网络互连设备,而不是一种网络协议。它在协议结构上并没有占有一席之地,因此不能通过向协议栈注册协议的方式来申请网桥数据包的处理。相反,网桥接口的数据包和一般接口(如eth0)在格式上完全是一样的,不同之处是网桥在2层上就对它进行了转了,而一般接口要在3层 才能根据路由信息来决定是否要转发,如何转发。linux内核是通过一个虚拟的网桥设备来实现桥接的。这个虚拟设备可以绑定若干个以太网接口设备,从而将它们桥接起来。如下图(摘自ULNI):网桥设备br0绑定了eth0..
转载
150阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥代码分析之网桥转发数据库的代码分析Ⅳ

1 数据库初始化br_fdb_init()该函数调用kmem_cache_create 来创建一个新缓存(这个函数并没有向缓存分配任何内存)int __init br_fdb_init(void){ br_fdb_cache = kmem_cache_create("bridge_fdb_cache", sizeof(struct net_bridge_fdb_entry), 0, SLAB_HWCACHE_ALIGN, NULL); if (!br...
转载
56阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥代码分析之网桥及网桥端口的添加与删除Ⅲ

目录1 网桥添加br_add_bridge()1.1 申请并初始化 net_device、net_bridge1.1.1 初始化网桥br_dev_setup()1.1.2 网桥操作函数集合2网桥删除br_del_bridge()3 网桥端口添加br_add_if()3.1 网桥端口创建new_nbp()4 网桥端口删除br_del_if()4.1 删除网桥端口 del_nbp()4.1.1 网桥端口销毁destroy_nbp_rcu()、destroy...
转载
164阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥代码分析之网桥初始化Ⅱ

目录1 初始化br_init()1.1 CAM 转发表初始化br_fdb_init()1.2 注册通知链struct notifier_block br_device_notifier1.3 注册用户态 ioctl 接口br_ioctl_deviceless_stub()1 初始化br_init()对于网桥初始化所需要做的功能,主要有以下几项调用 stp_proto_register 进行 stp 协议相关的初始化 调用 br_fdb_init 进行CAM表的初始化...
转载
40阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥代码分析之网桥功能及其相关数据结构Ⅰ

目录1 linux 网桥功能2 相关数据结构2.1 网桥struct net_bridge2.2 网桥端口struct net_bridge_port2.3转发表项struct net_bridge_fdb_entry2.4 嵌套关系1 linux 网桥功能《linux 网桥浅析》2 相关数据结构2.1 网桥struct net_bridgestruct net_bridge{ spinlock_t lock; //自旋锁,在向net_brid...
转载
30阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥配置命令:brctl

Linux网关模式下将有线LAN和无线LAN共享网段实现局域网内互联:思路其实很简单:就是将虚拟出一个bridge口,将对应的有线LAN和无线LAN都绑定在这个虚拟bridge口上,并给这个bridge口分配一个地址,其他子网微机配置网关为bridge口的地址便可以了。当然,因为是设备是网关模式,路由和nat也是必须的了。如果设备本身便是网桥模式,那么路由和nat便可以省掉了。brctl addbr bridgebrctl addif bridge eth0brctl addif bridg
转载
86阅读
0评论
0点赞
发布博客于 2 月前

linux网络报文接收发送浅析

linux网络报文接收流程netif_rx-->netif_rx_schedule-->net_rx_action-->process_backlog-->netif_receive_skb-->上层协议栈处理(ptype_base的HASH表中已注册.type与.func协议处理函数)linux网络报文发送流程上层发送协议栈组装需发送的报文有队列设备:fun_xmit-->dev_queue_xmit-->qdisc_run-->qdsi
转载
99阅读
0评论
0点赞
发布博客于 2 月前

linux 网桥浅析

目录1 什么是桥接?2 linux的桥接实现2.1 相关模型2.2 相关数据结构2.3 接收过程2.4 发送过程2.5 生成树协议2.5.1 确定树根2.5.2 确定上行口2.5.3 确定需要被阻塞的下行口1 什么是桥接?简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连
转载
102阅读
0评论
0点赞
发布博客于 2 月前

集线器、交换机、网桥区别

目录1 集线器2 网桥3 交换机4 网桥和交换机的工作原理及区别?4.1 网桥的连接模式:(红点处为HUB)4.2 交换机连接模式4.3 网桥的工作原理4.4 交换机有些许不同4.5 值得注意的一些问题4.5.1 网桥需要软件辅助?4.5.2网桥用于连接不同的网段?(搜索百度时查到一个答案)4.6这里再次总结一下网桥和交换机最近一直在看网络方面的东东,先把基础的东西总结一下,注意:以下的概念现在已经不一定准确了,因为硬件发展相当迅速,集成电路的集成度越..
转载
79阅读
0评论
0点赞
发布博客于 2 月前

网桥的工作原理

目录1功能介绍2题目分析1功能介绍网桥工作在数据链路层,起到的作用是把多个 “局域网” 连接起来,组成更大的局域网。它的功能主要有两点:过滤和转发。通常来看,网桥起到了把不同局域网连接在一起的作用,即使这些局域网使用不同的协议比如802.11和802.3。加入一个网桥连接一个802.3和一个802.11,那么网桥转发的时候首先需要把802.3的帧头拆掉,换成802.11的头,再转发给802.11使之适应无线局域网的帧格式。我们来看看网桥的过滤和转发功能:网桥连接着局域网...
转载
193阅读
0评论
0点赞
发布博客于 2 月前

Linux内存是怎么工作的?

目录1 内存映射2 虚拟内存空间分布3 内存分配与回收4 如何查看内存使用情况5 小结1 内存映射说到内存,你能说出你现在用的这台计算机内存有多大吗?我估计你记得很清楚,因为这是我们购买时,首先考虑的一个重要参数,比方说,我的笔记本电脑内存就是 8GB 的 。我们通常所说的内存容量,就像我刚刚提到的 8GB,其实指的是物理内存。物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。那么,进程要访问内存时,该怎么办呢?Li
转载
90阅读
0评论
0点赞
发布博客于 3 月前

linux 中 top 命令参数详解

top命令用法top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。top的使用方式 top [-d number] | top [-bnp]参数解释:-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 -b:以批次的方式执行top。 -n:与-b配合使用,表示需要进行几次top命令的输出结果。 -p:指定特定的pid进程号进行观察。在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的
转载
77阅读
0评论
0点赞
发布博客于 3 月前

iptables 中 SNAT、DNAT 和 MASQUERADE 的含义

IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。SNAT是source networkaddress translation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报
转载
45阅读
0评论
0点赞
发布博客于 3 月前

虚拟路由冗余协议(VRRP)

1 VRRP简介1.1 定义虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。##目的:VRRP能够在不改变组网的情况下,采用将多台路由设备组成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现默认网关的备份。当网关设备发生故障时,V...
转载
157阅读
0评论
0点赞
发布博客于 3 月前

IPv6 协议简述

1 IPv6简介IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为IPng(IP Next Generation)。它是Internet工程任务组IETF(Internet Engineering Task Force)设计的一套规范,是IPv4(Internet Protocol Version 4)的升级版本。1.1 引入目的IPv4协议是目前广泛部署的因特网协议。在因特网发展初期,IPv4以其协议简单、易于实现、互操作性好的优势而得到快
转载
475阅读
0评论
1点赞
发布博客于 3 月前

IPv6邻居发现协议(NDP)

目录1 邻居发现协议NDP2 地址解析2.1 IPv6地址解析过程分析2.2 报文抓包分析3 跟踪邻居状态4 重复地址检测4.1 抓包分析4.2 IPv6地址生命周期5 路由器发现5.1 地址自动配置5.2 默认路由器优先级和路由信息发现6 路由重定向1 邻居发现协议NDP邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolut
转载
418阅读
0评论
0点赞
发布博客于 3 月前

VLAN基本原理及应用

目录1 为什么需要VLAN1.1什么是VLAN?1.2 未分割广播域时……1.3广播信息是那么经常发出的吗?1.4 广播域的分割与VLAN的必要性2 实现VLAN的机制2.1 直观地描述VLAN2.2需要VLAN间通信时怎么办3 VLAN的访问链接(Access Link)3.1 交换机的端口类型3.2 访问链接3.3 静态VLAN——基于端口3.4 动态VLAN3.4.1 基于MAC地址的VLAN3.4.2 基于IP地址的VLAN3.4...
转载
109阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 三 / 四层协议接收数据处理函数以及相关的全局 hash表 / 数组

目录前言1 二层数据包处理netif_receive_skb()2 三层数据接收处理2.1 三层数据包协议处理数据结构struct packet_type2.2 三层协议栈 全局 hash 表 struct list_head ptype_base2.3 三层协议处理添加dev_add_pack()3 四层数据接收处理3.1 四层数据包协议处理数据结构 struct net_protocol3.2 四层协议栈 全局数组 struct net_protocol ...
转载
80阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 邻居协议之 arp 数据包收发处理流程

前言在arp初始化时,通过调用dev_add_pack将arp协议的接收处理函数添加到了三层协议数据包处理函数相关的hash链表ptype_base中(关于三层协议数据包处理函数相关的hash链表,请参考文档http://blog.csdn.net/lickylin/article/details/22900401)。当底层接收到属于本机的arp数据包时,就会调用arp_rcv进行后续处理。1 arp数据包文接收arp_rcv()功能:对接收到的arp数据包的处理函数首先对arp数据...
转载
157阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 邻居协议之ARP协议处理初始化

目录前言1arp协议相关数据结构1.1 arp协议格式1.2 arp数据结构1.3 arp操作码2 arp协议初始化arp_init()2.1 邻居表初始化 neigh_table_init()2.1.1初始化邻居表项成员 neigh_table_init_no_netlink()2.2 arp表初始值struct neigh_table arp_tbl3 arp协议邻居项的初始化函数 arp_constructor()前言上面分析完了通用邻居层的架构...
转载
76阅读
1评论
0点赞
发布博客于 3 月前

linux内核协议栈 邻居协议之通用邻居项的状态机机制【核心】

1邻居几个核心状态邻居项的状态机机制是通用邻居层最重要的内容,主要是处理邻居项中状态的改变,其中包括几个邻居状态的定时器机制,以及邻居项的更新,solicit请求的发送等对于通用邻居项的状态机,主要有如下几个状态:NUD_INCOMPLETE NUD_REACHABLE NUD_STALE NUD_DELAY NUD_PROBE NUD_FAILED NUD_NOARP NUD_PERMANENT 其中,处于如下状态的邻居项,都会启动一个定时器:#define NUD..
转载
72阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 邻居协议之通用邻居项的创建、查找、删除等相关函数

目录前言1邻居表项创建neigh_create()1.1邻居表项内存申请与初始化neigh_alloc()1.2邻居hash表扩容 neigh_hash_grow()2邻居表项查找2.1neigh_lookup()2.2neigh_lookup_nodev()2.3查找+条件创建 __neigh_lookup()2.4查找+默认创建 __neigh_lookup_errno()3邻居表项销毁neigh_destroy()3.1邻居表项条件...
转载
40阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 邻居协议之通用邻居项的垃圾回收机制

目录前言1 同步(强制)回收处理函数 neigh_forced_gc()2异步(周期)回收处理函数 neigh_periodic_work()前言对于通用邻居层,我认为主要可以分为三个方面:邻居项处理函数,包括邻居项创建、更新、删除等 邻居项的状态机机制,主要是处理邻居项中状态的改变,其中包括几个邻居状态的定时器机制,也包括发送solicit请求等 邻居项的垃圾回收机制,主要是负责回收一个邻居表里长时间不用的邻居项,已节省邻居缓存空间。这三个方面需要相互协调工作,才能完成通用邻.
转载
39阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 邻居协议相关数据结构

目录前言1 邻居基本状态2邻居组合状态2.1NUD_IN_TIMER2.2NUD_VALID2.3NUD_CONNECTED3邻居相关结构体3.1领居表项参数struct neigh_parms3.2领居表项操作函数struct neigh_ops3.3领居表项struct neighbour3.4邻居表struct neigh_table前言在linux代码中,对于不同的邻居项,抽象出了一个通用的模型,通用邻居层,主要是用来进行...
转载
42阅读
0评论
0点赞
发布博客于 3 月前

CSDN为什么无法创建博客分栏了??

 
发布Blink于 3 月前

linux内核协议栈 邻居协议概述

1 什么是邻居协议?NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。这里先以ARP探测来剖析邻居协议。如果一台主机和你的计算机连接在同一个LAN上(也就是说,你和这台主机通过一个共享介质相连或点对点直接相连),那么它就是你的邻居,而且他们有相同的L3网络配置。
转载
39阅读
0评论
0点赞
发布博客于 3 月前

ARP代理(善意的欺骗)

目录1 ARP代理概述2 代理ARP工作流程3代理 ARP 的优缺点3.1 优点3.2 缺点4 linux上配置ARP代理4.1 hostA配置4.2 router配置4.3 hostD配置4.4 结果显示1 ARP代理概述本文档解释了代理地址解析协议 (ARP) 的概念。代理 ARP 是一种技术,即一台主机(通常是路由器)应答要发送至另一台机器的 ARP 请求。"通过"伪造"其身份,需要说明的是这里的"伪造"是一种善意的欺骗,路由器负责将信息包路由到“真实.
转载
135阅读
0评论
0点赞
发布博客于 3 月前

ARP协议报文格式及ARP表简述

目录1 ARP协议报文概述1.1 ARP报文格式1.2 ARP报文抓包1.2.1 arp请求1.2.2 arp应答2 ARP映射表2.1 动态ARP表项2.2 静态ARP表项2.3 短静态ARP表项2.4 长静态ARP表项1 ARP协议报文概述ARP(Address Resolution Protocal,地址解析协议)是将IP地址解析为以太网的MAC地址(或者称为物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对
转载
227阅读
1评论
1点赞
发布博客于 3 月前

linux内核协议栈 icmp协议初始化

目录1 ICMP收包处理函数初始化2 ICMP协议模块初始化2.1icmp_sk_init()【核心】1 ICMP收包处理函数初始化我们知道icmp协议是附属于ip层的3层协议,且是将icmp数据存放于ip数据包的数据部分的3层协议。而tcp、udp也是将tcp、udp数据存放于ip数据包的数据部分的4层协议。虽然icmp与tcp等协议不属于同一个网络层,但是都是在3层ip协议处理完以后,才会交给icmp、tcp的处理函数去处理。因此在linux中,都是调用inet_add...
转载
63阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 icmp 报文收发流程

1 ICMP报文接收1.1 icmp_rcv() 实现在ip层判断是icmp报文之后,会调用icmp_rcv()来处理 icmp 类型的报文对数据包进行合理性检查 根据icmp的类型,分类处理/* * Deal with incoming ICMP packets. */int icmp_rcv(struct sk_buff *skb){ struct icmphdr *icmph; struct rtable *rt = skb_rtable(skb); str...
转载
261阅读
2评论
0点赞
发布博客于 3 月前

linux内核协议栈 icmp 协议概述与数据结构

1 ICMP协议概述ICMP协议是网络层中一个非常重要的协议,其全称为InternetControlMessageProtocol(因特网控制报文协议),ICMP协议弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。在实现中,路由器会使用该协议来报告问题,而主机则会使用该机制来测试目的站是否可达。该报文的最终目的地不是一个应用程序或者目的设备上的用户,而是目的设备上的网际协议软件,一般icmp报文的接收是linux内核里的icmp接收模块来...
转载
56阅读
0评论
0点赞
发布博客于 3 月前

linux内核协议栈 netfilter 之 ip 层 netfilter 的 NAT 模块 hook 及 target 代码剖析

1 钩子函数1.1 nf_nat_ipv4_in()NF_INET_PRE_ROUTING1.2 nf_nat_ipv4_out()NF_INET_POST_ROUTING1.3 nf_nat_ipv4_local_fn()NF_INET_LOCAL_OUT1.4 nf_nat_ipv4_fn()NF_INET_LOCAL_IN2 target 函数3 iptables 案例
转载
139阅读
0评论
1点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之 ip 层 netfilter 的 NAT 原理及模块初始化

目录1 NAT原理1.1SNAT1.2DNAT2 NAT模块初始化2.1 nat 表注册iptable_nat_net_init()2.2target 注册xt_nat_init()2.3 钩子注册2.4 L4协议相关的结构注册1 NAT原理NAT会修改数据包的ip层的源或者目的ip地址。在实际应用中,NAT主要用于实现私有网络访问公共网络的功能。1.1SNAT源目的地址转换,即对ip数据包的源ip地址进行转换操作,典型的应用即是网关,网关的la...
转载
31阅读
0评论
0点赞
发布博客于 4 月前

netstat 命令详解及实现原理

目录1netstat 概述1.1 Active Internet connections1.2 Active UNIX domain sockets2 netstat 命令参数3 netstat 常见用法3.1列出所有端口 (包括监听和未监听的)3.2列出所有处于监听状态的 Sockets3.3显示每个协议的统计信息3.4在 netstat 输出中显示 PID 和进程名称 netstat-p3.5在 netstat 输出中不显示主机,端口和用户名 (hos...
原创
313阅读
1评论
0点赞
发布博客于 4 月前

Linux vmstat命令详解

目录1vmstat、虚拟内存概述1.1 虚拟内存原理2 vmstat 命令详解2.1vmstat 常用命令格式2.2使用实例2.2.1 输出结果字段说明1vmstat、虚拟内存概述vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat工具提供了一种低开销的系统性能观察方式。因为vmstat本身就是低开销工...
转载
52阅读
0评论
0点赞
发布博客于 4 月前

linux mpstat 命令使用详解

mpstat是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。目录1mpstat命令1.1 命令格式2使用2.1 每隔1s输出所有cpu的使用情况2.2 查看软中断统计信息2.3查看软中断总数统计1mpstat命令1.1 命令格式mpstat [ -A ] [ -u ] ...
转载
162阅读
0评论
0点赞
发布博客于 4 月前

Linux watch命令详解

简介watch是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果。你可以拿他来监测你想要的一切命令的结果变化,比如 tail 一个 log 文件,ls 监测某个文件的大小变化,看你的想象力了!命令格式:watch[参数][命令]其它操作:切换终端:Ctrl + X 退出watch:Ctrl + G命令功能:可以将命令的输...
转载
74阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之连接跟踪子系统的L3 L4协议栈模块初始化与自定义注册

目录1L3、L4协议跟踪初始化nf_conntrack_proto_init()1.1L3协议管理1.1.1 struct nf_conntrack_l3proto1.1.2 L3协议注册nf_conntrack_l3proto_register()1.2. L4协议的管理1.2.1 struct nf_conntrack_l4proto1.2.2 L4协议注册nf_conntrack_l4proto_register()2自定义协议L3、L4处理注册nf_co...
转载
51阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之连接跟踪子系统初始化

目录1 连接跟踪模块概述2核心初始化入口module_init(nf_conntrack_standalone_init);2.1创建/proc/net/nf_conntrack只读文件nf_conntrack_standalone_init_proc()2.2 注册 /proc/sys/ 下相关文件3 核心初始化nf_conntrack_init()3.1 hash表大小计算、L3L4协议栈模块、helper模块初始化3.1.1L3L4协议栈模块初始化3.1.2...
转载
36阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之连接跟踪子系统核心实现nf_conntrack_in() / nf_conntrack_confirm() / 定时器

1连接跟踪入口nf_conntrack_in()数据包skb就是通过该函数进入连接跟踪子系统的,对于发送报文,从LOCAL_OUT点进入,对于接收报文,从PRE_ROUTING点进入。该函数的功能是实现对数据的连接跟踪,更新连接跟踪项的连接状态,目前就是根据五元组识别一条数据流。unsigned int nf_conntrack_in(int pf, unsigned int hooknum, struct sk_buff *skb){ struct nf_conn *ct; en...
转载
94阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之连接跟踪子系统AF_INET钩子函数

1连接跟踪子系统钩子函数概述如《linux内核协议栈 netfilter 之 ip 层的 hook 注册概述以及 hook 的调用场景》中的1.4小结所述,为了支持连接跟踪子系统,AF_INET协议族在4个HOOK点共注册了8个钩子函数,每个HOOK点有两个。这些钩子函数可分为入口(PRE_ROUTING和LOCAL_IN)和出口(LOCAL_OUT和POST_ROUTING)两大类。1.1数据包流向在分析之前,我们再次回顾一下数据包在连接跟踪模块中的走向。1.1.1 发往本地的数...
转载
43阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之连接跟踪子系统核心数据结构 struct nf_conn

1连接跟踪信息块struct nf_conn连接跟踪子系统中的每条“连接”就是用struct nf_conn表示,其定义如下:struct nf_conn { /* Usage count in here is 1 for hash table/destruct timer, 1 per skb, plus 1 for any connection(s) we are `master' for */ //连接信息块的引用计数,如注释所列,这些情况会增加引用计数 st..
转载
84阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之连接跟踪模块概述

连接跟踪(CONNTRACK)就是跟踪并且记录连接状态。包括TCP、UDP、ICMP等协议类型的连接。其主要是判断该数据包是什么状态。根据数据包的源ip地址、目的ip地址、源端口、目的端口、协议号来确定一条连接。因为连接跟踪支持TCP、UDP、ICMP等协议,而不同的协议,其处理上会有一些不同,因此增加了协议相关的连接跟踪结构,即nf_conntrack_protocol、nf_conntrack_l3proto,其中nf_conntrack_protocol是四层协议的连接跟踪相关的结构,这个...
转载
57阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之 ip 层的 filter 表注册及规则的添加以及钩子函数

目录1filter 表初始化iptable_filter_init()2filter表的注册iptable_filter_net_init()2.1ipt_register_table() 入参2.1.1static struct xt_table packet_filter2.1.2 struct ipt_replace repl2.1.3struct ipt_replace repl 初始化ipt_alloc_initial_table()2.2ipt_re...
转载
107阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之 ip 层的table、rule、match、target结构分析

在使用iptables过程中,经常会提到table、rule、match和target,这些在内核都有对应的数据结构(rule并没有对应结构体),在理解内核的逻辑代码之前,非常有必要先熟悉这些数据结构,以及内核到底是如何组织它们的,这里顺便分析ip层对于rule、match、target 的组织形式。目录1 struct xt_table1.1 struct xt_table_info2规则rule struct ipt_entry2.1 标准匹配 struct ipt_ip3规..
转载
97阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之 ip 层的 hook 注册概述以及 hook 的调用场景

1三层netfilterhook点的注册与注销我们知道使用iptables,添加规则时需要指定表,在iptables中有filter、nat、mangle三张表,因为我们接下来几节分析的内容也是从这三个table表加上连接跟踪,此处我们也已这四个模块来将,而不是按HOOK点的分类来分析1.1filter 表 hook 注册 struct nf_hook_ops ipt_opsFilter表主要在以下几个hook点上其作用:NF_IP_LOCAL_IN NF_IP_LOCAL_OUT...
转载
133阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 netfilter 之 hook 机制概述

1 netfilter介绍Linuxnetfilter就是借助一整套的hook函数的管理机制,实现数据包在三层以上的过滤、地址转换(SNAT、DNAT)、基于协议的连接跟踪。我们所说的内核的netfilter,应该包括二层数据的filter操作,以及对三层及三层以上数据的filter等操作。只不过二层的filter实现与三层及三层也上的filter实现有所不同。其中二层的filter与应用层程序ebtables结合使用,而三层及以上的filter结合iptables使用。但是二层filter与...
转载
137阅读
1评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4分片重组Ⅲ之分片回收和重组

这篇笔记来看看分片重组功能额外的一些实现细节,包括:IP分片队列的回收; 哈希表的重新散列;IP分片队列的回收首先,最正常的情况就是收到了所有的IP分片,然后将其组装成一个完整的IP报文,然后递交给上层。情况最差的,就是在规定的时间内没有收到全部的分片,这时需要有老化机制,使得之前缓存的片段能够被释放,否则对系统是一种负担。重组完成后的IP分片队列回收在ip_frag_reasm()中,并没有看到有对IP分片队列的明确回收操作,相关的两个动作如下:/* Build a new IP
转载
61阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4分片重组Ⅱ之 ip_defrag() 接口

Table of Contents1IP片段接收入口 ip_local_deliver()2 IP片段重组ip_defrag()2.1 查找IP分片队列 ip_find()2.1.1哈希查找分片队列 inet_frag_find()2.1.2新建IP分片队列inet_frag_create()2.2 重组IP报文 ip_frag_queue()2.2.1所有分片均已收到重组ip报文 ip_frag_reasm()1IP片段接收入口 ip_local_delive...
转载
112阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4分片重组Ⅰ之相关数据结构

目录1 IP分片重组控制信息数据结构1.1网络命名空间 struct netns_ipv41.2 IPv4分片哈希表struct inet_frags1.3 IP分片队列struct ipq [ inet_frag_queue]1.4 IPv4分片关系图2 IPv4分片初始化ipfrag_init2.1 ip4_frag_match()2.2 ip4_frag_init()1 IP分片重组控制信息数据结构1.1网络命名空间 struct netns_ipv4...
转载
72阅读
0评论
0点赞
发布博客于 4 月前

linux协议栈 IPv4之发送过程中的分段处理ip_fragment()

目录1 分片位置2 ip_fragment()代码分析1 分片位置分段是网络层的一个重要任务,网络层需要对两方面的IP数据包进行分段:本地产生的数据包; 转发的数据包;这两种数据包的长度如果超过了出口设备的MTU(或者PMTU),则网络层必须先对数据包进行分段,使其适配出口设备的MTU。IPv4使用 ip_fragment() 处理分段,在设计时,要求该函数能够处理所有的情况,但是在实现过程中,充分考虑了实际可能的情况,对某些场景的处理进行了优化,下面分情况介绍。对于本机发送
转载
65阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4之发送接口: ip_append_data() Ⅱ 【UDP使用】

目录1 ip_append_data 功能说明1.1关键点1.2 struct cork1.3 struct ipcm_cookie2 ip报文数据区构造ip_append_data()3 ip报文发送(构造 ip 首部) ip_push_pending_frames()4 清除发送队列 ip_flush_pending_frames()1 ip_append_data 功能说明1.1关键点该函数的设计目标是将要发送的数据按照便于IP协议分段的方式组织成一个个s...
转载
35阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4之发送接口: ip_append_data() Ⅰ 【UDP使用】

目录1 ip_append_data 函数功能概述2 skb数据组织策略2.1 情形12.2 情形22.3 情形31 ip_append_data 函数功能概述ip_append_data() 主要是由 udp 使用。因为 ip_append_data() 的实现非常的复杂,涉及 skb 对数据的组织方式,以及各种出于性能考虑的分配策略,所以在分析其代码实现之前,有必要先讨论下内核实际采取的数据组织方式。首先需要明确 ip_append_data() 要实现的功能:ip_
转载
20阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4之发送接口 ip_queue_xmi()【TCP使用】

ip_queue_xmi() 接口主要由tcp使用,主要就干了两件事:如果还没有查询过路由,那么查路由; 构造IP首部,然后调用IPv4协议内部的接口继续发送;注意:该函数并没有处理分段,所以调用者应该保证传入的 skb 不会超过设备的 MTU,而 tcp 在组包的时候有考虑尽量不会让IP层进行分段,所以 tcp 可以调用该接口,而 udp 的发送过程并没有这种保证,所以该接口并不合适 udp。int ip_queue_xmit(struct sk_buff *skb, int ipfrago
转载
24阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4之发送接口概述

目录前言1 上层协议发送接口1.1 ip_queue_xmit()1.2 ip_build_and_send_pkt()1.3 ip_send_reply()1.4 ip_append_data()1.5 ip_push_pending_frames()2IP层内部发送过程2.1 ip_local_out()2.2 已过 LOCAL_OUT 链 dst_output()2.2.1 ip_output()2.3 已过 POST_ROUTING 链 ip_fin.
转载
38阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IPv4之接收数据包流程

在IPv4之协议族初始化中有介绍,当设备接口层处理完输入数据包后,如果发现该报文应该由IP协议进一步处理,那么将会调用ip_rcv()函数。这篇笔记就从该函数入手,一直到将数据包递交给更高层协议为止,从宏观角度分析下数据包在IP层的传递过程。主要涉及如下文件:源代码路径 说明 net/ipv4/ip_input.c IP协议输入报文处理过程 net/ipv4/ip_forward.c IP协议转发报文处理过程 从设备接口层接收ip报文接收 ip_rcv()我们知道,
转载
58阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 IP地址数据结构

目录1 网络设备struct net_device2 IP配置块struct in_device2.1 IP地址struct in_ifaddr2.2 IP地址作用域2.3 系统配置 struct ipv4_devconf3 IP配置块的创建与销毁inetdev_init()/inetdev_destroy()4 源IP地址选择inet_select_addr()1 网络设备struct net_deviceIP地址是和主机相关的,但是在linux内核中,IP地...
转载
64阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP系统参数详解

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHE
转载
47阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 UDP之数据报接收过程Ⅱ

目录1系统调用 udp_recvmsg()1.1 从接收队列 sk_receive_queue 中获取skb1.1.1 获取队列头不删除 skb_peek()1.1.2 将 skb 从移除队列中 __skb_unlink()1.2 尝试释放skb内存 skb_free_datagram_locked()2 后备队列 sk_backlog 中的skb处理 release_sock()2.1 后备队列skb进入接收队列 sk_backlog_rcv()1系统调用 udp_re..
转载
68阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 UDP之数据报接收过程Ⅰ

1 UDP报文接收概述UDP数据报的接收要分两部分来看:网络层接收完数据包后递交给UDP后,UDP的处理过程。该过程UDP需要做的工作就是接收数据包并对其进行校验,校验成功后将其放入接收队列 sk_receive_queue 中等待用户空间程序来读取。 用户空间程序调用read()等系统调用读取已经放入接收队列 sk_receive_queue 中的数据。2从IP层接收数据包 udp_rcv()该函数是在AF_INET协议族初始化时,由UDP注册给网络层的回调函数,当网络层代码处理完...
转载
118阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 bind 系统调用(UDP)

目录1 UDP端口绑定概述2 UDP端口分配 udp_v4_get_port()2.1 判断端口是否可用udp_lib_lport_inuse()3端口的自动绑定inet_autobind1 UDP端口绑定概述UDP套接字的端口号绑定发生在三种场景:应用程序显示的调用bind()系统调用实现端口绑定,一般服务器端编程时会这么做; UDP套接字创建后,客户端使用connect()连接服务器; UDP套接字创建后是可以直接使用sendto()发送数据的,这种情况下会由kern..
转载
38阅读
0评论
1点赞
发布博客于 4 月前

linux内核协议栈 UDP之数据报发送过程

当应用程序调用send()等一系列系统调用向UDP套接字写数据时,最终都会调用到传输层的udp_sendmsg(),这篇笔记重点分析下UDP协议是如何将用户态数据封装成skb递交给IP层的。要点说明在分析代码之前,有必要对一些UDP的写操作过程中的一些关键点进行说明,否则会看的晕头转向。MSG_MORE标记UDP数据报不像TCP,它是有边界的,即发送端的一个UDP数据报会完整的被接收端以一个UDP数据报的方式接收。然而,并非一次写操作对应一个UDP数据报,应用程序可以通过MSG_MORE
转载
163阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP三次握手后客户端宕机

实验如下:客户端建链完成之后发一包数据进入睡眠 服务器收到一包数据后也进入睡眠 客户端执行正常重启和宕机操作(内核版本2.6.32)1、正常重启(reboot指令):客户端在下电前发送断链强求FIN包,服务器可以感知回复 ACK 报文,将状态切换为CLOSE_WAIT。[root@localhost wq]# netstat -anp | grep 10007tcp 0 0 10.228.90.12:10007 0.0.0.0:*
原创
57阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP连接探测中的Keepalive和心跳包使用

目录1TCP保活的必要性2导致TCP断连的因素3保活的两种方式3.1应用层面的心跳机制3.2TCP协议自带的保活功能4两种方式的优劣性5到底选用那种心跳方式?6 配置 Keep-alive6.1socket 进行单独设定keepalive(代码层面)6.2修改系统配置文件7 测试结果1TCP保活的必要性多防火墙等对于空闲socket自动关闭 对于非正常断开,服务器并不能检测到.为了回收资源,必须提供一种检测机制.2导致TCP...
转载
89阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP选项之SACK选项的接收 Ⅲ

Table of Contents1 检测是否存在DSACK2 检测SACK块是否有效这篇笔记记录了发送方在收到SACK信息后的处理过程中,对SACK信息块的检查,具体包括:判断第一个SACK块是否是DSACK; 检查SACK信息块(包括DSACK)是否合法。1 检测是否存在DSACKtcp_check_dsack()用于判断收到的第一个SACK块是否是DSACK,参数sp指向输入段携带的SACK选项信息,num_sacks表示输入段携带了几个SACK块。关于如何判定收到的SAC
转载
32阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP选项之SACK选项的接收Ⅱ

Table of Contents1 tcp_sacktag_skip()2tcp_sacktag_walk()2.1 tcp_match_skb_to_sack()2.2 tcp_sacktag_one()2.2.1 记分牌2.2.2 更新记分牌在《linux内核协议栈 TCP选项之SACK选项的接收Ⅰ》中有看到,对于每个SACK信息块,在和cache信息比较后,都会有两个核心操作来更新记分牌:tcp_sacktag_skip() tcp_sacktag_walk().
转载
34阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP选项之SACK选项的接收Ⅰ

Table of Contents1 接收方对SACK信息的处理tcp_sacktag_write_queue1.1 tcp_maybe_skipping_dsack()1.2tcp_highest_sack_seq()1 接收方对SACK信息的处理tcp_sacktag_write_queue收到ACK段后,首先会用tcp_paser_options()解析输入段携带的选项信息,在该函数中,如果包含了SACK信息,那么skb的控制块的sacked字段就记录了SACK信息距TCP首...
转载
43阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP选项之SACK选项的发送

目录1. 相关数据结构1.1 struct tcp_sock1.2 struct tcp_options_received2慢速路径数据接收tcp_data_queue()2.1 判断SACK是否使能tcp_is_sack2.2 DSACK 设置 tcp_dsack_set2.3 将SACK块加入到 selective_acks 数组3发送SACK选项tcp_transmit_skb()3.1 SACK片数计算 tcp_established_options()...
转载
41阅读
0评论
0点赞
发布博客于 4 月前

Linux安全审计 auditd 服务

目录1 audit 功能引入2 查看运行状态3 auditd的相关的工具4 监控规则添加 auditctl4.1 监控文件和目录的更改4.2查看已配置的规则5 查看审计日志 ausearch5.1 审计文件5.2 审计目录6 查看审计报告aureport6.1审计活动概述6.2 授权失败6.3 账户与修改相关事件1 audit 功能引入linux 系统中有着大量的配置文件,有些文件涉及和内核驱动的交互,一旦被异常修改会导致一些未知的错误,如...
原创
616阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP选项之SACK选项概述

目录1SACK概述1.1 SACK允许选项1.2 SACK选项2SACK允许选项的发送2.1 SYN段发送2.2 接收SYN段2.2.1 struct tcp_options_received2.2.2 tcp_parse_options()2.3 发送SYN+ACK段3D-SACK1SACK概述标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重...
转载
117阅读
0评论
0点赞
发布博客于 4 月前

linux协议栈 TCP定时器之超时重传定时器

每条TCP连接都会维护一个超时重传定时器,该定时器是TCP保证可靠性的一个非常重要的手段,一旦该定时器超时,那么就会重传还未收到ACK的报文。这篇笔记就来看看该定时器相关的代码实现。1. 相关数据结构struct inet_connection_sock {... //icsk_retransmit_timer的超时时刻,jiffies超过该值时定时器超时 unsigned long icsk_timeout; //超时重传定时器、持续定时器(还有其它) struct timer
转载
164阅读
0评论
0点赞
发布博客于 4 月前

/proc/sysrq-trigger 机制浅析

目录1 系统请求开关2 常用方法3 说明文档 sysrq.txt(linux-2.6.38)1 系统请求开关怎么打开和关闭SysRq组合键 ?为了安全起见,默认SysRq组合键是关闭的。 打开这个功能,运行:echo 1 > /proc/sys/kernel/sysrq关闭这个功能:echo 0 > /proc/sys/kernel/sysrq如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1。重新启动以后,
原创
88阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP拥塞控制之多算法支持

目录1数据结构tcp_congestion_ops2初始化tcp_cong_list2.1 常驻内存拥塞控制算法3基本操作3.1 算法的注册/注销tcp_register_congestion_control3.2 套接字指定拥塞控制算法tcp_set_congestion_control3.3 设置默认算法tcp_set_default_congestion_controlLinux内核是支持多种拥塞控制算法并存的,而且支持为不同的TCP流使用不同的拥塞控制...
转载
167阅读
3评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP数据接收之清除发送队列 + RTT采样

在ACK的确认过程中,需要做的非常重要的一件事就是将已经确认的数据从发送队列(以及重传队列)中删除,这是通过tcp_clean_rtx_queue()完成的。此外由于TCP在实现过程中,发送队列和重传队列都是sk_write_queue,所以这两个队列是一并处理的。这篇笔记就来看看发送队列的清除操作是如何实现的。1tcp_clean_rtx_queue()/* Remove acknowledged frames from the retransmission queue. If our pac.
转载
40阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP数据接收之慢速路径处理

目录1慢速路径执行tcp_rcv_established:slow_path2报文校验进队列 tcp_data_queue()1慢速路径执行tcp_rcv_established:slow_pathint tcp_rcv_established(struct sock *sk, struct sk_buff *skb, struct tcphdr *th, unsigned len){ struct tcp_sock *tp = tcp_sk(sk);...slo...
转载
66阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP数据接收之快速路径处理

目录1快慢路劲分流1.1 首部预测标记pred_flags1.1.1 首部预测标记的设定1.2__tcp_fast_path_on 调用1.2.1 客户端处理SYN+ACK报文 tcp_rcv_synsent_state_process1.3tcp_fast_path_on 调用1.3.1 服务器端收到SYN处理tcp_rcv_state_process1.4 tcp_fast_path_check 调用1.4.1tcp_recvmsg() 处理完紧急数据...
转载
87阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP数据接收入口

目录1接收的三个队列2接收入口 tcp_v4_rcv()2.1 添加到prequeue队列tcp_prequeue2.2 添加 backlog 队列sk_add_backlog2.3 receive队列处理tcp_v4_do_rcv1接收的三个队列IP层组合出一包数据后,如果数据包首部的协议字段表明上层协议为TCP,则调用TCP的tcp_v4_rcv()函数将数据传递给传输层继续处理,传输层的整体处理过程是非常复杂的,这篇笔记就先来看看传输层的入口处是如何处理的。...
转载
41阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP数据接收之ACK的处理

1、ACK响应概述在TCP输入数据段的处理过程中,如果发现输入段携带了ACK信息,则会调用tcp_ack()进行ACK相关的处理。实际中,ACK信息总是会携带的,因为携带ACK不需要任何的附加开销,所以对于输入的每一个段(除了RST【直接断链 】等特殊段),这个过程总是要执行的,这篇笔记就来看看TCP对ACK确认的处理过程。2ACK处理 tcp_ack()2.1 参数flagtcp_ack()有个非常重要的参数flag,其贯穿整个ACK的处理过程,它记录了从输入段中能够获取到的任何信息(..
转载
128阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP接收通告窗口

目录1 初始接收窗口tcp_select_initial_window2 服务端窗口初始值3 客户端窗口初始值4 TCP通告窗口值5 TCP窗口值通告6 窗口值的增长7 接收数据序号的窗口相关检查一些TCP协议栈将TCP头部16bit的窗口字段解释为有符号的整数,为了兼容这些系统,Linux内核定义了在没有窗口扩展系数选项的情况下,最大的窗口值为宏MAX_TCP_WINDOW,其为最大的16bit的有符号数。但是默认情况下,内核未开启此功能。PROC文件tcp_workar.
转载
90阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP数据发送之发送窗口

目录1发送窗口概述2snd_una 和 snd_wnd的更新2.1 发送窗口初始化2.1.1 客户端初始化2.1.2 服务器端初始化2.2 本地接收窗口 rcv_wnd 通告2.2.1 客户端发送2.2.2 服务器发送2.3传输过程中更新3发送窗口对发送过程的影响TCP的发送过程由滑动窗口控制,而滑动窗口的大小受限于发送窗口和拥塞窗口,拥塞窗口由拥塞控制算法的代表,而发送窗口是流量控制算法的代表,这篇笔记记录了发送窗口相关的内容,包括发送窗口的初始化、更新...
转载
121阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP选项之MSS

目录1MSS概述2客户端三次握手2.1 发送SYN段MSS选项值2.1.1 tcp_advertise_mss()2.1.2 tp->advmss的初始化2.2 接收SYN+ACK段3服务器端三次握手3.1 接收SYN段3.2 接收 ACK 报文3.2.1初始化 advmss3.3 发送SYN+ACK段4 三次握手小结5发送过程中获取MSS5.1 tcp_current_mss()5.2 tcp_sync_mss()5.2.1 ...
转载
165阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP层数据发送之TSO/GSO

TSO相关的内容充斥着TCP的整个发送过程,弄明白其机制对理解TCP的发送过程至关重要,这篇笔记就来看看TSO相关内容。1. 基本概念我们知道,网络设备一次能够传输的最大数据量就是MTU,即IP传递给网络设备的每一个数据包不能超过MTU个字节,IP层的分段和重组功能就是为了适配网络设备的MTU而存在的。从理论上来讲,TCP可以不关心MTU的限定,只需要按照自己的意愿随意的将数据包丢给IP,是否需要分段可以由IP透明的处理,但是由于分片会带来效率和性能上的损失,所以TCP在实现时总是会基于MTU设定自
转载
95阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP层数据发送系统调用 tcp_sendmsg

Table of Contents1发送队列2tcp_sendmsg()2.1数据内存分配大小 select_size()2.2数据推送接口 tcp_push / tcp_push_oneTCP协议发送相关的系统调用接口由很多,例如 send()、sendto()、sendmsg()和sendmmsg()。但是到了TCP协议层,都统一由内核的 tcp_sendmsg() 处理。1发送队列在看tcp_sendmsg()代码之前,有必要先看下发送队列的组织和使用方式。注:要...
转载
89阅读
0评论
0点赞
发布博客于 4 月前

linux内核协议栈 TCP层数据发送之发送新数

在上一篇笔记TCP数据发送之tcp_sendmsg()中介绍了TCP发送相关系统调用的内核核心处理函数tcp_sendmsg(),可以看出该函数做的核心工作就是将待发送的数据组织成一个个的skb,并且将这些skb按照先后顺序放入到发送队列sk_write_queue中。并且该函数也会尝试调用tcp_push()(以及其它两个接口)进行一次新数据发送。此外,在收到确认后,TCP会调用tcp_data_snd_check()检查是否可以发送数据,这里也会有机会发送新数据。这篇笔记记录了这些新数据发送过程
转载
104阅读
0评论
0点赞
发布博客于 4 月前

bash shell 获取当前正在执行脚本的绝对路径

如题,一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无论脚本在什么目录执行,都应该起到相同的效果,但是有些时候,我们设计一个软件包中的工具脚本,可能使用相对路径更加灵活一点,因为你不知道用户会在哪个目录执行你的程序,就有了本文的题目。常见的一种误区,是使用pwd命令,该命令的作用是“print name of current/working directory”,这才是此命令的真实含义,当前的工作目录,这里没有任何意思说明,这个目录就是脚本存放的目录。所以,这是不对的。你可以试试bash...
转载
169阅读
0评论
0点赞
发布博客于 5 月前