
个人笔记
文章平均质量分 83
TCH_world
记录职业生涯的点滴
展开
-
数据分片和分段
无原创 2022-06-12 21:40:28 · 1688 阅读 · 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连接跟踪主要数据结构
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之链接跟踪做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 评论 -
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 评论 -
TCP层接受发送数据接口关系
tcp接受发送数据接口关系原创 2018-12-06 00:21:09 · 436 阅读 · 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流量控制
TCP协议是可靠的协议,流量控制是考虑到接受端的限制,比如接受方缓冲区只有6000字节,那么发送端不能发送超过6000字节的报文,流量控制是接受端根据自身的情况而约束发送端的发送报文的速度和大小,流量控制使用的一个滑动窗口(rwnd),当TCP协议建立后接受端回复ACK报文中附加有滑动窗口,那么发送端不能发送超过滑动窗口的报文,当窗口大小为0时就表示接受端拒绝接受数据,发送端应该停止发送数据包。...原创 2018-12-15 23:58:21 · 1150 阅读 · 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 评论 -
TCP拥塞控制
前一节分析了TCP流量控制,流量控制是接收端根据自身的自由限制(缓冲区大小、CPU处理性能)控制发送端端的数据包速率和大小,是点到点的通信质量控制。而拥塞控制是防止过多的数据包注入网络造成网络通信的阻塞,涉及网络中的交换机、路由器等资源的限制,所以拥塞控制是一个全局的过程,涉及整个网络的状况。拥塞控制主要冲三个方面介绍:慢启动、快速重传、快速恢复。1、慢启动/拥塞避免算法TCP的拥塞控制的...原创 2018-12-16 13:59:37 · 933 阅读 · 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 评论 -
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 评论 -
netfilter之nat初始化
nat功能是我们使用非常广泛,包括SNAT、DNAT,很多功能是基于NAT实现。(1)SNATSNAT简称源地址转换,比如一个公司只有一个共有IP,公司下面有许多私有设备,私有设备都分配了私有地址,私有地址不能在互联网中传递,那么就要做源地址转换,私有设备要访问互联网就会把源地址转换为公司的共有IP,通过这个共有IP访问互联网。(2)DNATDNAT简称目的地址转换,也就是把目的地...原创 2018-12-11 22:32:14 · 696 阅读 · 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 评论 -
dpdk框架介绍
1、传统网络架构 传统的网络设备(交换机、路由器等)为了快速处理数据包而嵌入了NP处理器(Network Process),内置硬件电路实现高速转发数据包。随着云计算的发展以CPU为核心、操作系统是linux,网络设备都是虚拟化,没有NP处理器。云计算需要高速的处理数据包的要求。传统的网络架构处理流程如下:传统网络框架处理流程传统网络框架处理流程中没有控制层面和数据层面之分,大部...原创 2018-12-16 17:33:09 · 3520 阅读 · 2 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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_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 评论 -
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 评论 -
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协议和套接字、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 评论 -
TCP的Slow Path处理
TCP的Slow Path处是常规输入数据包的处理方式,根据套接字的状态来确定数据包的处理方式,在Slow Path处理方式中当套接字接受缓冲区已经满就不在接受新的Socket Buffer或当套接字忙(被其他进程锁住)时就将收到的数据包放入套接字阻塞等待队列backlog queue中,将数据包加入backlog queue队列的条件(1)、输入的数据包包含数据段,不是ACK段。(2)、...原创 2018-11-29 23:44:07 · 825 阅读 · 0 评论 -
TCP协议Fast Path
1、Fast PathLinux TCP/IP协议栈中,TCP曾有两条路径处理输入数据包:"Fast Path"、"Slow Path",Fast Path是内核优化TCP处理输入数据包方式,他是根据协议头来预定数据包的去向,Fast Path处理的条件是:(1)、收到的数据段中包含的是数据,不是ACK。(2)、数据段是顺序传送数据中的一个完整数据段,接受顺序正确。(3)、收到数据...原创 2018-11-29 22:46:44 · 2529 阅读 · 0 评论 -
TCP协议发送函数tcp_sendmsg
TCP协议发送过程的数据包来源有两种,第一是应用层产生的数据包需要复制到内核接受缓冲区由tcp_sendmsg函数完成,第二是TCP连接管理TCP协议层自己阐述的数据、数据包重传数据包,由函数tcp_transmit_skb完成。首先介绍tcp_sendmsg函数,tcp_sendmsg函数主要做了三件事情:(1)、将数据包复制到Socket Buffer中。(2)、把Socket BUf...原创 2018-12-02 15:39:09 · 2374 阅读 · 0 评论 -
TCP协议简介
1、TCP重传机制TCP协议是传输层可靠的传输协议,TCP可以保证数据包能完整准确地、按照正确的序列在网络上传送到目的地址,TCP通信前两端首先要建立连接,然后才能传输数据,TCP协议使用肯定回答和重传(PAR:Poisitive Acknowledgment with Re-transmission)机制来提供可靠数据传送功能。重传两个方面,一方面使用TCP协议传送数据后要等待接受方的回答信...原创 2018-11-25 12:27:12 · 455 阅读 · 0 评论 -
TCP协议接受IP层数据包过程
IP层函数ip_local_deliver函数处理对数据包处理接受后根据iphdr->protocol数据域中协议号在inet_protocol全局变量中查找传输层的接受函数,TCP协议的接受函数是tcp_v4_rcv,tcp_v4_rcv函数的功能主要包含两个方面:(1)、数据包合法性检查(2)、确定数据包是快速路径处理还是慢速路径处理下面分析tcp_v4_rcv函数的处理分析...原创 2018-11-28 23:31:42 · 734 阅读 · 0 评论 -
TCP协议关键数据结构
1、TCP协议头数据结构TCP协议头数据结构是struct tcphdr,定义在include/linux/tcp.h中,主要包含源端口、目的端口、协议长度、控制标志flags....struct tcphdr { __be16 source; //源端口 __be16 dest; //目的端口 __be32 seq; //数据段的起始序列号 __be32 ack_se...原创 2018-11-26 00:00:09 · 3540 阅读 · 0 评论