计算机是怎样跑起来的

矢泽久雄

内容提要

  • 本书以图配文,以计算机的三大原则为开端,相继介绍了计算机的结构、手工汇编、程序流程、算法、数据结构、面向对象编程、数据库、TCP/IP网络、数据加密、XML、计算机系统开发以及SE的相关知识。

前言

  • 其实不仅是计算机,其他学问亦是如此。首先要划出一个“知识的范围”,精通一门学问所必知必会的知识都在这个范围内。其次是掌握该范围内每个知识点中“基础中的基础知识”。最后是能独当一面的“目标”,即掌握了这些知识可以做什么。

第1章 计算机的三大原则

  • 在GBK字符编码下,一个汉字占用2个字节。而在UTF-8字符编码下,一个汉字占用3个字节。
  • 本书以本章介绍的计算机的三大原则为基础,内容延伸至硬件和软件、编程、数据库、网络以及计算机系统。在阅读之后的章节时,也请诸位时常将计算机的三大原则放在心上。

1.1 计算机的三个根本性基础

  • 1.计算机是执行输入、运算、输出的机器 2.程序是指令和数据的集合 3.计算机的处理方式有时与人们的思维习惯不同
  • 计算机的处理方式往往不符合人们的思维习惯(三大原则中的第三点)。
  • 诸位可以把这本书拿给你周围了解计算机的朋友看,他们应该会对你说“确实是这样的啊”“当然是这样的了”这类话。

1.2 输入、运算、输出是硬件的基础

  • 计算机的硬件由大量的IC (IntegratedCircuit,集成电路)组成

1.3 软件是指令和数据的集合

  • 所谓指令,就是控制计算机进行输入、运算、输出的命令。
  • 通过上面这个例子,诸位就应该能明白程序确实只是由指令和数据构成的了吧。
  • 无论是多么复杂的程序,都只不过是指令和数据的集合
  • 无论是哪个程序,其内容都是数值的罗列,每个数值要么是指令,要么是数据。

1.4 对计算机来说什么都是数字

  • 对计算机来说什么都是数字
  • 计算机内部会先把文字转换成相应的数字再做处理,这样的数字叫作“字符编码”。总之计算机会把什么都用数字来表示。

1.5 只要理解了三大原则,即使遇到难懂的最新技术,也能轻松应对

  • 计算机是执行程序的机器。程序是指令和数据的集合。为了使互联网上相互连接的计算机能通过程序协同工作,微软公司采用了SOAP以及XML规范。SOAP是关于调用指令的规范,XML则是定义数据格式的规范。

1.6 为了贴近人类,计算机在不断地进化

  • 计算机进化的目的只有一个——与人类更加相近。要想贴近人类,就必须从计算机的处理方式中摒弃不符合人们思维习惯的部分。
  • Windows XP和Office XP末尾的XP,代表的就是Experience(体验)。
  • 面向组件编程的方法是通过将组件(程序的零件)组装到一起完成程序;面向对象编程的方法是先如实地对现实世界的业务建模,之后再把模型搬到程序中。使用符合人类思维习惯的编程方法,可以实现高效率的开发。

1.7 稍微预习一下第2章

  • CPU(处理器)、内存以及I/O。

第2章 试着制造一台计算机吧

  • Z80 CPU是多少比特的CPU?
  • 通常用Hz来表示驱动CPU运转的时钟信号的频率。1秒发出1次时钟信号就是1Hz,所以100MHz(兆赫兹)的话就是100×100万 = 1亿次/秒。M(兆)代表100万。
  • 要想彻底掌握计算机的工作原理,最好的方法就是自己搜集零件,试着组装一台微型计算机。

2.1 制作微型计算机所必需的元件

  • CPU是计算机的大脑,负责解释、执行程序。内存负责存储程序和数据。I/O是Input/Output(输入/输出)的缩写,负责将计算机和外部设备(周边设备)连接在一起。

2.2 电路图的读法

  • 电路中有些地方有交叉,但若只是交叉在一起的话,并不表示电路在交叉处构成通路。只有在交叉处再画上一个小黑点才表示构成通路。
  • IC的引脚(所谓引脚就是IC边缘露出的像蜈蚣腿一样的部分)按照逆时针方向依次带有一个从1开始递增的序号。数引脚序号时,要先把表示正方向的标志,比如半圆形的缺口,朝向左侧。

2.3 连接电源、数据和地址总线

  • Vcc和GND这一对儿引脚用于为IC供电
  • 通常将1个二进制数(也就是数字IC上1个引脚所能表示的0或者1)所表示的信息称作“1比特”,将8个二进制数(也就是8比特)称作“1字节”。比特是信息的最小单位,字节是信息的基本单位。

2.4 连接I/O

  • 寄存器是位于CPU和I/O中的数据存储器。

2.5 连接时钟信号

  • 为了传输时钟信号,就需要把时钟发生器的8号引脚和Z80 CPU的CLK (CLK即Clock,时钟)引脚、Z80 PIO的CLK引脚分别连接起来
  • 据说19世纪英国的查尔斯·巴贝奇(Charles Babbage)曾向制造计算机的原型——分析机发起过挑战。分析机由齿轮组成,因当时科技水平的限制并未制造完成。可是如果把分析机改用电子元件制造出来的话,就是今天的计算机。

2.6 连接用于区分读写对象是内存还是I/O的引脚

  • Z80 CPU上的[插图](即Memory Request,内存请求)引脚和[插图] (即I/O Request, I/O请求)引脚解决了这个问题。当Z80 CPU和内存之间有数据输入输出时,[插图]引脚上的值是0,反之则是1。当Z80 CPU和I/O之间有数据输入输出时,[插图]引脚上的值是0,反之则是1。

2.7 连接剩余的控制引脚

  • CPU、内存、I/O中不但有地址总线引脚、数据总线引脚,还有其他引脚,通常把这些引脚统称为“控制引脚”。
  • 像这样不经过CPU而直接从外部设备读写内存的行为叫作DMA(Direct Memory Access,直接存储器访问)。在诸位所使用的个人计算机里,硬盘等设备要读写内存时使用的就是DMA。
  • CPU在时钟信号的控制下解释、执行内存中存储的程序,按照程序中的指令从内存或I/O中把数据输入到CPU中,在CPU内部进行运算,再把运算结果输出到内存或I/O中。

2.9 连接用于输入输出的外部设备

  • 当微型计算机运行起来后,指拨开关可用于从外部输入数据,LED可用于向外部输出数据。

2.10 输入测试程序并进行调试

  • 作为计算机大脑的CPU只能解释执行一种编程语言,那就是靠罗列二进制数构成的机器语言(原生代码)

第3章 体验一次手工汇编

  • CPU中的标志寄存器(Flags Register)有什么作用?
  • 一旦执行了算术运算、逻辑运算、比较运算等指令后,标志寄存器并不会存放运算结果的值,而是会把运算后的某些状态存储起来,例如运算结果是否为0、是否产生了负数、是否有溢出(Overflow)等。

3.1 从程序员的角度看硬件

  • 因为程序的作用是驱动硬件工作,所以在编写程序之前必须要先了解微型计算机的硬件信息。

3.2 机器语言和汇编语言

  • 操作数表示的是指令执行的对象。CPU的寄存器、内存地址、I/O地址或者直接给出的数字都可以作为操作数
  • 在汇编语言中,读写内存的指令不同于读写I/O的指令。一旦执行了读写内存的指令,比如LD指令,[插图]引脚上的值就会变为0,于是内存被选为输入输出的对象;而一旦执行了读写I/O的指令,比如IN或OUT指令,[插图]引脚上的值就会变为0,于是I/O(这里用的是Z80 PIO)被选为输入输出的对象。

3.3 Z80 CPU的寄存器结构

  • 计算机的硬件有三个基本要素,CPU、内存和I/O。CPU负责解释、执行程序,从内存或I/O输入数据,在内部进行运算,再把运算结果输出到内存或I/O。内存中存放着程序,程序是指令和数据的集合。I/O中临时存放着用于与周边设备进行输入输出的数据。
  • 既然数据的运算是在CPU中进行的,那么在CPU内部就应该有存储数据的地方。这种存储数据的地方叫作“寄存器”。
  • A寄存器也叫作“累加器”,是运算的核心。所以连接到它上面的导线也一定会比其他寄存器的多。F寄存器也叫作“标志寄存器”,用于存储运算结果的状态,比如是否发生了进位,数字大小的比较结果等。PC寄存器也叫作“程序指针”,存储着指向CPU接下来要执行的指令的地址。PC寄存器的值会随着滴答滴答的时钟信号自动更新,可以说程序就是依靠不断变化的PC寄存器的值运行起来的。SP寄存器也叫作“栈顶指针”,用于在内存中创建出一块称为“栈”的临时数据存储区域。
  • 操作数必须是已存储在CPU寄存器中的数字,这是汇编语言的规定。

3.4 追踪程序的运行过程

  • 机器语言是唯一一种CPU能直接理解的编程语言。
  • 转换而成的机器语言有多少个字节取决于汇编语言指令的种类以及操作数的个数。
  • 通过反复进行“读取指令”“解释、执行指令”“更新PC寄存器的值”这3个操作,程序就能运行起来了。

3.5 尝试手工汇编

  • 在CPU的资料中,明确写有所有可以使用的助记符,以及助记符转换成机器语言后的数值。只要查看这些资料,就可以把用汇编语言编写的程序手工转换成机器语言的程序,这样的工作称为“手工汇编”。
  • 机器语言中每条语句的字节数是多少,内存地址就相应地增加多少。

3.6 尝试估算程序的执行时间

  • 使用汇编语言编程时,因为要事无巨细地列出计算机的行为,所以程序会变得冗长繁复。

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

  • 用户的操作等产生事件后,由事件决定程序的流程。
  • 与河流的流动方式一样,程序的流程也分为三种。在程序中,把犹如水流向着一个方向流淌的流程称作“顺序执行”;把犹如水流流着流着产生了支流的流程称作“条件分支”;把犹如水流卷成漩涡的流程称作“循环”。
  • 为什么说“程序是流动着的”呢?因为作为计算机大脑的CPU在同一时刻基本上只能够解释、执行一条指令。把指令和作为指令操作对象的数据排列起来就形成了程序。

4.1 程序的流程分为三种

  • CPU中有各种各样的各司其职的寄存器。其中有一个被称为PC (Program Counter,程序计数器)的寄存器,负责存储内存地址,该地址指向下一条即将执行的指令。每解释执行完一条指令,PC寄存器的值就会自动被更新为下一条指令的地址。

4.3 表示循环程序块的“帽子”和“短裤”

  • 条件分支本身也是通过跳转指令实现的。根据比较操作的结果,跳转到之前处理过的步骤就是循环;跳转到之后尚未处理的步骤就是条件分支

4.4 结构化程序设计

  • 所谓结构化程序设计就是“为了把程序编写得具备结构性,仅使用顺序执行、条件分支和循环表示程序的流程即可,而不再使用跳转指令”
  • 在程序设计的世界中,如果看到了以“结构化”开头的术语,就可以这样认为:程序的流程是由程序块表示的,而不是用GoTo语句等跳转指令实现的。
  • 但是即使使用了结构化异常处理,在硬件上使用的也还是跳转指令,只是说在高级语言中不用再写相当于跳转指令的语句了。如果把用高级语言所编写的程序转换成机器语言,像结构化异常处理这样的语句还是会被转换为跳转指令。

4.5 画流程图来思考算法

  • 思考算法时的要点是要分两步走,先从整体上考虑程序的粗略流程,再考虑程序各个部分细节的流程。

4.6 特殊的程序流程——中断处理

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

4.7 特殊的程序流程——事件驱动

  • 用事件驱动的方式编写那些工作在GUI(Graphical User Inteface,图形用户界面)环境中的应用程序
  • 通常把用户在应用程序中点击鼠标或者敲击键盘这样的操作称作“事件”(Event)。负责检测事件的是Windows。Windows通过调用应用程序的WndProc()函数通知应用程序事件的发生。而应用程序则根据事件的类型做出相应的处理。这种机制就是事件驱动。
  • 条件分支和循环,在高级语言中用程序块表示,在机器语言和汇编语言中用跳转指令表示,在硬件上是通过把PC寄存器的值设为要跳转到的目的地的内存地址来实现

COLUMN 来自企业培训现场

  • 黑灵芝、粽子叶、红孩儿、三乘轿、黄丝带、五缕须、蓝琉璃、钟子期、灰八哥、摆酒宴

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

  • “哨兵”指的是一种含有特殊值的数据,可用于标识数据的结尾等。
  • 字符串的末尾用0表示,链表的末尾用-1表示,像这种特殊的数据就是哨兵。

5.1 算法是程序设计的“熟语”

  • 算法就相当于是程序设计中的熟语。
  • 只要理清在现实世界解决问题的步骤,再结合计算机的特性,就一定能想出算法。

5.2 要点1:算法中解决问题的步骤是明确且有限的

  • 要点1:算法中解决问题的步骤是明确且有限的
  • 被明确定义的有限个规则的集合,用于根据有限的步骤解决问题。
  • 算法就是“把解决问题的步骤无一遗漏地用文字或图表示出来”
  • 最大公约数是指两个整数的公共约数(能整除被除数的数)中最大的数。

5.3 要点2:计算机不靠直觉而是机械地解决问题

  • 请诸位注意以下三点:1.步骤是明确的、完全不依赖直觉的;2.步骤是机械的、不需要动脑筋就能完成的;3.使步骤终止的原因是明确的。

5.4 要点3:了解并应用典型算法

  • 笔者建议从事编程工作的人手中要有一本能作为算法辞典的书

5.5 要点4:利用计算机的处理速度

  • 要点4:利用计算机的处理速度
  • Mod是用于求除法运算中余数的运算符。
  • 无论是多么冗长繁琐的步骤,只要明确并且机械就能构成优秀的算法。

5.6 要点5:使用编程技巧提升程序执行速度

  • 在考量用于解决同一个问题的多种算法的优劣时,可以认为转化为程序后,执行时间较短的算法更为优秀
  • 改成用待判定的数除以比它的1/2小的所有数,处理时间就会缩短。之所以改成这样是因为没有必要去除以比它的1/2还大的数。
  • 在算法技巧中有个著名的技巧叫作“哨兵”。这个技巧多用在线性搜索(从若干个数据中查找目标数据)等算法中。线性搜索的基本过程是将若干个数据从头到尾,依次逐个比对,直到找到目标数据。

5.7 要点6:找出数字间的规律

  • 所有的信息都可以用数字表示——这是计算机的特性之一

5.8 要点7:先在纸上考虑算法

  • 最后介绍最为重要的一点,那就是思考算法的时候,要先在纸上用文字或图表描述出解决问题的步骤,而不要立刻开始编写代码。
  • 曾经有一本被誉为凡是立志成为程序员的人都应该去读的名著,那就是Niklaus Wirth的Algorithms+Data Structures=Programs。

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

  • 变量的实质是按照变量所存储数据的大小被分配到的一块内存空间。
  • 程序员有必要把算法(处理问题的步骤)和数据结构(作为处理对象的数据的排列方式)两者放到一起考虑

6.1 要点1:了解内存和变量的关系

  • 变量是程序中数据存储的最小单位,每个变量都对应着一块物理上的内存空间。

6.2 要点2:了解作为数据结构基础的数组

  • 通过使用数组,既可以同时定义出多个变量,又可以提高编写程序的效率。
  • 在用C语言编写的程序中,是通过指定数组名和数组所包含的元素个数来定义数组、以供使用的
  • 数组是数据结构的基础,之所以这么说是因为数组反映了内存的物理结构本身。在内存中存储数据的空间是连续分布的

6.3 要点3:了解数组的应用——作为典型算法的数据结构

  • 数组是数据结构的基础,只要使用数组就能通过程序实现各种各样的算法以处理大量的数据。
  • 通常把像变量i这样的用于记录循环次数的变量称为循环计数器(Loop Counter)。
  • 在冒泡排序算法中,需要从头到尾地比较数组中每对儿相邻的元素的数值,然后反复交换较大的数值和较小的数值的位置。

6.4 要点4:了解并掌握典型数据结构的类型和概念

  • 数组是一种直接利用内存物理结构(计算机的特性)的最基本的数据结构。
  • 这些数据结构其实都是通过程序从逻辑上改变了内存的物理结构,即数据在内存上呈现出的连续分布状态

6.5 要点5:了解栈和队列的实现方法

  • 通过使用由数组、栈顶指针以及入栈函数和出栈函数所构成的集合,就能实现栈这种数据结构了

6.6 要点6:了解结构体的组成

  • 所谓结构体,就是把若干个数据项汇集到一处并赋予其名字后所形成的一个整体
  • 一旦定义完结构体,就可以把结构体当作是一种数据类型,用它来定义变量。

6.7 要点7:了解链表和二叉树的实现方法

  • 链表是一种类似数组的数据结构,这个“数组”中的每个元素和另一个元素都好像是手拉着手一样
  • 带有指向其他元素指针的自我引用结构体
  • 在C语言中,把存储着地址的变量称为“指针”。这里的“*”(星号)就是指针的标志。
  • 那么,接下来就是链表的有趣之处了。因为Ptr中存储的是与下一个数组元素的连接信息,所以只要替换了Ptr的值,就可以对数组中的元素排序,使元素的排列顺序不同于其在内存上的物理排列顺序
  • 无论是在哪种编程语言中,数据结构的基础都是数组,因此设法灵活地运用数组才是关键。

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

  • OOP是Object Oriented Programming(面向对象编程)的缩略语。
  • ++是表示自增(每次只将变量的值增加1)的C语言运算符。之所以被命名为C++,是因为C++在C语言的基础上增加了面向对象的机制这一点。另外,将C++进一步改良的编程语言就是Java和C#语言。

7.1 面向对象编程

  • 面向对象编程(OOP, Object Oriented Programming)是一种编写程序的方法,旨在提升开发大型程序的效率,使程序易于维护

7.2 对OOP的多种理解方法

  • 面向对象编程是一种基于以下思路的程序设计方法:将关注点置于对象(Object)本身,对象的构成要素包含对象的行为及操作,以此为基础进行编程。

7.3 观点1:面向对象编程通过把组件拼装到一起构建程序

  • 面向对象编程的关键在于能否灵活地运用类。

7.4 观点2:面向对象编程能够提升程序的开发效率和可维护性

  • 大部分的类都已内置于面向对象编程语言中了,这些类可以为来自各个领域的程序员所使用。通常将像这样的一组类(一组组件)称作“类库”。
  • 所谓企业级的程序,指的是对可维护性有较高要求的程序
  • “我是创造类的人,你是使用类的人”——在实际应用面向对象编程时要带着这个感觉。开发小组中的全体成员没有必要都对程序中的方方面面有所了解,而是组中有些人只负责制作组件(类),有些人只负责使用组件。

7.5 观点3:面向对象编程是适用于大型程序的开发方法

  • 面向对象编程是适用于大型程序的开发方法
  • 在人的直觉中,大件物品都是由组件组装起来的。因此可以说面向对象编程方法把同样的直觉带给了计算机,创造了一种顺应人类思维习惯的先进的开发方法。

7.6 观点4:面向对象编程就是在为现实世界建模

  • 在面向对象编程中,可以通过“这个是由什么样的对象构成的呢?”这样的观点来分析即将转换成程序的现实世界。这种分析过程叫作“建模”。

7.7 观点5:面向对象编程可以借助UML设计程序

  • 为了把对现实世界建模的结果以图形的形式表示出来,还经常使用被称作UML(Unified Modeling Language,统一建模语言)的表记方法。

7.8 观点6:面向对象编程通过在对象间传递消息驱动程序

  • 面向对象编程通过在对象间传递消息驱动程序
  • 沉浸在面向过程编程中的程序员们通常都习惯于用流程图思考程序的运行过程。可是为了实践面向对象编程,就有必要改用时序图来考虑程序的运行过程。

7.9 观点7:在面向对象编程中使用继承、封装和多态

  • 继承指的是通过继承已存在的类所拥有的成员而生成新的类。封装指的是在类所拥有的成员中,隐藏掉那些没有必要展现给该类调用者的成员。多态指的是针对同一种消息,不同的对象可以进行不同的操作。
  • 为了对类进行封装,需要在类成员的定义前指定关键词public(表示该成员对外可见)或是private(表示该成员对外不可见)。

7.10 类和对象的区别

  • 类是对象的定义,而对象是类的实例(Instance)
  • 定义了一个类MyClass。但是我们还无法直接使用类MyClass所持有的成员,要想使用就必须在内存上生成该类的副本,这个副本就是对象

7.11 类有三种使用方法

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

7.12 在Java和.NET中有关OOP的知识不能少

  • Java和.NET其实是位于操作系统(Windows或Linux等)之上,旨在通过隐藏操作系统的复杂性从而提升开发效率的程序集,这样的程序集也被称作“框架”(Framework)。框架由两部分构成,一部分是负责安全执行程序的“执行引擎”,另一部分是作为程序组件集合的“类库”

第8章 一用就会的数据库

  • 键用于设定表和表之间的关系(Relationship),而索引是提升数据检索速度的机制。
  • SQL(Structured Query Language,结构化查询语言)

8.1 数据库是数据的基地

  • 所谓数据库(Database)就是数据(Data)的基地(Base)
  • 1970年美国IBM公司的Codd先生设计发明了关系型数据库。

8.2 数据文件、DBMS和数据库应用程序

  • 数据库的实质虽然是某种数据文件,但是诸位编写的应用程序并不是直接去读写这些数据文件,而是以DBMS作为中介间接地读写

8.3 设计数据库

  • 设计数据库的第一步是从“你想要了解什么”的视角出发找出需要的数据
  • 把必要的数据筛选出来以后,下一步要考虑的是各种数据的属性。属性也称作模式(内模式),具体来说就是数据的类型(是数字还是字符串),数字的话是整数还是浮点小数,字符串的话最多允许包含多少个字符,是否允许NULL值(表示未知或者不存在的值),等等。
  • 在关系型数据库中,把录入到表中的每一行数据都称为记录,把构成一条记录中的各个数据项(在本例中是商品名称、单价等)所在的列都称作字段。记录有时也被称为行或元组(Tuple),字段有时也被称为列或属性(Attribute)。

8.4 通过拆表和整理数据实现规范化

  • 为了解决这类问题,在设计关系型数据库时,还要进行“规范化”。所谓规范化,就是将一张大表分割成多张小表,然后再在小表之间建立关系,以此来达到整理数据库结构的目的。
  • 规范化的要点是在一个数据库中要避免重复存储相同的数据。

8.5 用主键和外键在表间建立关系

  • 为了在表间建立关系,就必须加入能够反映表与表之间关系的字段,为此所添加的新字段就被称为键(Key)
  • 当出现多对多关系时,可以在这两张表之间再加入一张表,把多对多关系分解成两个一对多关系(如图8.10所示)。加入的这张表被称作连接表(Link Table)。

8.6 索引能够提升数据的检索速度

  • 索引仅仅是提升数据检索和排序速度的内部机制

8.7 设计用户界面

  • 只要通过拆表实现了规范化、设置了主键和外键、确保没有多对多关系、根据需要设置了参照完整性和索引,那么数据库的设计就告一段落了。

8.8 向DBMS发送CRUD操作的SQL语句

  • SQL语言(Structural Query Language,结构化查询语言)
  • 使用SQL语言通常不需要定义变量或者考虑程序的执行流程。

8.9 使用数据对象向DBMS发送SQL语句

  • 在Windows应用程序中,向DBMS发送SQL语句时,一般情况下使用的都是被称为数据对象(Data Object)的软件组件

8.10 事务控制也可以交给DBMS处理

  • 事务由若干条SQL语句构成,表示对数据库一系列相关操作的集合
  • 为了防止出现这种问题,在SQL语言中设计了以下三条语句:1. BEGIN TRANSACTION(开启事务)语句,用于通知DBMS开启事务;2. COMMIT(提交事务)语句,用于通知DBMS提交事务;3. ROLL BACK(事务回滚)语句,用于在事务进行中发生问题时,把数据库中的数据恢复到事务开始前的状态(如图8.16所示)。

COLUMN 来自企业培训现场

  • 对于缺乏计算机基础知识的新人而言,笔者大力推荐C语言。因为它既能够使程序员感知到计算机的构造,又迫使程序员殚精竭虑地去思考如何才能亲手实现算法和数据结构。

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

  • 所谓MAC地址就是能够标识网卡的编号。
  • 通常,人们把通过连接多台计算机所组成的、可用于交换信息的系统称为“网络”(Network)。

9.1 实验环境

  • “集线器”(Hub)是负责把各台计算机的网线相互连接在一起的集线设备。“路由器”(Router)是负责把公司内的网络和互联网连接起来的设备。

9.2 实验1:查看网卡的MAC地址

  • 计算机是硬件和软件的集合体,网络也不例外
  • 1.安装到每台计算机上的网卡(NIC, Network Interface Card);2.插到网卡上的网线;3.把网线汇集起来连接到一处的集线器;4.用于接入到互联网的路由器。需要注意的是这些硬件的规格只有相互匹配了才能连接在一起。
  • CSMA/CD(Carrier Sense Multiple Access with Collision Detection,带冲突检测的载波监听多路访问)

9.3 实验2:查看计算机的IP地址

  • 通常把设定了IP地址的计算机称为“主机”(Host)。因为路由器也算是计算机的一种,所以它们也有IP地址。在TCP/IP网络中,传输的数据都会携带MAC地址和IP地址两个地址。

9.4 实验3:了解DHCP服务器的作用

  • IP地址和子网掩码都是在软件上设置的参数。

9.5 实验4:路由器是数据传输过程中的指路人

  • 互联网就是用路由器把多个LAN连接起来所形成的一张大网
  • 当从公司内的计算机向另一家公司的计算机发送数据时会发生什么呢?首先,一个不属于LAN内计算机的IP地址会被附加到数据的发送目的地字段上。这样的数据虽然会被LAN内的计算机所忽略,但是不会被路由器忽略。因为路由器的工作原理就是查看附加到数据上的IP地址中的网络地址部分,只要发现这个数据不是发送给LAN内计算机的,就把它发送到LAN外,即互联网的世界中。

9.6 实验5:查看路由器的路由过程

  • 通常把这种数据经过路由器转发的过程称为“路由”(Routing)。

9.7 实验6:DNS服务器可以把主机名解析成IP地址

  • DNS服务器可以把主机名解析成IP地址
  • 通常把这种由主机名和域名组合起来形成的名字称作FQDN(Fully Qualified Domain Name,完整限定域名)。

9.8 实验7:查看IP地址和MAC地址的对应关系

  • 实现由IP地址到MAC地址的转换,这种功能被称作ARP(Address Resolution Protocol,地址解析协议)

9.9 TCP的作用及TCP/IP网络的层级模型

  • IP协议用于指定数据发送目的地的IP地址以及通过路由器转发数据。而TCP协议则用于通过数据发送者和接收者相互回应对方发来的确认信号,可靠地传输数据。

第10章 试着加密数据吧

  • 信息摘要是指从作为数字签名对象的文件整体中计算出的数值。
  • 对比由文件整体计算出的信息摘要,可以证明文件的内容有没有被篡改。加密处理过的信息摘要就是数字签名。
  • 因此像这种网店页面的URL,通常都是以https://开头,表示数据正在使用加密的方式进行传输。

10.1 先来明确一下什么是加密

  • 定义了应该把哪个编码分配给哪个字符的字符编码体系叫作字符集
  • 通常把这种未经加密的文本数据称为“明文”
  • 虽然存在各种各样的加密技术,但是其中的基本手段无外乎还是字符编码的变换,即将构成明文的每个字符的编码分别变换成其他的数值。通过反转这种变换过程,加密后的文本数据就可以还原。通常把密文还原成明文的过程(即解读密码的过程)称为“解密”。

10.4 适用于互联网的公开密钥加密技术

  • 前面几节所讲解的加密技术都属于“对称密钥加密技术”,也称作“秘密密钥加密技术”(如图10.7所示)。这种加密技术的特征是在加密和解密的过程中使用数值相同的密钥。
  • 因此对称密钥加密技术不适合在互联网中使用。

10.5 数字签名可以证明数据的发送者是谁

  • 步骤中所提及的“信息摘要”(Message Digest)可以理解为就是一个数值,通过对构成明文的所有字符的编码进行某种运算就能得出该数值。
  • MD5(Message Digest5)的信息摘要

第11章 XML究竟是什么

  • HTML是用于编写网页的标记语言。XML是用于定义任意标记语言的元语言。
  • 所谓标记语言,就是可以用标签为数据赋予意义的语言

11.1 XML是标记语言

  • XML是Extensible Markup Language的缩写,译为可扩展标记语言。
  • HTML(Hypertext Markup Language,超文本标记语言)

11.3 XML是元语言

  • XML并没有限定标签的使用方式,使用什么样的标签都可以。可以说XML仅仅限定了进行标记时标签的书写格式(书写风格)。

11.4 XML可以为信息赋予意义

  • 网页是指使用HTML规定好的标签,将字符串和图片显示在Web浏览器上的页面。
  • 因为HTML中规定的各种标签只能用来指定信息的呈现样式,而不能表示信息的含义。
  • XML的主要用途是为在互联网上交换的信息赋予意义
  • HTML是给人看的,XML是给计算机看的

11.5 XML是通用的数据交换格式

  • CSV(Comma Separated Value,逗号分隔值

11.6 可以为XML标签设定命名空间

  • XML文档并非互联网专用,但是XML确实是一种主要通过互联网在全世界的计算机之间交换数据时使用的数据格式。

11.7 可以严格地定义XML的文档结构

  • 所谓有效的XML文档是指在XML文档中写有DTD(Document Type Definition,文档类型描述)信息。

第12章 SE负责监管计算机系统的构建

  • SE是System Engineer(系统工程师)的缩略语。

12.1 SE是自始至终参与系统开发过程的工程师

  • 所谓系统,就是“由多个要素相互发生关联,结合而成的带有一定功能的整体”。将各种各样的硬件和软件组合起来构建而成的系统就是计算机系统。
  • SE负责的工作是项目管理和软件开发管理,以及引进计算机系统后的维护,而制作软件(编程)的工作则交由程序员完成。

12.3 系统开发过程的规范

  • 无论任何事都需要规范,即便未能按其实践,规范的存在也算是一种参考。

12.4 各个阶段的工作内容及文档

  • 在计算机行业中常会提及“外部”和“内部”,一般情况下,把从用户的角度看到的东西称为“外部”,把从开发者的角度看到的东西称为“内部”。

12.5 所谓设计,就是拆解

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

12.6 面向对象法简化了系统维护工作

  • 所谓“对象”(Object),就是把指令和数据归拢到具有一定意义的组中而形成的整体
  • 只有以易于维护为标准把业务拆解成对象的做法,才是具有专家风范的面向对象法。

12.7 技术能力和沟通能力

  • 所谓技术能力,是指灵活运用硬件、软件、网络、数据库等技术的能力。而所谓沟通能力,是指和他人交换信息的能力,而且这里要求的是双向的信息交换能力。

12.8 IT不等于引进计算机

  • IT是Information Technology(信息技术)的缩写,也许翻译成“充分运用信息的技术”会更加容易理解。
  • SE的工作是分析靠手工作业完成的业务,提出能够用计算机解决客户所面临问题的方法

12.9 计算机系统的成功与失败

  • 客户期待的是由计算机带来的IT解决方案,而并非计算机技术