AOP 切面编程 作者: lovingyu_er 时间: 2019-09-24 16:00:00 分类: 编程语言,PHP 评论 ####AOP 面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计、剖面導向程式設計)是计算机科学中的一种程序设计范型,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。 --《维基百科》 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 --《百度百科》 AOP 的主要作用就是在不侵入原有功能代码的情况下,给原有的功能添加新的功能。 我们都知道 OOP 实际上就是对我们的功能属性,方法做一个抽象封装,能够比较清晰的划分逻辑单元,但是 OOP 只能够进行纵向的抽象封装,无法很好的解决横向的重复问题,而 AOP 则很好的解决了这一问题,下面请看以下图示。 ####相关术语解释 首先我们先将相关术语进行一个大致的解释 通知(Advice) 就是你想要的功能,用方法实现的功能,也就是上说的安全、事务、日志等。你先把功能用方法给先定义好,然后再想用的地方用一下。 连接点(JoinPoint) 就是允许你把通知(Advice)放在的地方,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点,Swoft 只支持方法级的连接点。只要记住,和方法有关的前前后后都是连接点。 切入点(Pointcut) 这个就是定义要切入的具体的方法,为什么呢,假设一下,一个类中有10个方法,每个方法都有好多个连接点(JoinPoint),但是你并不想在所有方法都使用通知(织入),你只想织入其中的某几个方法,那么就是用这个切入点来定义具体的方法。 切面(Aspect) 是通知(Advice)和切入点 (Pointcut)的结合。通知说明了干什么,切入点说明了在哪里干,一般情况下连接点是在指定切入点的时候就指定好了的,上面单独吧连接点写出来只是为了让其更好理解。 引入(introduction) 就是将我们新的类和方法,用到目标类中。 目标(target) 引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被织入切面。 代理(proxy) 整套AOP机制的,都是通过代理,Swoft 使用了 PHP-Parse 类库来更方便的实现AOP 织入(weaving) 把切面应用到目标对象来创建新的代理对象的过程。
hping3 实现网络SYN包攻击 作者: lovingyu_er 时间: 2019-09-05 21:38:00 分类: Ubuntu 评论 拒绝服务攻击(英语:denial-of-service attack,简称DoS攻击)亦称洪水攻击,是一种网络攻击手法,其目的在于使目标计算机的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。 当黑客使用网络上两个或以上被攻陷的计算机作为“僵尸”向特定的目标发动“拒绝服务”式攻击时,称为分布式拒绝服务攻击(distributed denial-of-service attack,简称DDoS攻击)。据2014年统计,被确认为大规模DDoS的攻击已达平均每小时28次。[1]DDoS发起者一般针对重要服务和知名网站进行攻击,如银行、信用卡支付网关、甚至根域名服务器等。 DoS也常见于部分网络游戏,被心怀不满的玩家或是竞争对手广泛使用。DoS也常被用于抗议,自由软件基金会创办人理查德·斯托曼曾表示,DoS是“网络街头抗议”的一种形式。[2] 有条件的童鞋,可以查看一下这个网址,蛮有意思,显示了国际上不同国家之间的网络攻击: ```bash http://www.digitalattackmap.com/ ``` 常用的工具比较常见的就是hping3: hping3 工具的介绍: ```bash hping3 - send (almost) arbitrary TCP/IP packets to network hosts ``` 简单的hping3洪水攻击: ```bash # hping3 -S --flood -V attacked_domain.com ``` 参数详解: SYN:同步序列编号 -S:发送SYN包,这也是hping3攻击的原理,发送大量的SYN包给目标服务器,频繁的进行 --flood:尽可能快的发送SYN包 -V:攻击端将会显示额外的攻击信息 其他的参数: ```bash # hping3 -c 10000 -d 120 -S -w 64 -p 80 --flood --rand-source attacked_domain.com ``` -c :发送数据包的个数 -d :每个数据包的大小 -w :tcp window 的大小 -p :对目标攻击的端口 –rand-source:使用随机的IP地址,目标机器看到一堆ip,不能定位你的实际IP;也可以使用-a或–spoof隐藏主机名 简单的tcp攻击: ```bash # nping --tcp-connect -rate=90000 -c 900000 -q attacked_domain.com ``` 其他比较详细的参数可以参考: ```bash man hping3 man hping ```
C语言指针的一些基础知识 作者: lovingyu_er 时间: 2019-09-05 21:06:00 分类: C/C++ 评论 在C语言中,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址: ```c #include int main () { int var1; //定义一个整型变量 char var2[10]; //定一个char类型的数组 printf("var1 的变量的地址:%p\n",&var1); //&var1代表变量在内存中地址 printf("var1 变量的大小:%ld\n",sizeof(int)); //int类型在平台上的占用的内存大小 printf("var2 变量的地址:%p\n",&var2);//var2在内存中的地址 } ``` 不同的平台上,输出的结果不一样,一般都是0x开头的字符串 ```bash var1 的变量的地址:0x7ffee71e7584 var1 变量的大小:4 var2 变量的地址:0x7ffee71e758e ``` 通过上述的案例,我们知道了每个变量在运行的时候,在内存中都有一个地址,那么指针到底是怎么回事呢? ######指针 **指针是一个变量(int *p),其值为另一个变量的地址(p代表的是地址)**,即,**内存位置的直接地址**。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为: ```c type *variable_name; ``` 其中type可以是c语言预定义的变量,也可以是你自定义的数据结构; #####如何使用指针 ```c #include void main (){ int var =20; int *ip; ip =&var; printf("var 的变量的值是:%d\n",var); printf("var 变量的地址是:%p\n",&var); var = 30; *ip = 40; printf("*p 代表的是:%d\n",*ip); printf("p 代表的是:%p\n",ip); printf("var 的变量的值是:%d\n",var); printf("var 变量的地址是:%p\n",&var); } ``` 输出的结果如下: ```c var 的变量的值是:20 var 变量的地址是:0x7ffee71e7580 *p 代表的是:40 p 代表的是:0x7ffee71e7580 var 的变量的值是:40 var 变量的地址是:0x7ffee71e7580 ``` 注意: 1.*p代表的是指针的所指向内存的值;p代表的是指针的所指向的值的内存; 2.*表示该变量的类型是一个指针变量,指针变量名是p1而不是*p1; #####c语言的null指针 在我的mac平台上,进行了如下的测试,省略了部分代码: ```c int *ptr_test; int *ptr_null = NULL; printf("*ptr_testd的变量的地址:%p\n",ptr_test); printf("*ptr_null的变量的地址:%p\n",ptr_null); //在同一个平台上,结果相同,说明初始化指针的时候,可以省略 =NULL; //printf("*ptr_testd的变量的value:%d\n",*ptr_test); //printf("*ptr_null的变量的value:%d\n",*ptr_null); if(ptr_test){ printf("is not null\n"); }else{ printf("is null\n"); } if(ptr_null){ printf("ptr_null is not null\n"); }else{ printf("ptr_null is null\n"); } ``` 注意:不赋值的指针和赋值为null的指针相同,在我的平台上输出结果为0x0 。 在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针指向一个不可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
ifconfig 名词解释 作者: lovingyu_er 时间: 2019-09-03 20:37:00 分类: Ubuntu 评论 ###### Ubuntu 下ifconfig 的解释  ```bash hostname@hostname_test:~/php_developer$ sudo ifconfig enp4s0 enp4s0: flags=4163 mtu 1500 inet 192.168.21.220 netmask 255.255.255.0 broadcast 192.168.21.255 inet6 fd84:9181:6055:0:bc6f:8983:6570:5d3d prefixlen 64 scopeid 0x0 inet6 fd84:9181:6055::135 prefixlen 128 scopeid 0x0 inet6 fd84:9181:6055:0:12be:2c14:8c2f:22b7 prefixlen 64 scopeid 0x0 inet6 fe80::88f3:b1b7:4954:a99a prefixlen 64 scopeid 0x20 ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet) RX packets 3045300 bytes 3839125183 (3.8 GB) RX errors 0 dropped 107 overruns 0 frame 0 TX packets 1704216 bytes 241712127 (241.7 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` 1.网络接口标示:在ifconifg -a 中的第一行中的 running标示网络连接状态,表示改机器的网卡连接到路由器或者交换机。如果看不到这个标示,标示网卡没有插网线,或者网线有问题 2.mtu的大小;默认大小为1500,不同的网络架构,这个值可能大小不一样,但是你可以调整,在ubuntu 系统中,你可以通过```bash /etc/class/net/enp4s0/mtu ``` 修改这个值 3.网络接口的ip地址,子网,以及mac地址 4.网络收发字节数,包数,错误数以及丢包的情况.详细的信息参考如下: RX: receive 接受; RX errors: 表示总的收包的错误数量,这包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。大部分是校验错误,帧同步错误等等。 RX dropped: 表示丢弃的数据包;数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。 RX overruns: 表示超限数据包数。表示了 fifo 的 overruns(网络的I/O 数据较快 ,导致了ring buffer 数据包来不及处理,也就是队列满,导致丢包 )这是由于 Ring Buffer(aka Driver Queue) 传输的 IO 大于 kernel 能够处理的 IO 导致的,而 Ring Buffer 则是指在发起 IRQ 请求之前的那块 buffer。很明显,overruns 的增大意味着数据包没到 Ring Buffer 就被网卡物理层给丢弃了,而 CPU 无法即使的处理中断是造成 Ring Buffer 满的原因之一, RX frame: 表示 misaligned 的 frames。 TX: transmit 发送; 对于 TX 的来说,出现上述 counter 增大的原因主要包括 aborted transmission, errors due to carrirer, fifo error, heartbeat erros 以及 windown error,而 collisions 则表示由于 CSMA/CD 造成的传输中断。 dropped与overruns的区别 : dropped,表示这个数据包已经进入到网卡的接收缓存fifo队列,并且开始被系统中断处理准备进行数据包拷贝(从网卡缓存fifo队列拷贝到系统内存),但由于此时的系统原因(比如内存不够等)导致这个数据包被丢掉,即这个数据包被Linux系统丢掉。 overruns,表示这个数据包还没有被进入到网卡的接收缓存fifo队列就被丢掉,因此此时网卡的fifo是满的。为什么fifo会是满的?因为系统繁忙,来不及响应网卡中断,导致网卡里的数据包没有及时的拷贝到系统内存,fifo是满的就导致后面的数据包进不来,即这个数据包被网卡硬件丢掉。所以,个人觉得遇到overruns非0,需要检测cpu负载与cpu中断情 carrirer :错误的数据包数。比如:双工模式不匹配,物理电缆出现问题。 collisions:表示碰撞的数据包数