自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 防踩坑!C语言内存管理

对于一个程序员来说,内存的使用对程序的效率和稳定性有着至关重要的作用。C语言对内存使用、管理几乎没有任何限制,这赋予了我们高效管理内存能力的同时也引入了很多内存管理方面的风险。C语言内存管理的灵活性体现可以使用很多极端场景,其他具有GC的高级语言可能无法适用。例如 - 程序对性能特别敏感,不允许GC回收内存时的停顿。 - 程序运行于嵌入式设备内存资源匮乏,及时的内存释放对嵌入式设备是非常重要的。本文会罗列一下开发中经常用到的一些技巧,以减少因为内存使用不当造成bug的情况。

2020-05-26 22:46:41 540 1

原创 深入理解C语言数组与内存分配

C语言在定义数组时是否允许使用变量指定数组长度,如果您的答案否,那我建议您仔细阅读以下这篇文章:)

2020-05-22 23:48:24 5762

原创 使用sar命令分析Linux卡死

卡死现象Linux卡死时的现象无法通过网络连接到Console,ping 主机IP时通的,但是telnet常用端口比如22等是不通的。机器重启后,查看日志发现日志在机器卡死时间节点后就断掉了,就像机器被突然拔掉了电源。Linux系统卡死危害是非常大的,一般系统卡死后机器失去响应,无法通过正常手段对系统进行操控,如果没有安装相关的带外管理口,很有可能需要运维人员进入到机房进行手动重启才能恢复。找到sar文件sar是Linux每隔一段时间都会对系统收集各种资源使用的工具,每一天都会产生一个文件,存储在

2020-05-16 10:38:16 948

原创 Ubuntu编译Golang代码包

建立开发调试环境建立开发环境C版本Go1.4Go版本Go1.5建立开发环境主机环境:16.04.1-UbuntuGO1.5实自举(用GO实现GO的编译器),因此保留两个版本的Go环境。C版本Go1.4Go版本Go1.5

2020-12-20 16:47:58 647 2

原创 深入理解Linux网络技术内幕 第32章 路由-Linux的实现

主要数据结构路由代码定义和使用的主要数据结构中的rt代表路由(route),fib转发信息库(Forwarding Informations Base),fn功能(function)。struct ip_rt_acct该结构被路由表的分类器使用,用于跟踪和一个标签(tag)关联的路由上的流量统计信息,统计信息包括报文个数和字节数。这个结构初始化为长度256的数组。因为路由标签的取值范围是0~255。struct ip_rt_acct { __u32 o_bytes; __u32 o_p

2020-11-29 21:59:06 403

原创 深入理解Linux网络技术内幕 第30章 路由-概念

路由与路由表决定一个入口报文送给本地主机还是转发所需要的信息,以及转发时正确转发所需要的的信息,都存储转发信息库中FIB(Forwarding Information Base),也简称为路由表。路由表是由许多路由的集合,一条路由是一组参数,这些参数存储了到一个给定目的地转发流量的所有信息。一条路由所需要的最少参数集合:目的网络出口设备:与路由匹配项从该设备发送出去。下一跳网关:当目的网络和本地主机不是直接相连时,需要其他路由器转发。下一跳网关就是指该路由器的地址。路由的基本元素对称路由和非

2020-11-26 22:31:54 357

原创 深入理解Linux网络技术内幕 第31章 路由-高级路由

策略路由策略路由背后的思想是允许用户除了根据目的IP地址配置路由外,还可以根据其他多个参数配置路由。比如出于安全或计费考虑分开流量。实现策略路由有两种方法单路由表法查找路由不只是基于目的地址,还需要检查多个条件选择一条唯一路由。此处检查入口设备和目的地址。多路由表方法主机维护多张独立的路由表,根据特定条件选择正确的路由表。这样内核路由查找之前需要先选择正确的路由表。Linux只维护一张路由缓存,该缓存由所有的路由表共享。策略路由查找根据配置策略选择要用的路由表。从选择的路由表查找路

2020-11-08 21:47:31 232

原创 Leetcode2-两数相加

题目给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807来源:力扣(LeetCode)链接:https://leetc

2020-11-01 17:04:17 47

原创 Leetcode1-两数之和

题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网

2020-11-01 16:55:04 63

原创 pktgen range命令发送报文通讯对最大为16384

pktgen是基于DPDK的报文发送器,可以非常轻易的将报文发送速度达到上千万PPS,是测试网络产品性能的利器。在使用过程中,经常有需要模拟高并发的场景。查询pktgen的文档后可以发现pktgen的range子命令可以设置发送报文的源IP、目的IP、源端口、目的端口的发送范围,从而可以模拟出大量通讯对报文。不过在实际使用中发现当设置range的范围超过某个值时就没有办法再提高了,经过测试后发现这个值是16384(不同的pktgen版本有不同的值)。经过一番搜索后没有发现相关说明,只能查阅相关源代码。最

2020-07-30 14:22:55 781

原创 深入理解Linux网络技术内幕 第28章 邻居子系统-ARP协议

邻居子系统-ARP协议

2020-07-03 22:19:10 486

原创 深入理解Linux网络技术内幕 第27章 邻居子系统-通用基础结构

邻居子系统-通用基础结构数据结构L3协议和邻居通用接口neigh->ops初始化neigh->output和neigh->nud_state初始化邻居信息更新-neigh_update数据结构struct neigh_table 描述邻居协议参数和所用函数。struct neighbour 存储邻居相关信息。该结构描述主机的L3地址,主机有多个L3地址也就有多个该结构。L3协议和邻居通用接口Linux内核通过虚拟函数表将L3协议和L2传输函数链接起来。邻居系统的虚拟函数表由str

2020-06-30 23:24:09 775

原创 深入理解Linux网络技术内幕 第26章 邻居子系统-概念

邻居子系统-概念概念邻居协议作用Solicitation请求和应答Linux实现概念连接在同一LAN上的主机具有相同的L3网络配置互为邻居。另一种定义邻居的方式是主机到其邻居有且只有一个L3跃点。并且它的路由表必须提供可以直接和其邻居通信的路径。不是邻居的主机通信必须经过网管或者路由器。物理子网(LAN)和逻辑子网(IP子网)不总是一对一的。在同一个LAN上可以存在多个IP子网,或者多个LAN位于同一个IP子网内。邻居协议作用L3地址转换成L2地址,根据硬件不同存在多种L2协议,而L3协议不用关

2020-06-27 17:09:57 505

原创 深入理解Linux网络技术内幕 第16章 桥接-Linux实现

桥接-Linux实现网桥设备抽象桥接程序的初始化网桥设备抽象网桥对Linux来说是虚拟设备,我们需要把一个或者多个真实设备绑定到网桥设备上,否则无法接收和传输报文。当创建一个网桥时,必须告诉内核这个网桥绑定了那些接口。比如建立一个网桥br0,然后把eth0和eth1指派给br0,。此时eth0和eth1是网桥接口,它们不需要配置IP地址,可以把IP信息指定给网桥设备。前面章节提到设备上传输报文要调用dev_queue_xmit执行,dev_queue_xmit函数会调用驱动程序的hard_start

2020-06-20 22:02:32 1050

原创 深入理解Linux网络技术内幕 第15章 桥接-生成树协议

本章主要是看生成树协议STP(Spanning Tree Protocol)如何让拓扑消除环路,形成稳定网络。稳定网络是指STP已经收敛成最终的无环路拓扑。L2分层拓扑范例桥接式网络拓扑像一棵树,主机主要位于叶子节点上。下图是常用的网络拓扑结构,图中看到网络大概分成了三层,最下面的叶子几点是主机,主机链接到的网桥叫做接入网桥,这个网桥主要是用于链接在同一网桥的主机间转发流量。接入网桥和上层网桥也有一条或多条链路。途中的接入网桥时A1 A2 A3 A4。主机位于拓扑的叶子上,可以任意添加通向主机的链路

2020-06-15 22:33:45 743

原创 深入理解Linux网络技术内幕 第13章 桥接-概念

桥接中继器、网桥、路由器网桥合并LAN桥接不同技术的LAN地址学习广播和多播地址老化多台网桥网桥环路无环路拓扑中继器、网桥、路由器中继器通常有两个端口,只是简单的把一个端口接收到数据复制到另一个端口。网桥需要了解链路层协议。大多数LAN都用网桥也被称作交换机(switch)。路由器需要了解L3层协议,可以根据路由表转发入口报文。网桥为每个接口指定一个链路层地址,然后把所有目的地不是本机的报文都转发出去。网桥在下面两种情况会消费报文:报文目的地址是该接口的MAC地址生成树协议报文网桥合

2020-06-13 16:42:32 294

原创 深入理解Linux网络技术内幕 第14章 协议处理函数

协议处理函数每种协议都会有一个初始化函数,如果协议被静态编译到内核中初始化函数在引导期间执行,如果被编译成模块,就在模块加载时执行。设备驱动接收到一个报文后,将其保存在sk_buff结构内,然后对protocol字段初始化。skb->protocol = eth_type_trans(skb, nic->netdev);protocol字段被前面章节出现过的__netif_receive_skb函数使用,找到合适的L3处理函数并调用deliver_skb函数将skb传递到上层进行处理。

2020-06-13 11:08:30 388

原创 深入理解Linux网络技术内幕 第11章 帧的传输

111

2020-06-11 21:58:04 637

原创 深入理解Linux网络技术内幕 第10章 帧的接收

帧的接收通知内核已接收NAPI和netif_rxNAPI通知内核已接收NAPI和netif_rxLinux驱动程序通知内核接收报文有两种方式:netif_rx函数NAPI机制NAPINAPI混合中断和轮询,不适用纯粹的中断事件驱动模型。...

2020-06-07 23:04:12 575

原创 深入理解Linux网络技术内幕 第9章 中断和驱动程序

接收帧通知设备和内核可以使用两种方式交互数据:轮询和中断。有时候轮询和中断可以组合使用提高效率。轮询轮询就是内核不断的查询设备是不是有新数据就绪需要处理,例如查看某个寄存器等。中断中断时当特定事件发生时,内核中断其他的进程活动,调用中断处理函数处理数据。当接收到一个报文时处理函数将报文放入队列,然后通知内核进行后续的处理。这种处理方式在低流量环境时可以很好的工作,但是如果流量负载比较高而每个报文都导致一次中断,让CPU为处理中断浪费很多时间。中断中接收数据分成两个部分:第一是中断中的处理,将帧

2020-06-06 20:35:41 381

原创 深入理解Linux网络技术内幕 第8章 设备注册和初始化

设备注册和初始化

2020-06-04 22:53:19 892

原创 深入理解Linux网络技术内幕 第7章 组件初始化的内核基础架构

组件初始化的内核基础架构引导期间的内核选项注册关键字两遍分析使用引导选项配置网络设备模块初始化代码新模型:宏卷标引导期间的内核选项Linux允许用户把内核配置选项传递给引导程序,可以使用此机制在引导期间调整内核。parse_args函数用于解析输入字符串,输入字符串是形如 key=value形式的参数。寻找到特定关键字后,启用适当的处理函数。注册关键字内核组件使用__setup宏,注册关键字和处理函数。如网络子系统注册的关键字__setup("netdev=", netdev_boot_setu

2020-06-02 23:05:18 253

原创 深入理解Linux网络技术内幕 第6章 PCI层和网卡

PCI层和网卡数据结构PCI NIC设备驱动程序注册电源管理和网络唤醒PCI NIC驱动程序注册范例数据结构pci_device_idpci_device_id设备标识符,这不是Linux使用的本地ID,是根据PCI标准定义的IDpci_dev每个PCI设备都会被分派一个pci_dev实例,这个结构由内核引用一个PCI设备pci_driver定义PCI层和设备驱动程序之间的接口。这个结构主要由函数指针构成。所有的PCI设备都会使用这个结构。name驱动程序的名称id_table

2020-06-01 21:12:49 257

原创 深入理解Linux网络技术内幕 第5章 网络设备初始化

网络设备初始化内核初始化设备注册和初始化NIC初始化设备与内核交互硬件中断中断类型中断共享设备处理层初始化热插拔hotplug内核初始化当内核引导时,会执行start_kernel函数,start_kernel函数对一些子系统做初始化,start_kernel函数终止前调用init内核线程,由其负责后续的初始化。引导期间选项start_kernel函数里调用两次parse_args,一次是通过parse_early_param间接调用。这两个用于处理引导加载程序(BOOTLOAD,LILO或GR

2020-05-31 23:06:47 311

原创 深入理解Linux网络技术内幕 第4章 通知链

通知链概述定义通知链注册通知链通知链事件通知网络子系统的通知链概述内核多个子系统之间具有相互依赖性,因此一个子系统需要侦测或产生其他子系统感兴趣的事件。在网络协议栈中,比如路由子系统对网卡设备的UP、DOWN就非常感兴趣,路由子系统根据网卡产生的事件执行相应的动作。通知链就是一个函数链表,当给定的事情发生时,就调用链表中的所有的函数。通知链有两个角色:被通知者(notified),注册回调函数给通知者。通知者(notifier),产生事件并调用回调函数。定义通知链内核使用struct n

2020-05-31 19:02:11 196

原创 深入理解Linux网络技术内幕 第3章 用户空间与内核空间接口

用户空间与内核空间接口概述procfssysctlioctlNetlink概述Linux内核协议栈和用户空间交互的接口有:procfs文件系统sysctl(/proc/sys目录)sysfs文件系统ioctl系统调用Netlink套接字这是网络应用程序与内核通信的最新机制。IPROUTE2包中大多数命令都使用这个接口。procfs大多数网络功能在初始化时在/proc/下注册一个多个文件,当用户空间读取这个文件的时候,会调用内核函数,返回某种输出内容。网络协议栈的文件一般放在/proc

2020-05-31 16:45:50 177

原创 深入理解Linux网络技术内幕 第2章 关键数据结构

sk_buff结构这个结构是Linux网络协议栈中最重要的结构之一,代表接收或要传输的数据。不同的网络层都会使用这个结构,这个结构在不同层之间传递,不同的协议会传递这个值,结构内的字段相应的改变。struct sk_buff_head结构的next和prev字段必须是第一个,要和struct sk_buff一致,这样他们可以放到一个链表中。布局字段内核有一个双向链表维护所有的sk_buff结构。内核用struct sk_buff_head 记录了该链表信息。struct sk_buff_head

2020-05-31 11:25:38 387

原创 深入理解Linux网络技术内幕 第1章 简介

内存缓存内核使用kmalloc和kfree分配和释放内存块。对于常用的数据结构比如struct skb_buff等内核通常分配一块内存缓冲区用于常用数据结构的申请和释放。处理内存缓存相关的函数kmem_cache_createkmem_cache_destroykmem_cache_allockmem_cache_free引用计数为了避免访问已经释放的数据结构,同时让垃圾回收机制更加容易和有效率,很多数据结构会设置引用计数(reference count)。对于数据结构的存储和释放,内核

2020-05-23 15:18:51 287

原创 第25章 ICMPv4

ICMP(Internet Control Message Protocol)是一种传输协议,用于交换控制消息。ICMP报文头类型代码两个字段可以分辨出ICMP消息类型。校验和包括ICMP报文头和载荷。ICMP有效载荷当内核处理接入IP报文检查到错误时,就会发送ICMP错误消息,ICMP错误消息载荷数据包含:IP报文头+部分IP载荷数据。报文长度不超过576字节。ICMP类型ICMP_ECHO和ICMP_ECHOREPLY用于测试远程主机是否可连接。ICMP_DEST_UNREACH

2020-05-17 10:30:53 420

翻译 turbostat

turbostat统计X86 处理器的频率、空闲状态、电源状态、温度等状态。有两种方式调用该命令,第一个是提供command,这个统计CPU的信息直到命令完成。第二种方式移除相关的命令,这种方式每5秒钟展示统计信息。turbostat必须在root权限下调用。一、turboastat可以用来查看CPU核心处在C1 C3 C6 C7状态下时间。在CPU超线程的核心中,如果某个核心处于工作状态,会阻止该超线程的另一个核心进入比C1更加深入的省电模式。二、turbostat可以查看CPU的温度信息。Cor

2020-05-16 23:58:37 6733 1

原创 TCP重点知识总结

TCP首部16位源端口 16位目的端口32位序号32位确认号4位首部长度 保留6位 URG ACK PSH RST SYN FIN 16位窗口大小16位校验和 16位紧急指针选项数据TCP首部共计20字节TCP校验和TCP头中的校验和,需要在TCP头的前边加上一个含有源目IP的伪首部。MSS段MSS段表明最大报文长度,发送该值的一端将不接受超过这个长度的TCP报文段,这通常是为了避免IP分段。2MSL2MSL等待状态:TIME_WAIT状态。是任何丢弃的报文在网络

2020-05-16 23:45:03 318

原创 补码编码

补码编码用于有符号数的表示。最高位表示尾符号位。他的权重为-2的w-1次方。比如以4位为例子,最高位是符号位。0001 = -02**3+022+0*21+12**0=0+0+0+1=10101 = -023+1*22+02**1+120=0+4+0+1=51011 = -1*23+02**2+121+1*20=-8+0+2+1=-51111 = -12**3+122+1*21+1*2**0=-8+4+2+1=-1补码的表示范围不对称的,|TMin| = |TMax|+1。因为0是非负数,意味着表

2020-05-16 23:35:21 584

原创 HEAD FIRST设计模式-工厂模式

简单工厂模式定义创建一个工厂类,用于负责处理创建对象的细节。这样做的有点是当需要变更的时候只需要修改该类的代码就可以,其他地方不需要改动。

2020-05-16 23:29:41 76

原创 HEAD FIRST设计模式-适配器模式

定义适配器模式将一个类的接口转换成客户期望的另外一个接口。适配器让原本接口不兼容的类兼容。适配器的工作像是一个中间人,将客户发出的请求转换成厂商类能理解的请求。工作原理使用适配器的过程如下:通过目标接口调用适配器方法对适配器发出请求适配器使用被适配者接口把请求转换成被适配者的一个或者多个接口。客户接收到调用结果,但并未觉察到这一切是适配器在起转换作用。...

2020-05-16 23:24:22 116

原创 HEAD FIRST设计模式-单件模式

定义单件模式确保一个类只有一个实例,并提供一个全局访问点。利用静态变量来记录唯一的一个实例。把构造器私有化定义一个方法返回实例单件模式需要注意多线程的问题。可以使用锁或者在程序创建过程中就实例化该类。也可以使用双重检查加锁。...

2020-05-16 23:21:51 77

原创 HEAD FIRST设计模式-命令模式

定义将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式支持可撤销的操作。优点命令模式将发出请求的对象和执行请求的对象解耦。在被解耦的两者之间通过命令对象进行沟通,命令对象封装了接收者的一个或者一组动作。一个命令对象通过在特定的接收者上绑定一组动作来封装一个请求。命令对象将动作和接收者包进对象中,这个对象只暴露一个execute()方法。python代码如下from abc import abstractmethodfrom enum import Enumcla

2020-05-16 23:18:33 116

原创 深入理解Linux网络技术内幕 第24章 L4协议RAW IP处理

L4协议注册L4协议由struct net_protocol描述,其中的handler作为处理报文的函数,err_handler由ICMP协议处理函数所用的函数,用于通知L4协议收到ICMP UNREACHABLE消息。/* This is used to register protocols. */struct net_protocol { int (*early_demux)(struct sk_buff *skb); int (*early_demux_handler)(struct

2020-05-16 12:53:41 556

原创 十分钟搞定CENTOS7 netmap安装

netmap是作为Linux的一个内核模块存在的,使用netmap需要我们拿到netmap的源代码并结合Linux内核源代码进行编译的。安装kernel头文件一般我们不需要获取所有的linux代码,只需要获取linux的头文件即可。此处需要注意的是我们选取的linux系统的版本一定要和宿主机系统完全一致的版本才可以。例如我们实验机器的系统版本如下:使用谷歌搜索圈出的字符串可以找到这个文件安装后就是我们要找的头文件。将该文件下载安装到机器上。rpm -ivh kernel-devel-3.10.

2020-05-15 08:46:59 967

原创 深入理解Linux网络技术内幕 第22章 处理分段

处理分段IP分片IP分片IP层如果确定一个IP报文分片:第一个分片offset=0且MF=1中间的分片offset>0且MF=1最后一个分片offset>0且MF=0旧版本的内核在IP层处理IP分片,发送数据的函数可以接受0-64KB数据,当报文大于PMTU时,就必须把数据分割成多个IP报文。最近的版本是让L4协议协助分片任务,L4协议传递一组和PMTU匹配的缓冲区,IP层只需要为每个缓冲区增加IP头即可。分片方式快速分片慢速分片IP分片主要任务:把L3数据分成较

2020-05-13 22:37:30 417

原创 深入理解Linux网络技术内幕 第21章 传输

传输是指报文离开本地到另外一台主机,可以由L4层或转发调用。在此之前,内核需要做的准备包括:查询路由子系统下一跳初始化IP头处理选项分段校验和传输相关重要函数ip_queue_xmit L4协议吧PMTU考虑后,已经把数据切成合适大小的段,IP层只要加上IP头。ip_push_pengding_frames 调用该函数的L4协议不考虑IP分片相关操作。ip_append_data用来存储几个传输请求而不传输任何东西。使得IP层更容易处理分片,提高性能。当L4必须刷新数据时调用ip_pu

2020-05-12 22:28:12 570

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除