ARP原理和ARP攻击

[TOC] ARP(Address Resolution Protocol)地址解析协议,目的是实现IP地址到MAC地址的转换。 在TCP/IP协议栈中,最不安全的协议莫过于ARP了,我们经常听到的网络扫描,内网渗透,流量欺骗等等,他们基本上都与ARP有关系,甚至可以说,他们的底层都是基于ARP实现的。但是ARP的是实现仅需一问一答的两个包即可,实现上很简单。 目录 ARP协议 ARP数据包信息 ARP攻击 一、ARP协议 ARP(Address Resolution Protocol)地址解析协议,目的是实现IP地址到MAC地址的转换。 在计算机间通信的时候,计算机要知道目的计算机是谁(就像我们人交流一样,要知道对方是谁),这中间需要涉及到MAC地址,而MAC是真正的电脑的唯一标识符。 为什么需要ARP协议呢?因为在OSI七层模型中,对数据从上到下进行封装发送出去,然后对数据从下到上解包接收,但是上层(网络层)关心的IP地址,下层关心的是MAC地址,这个时候就需要映射IP和MAC。 ARP之简单请求应答 ​ 当两台计算机在同一个局域网通信,我们以ping命令为例,该命令使用的ICMP协议 PC1依据OSI模型①依次从上至下对数据进行封装,包括对ICMP Date加IP包头的封装,但是到了封装MAC地址的时候,②PC1首先查询自己的ARP缓存表,发现没有IP2和他的MAC地址的映射,这个时候MAC数据帧封装失败。我们使用ping命令的时候,是指定PC2的IP2的,计算机是知道目的主机的IP地址,能够完成网络层的数据封装,因为设备通信还需要对方的MAC地址,但是PC1的缓存表里没有,所以在MAC封装的时候填入不了目的MAC地址。 那么PC1为了获取PC2的MAC地址,③PC1要发送询问信息,询问PC2的MAC地址,询问信息包括PC1的IP和MAC地址、PC2的IP地址,这里我们想到一个问题,即使是询问信息,也是需要进行MAC数据帧的封装,那这个询问信息的目的MAC地址填什么呢,规定当目的MAC地址为ff-ff-ff-ff-ff-ff时,就代表这是一个询问信息,也即使后面我要说的广播。 PC2收到这个询问信息后,将这里面的IP1和MAC1(PC1的IP和MAC)添加到本地的ARP缓存表中,然后④PC2发送应答信息,对数据进行IP和MAC的封装,发送给PC1,因为缓存表里已经有PC1的IP和MAC的映射了呢。这个应答信息包含PC2的IP2和MAC2。PC1收到这个应答信息,理所应当的就获取了PC2的MAC地址,并添加到自己的缓存表中。 经过这样交互式的一问一答,PC1和PC2都获得了对方的MAC地址,值得注意的是,目的主机先完成ARP缓存,然后才是源主机完成ARP缓存。之后PC1和PC2就可以真正交流了。 ARP之广播请求单播回应 ​ 上图面的图解是不完全的ARP协议,因为在局域网里边不会只有两台主机,这里就要考虑如何在局域网众多主机里获得目的主机的MAC。 和上面的一样,刚开始PC1并不知道PC2的MAC地址,同样需要发送ARP请求,但是这个局域网里主机很多,怎么唯独获取PC2的MAC呢,①我们想到和一群陌生人交流一样,可以挨着询问一遍,这就是我们要说的广播,首先PC1广播发送询问信息(信息和上一张图介绍的一样),在这个普通交换机上连接的设备都会受到这个PC1发送的询问信息。 接下来②需要做的是,所有在这个交换机上的设备需要判断此询问信息,如果各自的IP和要询问的IP不一致,则丢弃,如图PC3、Route均丢弃该询问信息,而对于PC2判断该询问信息发现满足一致的要求,则接受,同样的写入PC1的IP和MAC到自己的ARP映射表中。 最后,③PC2单播发送应答信息给PC1,告诉PC1自己的IP和MAC地址。 二、ARP数据包信息 ARP数据的详细信息列表如下 Hardware type 硬件类型,标识链路层协议 Protocol type 协议类型,标识网络层协议 Hardware size 硬件地址大小,标识MAC地址长度,这里是6个字节(48bit) Protocol size 协议地址大小,标识IP地址长度,这里是4个字节(32bit) Opcode 操作代码,标识ARP数据包类型,1表示请求,2表示回应 Sender MAC address 发送者MAC Sender IP address 发送者IP Target MAC address 目标MAC,此处全0表示在请求 Target IP address 目标IP ARP请求包 ARP应答包 内容格式和上图相似,不过会有目的地址对应的MAC地址,ARP数据包类型字段为2。 ...

May 13, 2018

Underfitting and Overfitting

[TOC] 1. underfitting and overfitting 我们利用多项式回归获得更加准确的拟合曲线,实现了对训练数据更好的拟合。然而,我们也发现,过渡地对训练数据拟合也会丢失信息规律。看两个概念: 欠拟合(underfitting):拟合程度不高,数据距离拟合曲线较远,如下左图所示。 过拟合(overfitting):过度拟合,貌似拟合几乎每一个数据,但是丢失了信息规律,如下右图所示,房价随着房屋面积的增加反而降低了。 我们有如下策略来解决过拟合问题: 减少特征数,显然这只是权宜之计,因为特征意味着信息,放弃特征也就等同于丢弃信息,要知道,特征的获取往往也是艰苦卓绝的。 不放弃特征,而是拉伸曲线使之更加平滑以解决过拟合问题,为了拉伸曲线,也就要弱化一些高阶项(曲线曲折的罪魁祸首)。由于高阶项中的特征 x 无法更改,因此特征是无法弱化的,我们能弱化的只有高阶项中的系数 θi。我们把这种弱化称之为是对参数 θ 的惩罚(penalize)。**Regularization(正规化)**正是完成这样一种惩罚的“侩子手”。 如下例所示,我们将 θ3 及 θ4 减小(惩罚)到趋近于 0,原本过拟合的曲线就变得更加平滑,趋近于一条二次曲线(在本例中,二次曲线显然更能反映住房面积和房价的关系),也就能够更好的根据住房面积来预测房价。要知道,预测才是我们的最终目的,而非拟合。 2. Regularized Linear Regression 在线性回归中,我们的预测代价如下评估: $$J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2$$ 为了在最小化 J(θ) 的过程中,也能尽可能使 $θ$ 变小,我们将上式更改为: $$\begin{align*} J(\theta) &= \frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum\limits_{i=1}^{n}\theta_j^2 \ &= \frac{1}{2m}(X\theta-y)^T(X\theta-y)+\lambda\sum\limits_{i=1}^{n}\theta_j^2 \end{align*}$$ 其中,参数 λ 主要是完成以下两个任务: 保证对数据的拟合良好 保证 $θ$ 足够小,避免过拟合问题。 λ 越大,要使 $J(θ)$ 变小,惩罚力度就要变大,这样 θ 会被惩罚得越惨(越小),即要避免过拟合,我们显然应当增大 λλ 的值。 那么,梯度下降也发生相应变化: $$\begin{align*} \theta_0 &=\theta_0-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)} \ \theta_j &=\theta_j-\alpha\big(\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\lambda}{m}\theta_j\big) \quad (1) \ \mbox {即:}& \ \theta &= \theta-\alpha*(\frac{1}{m} X^T(y-X\theta) + \frac{\lambda}{m}\theta_{j}) \quad j \neq 0 \end{align*}$$ ...

May 10, 2018

Logistic Regression

[TOC] 1. Classification and Representation 使用线性回归来处理 0/1 分类问题总是困难重重的,如下两图,在第一幅图中,拟合曲线成功的区分了 0、1 两类,在第二幅图中,如果我们新增了一个输入(右上的 X 所示),此时拟合曲线发生变化,由第一幅图中的紫色线旋转到第二幅图的蓝色线,导致本应被视作 1 类的 X 被误分为了 0 类: 因此,人们定义了逻辑回归来完成 0/1 分类问题。 1.1 sigmoid 用线性回归预测函数hθ(x)来处理回归问题不太有效,特别对于0/1分类问题。新的逻辑回归预测函数 g(z) 称之为 Sigmoid Function,亦称 Logic Function,其函数图像如下: 预测函数hθ(x) 被很好地限制在0、1之间。阈值为 0.5,大于则为 1 类,反之为 0 类。函数曲线过渡光滑自然。 1.2 Decision Boundary 决策边界,顾名思义,就是用来划清界限的边界,边界的形态可以不定,可以是点,可以是线,也可以是平面。Andrew Ng 在公开课中强调:“决策边界是预测函数 hθ(x)hθ(x) 的属性,而不是训练集属性”,这是因为能作出“划清”类间界限的只有 hθ(x),而训练集只是用来训练和调节参数的。 线性决策边界: 非线性决策边界: 2. Logistic Regression Model 2.1 Cost Function 当y=0时: 当y=1时: 可以看到,当 hθ(x)≈y 时,cost≈0,预测正确。 ...

May 3, 2018

Programming Exercise 1 Linear Regression

[TOC] 1. Introduction 任务所要用到的文件 Files included in this exercise ex1.m - Octave/MATLAB script that steps you through the exercise ex1 multi.m - Octave/MATLAB script for the later parts of the exercise ex1data1.txt - Dataset for linear regression with one variable ex1data2.txt - Dataset for linear regression with multiple variables submit.m - Submission script that sends your solutions to our servers [?] warmUpExercise.m - Simple example function in Octave/MATLAB [?] plotData.m - Function to display the dataset [?] computeCost.m - Function to compute the cost of linear regression [?] gradientDescent.m - Function to run gradient descent [†] computeCostMulti.m - Cost function for multiple variables [†] gradientDescentMulti.m - Gradient descent for multiple variables [†] featureNormalize.m - Function to normalize features [†] normalEqn.m - Function to compute the normal equations ? indicates files you will need to complete † indicates optional exercises ...

April 25, 2018

Linear Regression with Multiple Variables (week2)

[TOC] Multiple Features 多个特征的数据 对于线性回归: 其中:X0 = 1 Gradient Descent for Multiple Variables 对于m个样本,n个特征的, Feature Scaling 对训练数据进行特征缩放可以加快训练速度。 有两种帮助的技术是特征缩放和均值归一化。特征缩放涉及将输入值除以输入变量的范围(即最大值减去最小值),从而产生仅1的新范围。均值归一化涉及从该值中减去输入变量的平均值。输入变量导致输入变量的新平均值仅为零。要实现这两种技术,请调整输入值,如下面的公式所示: Features and Polynomial Regression 特征和多项式回归不一样,We can improve our features and the form of our hypothesis function in a couple different ways. 可以通过组合特征生成新的特征,We can combine multiple features into one. For example, we can combine x_1 and x_2 into a new feature x_3 by taking x_1⋅x_2. 可以通过取平方,立方,平方根等方法增加多项式,We can change the behavior or curve of our hypothesis function by making it a quadratic, cubic or square root function (or any other form). ...

April 20, 2018

model and cost function (week1)

[TOC] 1.Model Representation 定义:给定一个训练数据集,学习一个函数作为预测器(假设函数hypothesis),这个预测器就是模型。 given a training set, to learn a function h : X → Y so that h(x) is a “good” predictor for the corresponding value of y. this function h is called a hypothesis. 2.Cost Function 损失函数 定义:用来衡量假设函数的准确性。 对给定的输入x,用预测值(h(x)和真实值y的函数f(h(x), y) 计算得,不同的数据和模型有不同的函数。如果预测结果和真实值越接近,则说明模型学习的越好。如下例子: 不同的模型参数theta得到不同的模型,对应的损失函数值也不同,通过最小化损失函数来寻找最好的模型。 对于不同的模型,拥有不同的损失函数曲线图,等高线上面的损失值是相等的,虽然模型参数值可能不同。 3.Gradient Descent 梯度下降:每个模型有对应的模型参数,损失函数用来衡量模型与数据之间的匹配程度。为了让模型更加的匹配数据,需要对模型参数进行调整,而梯度下降是一种更新模型参数的方法。 注意:在更新参数的时候,计算偏导数 Partial derivative 的时候,使用的是本轮迭代参数更新之前的参数,而不是前面更新了参数,立马在后面的求偏导数中使用更新的参数计算。 对于学习率的选择: Gradient Descent For Linear Regression 看公式: ...

April 13, 2018

octave安装和基本使用

[TOC] Octabe install 推荐 使用Octave安装包安装. On Ubuntu, you can use: sudo apt-get update && sudo apt-get install octave On Fedora, you can use: sudo yum install octave-forge Octave 使用 官方文档 GNU Octave, version 4.2.2 Copyright (C) 2018 John W. Eaton and others. Octave was configured for "x86_64-pc-linux-gnu". ... For more information, visit http://www.octave.org/get-involved.html >> 1 ==2 ans = 0 >> 1~=2 ans = 1 # 9x9 随机 0~1 >> rand(9,9) ans = 0.3560386 0.4607871 0.8059847 0.2042094 0.2411058 0.9311803 0.8023873 0.8208079 0.9631931 0.4604231 0.0222901 0.6693275 0.5887816 0.0076518 0.1670580 0.6335819 0.1711659 0.1405882 0.0519485 0.3400714 0.2909762 0.3687556 0.7300303 0.3436051 0.1679526 0.2550348 0.0342722 0.9379501 0.7760394 0.0859048 0.3292712 0.2385854 0.8567406 0.2433711 0.8027390 0.4103872 0.8297066 0.5138018 0.3540072 0.7688630 0.7550758 0.0676738 0.3528168 0.5365513 0.8800598 0.3350162 0.8376844 0.7863446 0.6448189 0.1355422 0.0235755 0.2975952 0.2879286 0.8854084 0.2484960 0.2086548 0.4821656 0.5838678 0.2676164 0.8016253 0.5552146 0.2787187 0.7647289 0.7559019 0.2639478 0.4199944 0.5312557 0.5202589 0.7852354 0.5681352 0.1088001 0.6572705 0.9477478 0.4998028 0.4179308 0.0513819 0.8775790 0.5860457 0.3993368 0.3765168 0.2140254 >> ones(9,9) ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 >> W = zeros(9,9); >> W W = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> rand(1, 2) ans = 0.76409 0.77792 >> sqrt(9) ans = 3 >> A = rand(1, 100000); >> hist(A, 20) ...

April 10, 2018

nvidia jetson TX2 刷机

[TOC] TX2 出厂时,已经自带了 Ubuntu 16.04 系统,可以直接启动。但一般我们会选择刷机,目的是更新到最新的 JetPack L4T,并自动安装最新的驱动、CUDA Toolkit、cuDNN、TensorRT。 刷机注意以下几点: 开发板刷机过程全程联网 除了Jetson TX2之外,您还需要另一台带有Intel或AMD x86处理器的台式机或笔记本电脑。(所以自己要是win电脑,要安装VMware 虚拟机,并在虚拟机上安装Ubuntu 的操作系统,我安装的是Ubuntu -16.04.3 64 位) 这些类型的机器通常被称为PC的个人电脑。该计算机被称为烧录过程的主机。 JetPack是一个x86二进制文件,不能在基于ARM的机器上运行。 先推荐一个国外刷机技术视频:https://v.qq.com/x/page/b0515967lbr.html 这个视频挺好,虽然是JetPack 3.0刷机,但步骤一模一样。跟着他的步骤刷机就可以,不过有些地方可能不够详细,可以自己先看一遍,有个大致印象。 1. 从官网下载JetPack3.1 下载地址为jetpack, 理论上此处下载需要NVIDIA的帐号。 安装JetPack3.1 现在把刚下载的软件包上传的虚拟机中Ubuntu主机中,可以通过共享文件夹的形式,将JetPack3.1从win电脑copy到vmware虚拟机中的ununtu,这个方法大家可以网上搜下,这里不做赘述。 然后在虚拟机上,终端定位到Jetpack3.1所在文件夹 更改执行权限: $ chmod +x ./JetPack-L4T-3.1-linux-x64.run 执行安装 $ sudo ./JetPack-L4T-3.1-linux-x64.run 然后进入了软件界面, 选择板子 随后进入了component manager界面,如图所示: 成功后,就要下载各种包了 连接方式

April 7, 2018

Prometheus简介

[TOC] 1、Prometheus介绍和架构 1.1 Prometheus介绍 Prometheus是一个开源的系统监视和警报工具包,自2012成立以来,许多公司和组织采用了Prometheus。它现在是一个独立的开源项目,并独立于任何公司维护。在2016年,Prometheus加入云计算基金会作为Kubernetes之后的第二托管项目。 1.1.1 Prometheus的关键特性 由度量名和键值对标识的时间序列数据的多维数据模型 灵活的查询语言 不依赖于分布式存储;单服务器节点是自治的 通过HTTP上的拉模型实现时间序列收集 通过中间网关支持推送时间序列 通过服务发现或静态配置发现目标 图形和仪表板支持的多种模式 1.1.2 Prometheus的组件: 如上图,Prometheus主要由以下部分组成: Prometheus Server:用于抓取和存储时间序列化数据 Exporters:主动拉取数据的插件 Pushgateway:被动拉取数据的插件 Altermanager:告警发送模块 Prometheus web UI:界面化,也包含结合Grafana进行数据展示或告警发送 prometheus本身是一个以进程方式启动,之后以多进程和多线程实现监控数据收集、计算、查询、更新、存储的这样一个C/S模型运行模式。 1.1.3 Prometheus的整体架构 Prometheus从jobs获取度量数据,也直接或通过推送网关获取临时jobs的度量数据。它在本地存储所有被获取的样本,并在这些数据运行规则,对现有数据进行聚合和记录新的时间序列,或生成警报。通过Grafana或其他API消费者,可以可视化的查看收集到的数据。下图显示了Pometheus的整体架构和生态组件: Prometheus的整体工作流程: 1)Prometheus 服务器定期从配置好的 jobs 或者 exporters 中获取度量数据;通过推送网关获取临时jobs的度量数据. -Retrieval 负责获取 2)Prometheus 服务器在本地存储收集到的度量数据,并对这些数据进行聚合;- 由TSDB负责存储 3)运行已定义好的 alert.rules,记录新的时间序列或者向告警管理器推送警报。 4)告警管理器根据配置文件,对接收到的警报进行处理,并通过email等途径发出告警。 5)Grafana等图形工具获取到监控数据,并以图形化的方式进行展示。 1.2 Prometheus关键概念 1.2.1 数据模型 Prometheus从根本上将所有数据存储为时间序列:属于相同度量标准和同一组标注尺寸的时间戳值流。除了存储的时间序列之外,普罗米修斯可能会生成临时派生时间序列作为查询的结果。 度量名称和标签:每个时间序列都是由度量标准名称和一组键值对(也称为标签)组成唯一标识。 度量名称指定被测量的系统的特征(例如:http_requests_total-接收到的HTTP请求的总数)。它可以包含ASCII字母和数字,以及下划线和冒号。它必须匹配正则表达式[a-zA-Z_:][a-zA-Z0-9_:]。 标签启用Prometheus的维度数据模型:对于相同度量标准名称,任何给定的标签组合都标识该度量标准的特定维度实例。查询语言允许基于这些维度进行筛选和聚合。更改任何标签值(包括添加或删除标签)都会创建新的时间序列。标签名称可能包含ASCII字母,数字以及下划线。他们必须匹配正则表达式[a-zA-Z_][a-zA-Z0-9_]*。以__开始的标签名称保留给供内部使用。 样本:实际的时间序列,每个序列包括:一个 float64 的值和一个毫秒级的时间戳。 **格式:**给定度量标准名称和一组标签,时间序列通常使用以下格式来标识: <metric name>{<label name>=<label value>, ...} 例如,时间序列的度量名称为api_http_requests_total,标签method=”POST”和handler=”/messages”,则标记为: api_http_requests_total{method="POST", handler="/messages"} 如下,是在进行数据收集后,在Prometheus中的data目录的数据 # tree . ├── 01EHSWYREVQ296VKWT5MAJEX90 │ ├── chunks │ │ └── 000001 │ ├── index │ ├── meta.json │ └── tombstones ├── 01EHTAP73QPZY1VH6C2K9GHG6H │ ├── chunks │ │ └── 000001 │ ├── index │ ├── meta.json │ └── tombstones ... ├── chunks_head │ ├── 000009 │ └── 000010 ├── index.html ├── lock ├── queries.active └── wal ├── 00000006 ├── 00000007 ├── 00000008 ├── 00000009 └── checkpoint.00000005 └── 00000000 prometheus采用time-series(时间序列)方式,存储在本地硬盘 ...

March 28, 2018

horovod

[TOC] 官方介绍 Horovod is a distributed training framework for TensorFlow, Keras, and PyTorch. The goal of Horovod is to make distributed Deep Learning fast and easy to use. 官方测试效果 Running Horovod The example commands below show how to run distributed training. See the Running Horovod page for more instructions, including RoCE/InfiniBand tweaks and tips for dealing with hangs. 1. 单机4卡: # docker nvidia-docker run -it 172.16.10.10:5000/horovod:0.12.1-tf1.8.0-py3.5 mpirun -np 4 -H localhost:4 python keras_mnist_advanced.py # singularity singularity shell --nv /scratch/containers/ubuntu.simg mpirun -np 4 -H localhost:4 python keras_mnist_advanced.py 2. 多机多卡: $ mpirun -np 16 \ -H server1:4,server2:4,server3:4,server4:4 \ ... python train.py 3. 完整 Docker 使用horovod ​ ...

March 10, 2018