《世界是数字的》是世界顶尖计算机科学家BrianW.Kernighan写的一本计算机科普类读物,简明扼要但又深入全面地解释了计算机和通信系统背后的秘密,适合计算机初学者和非计算机专业的人读。这真的是一本好书,借Google常务董事长的话:
对计算机、互联网及其背后的奥秘充满好奇的人们,这绝对是一本不容错过的好书。
可以举个简单的例子来说明NP问题,那就是著名的“旅行推销员问题”(TravelingSalesmanProblem)。一个推销员必须从他居住的城市出发,到其他几个城市去推销,然后再回家。目标是每个城市只到一次(不能重复),而且走过的总距离最短。这个问题实际应用价值很大,其原理经常被应用于设计电路板上孔洞的位置,或者部署船只到墨西哥湾的特定地点采集水样。旅行推销员问题已经被仔细推敲了50多年,但还是解决不了NP难问题。
现在业界内也经常讨论一个问题:P是否等于NP?即这些难题到底跟那些简单的问题是不是一类?尽管很多人都相信未来的某一天可以达到P=NP,但我还是希望这一天不要太早到来,因为现在一些重要的应用,如加密软件,都是完全建立在某个特定的问题确实极难解决的基础之上的。设想一下,如果某天这些难问题都被攻破了,那我们的各个账号密码、网银岂不是要……当然,如果真有那么一天,也表明计算机领域又有了一个重大的突破,这是值得可贺的。
我们知道,磁盘没有真正的删除,我们所谓的“delete”操作只是把文件占用的块回写到空闲块列表。但是,这些文件的内容并没有被删除。换句话说,原始文件占用的每个块中的所有字节都会原封不动地呆在原地。除非相应的块从空闲块列表中被“除名”并奉送给某个应用程序,否则这些字节不会被新内容覆盖。这意味着什么呢?意味着你认为已经删除的信息实际上还保存在硬盘上。如果有人知道怎么读取它们,仍然可以把它们读出来。任何可以不通过文件系统而能够逐块读取硬盘的程序,都可以看到那些被“删除”的内容。
那么如何真正的彻底删除呢?Mac中的“安全擦除”选项在释放磁盘块之前,会先用随机生成的比特重写其中的内容。但是即使用新信息重写了原有内容,一名训练有素的敌人仍旧可以凭借他掌握的大量资源发现蛛丝马迹。军事级的文件擦除会用随机的1和0对要释放的块进行多遍重写。更为保险的做法是把整块硬盘放到强磁场里进行消磁。而最保险的做法则是物理上销毁硬盘,这也是保证其中内容彻底销声匿迹的唯一可靠方法。
从技术角度讲,无线网络利用电磁波传送信号。电磁波是特定频率的电波,其振动频率以Hz来衡量(读者可能更熟悉广播电台常用的MHz或GHz,比如北京交通广播电台的频率是103.9MHz)。在发送信号之前,首先要通过调制把数据信号附加到载波上。比如,调幅(AM)就是通过改变载波的振幅或强度来传达信息,而调频(FM)的原理则是围绕一个中心值来改变载波的频率。接收器接收到信号的强度与发射器的功率成正比,与到发射器距离的平方成反比。由于存在这种二次方递减的关系,距离发射器的距离增加一倍,接收器接收到的信号强度就只有原来的四分之一。无线电波穿越各种物质时强度都会衰减,物质不同衰减程度也不同,比如说金属就会屏蔽任何电波(突然想起《超验骇客》电影里卡斯特家花园里建的用来屏蔽信号的金属网)。高频比低频更容易被吸收,二者在其他方面都一样。
无线联网对可以使用的频率范围—频段,以及使用多大的功率发送电波都有严格规定。频段分配始终都是一个有争议的话题,因为各种需求总会发生冲突。
下面介绍三种使用最广泛的无线联网技术。
美国使用了两种完全不同的手机通信技术:
(1)AT&T和T-Mobile使用GSM(GlobalSystemforMobileCommunications,全球移动通信系统),这是一种在欧洲使用非常普遍的系统,它把频带分成很窄的信道,在每个信道内依次附加多路通话。GSM是世界上应用范围最广的系统。(2)Verizon和Sprint使用CDMA(CodeDivisionMultipleAccess,码分多址),这是一种“扩展频段”技术,它把信号扩展到频带之外,但对不同的通话采用不同的编码模式进行调制。这就意味着,虽然所有手机都使用相同的频带,但大多数情况下通话之间不会发生干扰。GSM和CDMA都会利用数据压缩来尽可能减少封装信号的比特量。对于通过嘈杂的无线电信道发送数据时无法避免的错误,再添加错误校验来解决问题。
手机带来了一系列难解的非技术问题:
(1)频段的分配。在美国,政府限制每个频带最多只能有两家公司使用指定频率。因此频段是非常稀缺的资源,也是无线联网系统的关键资源。(2)手机信号发射塔的位置。信号发射塔作为户外建筑算不上漂亮,很多地区为此拒绝在自己的地界上搭设这种东西。
互联网有很多协议,其中最基础的有两个,一是互联网协议(InternetProcotol,IP),定义了单个包的格式和传输方式,二是传输控制协议(TransmissionControlProtocol,TCP),定义了IP包如何组合成数据流以及如何连接到服务。两者合起来起就叫TCP/IP。当然TCP/IP协议族不只是包含这两个协议,还包含其它许多的协议。
数据压缩技术分为无损压缩和有损压缩。-无损压缩,即压缩过程中不丢失信息,解压后得到的数据和原始数据一模一样,比如霍夫曼编码(Huffmancoding),和广泛使用的zip程序或bzip2程序,都属于无损压缩。只不过前者按单个字母来压缩,而后者按大块文字,比如zip就是根据原始文档的属性选择按单词或词组压缩。-有损压缩最常用于处理要给人看或听的内容。比如压缩数码相机拍出来的照片。人眼分辨不出来非常相近的颜色,所以不必保留实际输入的那么多种颜色,颜色少一点没有任何问题,这样就可以减少编码所用的位数。与此类似,某些难以觉察的细节也可以丢弃,这样处理后的图像尽管没有原始画面那么精密,但眼睛看不出来。细微的亮度变化也是如此。比如JPEG算法和用于压缩电影和电视节目的MPEG系列算法都是有损压缩。
所有压缩算法的思路都是减少或去掉那些不能物尽其用的位串,采用的主要方法包括把出现频率较高的元素编码成短位串、构造频率字典、用数字代替重复内容等。无损压缩能够完美重现原始数据,有损压缩通过丢弃接收者不需要的信息,来达成数据质量和压缩率的折中。
在“错误检测和校正”小节看到了一个有意思的算法,是IBM公司的彼得·卢恩(PeterLuhn)于1954年设计的一个校验和(checksum)算法,来检测在实际操作中最常见的两种错误:单个数字错误、由于两个数字写错位置而引起的大多数换位错误。后来这个算法有了很多应用场景,比如可以检测16位长的信用卡和储蓄卡的卡号是否是有效的卡号(这是美国的情况,中国的储蓄卡一般是19位,不过算法同样适用);10位或13位的ISBN书号也采用了类似算法的校验和,用来对付同类错误。
这个算法很简单:从最右一位数开始向左,把每个数字交替乘1或2,如果结果大于9就减9。如果把各位数的计算结果加起来,最后得到的总和能被10整除,那这个卡号就是有效卡号。
通用网关接口(CommonGatewayInterface,CGI),是HTTP协议里一个从客户端(你的浏览器)向服务器传递信息的机制,它能用来传递用户名和密码、查询条件、单选按钮和下拉菜单选项。CGI机制在HTML里用...标签来控制。你可以在标签里放入文本输入区、按钮等常见界面元素。如果再加上一个“提交”按钮,按下去就会把表单里的数据发送到服务器,服务器用这些数据作为输入,来运行指定的程序。
Cookie技术和Javascript脚本语言都是Netscape公司发明的,网景公司对互联网的贡献真是太大了(还记得网景浏览器吗?),不得不佩服。
病毒和蠕虫在技术上有个细微差别是:病毒的传播需要人工介入,也就是只有你的操作才能催生它的传播;而蠕虫的传播却不需要你的援手,完全自发进行。
搜索引擎的核心竞争力在于怎么才能迅速从抓取的页面中筛选出匹配度最高的URL,比如最为匹配的十个页面。谁能把最佳匹配结果排在前头,谁的响应速度快,谁就能赢得用户。
说到底就是拍卖搜索关键词,且搜索引擎公司都有完备的手段避免虚假点击。
只要上网,我们的信息就会被收集,而如果没有我们留下的蛛丝马迹,几乎什么事儿也干不了。使用其他系统时的情况也一样,特别是使用手机的时候,手机网络随时都知道我们在哪里。如果是在户外,支持GPS的手机(现在的智能手机几乎都支持)定位用户的误差不超过10米,而且随时都会报告你的位置。有些数码相机也带GPS,可以在照片中编入地理位置信息,这种做法被称为打地理标签。
怎么收集我们的浏览信息呢?有些信息会随着浏览器的每一次请求发送,包括你的IP地址、正在浏览的页面、浏览器的类型和版本、操作系统,还有语言偏好。此外,如果服务器的域中有cookie,那么这些“小甜饼”也会随浏览器请求一块发送。根据cookie的规范,只能把这些保存用户信息的小文件发给最初生成它们的域。那还怎么利用cookie跟踪我对其他网站的访问呢?要知道答案,就得明白链接的工作原理:
每个网页都包含指向其他页面的链接(这正是“超链接”的本义)。我们都知道链接必须由我们主动点击,然后浏览器才会打开或转向新页面。但图片不需要任何人点击,它会随着页面加载而自动下载。网页中引用的图片可以来自任何域。于是,在浏览器取得图片时,提供该图片的域就知道我访问过哪个页面了。而且这个域也可以在我的计算机上存放cookie,并且收到之前访问过的域所产生的cookie。
以上就是实现跟踪的秘密所在,下面我们再通过例子来解释一下。假设我想买一辆新车,因此访问了toyota.com。我的浏览器因此会下载60KB的HTML文件,还有一些JavaScript,以及40张图片。其中一张图片的源代码如下:
许多网站都含有多家公司的跟踪程序。给大家推荐一个浏览器扩展Ghostery,通过它可以禁用JavaScript跟踪代码,还能查看被阻止的跟踪器。装上它,你会惊讶于互联网上潜伏着多少“间谍”。仅适用于Firefox的Noscript插件也有类似的功能。
一个像素大的图片或者叫网页信标(webbeacon,一个很小而且通常是看不到的图片,用于记录某个网页是否已经被下载过了。)都可以用来跟踪你。用于取得像素图片的URL可以包含一个标识码,表示你正在浏览什么网页,还可以包含一个标识符,表示特定的用户。这两个标志就足以跟踪你的浏览活动了。