主页

CSS Flex

2022-01-04
前端

flexbox的轴线 #

  • 使用flex布局时,flex有两根轴线:主轴和交叉轴,主轴由flex-direction定义,另一根轴垂直于它。

主轴 #

  • 主轴由flex-direction定义,有四个值:
    • row
    • row-reverse
    • column
    • column-reverse
  • 当选择了row或者row-reverse,主轴将沿着水平方向延伸。

  • 当选择了column或者column-reverse,主轴就会沿着上下方向延伸。

交叉轴 #

  • 交叉轴始终垂直于主轴。

起始线和终止线 #

  • 如果flex-direction是row,那么主轴的起始线是左边,终止线是右边。

flex容器 #

  • 采用了flexbox的区域就叫做flex容器,通过将一个标签的display属性改为flexinline-flex来创建一个flex容器,这样容器内的直系子元素就会变成flex元素。所有的css属性都会有一个初始行为(假设元素未设置width、height、margin等属性):
    • 元素排列成一行(flex-direction属性的初始值为row)。
    • 元素从主轴线的起始线开始。
    • 元素不会在主轴方向不会被拉伸,但可能会缩小。
    • 元素会被拉伸来填充交叉轴的大小。
    • flex-basis的属性为auto。
    • flex-wrap属性为nowrap。

flex-wrap实现多行flex容器 #

  • 当项目太大而无法全部显示在一行中,添加flex-wrap:wrap,项目就会换行显示。这样每一行都相当于是一个新的flex容器,在该行上发生的空间分布不会影响其他行。
  • flew-wrap设置为unwrap,所有的flex元素都不会换行,它们将缩小以适配容器。如果项目的子元素无法缩小,使用nowrap会导致溢出。

flex-flow #

  • flex-directionflex-wrap可以组合简写为属性flex-flow第一个值为flex-direction,第二个值为flex-wrap。如flex-flow: row wrap

align-items #

  • align-items设置元素在交叉轴方向上对齐,默认值为stretch
  • 相应的值:
    • stretch 拉伸以贴到交叉轴的起始线和终止线。
    • flex-start 贴着交叉轴的起始线。
    • flex-end 贴着交叉轴的终止线。
    • center 交叉轴方向上居中。
    • baseline

图中flex-direction: row

justify-content #

  • justify-content属性用来使元素在主轴方向上对齐,默认值是flex-start
  • 相应的值:
    • stretch
    • flex-start 沿着主轴的起始线对齐。
    • flex-end 沿着主轴的终止线对齐。
    • center 主轴方向上居中
    • space-around 使每个元素的左右空间相等,第一个和最后一个元素距离起始线和终止线的距离是其他元素间隔的1/2。
    • space-between 使每个元素的左右空间相等,第一个和最后一个元素贴上起始线和终止线。

图中flex-direction: row

flex元素 #

  • flex容器里除了元素所占的空间以外的空间就是可用空间

flex-basis #

  • flex-basis定义了该元素的空间大小,该属性的默认值是元素内容的尺寸(auto)。

flex-grow #

  • 处理flex元素在主轴上增加空间的问题。

  • 该值被设定为一个正数时,flex会以flex-basis为基础,按照比例沿着主轴方向扩展尺寸。

  • 当给flex中所有的元素设定flex-grow为1时,容器中的可用空间会被这些元素平分,他们会延展以填充主轴方向上的空间。

flex-shrink #

  • 处理flex元素在主轴上收缩的问题。
  • 如果容器中没有足够排列flex元素的空间,就可以设置flex-shrink属性为正整数来缩小它占用的空间到flex-shrink以下。
  • 给flex-shrink属性更大的数值可以比赋值小数值的同级元素收缩程度更大。

flex属性的简写 #

  • flex-grow、flex-shrink、flex-basis可以简写为flex,顺序也是flex-grow、flex-shrink、flex-basis
  • flex有预定义的简写形式:
    • flex:initial 相当于flex: 0 1 autoflex-grow的值为0,所以flex元素不会超过他们的flex-basis尺寸,flex-shrink为1,可以缩小flex元素来防止他们溢出。
    • flex: auto 相当于flex: 1 1 auto,和上面的flex: initial基本相同,但是flex元素在需要的时候既可以拉伸也可以伸缩。
    • flex: none 相当于flex: 0 0 auto,元素既不能拉伸也不能收缩。
    • flex: 1flex: 2 相当于flex: 1 1 0

align-self #

  • align-self设置元素在交叉轴方向上的排列方式,会覆盖已有的align-items元素。
  • 值:
    • auto设置为父元素的align-items的值
    • stretch 拉伸贴上交叉轴的起始线和终止线。
    • center 交叉轴方向上居中。
    • flex-start 贴上交叉轴起始线。
    • flex-end 贴上交叉轴终止线。

参考链接: flex 布局的基本概念 - CSS(层叠样式表) | MDN (mozilla.org)

参考链接: Flex 布局教程:语法篇 - 阮一峰的网络日志 (ruanyifeng.com)

Hugo模板

2022-01-03
其他

  • hugo使用go的"html/template"和"text/template"库作为模板的基础。

  • go模板是添加了变量和函数的html文件。他们都被包裹在{{}}中。

  • 一个预定义的变量可以是已存在在当前的作用域中或者是一个自定义的变量。

  • 多个函数的参数可以使用空格分开,类似与{{ add 1 2 }}(add函数接收1和2这两个参数)。

  • 方法和函数可以通过.来访问访问。如获取在文章front matter中定义的bar{{ .Params.bar }}

  • 圆括号可以用来将items组合在一起{{ if or (isset .Params "alt") (isset .Params "caption") }} Caption {{ end }}

  • 原始字符可以包含换行。

变量 #

  • 在hugo中,每个模板都有一个Page对象,.Title是Page的一个元素之一。当Page是模板的默认作用域时,title可以通过.直接来带哦用{{.Title }}
  • 自定义变量需要有$前缀。
  • 变量可以存储在自定义变量中并在稍后被引用。
{{ $address := "123 Main St."}}
{{ $address }}
  • 变量可以使用=来重新定义。
{{ $var := "Hugo Page" }}
{{ if .IsHome }}
    {{ $var = "Hogo Home" }}
{{ end }}
Var is {{ $var }}

函数 #

  • go模板只提供了一些基本的函数,但也提供了扩展原始集的机制。
  • 调用函数使用他们的名字跟上需要的参数,参数需要用空格隔开。
{{ add 1 2 }}
<!--数字求和,输出3-->
{{ lt 1 2 }}
<!--比较大小,输出true-->

includes #

  • 一个模板中包含另一个模板。
  • hugo中的模板位置都是在layouts/目录开始。
  • partial函数用来包含部分模板
<!--包含layouts/partials/header.html-->
{{ partial "header.html" . }}
  • template函数用来在老版本的hugo中包含模板和用来调用内部模板。
{{ template "_indernal/opengraph.html" . }}

logic #

  • 使用range来进行迭代。
{{ range $array }}
    <!--.代表$aray的一个元素-->
    {{ . }}
{{ end }}


<!--将数组的元素的值赋值给变量-->
{{ range $elem_val := $array }}
    {{ $elem_val }}
{{ end }}

<!--将数组的元素的下标和值都复制给变量-->
{{ range $elem_index, $elem_val := $array }}
   {{ $elem_index }} -- {{ $elem_val }}
{{ end }}

snmp

2021-12-22
linux

snmpd.conf #

#建立一个从community到security name的映射,source可以是default、一个IP、一个主机名、或者一个子网(如10.10.10.0/24),source以!开头表示拒绝此source的请求。
com2sec -[-Cn CONTEXT] SECNAME SOURCE COMMUNITY

#建立从security name到group的一个映射,多个group指令可以指定相同的group名,
group GROUP {v1|v2c|usm|tsm|ksm} SECNAME

#定义一个view name,type可以是included或者excluded。
view VNAME TYPE OID [MASK]

#建立一个从group到三个view之一的映射,
#LEVEL是noauth、auth或priv之一
#PREFX指定CONTEXT如何被请求匹配,可以是exact、prefix
#READ和WRITE指定用于GET、SET和TRAP/INFORM 请求的view。
access GROUP CONTEXT {any|v1|v2c|usm|tsm|ksm} LEVEL PREFX READ WRITE NOTIFY

连接命令

#-v版本 -c community
snmpwalk -c nsag -v2c 10.0.1.81 1.3.6.1.2.1.1.1.0

vue

2021-12-11
前端

  • 每个vue应用都是通过createApp函数创建一个新的应用实例开始的。

模板语法和指令 #

  • Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层组件实例的数据。

插值{{ msg }} #

  • {{msg}}会被替代为对应组件实例中 msg 的值。当绑定的组件实例上 msg 发生了改变,插值处的内容都会更新。
<span>{{ msg }}</span>
  • 通过使用 v-once 指令,也能执行一次性地插值,当数据改变时,插值处的内容不会更新。
<span v-once>{{ msg }}</span>

v-html #

  • 双大括号会将数据解释为普通文本,为了输出真正的 HTML,需要使用v-html 指令。
<div id="example1">
    <p>{{ rawHtml }}</p>
    <span v-html="rawHtml"></span>
</div>

<script>
const RenderHtmlApp = {
  data() {
    return {
      rawHtml: '<span style="color: red">This should be red.</span>'
    }
  }
}
Vue.createApp(RenderHtmlApp).mount('#example1')
</script>

v-bind #

  • v-bind可以动态的设置标签的属性。
<div v-bind:id="dynamicId"></div>
<!--等同于-->
<div :id="dynamicId"></div>
  • 如果绑定的值是 nullundefined,那么该 attribute 将不会被包含在渲染的元素上。

动态参数 #

<a v-bind:[attributeName]="url"> ... </a>
  • 这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值。如果组件实例有一个 data property attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href
  • 动态参数预期会求出一个字符串,null 例外, null 值可以用于显式地移除绑定。任何其它非字符串类型的值都将会触发一个警告。
  • 需要避免使用大写字符来命名键名,因为浏览器会把 attribute 名全部强制转为小写。

JavaScript 表达式 #

  • Vue.js 提供了完全的 JavaScript 表达式支持。
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id"></div>

v-on #

  • v-on 指令,它用于监听 DOM 事件。
  • 修饰符 (modifier) 是以 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()
<a v-on:click="doSomething"> ... </a>
<!--等同于-->
<a @click="doSomething"> ... </a>

<form v-on:submit.prevent="onSubmit">...</form>

<!-- 只有在key是Enter时调用submit()方法-->
<input @keyup.enter="submit" />

v-if #

  • 可以配合v-elsev-else-if使用。
  • v-if是真正的条件渲染,在切换的过程中,子组件会被销毁和重建。
  • 不推荐v-if和v-for一起使用。v-if比v-for有更高的优先级。
<!--条件为真时才被渲染-->
<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

v-show #

  • 只是修改元素的display为none。
<h1 v-show="ok">Hello!</h1>

v-for #

  • 用来遍历数组和对象
<!--遍历数组-->
<ul id="array-rendering">
  <li v-for="item in items">
     <!--items: [{ message: 'Foo' }, { message: 'Bar' }]-->
    {{ item.message }}
  </li>
</ul>

<!--遍历对象-->
<li v-for="(value, name) in myObject">
  {{ name }}: {{ value }}
</li>

<!--把模板重复10次数-->
<div id="range" class="demo">
  <span v-for="n in 10" :key="n">{{ n }} </span>
</div>

v-model #

  • v-model 指令在表单 <input><textarea><select> 元素上创建双向数据绑定。
  • v-model 会忽略表单元素的 valuecheckedselected 属性的初始值,可以在data中声明初始值。
  • 多个复选框可以绑定到一个数组上。
  • 自动过滤用户输入的首尾空白字符,可以给v-model添加trim<input v-model.trim="msg" />

data属性 #

  • 组件的 data 选项是一个函数,Vue 会在创建新组件实例的过程中调用此函数。它应该返回一个对象,然后 Vue 会通过响应性系统将其包裹起来,并以 $data 的形式存储在组件实例中。为了方便,该对象的任何顶级 property 也会直接通过组件实例暴露出来。
const app = Vue.createApp({
  data() {
    return { count: 4 }
  }
})

const vm = app.mount('#app')

console.log(vm.$data.count) // => 4
console.log(vm.count)       // => 4

// 修改 vm.count 的值也会更新 $data.count
vm.count = 5
vm.$data.count = 6
  • 这些实例 property 仅在实例首次创建时被添加,所以你需要确保它们都在 data 函数返回的对象中。必要时,要对尚未提供所需值的 property 使用 nullundefined 或其他占位的值。

methods #

  • methods 选项向组件实例添加方法。
const app = Vue.createApp({
  data() {
    return { count: 4 }
  },
  methods: {
    increment() {
      // `this` 指向该组件实例
      this.count++
    }
  }
})

const vm = app.mount('#app')
console.log(vm.count) // => 4
vm.increment()
console.log(vm.count) // => 5
  • 在定义 methods 时应避免使用箭头函数,因为这会阻止 Vue 绑定恰当的 this 指向。
  • 这些 methods 和组件实例的其它所有 property 一样可以在组件的模板中被访问。在模板中,它们通常被当做事件监听使用。
<!--点击 <button> 时,会调用 increment 方法。-->
<button @click="increment">Up vote</button>

class和style的绑定 #

class #

<!--isActive为true或false决定了是否应用此样式-->
<div :class="{ active: isActive }"></div>

<!--class可以和:class共存:class中可以添加多个字段-->
<div class="static" :class="{ active: isActive, 'text-danger': hasError }"></div>

<!--绑定的数据对象可以在data中定义-->
<div :class="classObject"></div>
data() {
  return {
    classObject: {
      active: true,
      'text-danger': false
    }
  }
}

<!--可以传递一个数组-->
<div :class="[{ active: isActive }, errorClass]"></div>
data() {
  return {
    isActive: true
    errorClass: 'text-danger'
  }
}

style #

<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data() {
  return {
    activeColor: 'red',
    fontSize: 30
  }
}

<!--直接绑定一个样式对象-->
<div :style="styleObject"></div>
data() {
  return {
    styleObject: {
      color: 'red',
      fontSize: '13px'
    }
  }
}

<!--将多个样式对象以数组的形式应用到一个元素上-->
<div :style="[baseStyles, overridingStyles]"></div>

链路层

2021-11-24
计算机网络

概述 #

  • 链路层有两种不同类型的链路层信道,第一种是广播信道,因为许多主机与相同的广播信道相连,需要使用媒体访问协议来协调传输帧。第二种类型是点对点通信联络,由链路一端的单个发送方和链路另一端的单个接收方组成,许多链路层协议都是为点对点链路设计的,如点对点协议(PPP)和高级数据链路控制(HDLC)。
  • 媒体访问控制协议(MAC)规定了帧在链路上传输的规则,对于在链路的一端只有一个发送方,链路的另一端仅有一个接收方的点对点链路,MAC协议比较简单,任何时刻发送方都能发送帧;当多个节点共享单个广播链路时,MAC协议需要协调多个节点的帧传输。
  • 链路层的主体部分是在网络适配器中(也叫网络接口卡Network Interface Card NIC)实现,链路层控制器的很多功能使用硬件实现。
  • 在发送端,控制器取得了由协议栈高层生成并存储在主机内存的数据报,在链路层帧中封装该数据报,然后遵循协议将该帧传入到链路中;在接收端接收整个帧,抽出网络层数据包,如果链路层执行差错检测,则需要发宋控制器在该帧的首部设置差错检测比特,由接收控制器执行差错检测。

CRC校验 #

  • Cyclic Redundancy Check循环冗余检测。

  • 原理是

    1. 发送方和接收方先协商个数G,接收方在发送的数据D后添加数据R,使得DR(如D为11011101,R为1100,则DR为110111011100)能被G整除。并要求G的最左边位置为1,G比R多一位。
    2. 接收方收到数据后,用G除以DR’,如果余数为0,则数据正确,否则数据错误。
    3. R可以通过G和D计算,计算方法如下:

多路访问协议 #

  • 广播信道中的所有节点都能传输帧,这可能会导致碰撞,通常当碰撞发生时,没有一个节点能有效地获得任何传输的帧。为了确保广播信道能执行有用的工作,需要使用某种方式来协调节点的数据传输。
  • 时隙ALOHA:
    • 所有的帧由L比特组成,事件被划分为L/R秒的时隙;一个时隙等于传输一帧的时间;节点只在时隙起点开始传输帧;
    • 当节点有一个新的帧要发送时,他等到下一个时隙开始传输整个帧;
    • 如果没有碰撞,该节点成功传输它的帧。
    • 如果有碰撞,该节点检测到这次碰撞,并在后续中该节点以概率p(0<p<1)在每个时隙中重传他的帧,直到该帧被传输出去。
  • 具有碰撞检测的载波侦听多路访问协议(CSMA/CD)是指一个节点在传输前先监听信道,当存在其他节点正在信道上传输帧时,节点等待直到检测到没有数据传输时才开始传输;节点传输时会一直侦听信道,当它检测到另一个节点也在传输帧时,它就停止传输,并等待一个时间后重新传输。
  • CSMA/CD等待的时间使用的是二进制指数后退算法,该算法如下:当传输一个帧是,在该帧尽力了一连串的n次碰撞后,节点随机地从[0, 1, 2, …, 2 n-1]中选择一个K值。

MAC地址 #

  • 并不是主机具有链路层地址,而是他们的网络接口具有链路层地址;具有多个网络接口的主机具有多个链路层地址。
  • 链路层交换机的任务是在主机和路由器之间承载数据报,主机或者路由器不必明确的将帧发送到交换机。
  • MAC地址共248位,通常采用十六进制表示,如1A-23-F9-CD-06-9B。
  • 当某些适配器向目的适配器发送一个帧时,发送适配器将目的适配器的MAC地址插入到该帧中, 并将该帧发送到局域网上。
  • 有一个特殊的MAC广播地址,FF-FF-FF-FF-FF-FF,适用于发送适配器需要让其他局域网上的其他适配器接收并处理它发送的帧。

ARP #

  • Address Resolution Protocol,地址解析协议。
  • ARP为在同一个子网上的主机和路由器接口解析IP地址,获得MAC地址。
  • 每台主机或路由器中都有一个ARP表,包含了IP地址到MAC地址的映射关系。该表也包含了一个TTL,表示从表中删除映射的时间。通常的过期时间是20分钟。
  • ARP的处理流程如下:
    • A主机向子网中广播一个ARP分组,该分组中包含源和目的IP地址,源MAC地址,目的MAC地址为FF-FF-FF-FF-FF-FF。
    • 由于是广播地址,每个适配器都将该帧中的ARP分组向上传递给ARP模块,ARP模块检查它的IP地址是否和ARP分组中的目的IP地址是否匹配。
    • 如果匹配,将向A主机发送一个带有A主机需要的目的MAC地址的ARP分组。
    • A主机更新他的ARP表。

以太网 #

  • 早期使用总线拓扑的以太网是一种广播局域网,即所有传输的帧都会被该总线上所有的适配器处理。
  • 集线器(hub)是一种物理层设备,作用与各个比特,当一个0或1的比特到达一个接口时,集线器只会重新生成这个比特,将其能量强度放大,并向其他的所有接口传输出去。采用基于集线器的星形拓扑的以太网实际上也是一个广播局域网。当某集线器同时从两个不同的接口接收到帧时,将出现一次碰撞。
  • 交换机(switch)是链路层设备,使用交换机的以太网安装采用星形拓扑,交换机不仅是无碰撞的,也是“存储-转发”。

以太网帧格式 #

  • 前导字段前7个字节是用来确定一个帧的到达时间,并确定编码位之间的时间量。最后一个字节固定值为0xAB。

  • 源地址和目的地址都指的是适配器的地址,当接收方收到一个帧,如果帧的内容是自身的地址或者是广播地址,它会将帧的数据字段传递给网络层,如果它收到了具有任何其他MAC地址的帧,则丢弃。

  • 类型字段指定以太网上层使用的协议。

  • 数据字段最小是46字节,如果IP数据报小于46字节,数据包必须被填充到46字节。当采用填充时,传递到网络层的数据报还包括填充部分,网络层使用IP数据包首部中的长度字段来去除填充部分。

  • CRC的目的是使得接收适配器检测帧中是否引入了差错。

  • 以太网采用无连接服务,向网络层提供不可靠服务,当适配器收到一个帧后,它对该帧执行CRC校验,当该帧不通过CRC校验时,设配器只会丢弃该帧而不会通知发送端。

链路层交换机 #

  • 交换机对子网中的主机和路由器是透明的,这意味这当某主机向另一台主机发送一个帧,并不知道某交换机会接收该帧并把它转发到另一个节点。交换机输出接口设置有缓存。
  • 使用交换机能消除碰撞,交换机将链路彼此隔离。

转发和过滤 #

  • 过滤决定一个帧是否应该转发到某个接口还是应当将其丢弃。
  • 转发决定一个帧应该被导向哪个接口,并把该帧移动到哪些接口上。
  • 交换机的过滤和转发基于交换机表(switch table)实现,该交换机表包含局域网上某些主机和路由器但不必是全部的表项。交换机表中包含:1. MAC地址;2MAC地址对应的接口;3. 该信息放到交换机表中的时间。
  • 交换机的工作流程如下,假设A帧从x接口到达,目的地址为DD-DD-DD-DD-DD-DD:
    • 如果表中没有DD-DD-DD-DD-DD-DD,则交换机向除x外所有的接口广播该帧。
    • 如果表中有DD-DD-DD-DD-DD-DD,并且对应的接口为x,则交换机丢弃该帧。
    • 如果表中有DD-DD-DD-DD-DD-DD,并且对应的接口不为x,则交换机将该帧转发到接口y上。
  • 交换机表是自学习的,通过如下方式实现:
    1. 交换机表初始为空。
    2. 对于每个接口收到的入帧,该交换机在其表中存储该帧源MAC地址、该帧到达的接口和当前时间。
    3. 如果一段时间(老化期)后,交换机没有收到源MAC地址在该表里的数据后,就从该表里删除这个地址。
  • 交换机是即用即插设备,不需要网络管理员手动维护。交换机是全双工的,任何接口都能同时发送和接收。

无线局域网IEEE802.11(Wi-Fi) #

  • Wi-Fi(无线保真),一个接入点(AP)网络下面可以包含多个站(STA),一个AP和相关的站被称为一个基本服务集(BSS)。AP之间使用一种有线的分布式服务(称为DS),形成一个扩展服务集(ESS),这种方式通常被称为基础设施模式。

    802.11帧 #

  • 物理层会聚程序(PLCP)头部以独立于物理层的方式提供特定的物理层信息。
  • MPDU的帧控制字包括三种类型:管理帧、控制帧和数据帧。MPDU的剩余字段由帧类型来决定。

管理帧 #

  • 管理帧用于创建维持、终止站和接入点之间的连接。
  • 管理帧也被确定是否采用加密,传输网络名称(SSID或ESSID),支持哪种传输速率,以及采用的时间数据库等。
  • 当一个Wi-Fi接口”扫描“临近的接入点时,这些帧被用于提供必要的信息。
  • 扫描是一个站发现可用的网络以及相关配置信息的过程。一个站可以主动侦测网络,在扫描时传输一个特殊的管理帧(“探测请求”)。这些探测请求有一定的限制,以保证802.11流量不在非802.11频率上传输。

控制帧 #

  • 控制帧和帧确认被用于一种流量的控制方式,流量控制有助于接收方是一个过快的发送方降低发送速度,帧确认有助于发送方知道哪些帧已被正确接收。
  • 802.11网络支持可选的请求发送/明确发送(RTS/CTS),通过放缓传输来进行流量控制。当RTS/CTS启用时,一个站在发送数据帧之前发送一个RTS帧,当接收方愿意接收额外的流量时,这个站会开启一个时间窗口,用于向确认接受的站发送数据帧。
  • RTS和CTS帧比较短,因此他们不会长期使用信道。如果一个分组的大小足够大,AP通常为每个分组启动一次RTS/CTS交换。通常AP都提供一个称为分组大小阈值的配置选项,超过阈值的帧将会导致一个RTS帧优先于数据帧发送。大多数设备生产商设置的默认值是500字节。
  • 802.11采用一种重传/确认的方法来重传。确认是对预期在一定时间内接受的一个单播帧(802.11a/b/g)或一组帧(802.11n/e)的响应。组播和广播帧没有相关的确认,在指定时间内没有收到对应的ACK会导致帧的重传。

数据帧、分片和聚合 #

  • 通常802.11帧和链路层(LLC)帧之间存在一对一关系,他们保证更高层协议是可用的。但是802.11支持帧分片,可将一个帧分为多个分片。根据802.11n的规定,它也支持帧聚合,可将多个帧合并发送以减少开销。
  • 当使用帧分片时,每个分片都有自己的MAC头部和尾部的CRC,并且他们独立于其他分片处理。当信道有明显的干扰时,分片有助于提高性能。分片仅用于目的地址为单播的帧,为了具备这种能力,顺序控制字段包含一个分片号(4位)和一个序列号(12位)。如果一个帧经过分片,所有分片包含相同的序列号值,没相邻的分片的分片号之差为1。由于分片号字段长度为4位,同一帧最多可能有15个分片。帧控制字中的更多标志字段表示更多分片还没有到达。最后一个分片将这个位置设置为0。接收方将接收的同一序列号的分片根据分片号重组成原始帧。当所有包含同一序列号的分片被接收,并且最后一个分片将更多标志字段设为0时,这个帧被重组并交给更高层协议来处理。
  • 分片并不常使用,分片大小通常可设为256字节至2048字节,并作为一个阈值,只要超过了阈值的帧才被分片。

环回地址 #

  • 通常使用一个虚拟的环回网络接口来实现。它像一个真正的网络接口,但实际上是一个由操作系统提供的专用软件。
  • 以127开头的IPv4地址被保留位环回地址,linux为环回地址分配的IPv4地址为127.0.0.1(IPv6为::1),为它分配的名称为localhost。
  • 传输层和网络层对数据执行完整的处理流程,在数据离开网络层时将其回送给网络层协议栈。在linux中环回接口被称为lo。

MTU和路径MTU #

  • 在很多链路层中,携带的高层协议PDU的帧大小是有限的,以太网的有效载荷通常被限制为1500字节。这种特征被称为最大传输单元(MTU)。
  • 当两台主机之间跨越多个网络通信时,每条链路可能由不同大小的MTU,最小的MTU被称为路径MTU。
  • 任何两台主机之间的路径MTU可能会改变。路径MTU不需要在两个方向上相同。

隧道 #

  • 一般来说,隧道是在高层(或同等层)中携带低层数据。如在IPv4分组中携带IPv4数据,在一个UDP分组中携带以太网数据。
  • 隧道转变了严格分层的思路。
  • 用于建立隧道的常用协议包括:通用路由封装(GRE)、点对点隧道协议(PPTP)和第二层隧道协议(L2TP)。

与链路层相关的攻击 #

  • 在传统的有线以太网中,接口可以被设置为混杂模式,这允许它接收目的地不是自己的流量。当介质是共享电缆时,该功能允许任意一台连接以太网的电力计算机获取到别人的帧并检查内容。在使用交换机后,这变的不容易了。

概述

2021-11-24
计算机网络

协议 #

  • 计算机会执行各种协议,一系列相关的协议的集合称为一个协议族。
  • 指定一个协议族中的各种协议之间的相互关系并划分需要完成任务的设计,称为协议族的体系结构或参考模型。

分层 #

介绍
应用层 Telnet、FTP和e-mail等
运输层 TCP和UDP
网络层 IP、ICMP和IGMP
链路层 设备驱动程序和接口卡
  1. 链路层:也叫数据链路层或者网络接口层,包括操作系统中的设备驱动程序和计算机中对应的网络接口卡(网卡),他们一起处理与电缆(或其他传输媒介)的物理接口细节。
  2. 网络层:处理分组在网络中的活动。
  3. 运输层:未两台主机上的应用程序提供端到端的通信。TCP的工作是把应用程序交给他的数据分为合适的小块交给下面的网络层,确认接收到的文组,设置发送最后确认分组的超时时钟等。UDP把称作数据报的分组从一台主机发送到另一台主机,不保证该数据报能到达另一端。
  4. 应用层负责处理特定的应用程序细节。
  • 一般来应用层的程序通常是一个用户进程,而下三层一般在操作系统内核中执行。
  • 多个网络通过IP路由器(IP Router)进行连接。从历史来说,路由器也叫做网关,但现在网关这个术语只用来表示应用层网关:一个连接两种不同协议族的进程。
  • 网桥是在链路层上对网络进行互联,而路由器则是在网络层上对网络进行互联。网桥使得多个局域网组合在一起,这样对上层来说就好像是一个局域网。
  • TCP/IP的每层都是用地址和标识符,用于区分不同协议或相同协议不同关联。链路层接入网络通常使用48位地址;IPv4使用32位地址,IPv6使用128位地址。TCP和UDP传输使用一系列的不同的端口号。

互联网的地址 #

通常采用点分十进制数地址。

分类 #

  • A类地址:第一位为0(二进制),网络号长度8位,主机号长度24位。范围0.0.0.0~127.255.255.255。127是一个保留地址。
  • B类地址:前两位为10(二进制),网络号长度16位,主机号长度16位。范围128.0.0.0~191.255.255.255。
  • C类地址:前三位为110(二进制),网络号长度24位,主机号长度8位。范围192.0.0.0~223.255.255.255。
  • D类地址:前四位为1110(二进制),范围224.0.0.0~239.255.255.255,D类地址被保留支持组播。
  • E类地址:前四位为1111,范围从240.0.0.0~255.255.255.255。E类不用。

专用地址 #

  1. 10.0.0.0~10.255.255.255
  2. 172.16.0.0~172.31.255.255
  3. 192.168.0.0~192.168.255.255
  4. 0.0.0.0/8:本地网络中的主机,仅作为源IP使用。
  5. 127.0.0.1/8:回环地址,通常只用127.0.0.1。
  6. 255.255.255.255/32:本地网络(受限)的广播地址。

IPv6 #

  • IPv6地址的长度是128位,采用16进制表示,每四个16进制数用一个冒号分隔(四个16进制数也称为一个块或字段),一个IPv6地址包含8个块。如5f05:2000:80ad:5800:0058:0800:2023:1d71
  • IPv6地址简化写法
    • 前导的0必须压缩,如5f05:2000:80ad:5800:58:800:2023:1d71
    • 全零的块可以省略用符号::表示。::只能用于影响最大的地方(压缩最多的0)。如果多个块中包含等长度的0,则顺序靠前的块被替换为::。如0:0:0:0:0:0:0:1可以简写为::12001:0db8:0:0:0:0:0:2 可以简写为2001:db8:2。一个IPv6地址中的::只可以出现一次。
    • IPv4映射的IPv6地址格式中 紧接着IPv4部分的地址块的值为ffff,地址的其余部分使用点分四组格式。如IPv6地址::ffff:10.0.0.1可以表示为IPv4地址10.0.0.1。
    • a到f的16进制用小写表示。
  • 在某些情况下,IPv6地址中的冒号可能和其他分隔符混淆(如URL),这种情况下可以使用[]来包裹IPv6地址。

广播地址 #

  • 在每个IPv4子网中,一个特殊地址被保留作为子网广播地址。子网广播地址通过将IPv4地址中的网络/子网部分设置为适当值,以及主机部分的所有地址设置为1而形成。
  • 子网广播地址的计算方式为:对子网掩码取反,并于子网中任意的计算机的地址(或者网络/子网前缀)进行按位或运算(两个输入为任意一个为1,则结果为1)。
  • 子网128.32.1.0/24的子网广播地址是128.32.1.255,使用这种地址作为目的地址的数据报,也被称为定向广播,定向广播至今在Internet中被禁用。
  • 255.255.255.255的IP地址被保留为本地网络广播,也称有限广播,它不会被路由器转发。

组播地址 #

  • 一个IP组播地址标识一组主机接口,一个组所覆盖的网络部分称为组的范围,常见的范围包括同一计算机、同一子网等。
  • 当一台主机向一个组发送数据时,他会创建一个数据报,使用单播IP地址作为源地址,使用组播IP地址作为目的地址,已加入组的所有主机将接收发送到改组的任何数据报。

封装 #

  • 上层向下层传输数据时,每一层都会对收到的数据增加一些首部信息。
  • 下层向上层传输数据时,会去掉各层协议的报文首部,每层协议都要去检查报文首部中的协议标识,以确定接收数据的上层协议,这个或称被称为分用(Demultiplexing)。
  • TCP(传输控制协议)传给IP的数据单元被称作TCP报文段或者简称为TCP段(TCP segment),UDP(用户数据报协议)传给IP的信息单元被称为UDP数据报(UDP datagram)。IP传给网络接口层的数据单元是分组(packet)也可以叫做IP数据报,分组既可以是一个IP数据报(IP datagram),也可以是IP数据报的一个片(fragment)。通过以太网传输的比特流称作帧(Frame)。
  • 以太网数据帧的长度必须时46~1500字节之间,以太网帧包含一个48位的目的地址(又称为介质访问控制(MAC))和一个16位的以太网类型字段(指定是IPv4或者IPv6等)。

端口号 #

  • 端口号由16位组成,范围是(0~65535)。每个IP地址有65536个可用的端口号。
  • 标准的端口号由Internet号码分配机构(IANA)分配。这组数字被划分为特定范围,包括熟知端口号(0-1023)、注册端口号(1024-49151)和动态/私有端口号(49152-65535)。类似Linux这样的操作系统绑定到一个熟知端口上需要管理员的权限。
  • 安全外壳协议(SSH,端口22)、FTP协议(端口20、21)、Telnet远程终端控制(端口23)、简单邮件传输协议(SMTP,端口25)、域名系统(DNS,端口53)、交互式邮件访问协议(IMAP和IMAPS,端口143和993)、简单网络管理协议(SNMP,端口161和162)、轻量级目录访问协议(LDAP,端口389)、超文本传输协议(HTTP和HTTPS,端口80和443)。

xwindow

2021-11-15
linux

  • linux上的图形用户接口GUI被称为X或者X11。
  • X11是一个软件,利用网络构架来进行图形接口的执行与绘制。

X11 #

  • X Server是管理硬件,X Client则是应用程序。X Client应用程序将所想要呈现的画面告诉X Server,X Server将结果透过他管理的硬件绘制出来。

X Server 硬件管理、屏幕绘制与字符提供功能 #

  • X Server管理的设备主要与输入/输出有关,包括键盘、鼠标、手写板、显示器、屏幕分辨率与颜色深度、显示是配置与显示的字符等。
  • 每台客户端主机都需要安装X Server,而服务器则是提供X Client软件,以提供客户端绘图所需要的数据。
  • X Server和X Client的互动并非只有client–>server,两者实际上是有互动的,X Server会将来自输入设备(键盘、鼠标等)的动作告知X Client。

X Client 负责X Server要求的事件处理 #

  • X Client也可以叫X Application。
  • X Server管理显示接口与在屏幕上绘图,同时将输入设备的行为告知X Client,此时X Client会依据这个输入设备的行为来开始处理,再将结果传回X Server,X Server再根据X Client传回来的绘图资料将它描述在自己的屏幕上,来得到显示的结果。

X Window Manager 特殊的X Client,负责管理所有的X Client #

  • 窗口管理员提供许多的控制元素,包括任务栏、桌面背景的设定等等;管理虚拟桌面;提供窗口控制参数,包括窗口的大小、窗口的重叠显示、窗口的移动、窗口的最小化等等。

Display Manager 提供登入需求 #

  • gdm全称GNOME Display Manager;一般通过图形界面登入系统的那个登录界面就是Display Manager。

X Window的启动 #

  • 通过startx启动:startx [X client参数] -- [X server参数],startx是一个shell脚本。
    • startx最重要的任务是找出用户或者系统默认的X server和X client配置文件,它可以直接启动,也可以外接参数启动。
    • startx的X server参数的优先级如下:①通过命令行传递的参数;②~/.xserverc;③/etc/X11/xinit/xserverrc;④单纯执行/usr/bin/X(X server执行文件)。
    • startx的X client参数优先级如下:①startx后面跟的参数;②~/.xinitrc;③/etc/X11/xinit/xinitrc;④单纯执行xterm。
    • 当startx找到需要的设定值后,就呼叫xinit来启动X。xinit [client option] -- [server or display option]
    • 当单纯执行xinit的时候,默认执行的命令为xinit xterm -geogmetry _1_1 -n login -display :0 -- X :0。-display:0表示这个虚拟机是第:0号的X显示接口。一般会使用startx来启动xwindow,因为startx会自动找到对应的参数。
  • xserverrc
    • 在启动X server时,Xorg会去读取/etc/X11/xorg.conf这个配置文件。linux通过执行X来启动X server,linux可以同时启动多个X,第一个X的画面在:0即tty2,第二个X是:1即tty3。
  • 在文字接口下启动X时,直接使用startx来找到X Server和X client的参数或者配置文件,然后再呼叫xinit来启动X窗口系统。xinit现在如X server到预设的:0这个显示接口,然后再加载X client到这个X显示接口上。X client通常就是GNOME或者KDE。
  • X Server理论上要启动一个6000端口来和X client通信,但是在同一台机器上时,会使用socket来通信。在X Window System环境下,我们称port 6000为第0个显示接口,即hostname:0,可以简写为:0。
#X启动

#启动X server,这个时候会跳转到tty2(也可能是别的,下面以tty2举例),但是啥都没有,用ctrl+alt+F1跳回到tty1
X :1 &
#启动X Client,这个时候tty2会变白,通过ctrl+alt+F2跳到tty2
xterm -display :1 &
#在tty2执行
xclock -display :1 &
xeyes -display :1 &
#切换到tty1,安装twm
apt install twm
#启动twm,再切换到tty2就能拖动窗口了
twm -display :1 &

mybatis配置

2021-11-02
java

总览 #

  • configuration 配置
    • properties 属性
    • settings 设置
    • typeAliases 类型别名
    • typeHandlers 类型处理器
    • objectFactory 对象工厂
    • plugins 插件
    • environments 环境变量
      • environment
        • transactionManager 事务管理器
        • dataSource 数据源
    • databaseIdProvider 数据库标识
    • mappers 映射器

属性properties #

  • 设置好的属性可以在整个配置文件中使用。
  • 通过方法参数传递的属性优先级最高,resource/url属性中指定的位置文件次之,properties元素中指定的属性优先级最低。
<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <!-- 启用默认值设置,使用方式为${username:prod_user} -->
  <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
</properties>

类型别名typeAliases #

  • 指定类型别名
  • 内建的一些类型别名,如:string、long、integer、float、map、arraylist、date等
<typeAliases>
  <typeAlias alias="author" type="domain.blog.Author"/>
  <!-- 每一个在包domain.blog中的类,会默认使用该类的首字母小写的类名作为它的别名 -->
  <package name="domain.blog"/>
</typeAliases>

环境变量environments #

<environments default="development">
    <!--  type用来指定数据源,内建了三种数据源UNPOOLED|POOLED|JNDI,可以通过实现接口DataSourceFactory来使用第三方数据源 -->
    <dataSource type="">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

数据库标识databaseIdProvider #

  • mybatis可以根据不同的数据库厂商执行不同的语句。
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>
  <property name="MySQL" value="mysql" />
</databaseIdProvider>
  • 使用方式
<select id="select" resultType="map" databaseId="mysql">
	select * from mysql
</select>

映射器 #

<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
  <package name="org.mybatis.builder"/>
</mappers>