
网络
文章平均质量分 62
TCH_world
记录职业生涯的点滴
展开
-
linux硬件中断处理流程3----NAPI
linux硬件中断处理流程3----NAPI原创 2022-07-04 22:52:43 · 1010 阅读 · 1 评论 -
linux硬件中断处理流程1
网络设备硬件中断原创 2022-07-03 15:32:10 · 1718 阅读 · 0 评论 -
linux硬件中断处理流程2----netif_rx
硬件中断处理函数netif_rx原创 2022-07-03 22:58:16 · 1882 阅读 · 0 评论 -
skb_buff协议头指针操作函数
sk_buff协议头指针操作函数原创 2022-06-13 22:40:43 · 3531 阅读 · 0 评论 -
数据分片和分段
无原创 2022-06-12 21:40:28 · 1688 阅读 · 0 评论 -
struct sk_buff数据空间预留和对齐
五原创 2022-06-11 13:45:09 · 1334 阅读 · 0 评论 -
linux数据包ip层转发流程
基于内核2.6.29原创 2022-05-29 21:17:39 · 713 阅读 · 0 评论 -
linux路由选择流程
linux路由确认原创 2022-05-29 19:59:59 · 885 阅读 · 0 评论 -
struct net_device的promiscuity域
struct net_device的promiscuity域表示混杂模式的计数器。默写网络管理任务要求网络设备接收所有经过网格设备的数据包,而不仅仅是目的地址与该网络设备匹配的数据包,这种工作模式称为混杂模式。 这种模式可以用于局域网段上检查网络性能或安全性,台也用于 桥接器代码中。promiscuity用于指明当前网络设备是否处于混杂模式。之所以使用计数器而不是用一个标志变量来表明混杂模式,是因为某一时刻可以有多个任务需要使用混杂模式,每个任务在进入该模式时,对promiscuity计...原创 2021-04-12 23:39:37 · 236 阅读 · 0 评论 -
Sockert Buffer的复制
和克隆不同,当多个进程对同一个Socket Buffer的操作既要修改sk_buff数据结构中的内容,也要修改数据包内容时,必须对Socket Buffer进行复制,这是可以有两个选择:1、如果既要修改主数据包中的内容,又要操作分片数据段中的值,函数struct sk_buff *skb_copy(struct sk_buff *skb)可以完成该功能。2、如果只修改主数据包中的内容,而不需要读/写分片数据段中的值,可以使用函数struct sk_buff *pskb_copy(struct sk_原创 2021-03-25 23:32:54 · 225 阅读 · 0 评论 -
Socker Buffer的克隆
在什么时候需要对Socket Buffer进行克隆,某些时候,同一个Socket Buffer会由不同的进程进行独立处理,但这些进程所需要操作的只是sk_buff数据结构描述符,不需要对数据包本身做改动。这是为了提高处理性能,内核不需要对整个Socket Buffer(sk_buff数据结构和数据包缓冲区)做完全懂得复制,只对sk_buff数据结构做完全的复制,并对数据包的引用计数加1,以此防止在还有进程使用该Socket Buffer的数据包情况下,缓冲区被释放。这就是sk_buff克隆函数的功能。这是原原创 2021-03-24 23:36:07 · 301 阅读 · 0 评论 -
suricata应用层协议解析
suricata应用层协议解析1. 协议注册应用层协议保存在全局变量static AppLayerParserCtx alp_ctx;typedef struct AppLayerParserCtx_ {AppLayerParserProtoCtx ctxs[FLOW_PROTO_M...原创 2020-02-14 15:09:56 · 3790 阅读 · 1 评论 -
suricata初始化流程
suricata初始化流程1、简介suricata是一款高性能的IDS、IPS和网络安全监测引擎。采用多线程模式,利用多核...原创 2020-02-14 12:13:05 · 687 阅读 · 0 评论 -
TCP流量控制
TCP协议是可靠的协议,流量控制是考虑到接受端的限制,比如接受方缓冲区只有6000字节,那么发送端不能发送超过6000字节的报文,流量控制是接受端根据自身的情况而约束发送端的发送报文的速度和大小,流量控制使用的一个滑动窗口(rwnd),当TCP协议建立后接受端回复ACK报文中附加有滑动窗口,那么发送端不能发送超过滑动窗口的报文,当窗口大小为0时就表示接受端拒绝接受数据,发送端应该停止发送数据包。...原创 2018-12-15 23:58:21 · 1150 阅读 · 0 评论 -
netfilter连接跟踪主要数据结构
linux协议栈中netfiler框架对数据包做过滤处理基本上都是基于连接跟踪来做的,比如snat、dnat等,连接跟踪就是记录数据流在协议栈中的两个方向,不同的协议有不同的特征,tcp/udp就是五元组(源ip、目的Ip、源端口、目的端口、协议号),icmp协议就是ip、id、type、code。1、struct nf_connstruct nf_conn结构体是连接跟踪的抽象结构,其中...原创 2018-12-09 16:19:22 · 1271 阅读 · 0 评论 -
TCP拥塞控制
前一节分析了TCP流量控制,流量控制是接收端根据自身的自由限制(缓冲区大小、CPU处理性能)控制发送端端的数据包速率和大小,是点到点的通信质量控制。而拥塞控制是防止过多的数据包注入网络造成网络通信的阻塞,涉及网络中的交换机、路由器等资源的限制,所以拥塞控制是一个全局的过程,涉及整个网络的状况。拥塞控制主要冲三个方面介绍:慢启动、快速重传、快速恢复。1、慢启动/拥塞避免算法TCP的拥塞控制的...原创 2018-12-16 13:59:37 · 933 阅读 · 0 评论 -
TCP协议time_wait
因为TCP连接是双向的所以只有两个放行的连接都关闭了这个连接才算终止,首先A主机发送控制信息FIN包给B主机关闭A主机到B主机放行的连接,然后B主机回复ACK包这时A主机到B主机放行的连接关闭,A主机不能向B主机发送数据,但B主机可以向A发送数据,因为B主机到A主机方向的连接没有关闭。接下来B主机向A主机发送FIN包请求关闭B主机到A主机方向的连接,当A主机回复ACK后完成TCP四次挥手,这时还有...原创 2018-12-16 15:51:37 · 270 阅读 · 0 评论 -
dpdk编译问题
今天下载dpdk源码编译报一个错误如下,找到很久发现是没有安装这个库libpcap0.8-dev,我的虚拟机是ubuntu所以运行这个apt-get install libpcap0.8-dev安装libpcap0.0-devPcap.h no such file and directory ...原创 2018-12-16 15:57:30 · 1069 阅读 · 0 评论 -
dpdk框架介绍
1、传统网络架构 传统的网络设备(交换机、路由器等)为了快速处理数据包而嵌入了NP处理器(Network Process),内置硬件电路实现高速转发数据包。随着云计算的发展以CPU为核心、操作系统是linux,网络设备都是虚拟化,没有NP处理器。云计算需要高速的处理数据包的要求。传统的网络架构处理流程如下:传统网络框架处理流程传统网络框架处理流程中没有控制层面和数据层面之分,大部...原创 2018-12-16 17:33:09 · 3520 阅读 · 2 评论 -
netfilter链接跟踪实现之ipv4_confirm函数
ipv4_confirm函数注册在LOCAL_IN链、POST_ROUTING链,这个是netfiler的两个出口,从函数名字看得出函数的功能是链接跟踪确认,下面来分析这个函数。static struct nf_hook_ops ipv4_conntrack_ops[] __read_mostly = {... { /*数据包最后出去在POSTROUTING链上连接跟踪确认*/ ...原创 2018-12-11 20:51:11 · 1412 阅读 · 0 评论 -
netfilter之nat初始化
nat功能是我们使用非常广泛,包括SNAT、DNAT,很多功能是基于NAT实现。(1)SNATSNAT简称源地址转换,比如一个公司只有一个共有IP,公司下面有许多私有设备,私有设备都分配了私有地址,私有地址不能在互联网中传递,那么就要做源地址转换,私有设备要访问互联网就会把源地址转换为公司的共有IP,通过这个共有IP访问互联网。(2)DNATDNAT简称目的地址转换,也就是把目的地...原创 2018-12-11 22:32:14 · 696 阅读 · 0 评论 -
linux网桥--简介
版权声明:如有需要,可供转载,但请注明出处:https://blog.youkuaiyun.com/City_of_skey/article/details/85240141目录 1、网桥简介 2、网桥初始化2.1 struct net_bridge2.2 struct net_bridge_port2.3 struct net_bridge_fdb_entry2.4 br...原创 2018-12-24 22:56:44 · 5440 阅读 · 1 评论 -
IPsec协议过程
版权声明:如有需要,可供转载,但请注明出处:https://blog.youkuaiyun.com/City_of_skey/article/details/866187841、ipsec协议简介IPSec是在网络层构建的安全虚拟专有网络,通过在数据包中插入一些预定义的头部,实现对网络层以上的协议数据安全。不同于ssl应用层的加密。IPSec内核加密支持的库是xfrm。ipsec安全体系...原创 2019-01-23 23:04:34 · 18972 阅读 · 0 评论 -
IPsec相关数据结构1
版权声明:如有需要,可供转载,但请注明出处:https://blog.youkuaiyun.com/City_of_skey/article/details/86562770目录1、简介2、xfrm_state3、xfrm_policy4、xfrm_tmpl 1、简介ipsec对数据加密是在内核IP层实现的,通过PF_INET类型套接字和应用层通信文件在/net/key目录下,安全...原创 2019-01-20 15:50:56 · 648 阅读 · 0 评论 -
IPsec协议相关结构2
版权声明:如有需要,可供转载,但请注明出处:https://blog.youkuaiyun.com/City_of_skey/article/details/86563402目录1、xfrm_type2、xfrm_mode3、xfrm_policy_afinfo4、xfrm_state_afinfo5、xfrm_mgr1、xfrm_typeah、esp、ipcomp协议的通过s...原创 2019-01-20 16:50:30 · 701 阅读 · 0 评论 -
IPsec初始化
版权声明:如有需要,可供转载,但请注明出处:https://blog.youkuaiyun.com/City_of_skey/article/details/86586382目录1、简介2、状态初始化3、策略初始化4、输入初始化1、简介IPsec的初始化主要包括三部分:状态初始化、策略初始化、输入初始化。初始化函数是xfrm_initvoid __init xfrm_init...原创 2019-01-21 23:24:57 · 630 阅读 · 0 评论 -
udp协议基本数据包结构
udp是不可靠、无连接的协议,不可靠是指不能检查到数据包是否安全到达对端,但应用程序可以做保证数据包到达的机制,udp是无连接的协议说明udp的开销小、数据包传输效率高,如果传输的数据小,创建连接的开销、保证数据包可靠发送需要做的工作比数据本身还有多,那么udp是一种好的选择。udp协议头包含有四部分:(1)、源端口:16位表示取值范围是1-65535。(2)、目的端口:也是16位。(...原创 2018-11-20 23:26:23 · 10708 阅读 · 0 评论 -
netfilter之链接跟踪做nat
上一节我们将了NAT是基于链接跟踪实现的,当一条链接跟踪建立要改变它的tuple的reply方向才能做nat,这个链接跟踪的nat是函数nf_nat_setup_info实现1、nf_nat_setup_infonf_nat_setup_info对链接跟踪的做NAT,只会改变链接跟踪reply方向的ip、端口,不会改变数据包的ip、端口,数据包的DAT在上一节已经介绍了是在PRE_ROUT...原创 2018-12-14 00:01:02 · 1289 阅读 · 0 评论 -
TCP状态机图
TCP状态机图1、TIME_WAIT如上图tcp状态机的切换过程,其他的都好理解,这里只介绍以下TIME_WAIT,TIME_WAIT出现在主动发送FIN端,TCP是双向的、可靠的传输层协议,关闭一个TCP连接需要关闭两端,也就是TCP的四次挥手,当主机A发送最后一个ACK后就进入TIME_WAIT,这个时间大概是2min,这是一个数据包在网络中传输的大概时间,应为TCP是可靠的协议,为...原创 2018-12-06 21:03:32 · 1085 阅读 · 0 评论 -
TCP连接状态管理
TCP协议连接初始化后的状态管理和切换由tcp_rcv_sate_preocess函数完成,tcp_v4_recevie函数收到数据包后查看TCP协议头,区分是只含纯传送负载数据还是包含控制信息SYN、FIN、RST、ACK等的数据包。各种状态的数据包处理过程大部分在tcp_rcv_state_process函数中完成,除ESTABLISHE和TIME_WAIT这两个状态外。数据包到达后如果是CL...原创 2018-12-03 23:53:07 · 1309 阅读 · 0 评论 -
ip层本机接受数据包处理
当数据包的目的地址是本机是,Ip_rcv_finish函数就会将skb->dst->input函数指针初始化为ip_local_deliver,ip层本地发送数据包也分为两个阶段分配分别有两个处理函数:ip_local_deliver和ip_local_deliver_finish。本地转发数据包的首要任务是重组数据包,前送的数据包可以不要重组,前送可以转发每个分片数据包。一、本地...原创 2018-11-17 10:54:22 · 632 阅读 · 0 评论 -
UDP协议接受数据流程
当数据达到网络层时,根据IP协议头中的protocol数据域协议码在全局哈希表inet_protos[MAX_INET_PROTOS]中寻找传输层的收包函数,前面介绍UDP基本数据结构时说了了UDP和网络层的接口数据结构,AF_INET协议族初始化函数inet_init中调用inet_add_protoc函数把UDP协议的实例struct net_protocol udp_protocol注册到哈...原创 2018-11-23 23:46:49 · 2038 阅读 · 0 评论 -
IP层笔记
一、网络层的任务 数据包进入网络层后主要做以下几个处理,无论是接受数据包还是发送数据包。1、数据包校验和检查 数据包如有错误就会被丢掉,错误包括检验和不正确、协议头草除了边界等等。2、防火墙对数据包做过滤 网络防火墙就是大名鼎鼎的netfiler框架,比如我们应用层通过iptable命令配置的规则,获取我们写的内核模块也就是在netfilter中加入钩子函数,防火墙主要有四个...原创 2018-11-11 16:45:33 · 789 阅读 · 0 评论 -
数据包前送
一、ip_forward函数ip_rcv_finish处理结束后,如果数据包的目标地址不是本机,内核就要前送数据包,如果是数据包的目标地址是本机就上传TCP/IP协议栈,处理函数由dst_input完成,根据路由选项将处理函数设置为ip_forward或则ip_local_deliver。ip_forward是数据包前送处理函数,ip_local_deliver是本地接受处理函数。数据包的...原创 2018-11-16 23:49:29 · 811 阅读 · 0 评论 -
UDP发送数据包流程
UDP发送数据包的函数是udp_sendmsg,完成从用户地址空间接受数据包然后赋值到内核空间。udp_sendmsg函数主输入参数有四个:(1)、kiocb:为了提高对用户地址空间操作效率的数据结构体。(2)、sk:打开的套接字数据结构,包含了套接字的所有设置信息和选项。(3)、msg:存放管理用户地址空间的数据结构。(4)、len:从用户空间接受的数据包长度。int ud...原创 2018-11-21 23:58:00 · 5008 阅读 · 0 评论 -
udp协议连接函数ip4_datagram_connect
udp协议是无连接函数,但也支持系统调用connect函数,调用connect的目的是建立到达目的地址的路由,并把路由保存到路由高速缓冲区中,接下来发送数据包时就可以使用路由高速缓冲区的信息,应用层表现为可以调用send函数发包而不要指定目的地址。应用层调用connect函数时套接字层是调用了ip4_datagram_connect函数。接下来是ip4_datagram_connet函数分析1...原创 2018-11-21 22:16:43 · 839 阅读 · 0 评论 -
网络层数据包接受/发送API
网络层的数据包主要有三个流向:本机接受数据、前送数据包、本机产生数据包,其中数据包的流向要经过Netfiler的5个链子上的钩子函数处理,5个链子分别是:NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING,处理流程已经API的关系如下图:网络层数据包接受/发送的A...原创 2018-11-20 22:05:59 · 718 阅读 · 0 评论 -
ip_rcv_finish
上一章我们分析了ip_rcv,这个函数主要是对数据包做各种正确性验证,然后调用掉网络过滤子系统的在PRE_ROUTEING链上的回调函数,经过网络子系统的处理在调用ip_rec_finish,ip_rcv_finish主要的工作:1)、确定数据包是前送还是在本机协议栈上传,如果是前送要确保输出网络设备和下一个接受栈的地址。2)、解析和处理部分IP选项。 1、获取路由信息skb-...原创 2018-11-15 00:14:10 · 1174 阅读 · 0 评论 -
ip_push_pending_frames函数
当调用ip_append_data和ip_append_page把传输层数据包复制到内核缓冲区,接下来调用ip_push_pending_frames函数发送数据包。struct sock *sk是ip_push_pending_frames函数唯一的输入参数,sk中包含了指向缓冲区队列sk_write_queue数据结构的指针。1、取发送缓冲区ip_push_pending_fra...原创 2018-11-19 00:03:25 · 899 阅读 · 0 评论 -
ip_append_page函数
当应用层调用sendmsg将数据包从用户空间地址移动到内核空间地址,这个复制是ip_append_data函数的输入参数getfrag函数完成。内核还为应用层提供了sendfile接口,它优化数据包的发送复制,这个接口称为零拷贝。sendfile接口只有当网络设备支持Scatter/Gather I/O功能才能使用,这时的ip_append_page不需要复制任何数据,内核只需要将frags数组初...原创 2018-11-18 23:23:16 · 532 阅读 · 0 评论