读书笔记 —《计算机是怎样跑起来的》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

这本《计算机是怎样跑起来的》对于小白还是比较友好的,了解了很多硬件方面的知识,手绘简单的硬件图真的太香了,之前知道有这个东西存在,却不知道为什么存在,对于基础薄弱的学习者是一个比较好的补充书籍,读完觉得很多之前晦涩难懂的概念确实豁然开朗了,值得推荐,笔记有点散,主要是个人觉得比较重要的点。

第一章:计算机的三大原则

1.计算机是输入、运算、输出的机器
2.程序是指令和数据的集合
函数:一组指令赋予一个名字
数据:1)作为指令执行对象的输入数据 2)从指令的执行结果得到的输出数据
3.计算机的处理方式有时与人们的思维习惯不同:对于计算机来说什么都是数字
CPU(Central Processing Unit)中央处理器:其内部可对数据执行运算并控制内存(用于存储指令和数据)和I/O(负责把键盘、鼠标、显示器等周边设备和主机连接再一起,实现数据的输入和输出)

只要用电路把CPU,内存以及I/O上的引脚相互连接起来,为每块IC提供电源,再为CPU提供时钟信号,硬件上的计算机就组装起来了
时钟信号:内含晶振的,被称为时钟发生器的元件发出的滴答滴答的电信号
Hz赫兹:表达驱动CPU运转的时钟信号的频率,一秒发出一次时钟信号就是1Hz
时钟信号是在 0 和 1 两个数之间反复变换的电信号

第二章:连接用于输入输出的外部设备

通常将 1 个二进制数( 也就是数字IC 上 1 个引脚所能表示的 0 或者 1) 所表示的信息称作“1 比特”,
将 8个二进制数( 也就是 8 比特) 称作“1 字节”。 比特是信息的最小单位,字节是信息的基本单位

寄存器是位于 CPU 和 I/O 中的数据存储器。
Z80 PIO 上共有 4 个寄存器。 2 个用于设定 PIO 本身的功能, 2 个用于存储与外部设备进行输入输出的数据,这 4 个寄存器分别叫作端口 A 控制、 端口 A 数据、 端口 B 控制和端口 B 数据

Z80 PIO 的 B/A 和 C/D 引脚分别连接到 Z80 CPU 的地址总线引脚 A0 和 A1 上,因此若赋予 B/A 引脚 1 则表示选中 B, 反之赋予 0 则表示选中 A。 同样地, 若赋予 C/D 引脚 1 则表示选中的是 C( C 即 Control, 表示控制模式) ; 反之赋予 0 则表示选中的是 D( D 即 Data, 表示数据模式)
在这里插入图片描述
所谓端口就是 I/O 与外部设备之间输入输出数据的场所,可以把端口( Port) 想象成是轮船装卸货物的港口

使用 Z80CPU 的 A0~A1( 00~11 共 4 个地址) 地址总线引脚也可以选择 I/O( Z80 PIO) 中的寄存器

对于只用于输出的引脚, 不需要使用时的处理方法是这个引脚什么都不连接;
而对于只用于输入或输入输出两用的引脚, 不需要使用时的处理方法则是把这个引脚上的电压固定成是 +5V 或 0V

区分读写对象是内存还是 I/O 的引脚:内存请求引脚MREQ,I/O 请求引脚IORQ
当 Z80 CPU 和内存之间有数据输入输出时, MREQ 引脚上的值是 0, 反之则是 1。
当 Z80 CPU 和I/O 之间有数据输入输出时, IORQ 引脚上的值是 0, 反之则是 1

CE(Chip Enable, 选通芯片) 引脚设成 0, 则TC5517 在 电 路 中 被 激 活,若 设 成 1 则 从 电 路 中 隔 离
因 为 此 时TC5517 进入了高阻抗状态, 所以即便它上面的引脚已经接入了电路也不会接收任何电信号
(使用CE和IORQ引脚是因为这样更适合使用了多个 I/O 的情况)

Z80 CPU 的 RD 引脚( 即 Read, 表示输入, 为 0 时执行输入操作) 和 WR 引脚( 即 Write, 表示输出, 为 0 时执行输出操作)

所谓中断就是让 CPU 根据外部输入的数据执行特定的程序

若将 BUSRQ(总线请求) 引脚的值设为 0,则 Z80 CPU 从电路中隔离。当处于这种隔离状态时,就可以不通过CPU,手动地向内存写入程序了。不经过 CPU 而直接从外部设备读写内存的行为叫作 DMA(Direct Memory Access,直接存储器访问)。在诸位所使用的个人计算机里,硬盘等设备要读写内存时使用的就是 DMA

上拉(pull_up),通过加入电阻把元件的引脚和+5V 连接起来

计算机工作原理:CPU在时钟信号的控制下解释、执行内存中存储的程序,按照程序中的指令从内存或 I/O 中把数据输入到 CPU 中,在 CPU 内部进行运算,再把运算结果输出到内存或 I/O 中。

在程序执行时,开关的状态就会对电路产生影响。要使用 74367(三态总线缓冲器)
在这个 IC 的电路图符号中,有用三角形标志代表的缓冲器,表示使电信号从右向左直接通过。
只有在 74367 的 G1 引脚和 G2引脚同时为 0 的时候,电信号才能通过。
而当 G1 引脚和 G2 引脚同时为 1 时,74367 就会与电路隔离

一旦打开了 Z80 CPU 的 BUSRQ 引脚连接着的开关,就可以通过BUSAK 引脚输出 0 得知 CPU 进入了 DMA 状态。因此只要把 BUSAK引脚连接到 4 个 74367 的 G1 引脚和 G2 引脚上,就可以实现通过DMA 向内存写入数据了

计算机大脑的 CPU 只能解释执行一种编程语言,那就是靠罗列二进制数构成的机器语言(原生代码)
程序是指令和数据的集合,表示指令或数据的数值是以 8 比特为一个单位存储到内存中

第三章:体验一次手工汇编

微型计算机中,地址空间为0~255,每一个地址中可以存储 8 比特(1 字节)的指令或数据
端口 A 数据寄存器对应 0 号地址,端口 B 数据寄存器对应 1 号地址,
端口 A 控制寄存器对应 2 号地址,端口 B 控制寄存器对应 3 号地址。
端口 A 数据寄存器和端口 B 数据寄存器存储的是与周边设备进行输入输出时所需的数据。
端口 A 连接用于输入数据的指拨开关,端口B 连接用于输出数据的 LED
在这里插入图片描述

一旦重置了 CPU,CPU 就会从 0 号地址开始顺序执行这段程序昵称赋予给 0 和 1 的组合。类似英语单词的昵称叫作“助记符”,使用助记符的编程语言叫作“汇编语言”

比如Give me money祈使句
操作码(Give)就是表示“做什么”的指令,用助记符表示的指令是英语单词的缩写
操作数(me)表示的是指令执行的对象,CPU 的寄存器、内存地址、I/O地址或者直接给出的数字都可以作为操作数

CPU 内部有存储数据的地方叫作“寄存器,,CPU 的寄存器不仅能存储数据,还具备对数据进行运算的能力

用汇编语言编写的程序是不能直接运行的,必须先转换成机器语言。机器语言是唯一 一种 CPU 能直接理解的编程语言。

通过反复进行“读取指令”“解释、执行指令”“更新 PC 寄存器的值”这 3 个操作,程序就能运行起来了

将一个 2 字节的数据存储到内存时,存储顺序是低 8 位在前、高 8 位在后(也就是逆序存储)。这样的存储顺序叫作“小端序”(Little Endian)
与此相反,将数据由高位到低位顺序地存储到内存的存储顺序则叫作“大端序”(Big Endian)。

LOOP 标签之后的 3 条指令共需要 11+11+10 = 32 个时钟周期
微型计算机采用的是 2.5MHz 的晶振,也就是 1 秒可以产生 250 万个时钟周期,所以每个时钟周期是 1 秒 ÷250万 = 0.0000004 秒 = 0.4 微秒,72 个时钟周期就是 72×0.4 = 28.8 微秒,32 个时钟周期就是 12.8 微秒,所以 LOOP 标签之后所执行的操作“输入、输出、跳转”每 1 秒可以反复执行 1 秒 ÷12.8 微秒 / 次 = 78125 次之多

第四章:程序像河水一样流动着

顺序执行是按照指令记录在内存中的先后顺序依次执行的一种流程(水流向一个方向流淌)
循环则是在程序的特定范围内反复执行若干次的一种流程。(漩涡)
条件分支是根据若干个条件的成立与否,在程序的流程中产生若干个分支的一种流程(中途分出了支流)
在这里插入图片描述
CPU 中有各种各样的各司其职的寄存器。其中有一个被称为 PC(Program Counter,程序计数器)的寄存器,负责存储内存地址,该地址指向下一条即将执行的指令。每解释执行完一条指令,PC 寄存器的值就会自动被更新为下一条指令的地址。

程序基本上是从内存中的低地址(编号较小的地址)开始,向着高地址(编号较大的地址)流下去的 。我们把程序的这种流动称为“顺序执行”

一旦使用了机器语言或汇编语言所提供的跳转指令,就可以将PC 寄存器的值设置为任意的内存地址。
如果将它的值设为之前执行过的步骤所对应的内存地址,那么就构成了循环

中断处理是指计算机使程序的流程突然跳转到程序中的特定地方,这 样 的 地 方 被 称 为 中 断 处 理 例 程(Routine)或 是 中 断 处 理 程 序(Handler),而这种跳转是通过 CPU 所具备的硬件功能实现的

人们通常把中断处理比作是接听电话。假设诸位都正坐在书桌前处理文件,这时突然来电话了,
诸位就不得不停下手头的工作去接电话,接完电话再回到之前的工作。像这样由于外部的原因使正常的流程中断,中断后再返回到之前流程的过程就是中断处理流程。

中断处理以从硬件发出的请求为条件,使程序的流程产生分支,因此可以说它是一种特殊的条件分支
事件驱动也是一种特殊的条件分支,它以从 Windows 送来的通知为条件,根据通知的内容决定程序下一步的流程

第五章:与算法成为好朋友的七个要点

辗转相除法中分为使用除法运算和使用减法运算两种方法。使用减法运算简单易懂。
用两个数中较大的数减去较小的数(步骤),反复进行上述步骤,直到两个数的值相等(步骤的终止)。
如果最终这两个数相同,那么这个数就是最大公约数。

哨兵用于提高线性查找的效率,不用重复比较
在这里插入图片描述

第六章:与数据结构成为好朋友的七个要点

变量中所存储的数据是可以改变的。变量的实质是按照变量所存储数据的大小被分配到的一块内存空间
使用了数组就可以高效地处理大量的数据,数组的实质是连续分配的一块特定大小的内存空间
LIFO(Last In First Out,后进先出)表示优先读取后存入的数据;
FIFO(First In First Out,先进先出)表示优先读取先存入的数据。

算法(处理问题的步骤)和数据结构(作为处理对象的数据的排列方式)

char a通过这一行代码就在内存中预留了一块空间,并为这块空间起了个名字叫作 a。
并不需要知道变量 a 被存储到内存空间中的哪个地址上了。因为当程序运行时是由操作系统为我们从
尚未使用的内存空间中划分出一部分分配给变量 a 的

内存的物理结构(地址+数据)
char a;把内存空间命名为a
a=123;把数值123存入内存空间
在这里插入图片描述
比如统计 1000 名职员的工资之类的程序。在这类程序中存储数据时使用的是“数组”,
而不是定义出 1000 个变量以供使用。通过使用数组,既可以同时定义出多个变量,又可以提高编写程序的效率

通过指定数组名和数组所包含的元素个数来定义数组
数组实际上是为了存储多个数据而在内存上集中分配出的一块内存空间,并且为这块空间整体赋予了一个名字
在这里插入图片描述
数据结构其实都是通过程序从逻辑上改变了内存的物理结构,即数据在内存上呈现出的连续分布状态,
数组有时可以转化为栈,有时可以转化为队列
在这里插入图片描述
结构体,当作是一种数据类型,用它来定义变量。如果把结构体 TestResult 用作数据类型并定义出了一个名为 xiaoming 的变量(代表小明的成绩),那么在内存上就相应地分配出了一块空间,这块空间由用于存储 Chinese、Math、English 这三个成员数据所需的空间汇集而来

把存储着地址的变量称为“指针”

链表是一种类似数组的数据结构,这个“数组”中的每个元素和另一个元素都好像是手拉着手一样

初始状态的链表中,元素的排列顺序与元素在内存上的物理排列顺序相同,只要改变连接信息(变更 Ptr 的值),元素就可以呈现出新顺序,不同于其在内存上的物理排列顺序

在链表(插入,删除快)的实现中,用的是自我引用的结构体,带有一个连接信息的成员的自我引用结构体
在这里插入图片描述
在二叉树(查找快)的实现中,用的还是自我引用的结构体,只不过要改为要带有两个连接信息的成员的自我引用结构体
在这里插入图片描述

第七章:成为会使用面向对象编程的程序员

结构体是数据的集合,它将数据捆绑在一起,使得我们可以,将这些数据看作是一个整体。而对结构体中的数据进行操作的函数却写在了结构体的外部。
然而在面向对象编程中,将表示事物行为的函数也放入了这个整体,这就形成了对象的概念,使得这个整体既能描述属性,又能描述行为。

通过把若干个类组装到一起构建一个完整的程序。类就是程序的组件(Component)。面向对象编程的关键在于能否灵活地运用类

用“函数”表示指令,用“变量”表示数据。对于 C 语言或是 BASIC 的程序员而言,程序就是函数和数据的集合。
假设要用非面向对象的编程方法编写一个由 10000 个函数和 20000 个变量构成的程序,那
么结果就很容易是代码凌乱不堪,开发效率低到令人吃惊,维护起来也十分困难

一种新的编程方法就被发明出来了,即把程序中有关联的函数和变量汇集到一起编成组。这里的组就是类

大部分的类都已内置于面向对象编程语言中了,这些类可以为来自各个领域的程序员所使用。通常将像这样的一组类(一组组件)称作“类库

所维护的程序是用一组类组装,需要修改的函数和变量就应该已经集中在一个类中,维护时没有必要去检查所有的类,只需修改需要维护的类就行了

如果一个类的修改导致其他的类就也要跟着修改,这样的设计是不行的。必须把组件设计成即使是坏了(有缺陷了)也能轻松地替换

对于类的使用者而言“类看起来是什么样子的”这种关于规范的描述通常被称为“接口”(Interface)。
例如只要把接口告诉合作公司,就可以要求他们编写类,编写出的类也就自然能够与程序中的其他部分严丝合缝地拼装起来

在进行面向对象编程的设计时,要在一开始就把所需要的类确定下来,然后再在每个类中列举出该类应该具有的函数和变量要一边观察作为程序参照物的现实世界,一边思考待解决的问题是由哪些事(类)构成的

用 C++ 等面向对象编程语言编写程序的话,程序可以通过由一个对象去调用另一个对象所拥有的函数这种方式运行起来。这种调用方式被称为对象间的“消息传递

继承指的是通过继承已存在的类所拥有的成员而生成新的类。
封装指的是在类所拥有的成员中,隐藏掉那些没有必要展现给该类调用者的成员。
多态指的是针对同一种消息,不同的对象可以进行不同的操作

类是对象的定义,而对象是类的实例(Instance)
类是做饼干的模具,而用这个模具做出来的饼干就是对象,做饼干用的面饼就是内存
在这里插入图片描述
我们无法直接使用类所持有的成员,要想使用就必须在内存上生成该类的副本,这个副本就是对象

类的三种使用方法

  1. 仅调用类所持有的个别成员(函数和变量);
  2. 在类的定义中包含其他的类(这种方法被称作组合);
  3. 通过继承已存在的类定义出新的类。

第八章:一用就会的数据库

表(Table)就是被整理成表格形式的数据
键用于设定表和表之间的关系(Relationship),而索引是提升数据检索速度的机制
每个值都能够唯一标识一条记录的字段称为主键。为了在表和表之间建立关系而在表中添加的、其他表主键的字段称为外键。而索引是与键无关的机制

在关系型数据库中,把录入到表中的每一行数据都称为记录,。记录有时也被称为行或元组(Tuple)
把构成一条记录中的各个数据项(在本例中是商品名称、单价等)所在的列都称作字段,字段有时也被称为列或属性(Attribute)

在表间建立关系,就必须加入能够反映表与表之间关系的字段,为此所添加的新字段就被称为键(Key)
在各个表中添加一个名为主键(Primary Key)的字段,该字段的值能够唯一地标识表中的一条记录。
学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键,在顾客表中添加的“顾客 ID”字段,在主键上绝不能存储相同的值

在销售记录表上,还要添加顾客 ID 和商品 ID 字段,这两个字段分别是另外两张表的主键,
对于销售记录表来说,它们就都是“外键”(Foreign Key)通过主键和外键上相同的值,多个表之间就产生了关联,就可以顺藤摸瓜取出数据

主键既可以只由一个字段充当,也可以将多个字段组合在一起形成复合主键,记录之间虽然在逻辑上有一对一、多对多以及一对多(等同于多对一)三种关系,但是在关系型数据库中无法直接表示多对多关系
在这里插入图片描述
当出现多对多关系时,可以在这两张表之间再加入一张表,把多对多关系分解成两个一对多关系
加入的这张表被称作连接表(Link Table)

在目前的酒铺数据库中,如果从商品表中删除了“日本酒”这条记录,那么在销售记录表中,曾经记录着买的是日本酒的那两条记录就不再能说明买的是什么商品了。但是一旦勾选了实施参照完整性的选项,在应用程序中再执行这类操作时,数据库就会拒绝执行

索引仅仅是提升数据检索和排序速度的内部机制。一旦在字段上设置了索引,数据库 就会自动为这个字段创建索引表,索引表是一种数据结构,存储着字段的值以及字段所对应记录的位置。

索引所起的就是“目录”的作用。与图书的目录一样,数据库的索引也是一种能够高效地查找目标数据的机制。

每次向表中插入数据时,DBMS 都必须更新索引表。提升数据检索和排序速度的代价,就是插入或更新数据速度的降低只有对那些要频繁地进行检索和排序的字段,才需要设置索引

主键:唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性,主键只能有一个

外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系,一个表可以有多个外键

索引:该字段没有重复值,但可以有一个空值,是提高查询排序的速度,一个表可以有多个惟一索引

SELECT 顾客姓名 , 住址 , 电话号码 , 商品名称 , 单价 , 销售量
FROM 顾客表 , 商品表 , 销售记录表
WHERE 顾客表 . 顾客姓名 = "日经次郎 "
AND 销售记录表 . 顾客 ID = 顾客表 . 顾客 ID
AND 销售记录表 . 商品 ID = 商品表 . 商品 ID ;

事务由若干条SQL 语句构成,表示对数据库一系列相关操作的集合,为了从顾客 A 的账户中给顾客 B 的账户汇入 1 万日元,就需要将以下两条 SQL 语句依次发送给 DBMS

  1. 把 A 的账户余额更新(UPDATE 语句)为现有余额减去1 万日元;
  2. 把 B 的账户余额更新(UPDATE 语句)为现有余额加上1 万日元。此时这两条 SQL 语句就构成了一个事务。
    在这里插入图片描述
    假设在第一条 SQL 语句执行后,网络或计算机发生了故障,第二条 SQL 语句无法执行,那么会发生什么呢?
    A 的账户余额虽然减少了1 万日元,但是 B 的账户余额却没有相应地增加 1 万日元,
    这就导致了数据不一致。为了防止出现这种问题,设计了以下三条语句
  3. BEGIN TRANSACTION(开启事务)语句,用于通知 DBMS开启事务;
  4. COMMIT(提交事务)语句,用于通知 DBMS 提交事务;
  5. ROLL BACK(事务回滚)语句,用于在事务进行中发生问题时,把数据库中的数据恢复到事务开始前的状态

第九章:通过七个简单的实验理解TCP/IP网络

通常把在一栋建筑物内或是一间办公室里的那种小规模网络称作 LAN。与此相对,把互联网那样的大规模网络称作 WAN(Wide Area Network,广域网)。
“集线器”(Hub)是负责把各台计算机的网线相互连接在一起的集线设备
“路由器”(Router)是负责把公司内的网络( LAN)和互联网(WAN)连接起来的设备
路由器的一端会先连接到互联网服务提供商的路由器上。而在服务提供商(Provider)那里,
又会继续将它们的路由器连接到其他路由器上,通过这种方式最终接入到互联网的主干线缆上
在这里插入图片描述
以太网中的每台计算机都需要先确认一件事:在网线上有没有其他的计算机正在传输电信号,也就是说要先确保没有人在占用网络,
然后才能发送自己想传输的电信号。谁先抢到了网线的使用权,谁就先发送。

多台计算机同时都想发送电信号时,让这些计算机等待一段长度随机的时间后再重新发送相同的电信号即可。这套机制叫作 CSMA/CD(Career Sense Multiple Access with Collision Detection,带冲突检测的载波监听多路访问)。所谓载波监听(Career Sense),指的是这套机制会去监听(Sense)表示网络是否正在使用的电信号(Career)

而多路复用(Multiple Access)指的是多个(Multiple)设备可以同时访问(Access)传输介质。
带冲突检测(withCollision Detection)则表示这套机制会去检测(Detection)因同一时刻的传输而导致的电信号冲突(Collision)
在小规模的 LAN 中,像这样略显粗躁的 CSMA/CD 机制是可以正常运转的。因为 CSMA/CD 归根结底也只是一种适用于 LAN 的机制
在这里插入图片描述
在以太网中,发送给一台计算机的电信号也可以被其他所有的计算机收到。一台计算机收到了电信号以后会先做判断,如果是发送给自己的则选择接收,反之则选择忽略。可以用被称作 MAC(MediaAccess Control)地址的编号来指定电信号的接收者。
在每一块网卡所带有的 ROM(Read Only Memory,只读存储器)中,都预先烧录了一个唯一的 MAC 地址。网卡的制造厂商负责确定这个 MAC 地址是什么,因为 MAC 地址是由制造厂商的编号和产品编号两部分组成的,所以世界上的每一个 MAC 地址都是独一无二的。

在 TCP/IP 网络中,除了硬件上的 MAC 地址,还需要为每台计算机设定一个软件上的编号。这个编号就是众所周知的 IP 地址,通常把设定了 IP 地址的计算机称为“主机”(Host)。因为路由器也算是计算机的一种,所以它们也有 IP 地址。
在 TCP/IP 网络中,传输的数据都会携带 MAC 地址和 IP 地址两个地址

IP 地址是一个 32 比特的整数,每 8 比特为一组,组间用“.”分隔,分成 4 段表示。8 比特所表示的整数换算成十进制后范围是0~255,
因此可用作 IP 地址的整数是 0.0.0.0~255.255.255.255,共计4294967296 个

AAA.BBB.CCC 这个公司内,如果有一台计算机的编号是 ×××,那么它的 IP 地址就是 AAA.BBB.CCC.XXX, AAA.BBB.CCC.YYY 也是这个公司的
AAA.BBB.CCC 这一部分是网络地址,而 XXX 或 YYY 的部分是主机地址

Subnet Mask 后面的 255.255.255.240。这一串数字是“子网掩码,二进制为:11111111.11111111.11111111.11110000
值为 1 的那些位对应着 IP 地址中的网络地址,后面值为 0 的那些位则对应着主机地址
4 个二进制数可以表示的范围是从 0000 到 1111,共 16 个数。而因为最开始的 0000 和最后的 1111 具有特殊的用途,
所以笔者的办公室内最多可以配置 14 台计算机,它们的主机地址范围是从 0001 到 1110。但是这其中又有一台路由器,
所以实际上最多只能放置 13 台计算机。与 MAC 地址一样,每个 IP 地址的值也都是独一无二的

大多数情况下选择的还是“自动获得 IP 地址”。这个选项使得计算机在启动时会去从 DHCP 服务器获取 IP 地址和子网掩码,
并自动地配置它们DHCP 的全称是 Dynamic Host Configuration Protocol(动态主机设置协议)

"默认网关”的配置项。通常会把路由器的 IP地址设置在这里。DNS 服务器的 IP 地址也可以从 DHCP 服务器获取

互联网就是用路由器把多个LAN 连接起来所形成的一张大网

分布在世界各地的 LAN 中的路由器相互交换着信息,互联网正是由于这种信息的交换才得以联通。这种信息被称作“路由表”,用来记录应该把数据转发到哪里。
在像互联网这样的网络中,传输路径错综复杂,而路由器就是站在各个岔路口的指路人
在这里插入图片描述
在一台路由器的路由表中,只会记录通往与之相邻的路由器的路径,而并不会记录世界范围内的所有传输路径

在路由表中还有如下的规则:如果数据的发送目的地就在本 LAN 中,则可以直接发送数据而无需经过路由器转发;反之如果在 LAN 外(或发送目的地的 IP 地址不在路由表中),则需要经过路由器转发

DNS 服务器可以把主机名解析成 IP 地址
在互联网中还存在着一种叫作 DNS(Domain Name System,域名系统)的服务器。
正是该服务器为我们把 www.grapecity.com 这样的域名解析为了 210.160.205.80 这样的 IP 地址

所使用的计算机的主机名是 ma50j(源于这台计算机的型号),所在的 LAN 的域名是 yzw.co.jp。
把主机名和域名组合起来所形成的 ma50j.yze.co.jp,就是能够标识笔者这台计算机的一个世界范围内独一无二的名字,这个名字与 IP 地址的作用是等价的。通常把这种由主机名和域名组合起来形成的名字称作 FQDN(Fully Qualified DomainName,完整限定域名)

DNS 服务器通常被部署在各个 LAN 中,里面记录着 FQDN 和 IP 地址的对应关系表

在互联网的世界中,到处传输的都是附带了 IP 地址的数据。但是能够标识作为数据最终接收者的网卡的,还是 MAC 地址
IP 地址到 MAC 地址的转换,这种功能被称作 ARP(Address Resolution Protocol,地址解析协议

ARP 会对 LAN 中的所有计算机提问:“有谁的 IP 地址是 210.160.205.80 吗?有的话请把你的 MAC 地址告诉我。”通常把这种同时向所有 LAN 内的计算机发送数据的过程称作“广播”(Broadcast)。
通过广播询问,如果有某台计算机回复了 MAC 地址,那么这台计算机的 IP 地址和 MAC 地址的对应关系也就明确了

如果为了查询 MAC 地址,每回都要进行广播询问,那么查询的效率就会降低。于是 ARP 还提供了缓存的功能,当向各个计算机都询问完一轮之后,就会把得到的 MAC 地址和 IP 地址的对应关系缓存起来(临时保存在内存中)。存起来的这些对应关系信息称作“ARP 缓存表”。

TCP/IP 这个词表示在网络上同时使用了 TCP 和 IP 这两种协议。
IP 协议用于指定数据发送目的地的 IP 地址以及通过路由器转发数据。
而TCP 协议则用于通过数据发送者和接收者相互回应对方发来的确认信号,可靠地传输数据。通常把像这样的数据传送方式称作“握手”(Handshake)
在这里插入图片描述
TCP 协议中还规定,发送者要先把原始的大数据分割成以“包”(Packet)为单位的数据单元,然后再发送,而接收者要把收到的包拼装在一起还原出原始数据

硬件上发送数据的是网卡。
在网卡之上是设备驱动程序(用于控制网卡这类硬件的程序),
设备驱动程序之上是实现了 IP 协议的程序,
IP程序之上则是实现了 TCP 协议的程序,
而再往上才是应用程序,比如Web 或电子邮件。
TCP 协议使用被称作“TCP 端口号”的数字识别上层的应用程序。
TCP 端口号中有一些是预先定义好的,比如Web 使用 80 端口,电子邮件使用 25 端口(用于发送)和 110 端口(用于接收)
在这里插入图片描述

第十章 :试着加密数据吧

在网店购物时用户输入的信用卡卡号,就是应该被加密传输的代表性数据。假设卡号未经加密就被发送出去,那么就会面临卡号被同样接入互联网的某人盗取,信用卡被其用来肆意购物的危险。因此像这种网店页面的URL,通常都是以 https:// 开头,表示数据正在使用加密的方式进行传输。

文本数据可以由各种各样的字符构成。其中每个字符都被分配了一个数字,我们称之为“字符编码”。
定义了应该把哪个编码分配给哪个字符的字符编码体系叫作字符集。
字符集分为 ASCII 字符集、JIS 字符集、Shift-JIS 字符集,EUC 字符集、Unicode 字符集等若干种。

通常未经加密的文本数据称为“明文,就会有被盗取滥用的危险,虽然存在各种各样的加密技术,但是其中的基本手段无外乎还是字符编码的变换,即将构成明文的每个字符的编码分别变换成其他的数值。
通过反转这种变换过程,加密后的文本数据就可以还原。通常把密文还原成明文的过程(即解读密码的过程)称为“解密”

加密时使用的是将字符编码向后错三个的方法,所以只要再将字符编码向前挪三个就可以实现解密
加上 3 就是加密,减去 3 就是解密。因此通常把像 3这样用于加密和解密的数字称为“密钥”,事先就把 3 这个密钥作只有数据的发送者和接受者才知道的秘密,那么不知道这个密钥的人,就无法对加密过的数据进行解密
在这里插入图片描述
在互联网上经过加密的数据也难免被盗,因此就要先设法做到即使数据被盗了,其内容也难以被破解。为此可以把密钥设成多位数,而不仅仅是一位数

对称密钥加密技术:在加密和解密的过程中使用数值相同的密钥

“公开密钥加密技术”:让解密时的密钥不同于加密时的密钥,接收者的公钥可以公开给任何人(发送者),接收者的私钥只有接收者自己知道
在这里插入图片描述
用于加密的密钥可以公开给全世界,因此称为“公钥”,而用于解密的密钥是只有自己才知道的秘密,因此称为“私钥”

用 RSA 创建公钥和私钥,无论是公钥还是私钥都包含着两个数值,两个数值组成的数对儿才是一个完整的密钥
在这里插入图片描述
以为了解了 RSA 算法,就可以通过公钥 c = 323、e = 11 推算出私钥 c = 323,f = 131 了。
但是为了求解私钥中的 f,就不得不对 c 进行因子分解,分解为两个素数 a、b。在本例中 c 的位数很
短,而在实际应用公开密钥加密时,建议将 c 的位数(用二进制数表时)扩充为 1024 位(相当于 128 字节)。
要把这样的天文数字分解为两个素数,就算计算机的速度再快,也还是要花费不可估量的时间,时间可能长到不得不放弃解密的程度

数字签名可以证明数据的发送者是谁
本例中信息摘要的算法是把明文中所有字母的编码加起来,然后取总和的最后两位。而在实际中计算数字签名时,使用的是通过更加复杂的公式计算得出的、被称作 MD5(Message Digest5)的信息摘要
在这里插入图片描述
数据是用发送者的私钥加密的,接收者才能用发送者的公钥进行解密

如果接收者重新算出的信息摘要和经过发送者加密的信息摘要匹配,就证明文件在传输过程中没有被篡改,并且的确是发送者本人发送

第十一章:XML究竟是什么

XML是标记语言(元语言),可扩展
XML 约束中规定,标签必须以 < 标签名 >、</ 标签名 >

是用于表示这是 HTML 文件的标签。 表示网页的头部, 表示网页的标题, 表示网页的主体。 使文字加粗显示的 <b>、 在网页中插入图片的 <img/> </b>

HTML 是给人看的,XML 是给计算机看的,XML 是通用的数据交换格式

如果某家厂商的某个应用程序把数据保存到了 XML 文件中,那么其他厂商的另一个应用程序就应该可以通过加载这个 XML 文件来使用数据
在 CSV 中,只记录了信息本身,文件尺寸小
而XML中标签为各个信息赋予意义,文件尺寸增大,就意味着会占用更多的存储空间、需要更长的传输及处理时间

大千世界中人们会为相同的标签赋予不同的意义

XML 命名空间(NameSpace in XML),旨在防止这种同形异义带来的混乱。所谓命名空间,
通常是一个能代表企业或个人的字符串,用于修饰限定标签的名字。
在 XML文档中,通过把“xmlns=" 命名空间的名字 "”作为标签的一个属性记述,就可以为标签设定命名空间

通常用全世界唯一的标识符作为命名空间的名称。说到互联网世界中的唯一标识符,公司的 URl 就不错

XML文档包括 XML声明、XML实例和 DTDD(Document Type Definition,文档类型描述)

用于解析 XML的组件:DOM 还是 SAX

SOAP(Simple Object Access Protocol,简单对象访问协议)可用于分布式计算。
所谓分布式计算,就是把程序分散部署在用网络连接起来的多台计算机上,使这些计算机相互协作,充分发挥计算机整体的计算能力。
简单地说,SOAP 就是使运行在 A 公司计算机中的 A 程序,可以调用运行在 B公司计算机中的 B程序
在这里插入图片描述

只有在像互联网那样的环境中,运行在不同机器中的不同应用程序相互联结,XML才会大有作为。
只有一台独立的计算机,或者只在一家公司内部的话,使用 XML 格式存储数据反而体现不出优势,
仅仅是文件的尺寸变大从而浪费存储空间罢了。

第十二章:SE负责监管计算机系统的构建

把从用户的角度看到的东西称为“外部”,把从开发者的角度看到的东西称为“内部
在这里插入图片描述
瀑布模型:开始
需求分析:系统策划文档、系统功能需求规格文档
外部设计:外部设计文档->系统处理的数据、显示在画面上的用户界面以及打印机打印的样式等
内部设计:内部设计文档->是将外部设计的内容具体化
程序设计:程序设计文档->为了用程序将内部设计的内容实现出来而做出的更加详细的设计
编码实现:模块设计文档、测试计划文档->把程序设计书上的内容翻译成程序代码,模块,就是拆解出来的构成程序的要素
测试:测试报告->测试人员要根据测试计划文档的内容确认程序的功能
部署、维护:部署手册、维护手册

定量地标示测试结果的方法中,有“涂色检查”和“覆盖测试”等方法。“涂色检查”的做法是一个个地确认“系统功能需求规格文档”中的功能,如果该功能实现了,就用红笔把它涂红。“覆盖测试”则是一种表示有多少代码的行为已经经过确认的方法

“部署“将计算机系统引进(安装)到客户的环境中,让客户使用
“维护”指的是定期检查计算机系统是否能正常工作,根据需要进行文件备份或根据应用场景的变化对系统进行部分改造

所谓设计,就是拆解从需求分析到程序设计,所进行的工作都是拆解业务,把将要为计算机系统所替代的手工业务拆解为细小的要素。
从编码实现到部署、维护阶段,所进行的工作则是集成,把拆解后的细小要素转换成程序的模块,再把这些模块拼装在一起构成计算机系统

并联系统的设备利用率高于串联系统的设备利用率

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值