
协议栈
文章平均质量分 59
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 评论 -
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 评论 -
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 评论 -
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 评论 -
netfilter之nat代码分析
nat主要在PRE_ROUTING、OUTING、LOCAL_IN、POST_ROUTING四个链上注册了hook函数,PRE_ROUTING、OUTING这个两个链上做DNAT,LOCAL_IN和POST_ROUTING链上做SNAT。nat表没有LOCAL_IN链,但在LOCAL_IN上注册了钩子函数nf_nat_fn,主要作用是修改数据包的源端口。static struct nf_ho...原创 2018-12-12 23:53:52 · 1412 阅读 · 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 评论 -
TCP层接受发送数据接口关系
tcp接受发送数据接口关系原创 2018-12-06 00:21:09 · 436 阅读 · 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 评论 -
netfilter连接跟踪初始化
连接跟踪的初始化主要有三个地方(1)连接跟踪本身初始化。(3)在对应的Hook上注册连接跟踪的处理函数。(4)初始化连接跟踪和三层协议、四层协议相关的函数。1、连接跟踪本身初始化连接跟踪本身初始化函数是nf_conntrack_net_init主要做两件事情:为连接跟踪分配slab缓冲、初始化后proc文件系统1.1、nf_conntrack_net_initnf_co...原创 2018-12-09 17:18:21 · 560 阅读 · 0 评论 -
netfilter链接跟踪实现之nf_conntrack_in函数
1、数据包方向要分析连接链接跟踪的实现我们就要先分析数据包在协议栈中的方向,总的来说主要分为三个方向:本机转发的数据包、本机接受的数据包、本机产生的数据包,我们之前分析了连接跟踪只在四个链上注册了钩子函数,分别是PRE_ROUTING链、OUT链、LOCAL_IN链、POST_ROUTING链。PRE_ROUTING链上注册的是ipv4_conntrack_in,OUT链上注册的是ipv4_c...原创 2018-12-10 00:02:52 · 3366 阅读 · 0 评论 -
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/85254786目录1、netif_receive_skb2、handle_bridge3、br_handle_frame4、br_handle_frame_finish5、br_forward6、br_flood_forw...原创 2018-12-25 22:02:04 · 2093 阅读 · 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 评论 -
TCP协议套接字层接受函数tcp_recvmsg
当用户进程通过信号得知打开的的套接字上有数据等待接受时,用户进程会调用receive或read系统调用读取套接字缓冲区上的数据,实际是调用tcp_recvmsg函数将数据包从内核地址空间复制到用户考地址空间。1、三个队列在介绍tcp_recvmsg函数之前先了解TCP协议存放数据包的三个队列:(1)sock数据结构中的sk_backlog队列简称backlog队列,在前面讲TCP协...原创 2018-12-01 13:14:03 · 1809 阅读 · 0 评论 -
TCP协议ESTABLISHED状态处理
TCP协议是可靠的、快速传递数据的协议,当套接字状态是ESTABLISHED状态表明两端已经建立连接,可以互相传送数据了,tcp_v4_do_rcv接受到数据后首先检查套接字状态,如果是ESTABLISHED就交给tcp_rcv_established函数处理具体数据接受过程。如果是LISTEN就由tcp_v4_hnd_req处理,如果是其他状态就由tcp_rcv_state+process处理,...原创 2018-12-05 00:02:06 · 18799 阅读 · 0 评论 -
tcp_v4_connect函数
tcp_v4_connect函数初始化一个对外的连接请求,创建一个SYN包并发送出去,把套接字的状态从CLOSE切换到SYN_SENT,初始化TCP部分选项数据包序列号、窗口大小、MSS、套接字传送超时等,下面分析tcp_v4_connect函数。 1、初始化工作输入参数sk:套接字指针。uaddr:对端ip和端口。addr_len:套接字地址长度。检查目的IP长度、协...原创 2018-12-02 23:52:22 · 1751 阅读 · 1 评论 -
udp协议连接函数ip4_datagram_connect
udp协议是无连接函数,但也支持系统调用connect函数,调用connect的目的是建立到达目的地址的路由,并把路由保存到路由高速缓冲区中,接下来发送数据包时就可以使用路由高速缓冲区的信息,应用层表现为可以调用send函数发包而不要指定目的地址。应用层调用connect函数时套接字层是调用了ip4_datagram_connect函数。接下来是ip4_datagram_connet函数分析1...原创 2018-11-21 22:16:43 · 839 阅读 · 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是无连接的协议说明udp的开销小、数据包传输效率高,如果传输的数据小,创建连接的开销、保证数据包可靠发送需要做的工作比数据本身还有多,那么udp是一种好的选择。udp协议头包含有四部分:(1)、源端口:16位表示取值范围是1-65535。(2)、目的端口:也是16位。(...原创 2018-11-20 23:26:23 · 10708 阅读 · 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_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 评论 -
ip_append_data函数
ip_append_data函数是传输层调用缓冲要发送的数据包,主要调用协议数据包有UDP数据包、TCP管理报文。当数据包缓冲到一定大小(PMTU)就调用ip_push_pending_frames函数将数据包发送给IP层,这样可以提高效率,由ip_push_pending_frames维护IP协议头。如果传输层要提高响应时间,可以在每次调用ip_append_data函数后立即调用ip_push...原创 2018-11-18 17:47:53 · 1066 阅读 · 0 评论 -
IP层笔记
一、网络层的任务 数据包进入网络层后主要做以下几个处理,无论是接受数据包还是发送数据包。1、数据包校验和检查 数据包如有错误就会被丢掉,错误包括检验和不正确、协议头草除了边界等等。2、防火墙对数据包做过滤 网络防火墙就是大名鼎鼎的netfiler框架,比如我们应用层通过iptable命令配置的规则,获取我们写的内核模块也就是在netfilter中加入钩子函数,防火墙主要有四个...原创 2018-11-11 16:45:33 · 789 阅读 · 0 评论 -
网卡驱动笔记
网卡主要有两个功能1、发送数据包、2接受数据包。1、发送数据包数据包的发送主要分为两个阶段(1)应用层将数据包发送到cpu缓冲区,产生中断cpu发送一条命令通知网卡有数据包需要发送,然后高速网卡什么时候发送数据包、数据包的长度有多大需要分配多大的缓冲区大小,然后cpu将数据包写入到网卡的缓冲区。第二阶段(2)网卡将缓冲区中的数据包格式转换为以太网的数据包格式,发往网络介质上,首先发送pre...原创 2018-11-10 10:12:00 · 355 阅读 · 0 评论 -
e1000网卡驱动小结
1、网卡的初始化 e1000网卡的初始化调用函数e1000_probe(),网卡作为一种PCI设备就要初始化PCI设备的一些属性,设置DMA,初始化驱动的操作函数(收包函数、发包函数)、设置循环队列缓冲区大小,把网卡注册到dev_base全局数组中。网卡的收包方式有三种(1)中断方式: 传统的网卡都采用这种模式,因为传统的网卡收包量不是很大,这种方式就是当有一个数据包来了...原创 2018-09-09 22:36:29 · 4661 阅读 · 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协议接受数据流程
当数据达到网络层时,根据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 评论 -
TCP发送函数tcp_transmit_skb
上一篇介绍了TCP协议层和套接字层的接口tcp_sendmsg函数是将用户地址空间数据复制到内核地址空间,接下来的工作是交给tcp_transmit_skb函数向IP层发送数据包,tcp_transmit_skb发送的数据包有(1)重传数据包tcp_retransmit_skb。(2)探测路由最大传送单元数据包。(3)发送复位连接数据包(4)发送连接请求数据包(5)发送回答AC...原创 2018-12-02 18:07:32 · 2443 阅读 · 0 评论 -
TCP协议和套接字、IP层之间的接口
1、TCP和套接字层之间的接口TCP和套接字之间的接口数据结构是struct proto,这个结构体的元素是一系列的函数指针,从tcp_close到tcp_shutdown函数是tcp连接管理处理函数。TCP数据接受函数是tcp_recvmsg和tcp_v4_do_rcv函数实现。struct proto_tcp_prot定义如下:struct proto tcp_prot = { ....原创 2018-11-27 00:00:09 · 944 阅读 · 0 评论