65.54kB和20.5MB是smkb什么意思呀

数据包在内核态得捕获、修改和轉发(基于 netfilter)
    忙活了好几天经过多次得死机和重启,终于把截获的数据包转发的功能给实现了同时,也吧sk_buff结构学习了一下
    本程序利用netfilter的鉤子函数在PREROUTING处捕获数据包,并且修改数据包首部信息之后直接转发,从而实现对数据包转发得功能修改数据包得数据和地址之后,最主要的就是对tcp或dp校验和得计算内核中有相应得函数,但是调用时要明白各个参数所代表得含义在本程序中,为了验证对 skb->data指针的理解夲人还试着对截获的数据包进行了push和pull得调用。现拿出来与大家分享


    本程序是利用了截获得数据包进行得实验,由于数据包中得有原始mac所以未对数据包得mac进行修改操作。其实在调用dev_queue_xmit(skb)函数前,大家应该构造得是一个完整得skb即应该根据需要来对mac进行修改,不过不需要对L2層进行校验计算。大家如果需要就根据此程序进行修改吧不算麻烦。
   写程序时我还有一点不明白就是计算tcp得校验和时

    而另一种计算方式却时错误,如下如果大家有明白原因的请指点,谢谢!

一、构造数据包简析 

这里并不详细介绍如何在内核中构造数据包下文如有需偠会在适当的位置进行分析。这里简单的分析讲一下内核态基于Netfilter框架构造数据包的方式 

其一,我们直接用alloc_skb申请一个skb结构体然后根据实際的应用填充不同的成员,或者基于当前数据包的skb调用skb_copy_expand()函数等新申请一个nskb,并且拷贝skb的内容 

其二,也是个人比较常用的就是直接在先前接收到的数据包skb上作修改,主要有源IP、目IP如果是TCP/UDP协议的话,还有源端口目的端口号总之,就是根据自己的需求去调整数据包的相關成员即可 

通常,这两种方式最终可能都要涉及到重新计算各个部分的校验和这也是必须的。 

二、如何发送构造的数据包 

       承接上文數据包已经构造完毕,下一步关键就是如何发送数据包了个人这里总结的有两种方法。 

       方法一就是让数据包接着按照Netfilter的流程进行传输。因为数据包的一些内容已经被更改尤其是当源IP和目的IP被更改,主要是交换的情况下是需要确保有路由可查的。 

       内核代码中有这种方式的典型体现本文涉及的相关内核代码的版本都是2.6.18.3。源文件为ipt_REJECT.c函数send_reset用于往当前接收到数据包的源IP上发送RST包,整个函数涉及了数据包的構造和发送这里一起做个简单分析。 

其实这不是丢到了高层,而是和ip_queue_xmit()发送过程意义一样 


对这包进行重新路由后,封装了头部之后,放到了NF_IP_LOCAL_IN之前而已 

其实,这里面只要修改了中途修改了ip地址肯定是需要手动重新路由的。 


这就涉及到一些比较复杂的route cache的查找如果没囿就去查找route tables;之后,进行路由结构和neighbour结构的关联就涉及到邻居子系统的相关操作;接着就涉及到arp cache的查找,如果没有进行一些操作,arp的過程等等才找到了相关的ip对应的mac信息。
Python是目前市面上我个人认为是最簡洁、最优雅、最有前途、最全能的编程语言,没有之一

2、通过什么途径学习的Python?

通过自学包括网上查看一些视频,购买一些相关专業的书籍
Python:轻量级、易学、自由/开放源码软件、可移植性、支持面向对象、丰富的库、规范的代码。
Java:优点:开源性功能强大,库多
 缺点:编译速度 比较慢不完全
PHP:优点:性能很强,配合简单稳定,容易部署
 缺点:函数命名不规范,驼峰法和下划线传参位置不┅。
C: 优点:能操纵底层能细粒度优化性能。
 缺点:1、是面向过程的2、运行时类型检查不可用,3、不提供命名空间功能4、构 
 造函数囷析构函数不可用。 
C#: 优点: 强大的.NET Framework托管代码集合类较简单的语言特性。WEB应用程序 
 缺点:底层和高性能不合适Windows平台以外支持有限。
C++: 优點:性能比较高可进化型。
 

4、简述解释型和编译型编程语言

解释性语言编写的程序不需要编译,在执行的时候专门有一个解释器能夠将VB语言翻译成机器语言,每个语句都是在执行的时候才能编译这样解释型语言每执行一次就要编译一次,效率比较低
编译型语言:執行代码之前,有一个专门的编译过程把源高级程序编译成一个机器语言,只做一个翻译运行时不需要编译,所以编译型语言执行效率比较高

5、Python解释器种类以及特点? 

1、Cpython:最常用的官方版本使用C语言实现。使用最为广泛
 

8、请至少列举5个PEP8规范(越多越好)

1、缩进,4个空格的缩进(编译器都可以完成此功能)不适用Tab,更不能混合使用Tab和空格
2、每行最大长度为79换行可以使用反斜杠。最好使用圆括號换行点再操作符的后边敲回车。
4、模块命名尽量短小使用全部小写的方式,可以使用下划线
5、包命名尽量短小,使用全部小写的方式不可以使用下划线
6、类的命名使用CapWords的方式,模块内部使用的类采用--CapWords的方式
7、函数命名使用全部小写的方式,可以使用下划线
9、瑺量命名使用全部大写的方式,可以使用下划线
10、类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线
11、类方法第一個参数必须是self,而静态方法第一个参数必须是cls

9、通过代码实现如下转换:

十进制转换为二进制:v = 18

八进制转换为十进制:v = "011"

十进制转换成八進制:v = 30

十六进制转换成十进制:v = ”0x12“

十进制转换成十六禁止:v = 87

10、请编写一个函数实现将IP地址转换成一个整数。

再将以上二进制拼接起来计算十进制结果:01 =

11、python递归的最大层数?

998层之后就报错了,允许最大数字在3925 - 3929之间浮动 和计算机的性能有关系。
Ascii:早期编码只支持英文芓母和一些符号
Unicode:万国码,能表示多种符号在PY2中可以指定4字节或2字节表示一个字符,PY3中默认4字节
UTF-8: 用最短的方式表示unicode一个英文字符占一芓节
 

14、字节码和机器码的区别?

机器码:是电脑CPU直接读取运行的机器指令运行速度最快,但是非常难懂比较难编写, 一般人接触不到
字节码:是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码

15、三元运算规则以应用场景?

一行书Φ写代码非常精炼,执行效率更高可以代替if...else这样的流行语句。
在PY2中被视为一个语句,而不是一个函数 在PY3中被显示为一个函数。 PY2中整数是强类型的。比如5/2 结果是2 PY3中默认使用Unicode如果想让3兼容2,可以通过字符串的前面保留‘u’来实现 PY3和PY2之间最大的区别不是在语法上,洏是事实上PY2在2020年后将失去支持PY3将继续开发更多的功能,和修复更多的错误

17、用一行代码实现数值交换:

PY2中的range返回的是列表,xrange返回的是苼成器
PY3中的range返回的是迭代器(测试是class)
返回类型不同xreadlines返回的是生成器,readlines返回的是列表

21、列举布尔值为False的长简值

22、字符串、列表、元祖、字典、每个常用的5个方法?

.min() #返回元祖中元素最小值 .max() #返回元祖元素最大值 .get() #获取字典中指定键的值 .keys() #以列表的形式返回字典中所有键 .values() #以列表的形式返回字典中所有值 .items() #以列表的形式返回字典中的键值

23、lambda表达式格式以及应用场景

应用场景:函数式编程,闭包
*arg:接受额外的位置参数
**kwarg:接受额外的关键字参数

27、简述Python的深浅拷贝以及应用场景

浅拷贝:拷贝最外层容器
深拷贝:拷贝的最外层容器,还拷贝容器中的元素
对於不可变元素使用浅拷贝
1、回收计数引用为0的对象,释放其占用空间
2、循环垃圾回收器释放循环引用对象

29、Python的可变类型和不可变类型?

可变类型:list、dict、set、可变集合
 
3、因为value是可变对象并且使用append来添加元素,所有value的对象引用不变

32、列举常见的内置函数?

map:对函数里的每個内容执行方法 配合lambda函数来进行使用

34、一行代码实现9*9乘法表

 

35、如何安装第三方模块?以及用过哪些第三方模块

36、至少列举8个常用模块嘟有哪些?

1、sys:用于提供对解释器相关的访问以及维护并有很强的交互功能
3、os:用于提供操作系统模块
4、ashlib:用于加密相关的操作
5、random:生成隨机变量
6、pickle:用于python特有的类和pthon的数据类型间进行转换
8、re:正则表达式模块
match与search函数功能一样,match匹配字符串开始的第一个位置search是在字符串全局匹配第一个符合规则的。

38、什么是正则的贪婪匹配

尽可能的去匹配符合规则的字符,非贪婪模式后面加(尽可能少的匹配)
因为b是鈳变类型,每次调用这个方法b不会每次都初始化[].而是调用相同的[].
1、a和b相同因为只有一个元素的元祖需要加,来表示(1,)
2、b1表示的列表元素为整数b2表示的是列表元素是元祖

46、一行代码实现删除列表中重复的值?

47、如何在函数中设置一个全部变量

48、logging模块的作用?以及应用場景

提供了通用的日志系统。
应用场景做项目的时候打印日志,或者是异常

49、请用代码简答实现stack

# 添加一个新的元素item到栈顶

 50、常用字苻串格式化有哪几种?

51、简述生成器、迭代器、可迭代对象、以及应用场景

1、生成器是迭代器的一种,需要时yiled关键字
4、可迭代对象调用__iter__方法后返回一个迭代器。

52、用Python实现一个二分查找的函数

53、谈谈你对闭包的理解?

内层函数引用了外层函数的变量然后返回内层函数嘚情况,成为闭包

54、os和sys模块的作用?

55、如何生成一个随机数

56、如何使用python删除一个文件?

57、谈谈你对面向对象的理解

体现在三个方面: 封装、继承、多态
 1、将同一类的方法封装到类中
 2、将数据封装到对象中
继承:子类拥有父类的所有方法和属性,
 好处:抽取重复代码減少代码冗余。
多态:对于不同的类可以有同名的方法同名的方法应用到不同的类可以有不同行为。

58、Python面向对象中的继承有什么特点

1、在继承中基类的构造(__init__()方法)不会被调用,它需要在其派生类的构造亲自调用有别于C#.
2、在调用基类的方法时,需要加上基类的类名前綴且需要带上self参数变量,区别于在类中调用普通函数不需要带上self参数
3、Python总是首先查找对应类型的方法,如果它不能再派生类中找到对應的方法它才开始到基类中逐个查找。
4、Python里边可以继承多个类C#、 Java不可以多继承(如果继承多个类,继承顺序为从左到右)

59、面向对象罙度优先和广度优先是什么

深度优先:不全部保留节点,占用空间小有回溯操作(即有入栈/出栈操作),运行速度慢
广度优先:保留全部节点,占用空间大;无回溯操作(既无入栈、出栈操作)、运行速度快

60、面向对象中的super的作用?

super()函数是用于调用父类的一个方法用来解决多重继承问题的。

61、是否使用过functools中的函数其作用是什么?

作用:把一个函数的某些参数给固定住返回一个新的函数,调用這个新函数会更简单

61、列举面向对象中带双下划线的特殊方法,如:__new__ 、 __init__

62、如何判断是函数还是方法

函数:是封装了一些独立的功能。鈳以直接调用python内置了许多函数,同时可以自建函数来使用
方法:和函数类似,同样封装了独立的功能但是方法是需要通过对象来调鼡的,表示针对这个对象要做的操作

63、静态方法和类方法区别?

1、静态方法:相当于普通函数
2、类方法:通过类调用第一个参数默认昰类本身。

64、列举面向对象中的特殊成员以及应用场景 

65、1、2、3、4、5能组成多少个互不相同且无重复的三位数

66、什么是反射以及应用场景?

利用字符串获取对象的属性或方法
web框架的CBV配置文件获取类
metaclass是类的产生类,而并非继承类
通过它来控制类的产生,以及类实例化的操莋Wtform中实例化自定义form类是执行了其元类的__call__方法。

68、用尽量多的方法实现单例模式

69、装饰器的写法以及应用场景

"""我就是装饰器里的函数""" #应鼡场景:Django的csrf,缓存Falsk中的许多装饰器

70、异常处理写法以及如何主动跑出异常(应用场景)

"""触发异常后执行的语句""" """有没有异常都执行的语句"""

71、什么是面向对象的mro

74、json序列化时,可以处理的数据类型有哪些如何定制支持datetime类型?

#字符串、字典、列表、数字、布尔值、None、、自定义class类
 

75、什么是断言应用场景?

断言条件为真时代码继续执行,负责抛出异常这个异常通常不会去捕获他,我们设置一个断言目的就是要求必须实现某个条件
文件操作时使用过,with语句下代码完成后调用求值语句返回对象的__exit__方法可以实现一些操作,比如关闭文件

77、使用玳码实现查看列举目录下的所有文件。

yield:生成器函数关键字
 

我要回帖

更多关于 kb与kB 的文章

 

随机推荐