计算机扫盲贴|第九章_互联网 |
前面的章节(
)描述了以太网和无线网等本地网络技术。我们知道,电话系统把全世界的电话机连在了一起,那么如何通过计算机网络把全世界的计算机连接起来呢?怎样才能扩大网络规模,把不同的本地网络连接在一起?
如把一幢大楼里的所有局域网都连通,或者用我家的计算机连接到另一个城市里你家的计算机,或者把分别位于加拿大和欧洲的公司网络连成一体。如果底层网络采用了不同的技术,不同的网络又是怎样互通的?当接人的网络和用户越来越多、距离越来越远、所用的设备和技术变化日新月异时,怎样才能从容地扩展网络来满足这些变化的要求? 我们说,“互联网”就是解答以上所有问题的一个答案。实际上,由于它实在太成功了,所以在大多数情况下,它就是唯一的答案。 👃🛩🆘🐋 互联网并不是一个巨型网络,更不是一台巨型计算机。它由定义了网络和其中的计算机相互通信规则的标准连接在一起,是一个松散、非结构化、混乱、自组织的网络集合。 如何才能把光纤网、以太网、无线网等不同物理属性的网络连接起来,甚至在它们之间相隔很远时也能连通?我们需要用名字和地址来识别网络和计算机,就像使用电话号码和电话簿那样。我们需要在间接相连的网络之间找到通信的路径,需要就信息采用何种格式传输达成协议,还需要在错误处理、时延、过载等一些不太容易想到的问题上达成协议。没有这些协议,就很难甚至无法进行通信。👨🦱🩲🧹😆✌ 所有的网络,尤其是互联网,都需要按照协议的约定来处理数据格式、谁先发起请求、后续可以跟随什么样的应答、错误如何处理等方面的问题。在这里,“协议”这个词跟生活中的意思差不多,表示用来跟对方交谈的一组规则。但是,网络协议是基于技术考虑而非社会习俗的,所以它要比最严格的社会结构还精确。 互联网必须满足以下这些不是那么显而易见的规则:互联网的所有接人方都要达成同样的协议和标准,如信息按什么格式组织、在计算机之间怎样交换,如何识别计算机身份并授权,以及错误发生了该如何处理。 👨🦱🕶🛏🤪🙏 考虑到既得利益者的影响,网络协议和标准的达成可能会相当复杂:公司要制造设备、售卖服务,专利和技术持有者想到处渔利,政府则想要监视和控制国际和国内的网络信息。 还有稀缺资源的分配问题。在这方面,无线服务的频段就是一个显而易见的例子,网站域名的管理也不能放任自流。由谁来分配这些资源,按什么原则分配?要使用这些有限的资源,应该谁向谁支付,支付什么?资源分配中遇到纠纷谁来裁决?裁决时以哪套司法系统为依据? 制定所有这些规则的可以是政府、公司、行业协会,也可以是像联合国下属的国际电联这种名义上的非营利性或中立团体。但无论谁制定规则,最终所有的参与者都要达成一致,照章办事。#t230: 🙌🚗🥭ℹ🐴 显然这些问题都是能解决的,毕竟有先例在:遍布全球的电话系统就把散布在各个国家的设备成功地连接了起来。尽管互联网和电话系统并无本质区别,但互联网比电话系统更新潮、规模更大、变化更快,也更杂乱无章。这个行业对所有人都是开放的,而通信业则是由传统电信公司组成的受控环境,其中大部分公司是由国家垄断或者牢牢控制的。 9.1 互 联 网 概 述 在深人了解互联网的技术细节之前,让我们先看看其概貌。互联网初创于1960年代,其初衷在于建造一个网络来连接分散在不同地理位置的计算机。由于项目的大部分资金来自美国国防部的高级研究计划署(Advanced Research Project Agency,缩写为ARPA),最初建成的网络就叫做ARPANET。1969年10月29日,ARPANET上的第一条消息从加州大学洛杉矶分校发出,到达550公里外的斯坦福大学。这一天可以看成互联网的诞生日。#y459:👵🩳💾😋👍 ARPANET从设计伊始,就具有能处理网络任何局部错误的健壮性,能在网络出现问题时依然成功路由数据。经过多年发展,原始ARPANET中的计算机逐步更新换代,所用的技术也推陈出新。网络覆盖范围也从最初只连接美国部分大学计算机科学系和科研机构,到1990年代逐步扩大到商界,最终发展成为互联网。 如今的互联网由成千上万个松散连接的独立网络构成,其中的每个网络都连接到另外一个或多个网络。邻近的计算机通过以以太网为主的局域网连接,然后网络和网络再连起来。网络连接采用的设备叫网关或路由器,其实就是一种专用的计算机,用来把组成信息的数据包从一个网络发送到下一个网络(维基百科上说网关是通用设备,而路由器是专用的,在本书里就不作区分通称为“网关”了)。 👃💈🌶🚭🐥 网关之间互相交换着路由信息,这样它们就至少知道哪些网络与本地网络相连并可以被访问到。 每个网络都可以连接上许多计算机主机(以下简称“主机”),比如家里、办公室里、宿舍里的PC和Mac。家用计算机可以通过无线网卡连接到路由器,然后路由器通过电缆或DSL链路连接到互联网服务提供商(Internet Service Provider,缩写为ISP)。办公室的计算机则可用有线网卡与以太网连接。 上一章已经提到,信息在网络之间游弋的时候,被分作称为包(packet)的小块。一个包就是按特定格式组织起来的一串字节。不同设备使用不同的包格式。包的内容中首先是地址信息,用于标明这个包的发送方和接收方;然后是与这个包本身有关的信息,比如包的长度;最后,通常也是最大的部分,是包输送的信息,即有效载荷。👳🩳💶😚👁 在互联网上,输送数据的包叫做IP包(IP即Internet Protocol,互联网协议)。所有的IP包都是一样的格式。在具体的物理网络上,IP包通过一个或多个物理包来传输。比如,由于最大的以太网包是1500字节,远小于最大IP包的65000字节,所以一个较大的IP包会被切分成多个较小的以太网包进行传输。 每个IP包会经过多个网关,每个网关都把这个包传递给离包的最终目的地更近的下一个网关。一个包在网络中的旅程可能会经过20个网关,这些网关很可能是不同国家的公司或研究所拥有和运行的。 👆🌧🍧🆎🐅 要让这一切运转起来,我们需要以下机制: 【地址】。就像电话号码一样,每台主机都必须有一个辨识身份的地址,才能跟互联网上的其他主机区分开来。这个辨识号码叫做IP地址,长度为32位(4字节)或128位(16字节)。较短的地址用于互联网协议版本4(IPv4),长的则用于版本6(IPv6)。IPv4已使用多年,现在仍占统治地位,但由于大部分IPv4地址都已经分配出去了,网络地址迁移到IPv6的进程正日益加快。 IP地址和以太网地址类似。IPv4地址通常用其4字节的值表示,其中每个字节对应一个十进制数,数与数之间用句点分割,如128.112.132.86就是普林斯顿大学网站 的IPv4地址。这种奇怪的记法叫点分十进制表示法,相比纯十进制或十六进制数值更好记,因而得到广泛的使用。下面是分别用点分十进制、二进制和十六进制表示这个IP地址的例子: 🤟⛴🥄📳🦬 IPv6地址是这个样子:2620:0:1003:100c:9227:e4ff:fee9:05ec,看上去更难理解,所以我们暂时先不讨论。#y450: IP地址的分配机制是,先由一个中心权威机构把连续的IP地址段分配给某个网络的管理员,再由管理员把单个IP地址分配给网络里的主机。这样,每台主机就有一个基于它所在网络的独一无二的地址。对台式机来说,IP地址可能是固定的;但移动设备往往使用动态地址,其IP地址至少在设备每次重新连接到互联网时会改变。👨🚒👑🛏😷🦴 【名字】。由于人们不太擅长记忆无规律的32位数字,哪怕写成点分十进制也不好记,因此,要让人们直接访问一台主机,必须给它取个名字才方便。比如,像 [/url]这种常见的名字,我们称之为域名。域名系统(Domain Name System,缩写为DNS)用于将名字转换为地址,是互联网基础设施的重要组成部分。 【路由】。必须有一种机制,能为每个包查找从源地址到目标地址的路径。前文提到的网关就提供了这种功能。网关之间持续交换路由信息,即互联网上网络和设备的相互连接情况,并根据路由信息把收到的每个包转发到下一个离最终目的地更近一些的网关。 ✊🛩🥄☪🐂 【协议】。最后,为了使信息在不同计算机之间成功复制,必须有一些规则和步骤,用来准确描述上述机制和其他互联网组件是如何协作的。 互联网的核心协议称为IP,该协议为信息传输定义了统一的传输机制和通用的格式。不同类型的物理网络用各自的底层协议来输送IP包。 在IP协议之上是传输控制协议(Transmission Control Protocol,缩写为TCP),该协议利用IP协议来提供可靠的传输机制,以便能从源地址向目标地址发送任意长度的字节序列。在TCP协议之上,更高层的协议利用TCP协议来提供那些我们看起来是“互联网”的服务,如网页浏览、电子邮件、文件共享等。除此之外,互联网还有很多其他协议。例如,IP地址的动态分配是通过DHCP协议(Dynamic Host Configuration Protocol,动态主机配置协议)来处理的。所有这些协议合起来就定义了互联网。 👍🪐🫑♀🦉 下面我们会详细探讨上述每个话题。#y448: 9.2 域 名 和 地 址 谁制定规则?谁控制名字和数字地址的分配?谁负责管理互联网?长期以来,互联网由一小群技术专家以松散合作的方式来管理。互联网的大部分核心技术是互联网工程任务组(Internet Engineering Task Force,IETF)开发的。IETF是一个松散的联盟组织,它设计了构成互联网各要素的运行方式,并将之写成规范的文档。👵👓📠🙂💅 IETF通过定期召开会议和频繁发布出版物的方式打造互联网的技术规范。这些出版物被称为“征求修正意见书”(Request for Comments,RFC)是互联网的事实规范。RFC可以在网上找到,迄今为止已有6000多个RFC。但并非所有RFC都是一本正经的,不信可以看看1990年愚人节应景发布的RFC-1149——“A Standard for the Transmission of IP Datagrams on Avidan Carriers”(用鸟类运送IP数据报的标准)。 管理互联网其他事务的是一个叫互联网名称与数字地址分配机构(Internet Corporation for Assigned Names and Numbers,缩写为ICANN,其网址为icann.org)的非营利组织。ICANN负责互联网的技术协调,包括分配为让互联网正常运行而不能重复的名字和数字地址,如域名、IP地址和某些协议信息。 👈🚂🥭🈚🐝 ICANN还负责给域名注册商授权,好让他们给个人和机构分配域名。ICANN最初是美国商务部管辖的一个署,但现在已经是独立的非营利组织,其主要资金来源是对域名注册商和域名注册收取费用。 9.2.1 域 名 系 统 域名系统(Domain Name System,DNS)规定了我们熟悉的分层命名方案,因此就有了guhei.net和google.com这样的名字。在域名系统中,.com、.net等组织机构代码和.us、.ca等两个字母的国家代码被称为顶级域。顶级域把管理责任和更多名字委托给下级域。例如,普林斯顿大学负责管理princeton.edu,在这个域名下可为计算机科学系规定子域名cs.princeton.edu、为古典文学系规定子域名classics.princeton.edu,计算机系贝可进一步规定域名 。这种层次式的命名可以一直扩展下去。 💅🦼🧊❓🐒 域名只表示逻辑结构,并不受任何地理限制。例如,IBM的分支机构遍布全球,但公司的全部计算机都在ibm.com域名下。一台计算机可以为多个域名服务,这在提供网站托管服务的公司里再平常不过了。也可以用多台计算机为同一个域名服务,比如像Facebook和Amazon这种大型网站。域名系统没有地理限制会带来很多有趣的结果。比如,南太平洋上位于夏威夷和澳大利亚之间有个群岛国叫图瓦卢,它在域名系统中的国家代码是.tv。图瓦卢把国家代码的使用权租给商业公司,后者则兴高采烈地把.tv域名卖给客户。 如果你要买news.tv这种显然有潜在商业价值的域名,可能就要准备掏一大笔钱。反之,kernighan.tv这种只对姓柯尼汉的人有意义的名字,价格还不到每年十几块钱呢。👨🎨🎩💶😤🤙 由于语言上的巧合而受益的其他国家还包括:摩尔多瓦共和国,其.md域名对医生很有吸引力;意大利,其.it域名可以用于play.it这样的网站。域名通常只能使用26个英文字母、数字和连字符。但从2009年起,ICANN批准了一些国际化顶级域名,比如中国除了用.cn之外也可以用.中国。#y433: 9.2.2 IP 地 址 每个网络和每台联网主机都必须有IP地址,这样才能互相通信。IPv4地址是互不重复的32位二进制数,在同一时刻任一地址只能给一台主机使用。ICANN把地址按块分配出去,得到地址块的机构再把它划分成子块分配给下级机构或个人。比如,普林斯顿大学有两个地址块,分别是128.122.ddd.ddd和140.180.ddd.ddd,其中ddd是从0到255的数字。这里的每个地址块最多允许给65536(216)台主机分配地址,总共大约有131000个可用地址。 🧑🚀💍⚔😅🤝 这两个地址块没有数值或地理上的关系,这就像212是纽约市的长话区号而213却是洛杉矶的一样。没有任何理由认为相邻的IP地址块代表物理位置相近的计算机,同样也没办法仅靠IP地址本身判断地理位置一尽管通常可以从其他信息推断出一个IP地址的来源。例如,DNS支持从IP地址到名字的反向查找,可以从128.112.132.86查到 ,于是就可以合理地猜测网站在新泽西州普林斯顿,尽管实际上服务器可能根本就在别的地方。 简单算一下就会发现,IPv4地址只有大约43亿个,甚至还不够地球上每人分一个。因此,按照人类使用的通信服务数量的增长势头,这些IPv4地址迟早会被耗光。实际情况比这种“危言耸听”更糟糕,因为IP地址是按块划分的,这样用起来就没有理论上那么有效率。想想吧,普林斯顿大学真的会有13万1千台计算机吗?IPv4地址耗尽的可能性是真实存在并且迫在眉睫的。(ipv4在2011年已经分配完毕#y426:) 👵👗📠💀🤝 有一种用单个IP地址肩扛手挑多台主机的技术,可以让我们在这个灾难面前获得喘息之机。家用无线路由器一般都提供网络地址转换服务(Network Address Translation,NAT),即用单个外部IP地址为多个内部IP地址提供连网服务。使用NAT之后,家里所有联网设备从外部网络看都具有相同的IP地址,内外地址的双向转换完全由NAT设备的硬件和软件搞定。 当互联网地址迁移到使用128位地址的IPv6之后,这种地址短缺的压力就会消失。IPv6有2^128个,也就是大约10^38个地址,是不会马上耗尽的。' 9.2.3 根 服 务 器 👩✈️💎🔌🥲👂DNS的关键功能是把名字转换为IP地址。顶级域的转换工作由一组根域名服务器负责,它们知道所有顶级域(比如mit.edu)的IP地址。为获取 的IP地址,需要先向根服务器查询mit.edu的IP地址,这样就能访问到MIT域,然后向MIT的域名服务器查询cs.mit.edu的IP地址,从得到的MIT计算机系的域名服务器就可以查到 的IP地址。 因此可以说,DNS使用分而治之的策略来搜索:对顶级域的首次查询把那些在下一步查询中不可能的地址排除掉,后面的每次查询也是如法炮制,这样就能逐级定位到目标主机。 在实际查询中,域名服务器会把近期查找到的名字和地址保存在缓存中。当收到一个新的查询时,如果缓存中有结果,本地域名服务器就会不求助于远程服务器而直接返回了。比如,当我访问kemighan.com时,由于十有八九最近没人查询过这个小众域名,本地域名服务器只好从根服务器开始查询。 ✌🍍🆒🪶 但当我再次访问这个域名时,由于IP地址已就近缓存,查询就会快很多。经尝试,首次查询耗时1/3秒,过了几秒钟之后再次查询同一个域名,只要首次时间的1/10,过几分钟再查也是如此。 你可以用nslookup等工具来亲自体验DNS查询。试试运行下面的命令吧: 👩🛍⌨🤩👈 nslookup 你大概以为只有一台根服务器吧?但对这么关键的系统来说,容忍单点故障的存在显然是个坏主意。因此,共有13台根服务器遍布于全世界,其中大约一半在美国。有的根服务器包含了位于天南海北的多台计算机,在功能上和一台计算机一样。它通过某种协议把查询请求分配到这组计算机里最近的那台。 根服务器在各种不同硬件上运行不同的软件系统,这样,跟单一环境比起来,遇到系统缺陷或病毒攻击时的系统健壮性就要好很多。尽管如此,根域名服务器一直还是协同攻击的目标。可以想见,在某些特殊条件的组合下,所有根域名服务器也可能会同时宕机。 🙏🫑☯🐶 9.2.4 注 册 自 己 的 域 名 只要你想要的域名还没被别人注册,自己去注册一个域名是很简单的事。ICANN授权了好几百个域名注册商,你只要挑一个,选择自己想要的域名,付钱,域名就归你了。当然,有些具体限制:域名最多只能有30个字符,只能包含字母、数字和连字符。但是只要试一下就知道,对于名字中出现的不端和人身攻击字眼,并没有特别规定。针对这种情况,大公司和名人只好防患于未然,买下像bigcorpsucks.com这种攻击性域名以防挨骂。 光有域名不行,你还需要为自己的网站准备主机,也就是存放网站内容以对外提供服务的计算机。这样别人访问你的网站时才可以看到内容。同时还需要找一个域名服务器,当别人查询你的域IP地址时,好让它告诉人家你主机的IP地址。设置域名解析是一个单独的步骤,而某些域名注册商通常也为用户提供域名解析服务,即使自己没有域名服务器,它也会为你寻找其他域名解析服务商提供方便。👩👒📀🤡👀 竞争导致价格下降。首次域名注册的价格一般为60元一年,后期续费也差不多;租用一个空间和流量配置都较低的主机服务的价格每年大约300元。只是用一个通用页面来“停放”域名的服务则是免费的。有些主机服务是免费的;当你只想随意做一个小型网站时,有的主机服务仅象征性收取少量费用;还有的主机服务则给你一段免费的试用期。 域名归谁所有?发生纠纷如何解决?别人先注册了kernighan.com,我该怎么办?答案很简单:先买先得。至于有商业价值的域名,比如mcdonalds.com和apple.com,法庭和ICANN的纠纷调解政策则偏向于财大气粗的一方。如果你的名字叫麦当劳或者苹果,基本不可能把域名从这些公司手中抢过来,甚至就算是你先注册的也很难保住。 🧑💻👠🪥😡👁 有个真实案例,2003年,有个叫迈克·罗(Mike Rowe)的加拿大中学生为自己的小软件公司建了个网站mikerowesoft.com,由于读音跟软件巨头“某软”相似,该公司威胁要为此采取法律行动。这个案子的最后结果是:经调解,迈克·罗换了个域名。#y450: 9.3 路 由 路由解决从源地址到目标地址的路径寻找问题。在任何网络中,路由都是核心所在。 有些网络使用静态路由表,为所有可能的目标地址提供路径的下一条地址。但在互联网中,由于网络规模太大、动态性太强,使静态路由表难以提供正常的路由。为此,互联网网关通过与邻近网关交换信息来刷新自身的路由信息,这样就能保证可能的及所需的路径信息基本跟得上网络的变化。🧑💻👓🪓💀✌ 互联网的庞大规模要求采用分层结构来管理路由信息。在路由系统的最顶层,上万个自治系统提供了它们所包含的网络的路由信息。一个自治系统通常也对应于一个大的互联网服务提供商(ISP)。在自治系统内部,路由信息仅进行本地交换,但整个自治系统对外部系统展现统一的路由信息集。 尽管不正式也不严格,路由系统在物理上也存在某种层次结构。用户通过ISP接人互联网,ISP是个公司或组织,它再连接到其他互联网提供商。有的ISP规模很小,有的则很大(比如由电话公司或有线电视公司经营的那些ISP)。有的ISP是由公司、学校、政府部门等机构自己运营,是为本机构提供内部服务的;有的ISP则对公众提供收费接人服务,如电话公司和有线电视公司。个人通常通过有线网络(在住宅中很常见)或电话接人ISP,公司和学校则提供以太网或无线连接。 👀⛪🍒🈸🦌 ISP之间通过网关相互连接。由于主要运营商之间的网络容量巨大,所以各个公司的网络都汇接到运营商的“对等交汇点”,运营商网络之间则互相建立物理连接。这样,就能使来自一个网络的数据高效传送到另一个网络。 有些国家对外连接的网关数量相对较少,这样可以监控和过滤政府认为不宜出现的信息。 你可以用traceroute程序探测路由信息。Unix系统(包括Mac)都提供了这个程序。Windows上也有,不过名字叫tracert,甚至还有网页版的。下面这个随手给出的例子: 👂🗺🫑🆚🐅 由于网络流量本身和经过的国家等原因,路由到达的地理位置可能令人惊讶,甚至让人完全意想不到。#y448: 遗憾的是,出于安全方面的考虑,越来越多的路由站点选择了关闭某些traceroute运行必需的信息,导致这条命令的实用价值越来越小。💄🗝😒👈 9.4 协 议 协议规定了双方互相沟通时遵守的规则:一方是否主动握手,鞠躬多深,谁先从门口走过,在路的哪一侧行驶,等等。虽然有些协议是法律强制规定的,比如在路的哪一边行驶,但生活中的大多数协议都不太正式。 互联网有很多协议,其中最基础的有两个,一是互联网协议(Intemet Procotol,IP),定义了单个包的格式和传输方式,二是传输控制协议(Transmission Control Protocol,TCP),定义了IP包如何组合成数据流以及如何连接到服务。两者合起来起就叫TCP/IP。👳🎩💿💩💪 由于每种物理网络都使用自己的格式传送IP包,网关在接收和转发它们时,必须在特定网络格式和IP之间来来回回地转换。 TCP在IP层之上确保可靠通信。这样,用户(实际上是指程序员)就不用考虑分包组包的事,只要面对信息流就可以了。被我们认为属于“互联网”的大部分服务都使用TCP。 👨🎨👑🔭🥰👁 再往上一层是支撑万维网、邮件、文件传输之类服务的应用层协议,它们大多以TCP为基础设计。从上面对协议的描述可见,互联网协议是分好几层的,每层都依赖下一层的服务,并为上一层提供服务。这是第5章中提到的软件分层理念的极好例子。下面这张常用的示意图看起来有点像多层的婚礼蛋糕: 和TCP处在同一层的协议还有用户数据报协议(User Datagram Protocol,UDP)。UDP比TCP简单得多,如果某些数据交换不要求双向流传输,只要高效率分包投递和少量其他特性,那就是UDP的用武之地。DNS、流媒体视频、VoIP和某些在线游戏就使用了UDP。 🎺🥰🧠 9.4.1 互 联 网 协 议 (IP) 互联网协议(ip)提供的包传递服务是不可靠、无连接的。所谓“无连接”,就是说每个IP包都是独立的,和其他IP包无关。互联网协议没有状态或记忆力,就是说这个协议一旦把包传给下一个网关,就不再需要保存关于这个包的任何信息。 至于“不可靠”,顾名思义,互联网协议是个“尽力而为”型协议,并不能保证包传送的质量,出错也就出错了。包可能丢失或者损坏,接收到的顺序可能和发送的不一致,也许送达得太快而无法处理,也许送达得太慢而失去作用。当然,实际使用的时候,互联网协议是相当可靠的,但是当包中途丢失或损坏的时候,该协议确实不会尝试修复。 🧑⚕️🧢🗡😚👁 这就像是在陌生的地方把明信片丢进邮箱,一般会送达收信人,但可能中途受损,有时会彻底寄丢,有时则比预期时间晚很多到达。互联网协议有一种错误模式倒是在明信片投递上见不到:IP包可以复制,所以接收方可能会收到多份。 IP包最大约为65KB。这样长消息就要拆分成小数据块分别发送,到了远端再组装起来。就像以太网包一样,IP包也有自己的格式。下图是IPv4数据包的格式,IPv6数据包与之类似,只不过源地址和目标地址都是128位的。 👌🏠🌶🆘🦚 IP包中有个很有趣的部分是TTL(生存时间,TimeToLive的缩写)。TTL是个单字节字段,由包的发送方设置一个初始值,每经过一跳网关就减1,当减到0的时候,就丢弃这个包,并给始发者返回一个报错包。互联网中一次典型的传包过程通常会经过15到20个网关,所以经过了255跳的包显然有问题,很可能是走环路了。TTL并不能消除环路,但能防止个别包在遇到环路时永远转圈。#y438: 9.4.2 传 输 控 制 协 议(TCP) 在互联网协议簇中,高层协议基于ip层的不可靠服务合成可靠的通信,其中最重要的高层协议就是传输控制协议一TCP。TCP能为用户提供可靠的双向数据流:向一端放人的数据从另一端流出来,延迟很小,出错率很低,仿佛是一条从一头到另一头的直连线缆。 👦👒🧹🤩🤙 这里不准备讨论TCP工作原理的细节(实在一言难尽#m290:),但其基本原理倒是相当简单。在TCP中,字节流切分成片段,放到TCP包也就是所谓的报文段里。TCP报文段不仅包含实际数据,还有控制信息构成的头部,其中包括方便接收方知晓收到的包代表数据流中哪部分的顺序号。通过顺序号,就可以发现丢失的报文段并重传之。 TCP报文段的头部还包括错误检测信息。这样,如果报文段出错,就很容易检测出来。每个TCP报文段都放在一个IP包里传输。下图展示了TCP报文段头部的内容,它们与数据一起封装在IP包里: 接收方必须对收到的每个报文段返回确认应答或否认应答。我给你发的每一个报文段,你都要返回一个应答以表明你收到了。如果在适当间隔之后我还没收到应答,那我就认为这个报文段已丢失,然后重新发送。同样,如果你预期会收到某个特定的报文段却没收到,那就得给我发送否认应答(比如“未收到27号报文段”),这样我就会重新发送。 显然,如果应答报文本身丢失了,情况就会更复杂。TCP使用若干计时器来检测此类错误,如果计时器超时,就认为出错。如果某个操作耗时过长,就会启动纠错程序。最终,某个连接可能会因为“超时”而被终止。你也许见过失去响应的网站,那就是遇到了这种情况。这些都是TCP协议的一部分。 TCP协议同样还包含提高传输效率的机制。比如,发送方可以在未收到上个包的应答信息时就继续发送下个包,接收方也可以为接收到的一组包回送一个应答。在通信顺畅的时候,这样做可以降低应答带来的开销。而当网络发生拥塞、开始出现丢包现象时,发送方就迅速回退到低速率,直到慢悠悠地一送一达。👵🛍🖨🤡🖕 在两台计算机主机之间建立TCP连接时,不仅要指定计算机,还要指定计算机上的端口。每个端口表示一个独立的会话。端口用两字节(即16位)二进制数表示,于是就有65536个可用端口。这样,在理论上每台主机可以同时承载65536个TCP会话。 有一百多个众所周知的端口预留给了标准服务。比如,Web服务器使用80端口,邮件服务器使用25端口。这样,用浏览器访问yahoo.com网站时,浏览器会建立一个到雅虎服务器80端口的TCP连接,而邮件程序则使用25端口来访问雅虎邮箱。源端口和目标端口是TCP头部的一部分,头部与数据一起构成TCP报文段。 💪🏝🌶↔🐺 (邮件客户端程序访问邮件服务器时,发信和收信使用不同的端口,发信用25端口而收信通常用110或143端口。另外,越来越多的人使用Webmail,即用浏览器通过邮件服务商的网站收发邮件而不是使用专门的邮件客户端程序,这样使用的端口就和浏览网页一样了。)#m264:TCP协议实现细节远比这复杂得多,但基本原理就是这些。TCP和IP最初由文特·瑟夫(Vint Cerf)和鲍勃·卡恩(Bob Kahn)于1973年设计,他们因此一起获得了2004年图灵奖。尽管经历了多次改进,但网络规模和通信速度已经增长了多个数量级,TCP/IP协议还是能基本保持不变,这充分证明最初的设计是相当棒的。如今,TCP/IP处理了互联网的大部分流量。#m275: 9.5 高 层 协 议 👴🎩🏮😇👍TCP提供双向通信方式,可使数据在两台计算机之间可靠地来回传输。互联网服务和应用程序使用TCP作为传输机制,但在完成具体任务时还要使用自己特定的协议。例如,超文本传输协议(Hyper Text Transfer Protocol,HTTP)就是万维网浏览器和服务器使用的非常简单的协议。 我在页面中点击亚马逊网站链接的时候,浏览器会打开一个TCP/IP连接,连接至服务器amazon.com的80端口,然后发送一条简短的消息请求某个网页。下图中,左边最顶端的客户端应用程序是浏览器。消息沿着协议链向下层走,跨越互联网(通常是经过更多步传递),到了远端之后回到协议上层,传给相应的服务器应用程序。服务器响应的返回路径不一定和传输客户端请求的路径一样。 ✍🗽🍍®🐖 亚马逊服务器准备好客户端请求的页面,然后把它和一小段附加数据(比如关于页面编码方式的信息)一起发送回去。浏览器读到返回结果后,据此显示出页面内容。如果说互联网是信息载体,那我们可以在上面做什么?在本节,我们先看看互联网初期使用的一些最早的程序。这些程序都诞生在1970年代初,不过至今仍在使用,主要归功于它们良好的设计和功能。所有这些程序都使用TCP来传输字节流。它们都是命令行程序,尽管大多数都很简单,却不是给普通用户而是给那些相对专业的人士使用的。 9.5.1 文 件 传 输 协 议 (FTP) 👄🏝🥣🐉 早期互联网的任务之一是让研究人员能够从别的站点获取各种信息,比如实验数据和测试结果,或者生成和分析这些数据的程序。用来做这件事的工具叫FTP,即文件传输协议(File Transfer Protocol)。 FTP展示了很多基本理念。其操作过程很简单:打开到一个站点的连接,从那个站点取回文件或者发送文件过去,然后关闭连接。除此之外,FTP还用一些命令操作远程文件系统里的文件。下面的例子是跟一个FTP服务器的对话过程(为了排版紧凑而略做编辑),从中可以看出FTP有多么简单。在下例中,我输人的命令用粗斜体表示。 🤙🚗🦀❌🦌 在上面的例子中,尽管服务器不认识客户机的ip地址,但仍然允许匿名访问,不检查口令。对于非公共的文件,就要先用某个有权限的帐户登录之后才能访问。就像早期大多数协议一样,FTP有个help命令,你完全可以自己摸索它的用法。 9.5.2 远 程 登 录(Telnet) 🥷🩴📞😫👂第二个早期的工具是Telnet,该工具用来操作远程机器,其效果就如同直接连在上面一样。Telnet接受客户端的键盘输人并将其发送到服务器,仿佛是在服务器上直接按键一样;然后Telnet拦住服务器的输出,并发回到客户端。 有了Telnet,就可以登录任何一台联网的计算机,并把它当成本地机器来使用。Telnet的基本用法很简单,但其附加功能还可以进行文件复制、把键盘输人定向到本机而不是远程等。Telnet最初的用途是远程登录,但也可用来连接到任何端口,因此也用于对其他协议进行简单测试。 Telnet和FTP协议一样,都是开放的。如果远程系统能接受没有口令的登录,那就不需要口令。如果远程系统向客户端要口令,Telnet会以明文形式将客户端的口令发送过去。因此,任何监视数据流的人都能看到口令。🧑🍳🥾📷😪🤳 现在,除了不讲究安全的场合,Telnet已经很少用了,原因之一就是它毫无安全性可言。而Telnet的继任者SSH(Secure Shell的缩写)则因为双向加密了全部通信而得到广泛使用,可以用来安全地交换信息。SSH使用22端口。#y431: 9.5.3 简 单 邮 件 传 输 协 议(SMTP) 第三个例子是简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)。我们通常使用浏览器或者独立程序如Outlook、MacMail来收发邮件。但就像互联网上的诸多其他应用一样,我们所能看到的只是表面,之下还有若干层,每层都靠各自的程序和协议来支撑。 👃🎢🥩🈷🦬 邮件的运行涉及两种基本类型的协议。SMTP用来在不同系统之间交换邮件。具体步骤是,先建立一条连接到收件人的邮件服务器25端口的TCP/IP连接,使用SMTP协议指明发件人和收件人,然后传送邮件内容。 SMTP是基于文本的协议,理论上可以用Telnet连接到邮件服务器的25端口观察其运行过程。不过,SMTP做了足够多的安全限制,因而即使把你自己的计算机当成邮件服务器进行本地操作,也会遇到麻烦。下面的这个实例来自与本机系统的实际会话过程,这次我给自己发了一封邮件,看上去像是别人发的——实际上就是垃圾邮件: 👵🎒📏🥰🖕 这条纯属瞎扯(或者说至少不现实)的消息就马上送到了我的邮箱: 由于安全限制,你不太可能在自己的系统上做这件事。如果能的话,你给别人发这样的邮件肯定会惹来麻烦。👨🚒🩰📏😀💅 SMTP要求邮件消息是ASCII文本。如果要把其他类型的数据转换成文本,或者把多块数据拼成一条邮件消息,那就要按MIME标准来。MIME的意思是多用途互联网邮件扩展(Multipurpose Intemet Mail Extensions),实际上它是SMTP之外的另一个协议。当需要在邮件里插人照片、音乐等附件时,就要用到MIME机制,在HTTP中也用得到它。 虽然SMTP也是像FTP和Telnet那样的端到端协议,但它的TCP/IP包从源节点到目的节点常常要经过15到20跳网关。这就意味着,途中的任何网关都可以检查经过的包,将邮件内容复制下来以从容不迫地审查。 👂⛵🎂🅿🦜 而且,SMTP本身也可以复制邮件内容,邮件系统会跟踪内容和头部的传送。因此,如果不想让发送的邮件内容被别人看到,一定要从一开始就加密。但有一点要记住,加密邮件内容并不会隐藏发件人和收件人的身份。#y430: 另外,SMTP只是把邮件从源主机传送到目的邮件服务器,然后就不管用户怎样收取邮件了。邮件到达目的邮件服务器之后就原地等待,直到收件人取走。广泛使用的邮件接收协议有两个:POP和IMAP。 当你把邮件从保存它的邮件服务器系统里移到自己的计算机时,要用到邮局协议(Post Office Protocol,POP)。利用POP可以把邮件从服务器上取下来,在自己计算机上保存一份用来阅读,然后把服务器上的那份删掉。 🧠🚤🍭🚷🐺 互联网邮件访问协议(Internet Mail Access Protocol,IMAP)则用于与POP功能相反的另一种场合:邮件保存在服务器上,你可以从好几个地方访问它。IMAP确保邮件只存在一个地方,这样任何时候邮箱都是一致状态。由此多个访问者可以同时读取和更新同一个邮箱。 因为不需要复制多份消息,也不需要在计算机之间同步,所以,当你需要在好几个地方(比如浏览器和手机)读取邮件的时候,IMAP就是最佳选择。 🧑💻🧢🗡😇🤙 像Gmail和雅虎邮件这样的“云端”邮件系统也很常见。这些系统底层也是通过SMTP传输邮件,客户端也像IMAP那样访问邮件。第11章将会讲到云计算。 9.5.4 文 件 共 享 和 点 对 点 协 议 1999年6月,美国东北大学一年级新生肖恩·范宁(Shawn Fanning)发布了Napster程序,让大家能轻而易举地共享MP3格式压缩的音乐。范宁的这事做得可谓恰逢其时:那时的音乐CD虽然满大街都是,但价格居高不下,而MP3编解码算法已广泛传播开来,个人计算机的运算速度已足以制作并播放MP3音乐。#y443: 🤳🧳🌰🐥 网络带宽也足够高,在上面传送歌曲相当快,大学里的宿舍网络就更不用说了。由于范宁的设计和实现做得很棒,Napster如星火燎原般传播开来。1999年中期,他组建了一家公司来经营这项服务,据称最火的时候有8000万用户。 但同年晚些时候,Napster就遭遇了第一起诉讼,被指控大范围偷窃受版权保护的音乐。2001年中期,法院判决Napster关闭其业务。 两年时间,从白手起家,到8000万用户,再到一无所有,这正是后来的流行语“互联网时代”的生动写照。现在,原始的Napster已经不复存在,但公司经过重建,名字仍然保留,靠收费的在线音乐谋生。 💪🪐🫑🚷🪶 【2008年消费电子产品零售商百思买公司买下了Napster,保留了其业务。2011年10月,在线音乐服务公司Rhapsody公司从百思买收购Napster,并将其业务和用户合并到Rhapsody,至此Naspter彻底关闭,只保留了网站首页已转跳到Rhapsody的服务页面。本书英文原版成书时未来得及跟踪此动向。】 使用Napster的方法是首先下载Napster客户端并安装到自己计算机上,然后指定一个文件夹以共享其中的文件。随后客户端登录到Napster服务器,把想共享给别人的文件的文件名传上去。 🦴🎢🔪♑🦟 Napster维护一个中心目录,里面是可以获取的文件名。这个中心目录一直保持更新,当有新客户端登录上来时,就把它们共享的文件名加进来;现有客户端对系统检测没有响应时,就从列表中去除它们的文件名。当用户在中心服务器搜索歌名或歌手时,Napster返回一个列表,里面列出在线而且愿意共享这些文件的其他人。当用户选择了某个共享者时,Naspter就为双方安排联系:提供IP地址和端口号,让用户计算机上的客户端连过去取文件一有点像红娘牵线。供需双方都把状态报告给Napster,但中心服务器并“不参与”文件共享的过程,从头到尾不碰音乐文件“一个手指头”。#y450: 我们已经习惯了客户机-服务器模型,比如浏览器(客户机)从网站(服务器)请求页面。作为一个实例,Napster为我们展示了另外一种模型:👳👠🧻😊🖐 中心服务器列出了现在可共享的音乐,但音乐文件本身还是存储在用户自己的计算机上;当文件传输时,文件直接从一个Naspter用户传到另一个用户,并不经过中心系统。 这样的组织方式就叫点对点,共享者就是其中的对等点(peer)。因为音乐文件本身只存在于对等点计算机上,从来不在中心服务器上,所以Napster希望据此规避版权问题,但这些看似合法的技术细节并未得到法庭认可。 👩✈️👚🩺😥👃 Napster协议使用了TCP/IP,所以它实际上和HTTP、SMTP是同一层的协议。Napster是个简单的系统,范宁的成功是在互联网基础设施、TCP/IP、MP3和构建图形用户界面的工具这些条件都具备的情况下吹起的一场东风。这并没有贬低范宁工作的意思,因为Napster确实是个很精巧的系统。 之后文件共享就流行起来,在Napster停业之前就兴起了其他一些服务,有的甚至用来共享并无版权保护的资料。这些服务在几个关键方面与Napster有所不同。 首先,Napster系统的脆弱之处在于它把当前可下载的文件列表保存在中心服务器;这样,只要关掉服务器,服务就荡然无存。 🥷👠🪣🤌 其次,Napster公司开在加州,就要受美国法律管辖。之后的文件共享程序就没有这些限制,大多数都在美国境外运作。 更重要的是,这些系统用了分布式的目录方案,将可共享文件的信息传播到多台计算机上,只关掉一部分机器并不能停掉服务。同时,这些服务也开始共享其他资料,除了音乐之外还有电影、软件和色情作品,从而在更多的圈子里促进了对文件共享服务的需求。#y448: 👍🛑🎂❓🐅 像Kazaa这样的文件共享程序还带了广告软件,在客户机运行时会显示广告。这样会在一定程度上影响用户分享文件的热情,不过并不严重。 这里有个真实的冷笑话:当有人复制了Kazaa的代码,剥离掉其中的广告软件,以“Kazaa精简版”之名放出来让人用时,Kazaa的发行者们还抗议了这种侵权行为。 那几年,还有个与Kazaa类似的重要的文件共享客户端是Grokster.com公司提供的。Grokster声称它提供的这个程序只用于合法用途,凡使用它产生的任何侵权行为,都是别人的责任。 👨🚒👞✒😥👊 后来,Grokster遭到一些媒体公司的起诉。2005年,美国最高法院对该案的最终判决是支持版权持有者。法庭裁定,Grokster对侵权行为负有间接责任,公司随即停止了业务。现在,网站grokster.com还在,值得去看一下,可以看到对侵权后果的预警。 【该网站会显示出最高法院对此案的判决结果,并在页面下部提示“你的IP地址xx.xx.xx.xx已经记录在日志,不要以为你不会被抓到,你不是匿名用户”。】 🤛⛴🦞❓🐢 另一个流行的文件共享网站LimeWire,在2010年遵法院命令停业,也显示了类似的当今的大多数文件共享,不论合法的还是非法的,都使用了一种叫Bit Torrent的点对点协议。 【作者尚未提及另一个广泛使用的点对点文件共享系统eDonkey网络,客户端为eDonkey2000(电驴)/eMule(电骡)。BitTorrent的强项是热门资源分享,而在eDonkey网络上寻找偏门/古旧资源的成功率高。】 👨🎨🧣📏😥🤝 这个协议是布莱姆·科亨(Bram Cohen)于2001年设计的,特别适用于共享很大的热门文件比如电影和电视节目,因为每个用Bit Torrent下载文件的站点也必须同时上载一部分文件给那些需要的人。BitTorrent通过搜寻和Kazaa类似的分布式目录来找到想要的文件,并用一个很小的“torrent文件”来标记传输过程的踪迹,其中维护了谁上载和接收了哪些文件分块的记录。‘ Bit Torrent用户很容易被查到,因为协议规定了下载者也必须上载,这样就可以找到那些把自称受版权保护的资料共享出来的行为。 文件共享是研究本书所涉及各种问题的绝佳案例,它综合了本书几乎所有重要话题: 🧑🎤🩰🪥🙄👎 引用 🖕🎢🫑🈷🐢 9.5.5 关 于 版 权 的 题 外 话 美国的娱乐产业通过美国唱片业协会(Recording Industry Association of America,RIAA)、美国电影协会(Motion Picture Association of America,MPAA)等行会组织对共享有版权资料的行为积极追讨法律赔偿。 他们指认了众多所谓的侵权者,提出诉讼或威胁要诉诸公堂。他们热衷于四处游说,试图通过立法来界定共享行为的非法性质。虽然合理付费后再向民众分发高品质音乐似乎有利可图,但接下来事态何去何从仍不明朗。苹果的iTunes商店则是这方面的一个成功例子。 👈🏫🥄♂🐅 在美国,有关数字版权问题的最主要法律是1998年的《数字千年版权法案》(Digital Millennium Copyright Act,DMCA)。该法案规定,包括在互联网上散发有版权的资料在内,任何规避数字媒体版权保护技术的行为都是违法的。其他国家也有类似法律。 DMCA是娱乐产业遭遇侵权之后使用的法律武器,但DMCA为互联网服务供应商提供了一条“避风港”条款:如果版权持有人通知ISP其用户在散发侵权资料,ISP因此要求侵权人删除版权资料,ISP不需要对侵权行为负责。#y431: 避风港条款在大学校园网里很重要,在这里大学就是学校师生的ISP。因此每所大学都有一间处理侵权举报的办公室,并且在这里张贴了像这样的显眼链接: 👂🌕🥚🆎🐕 【根据公法105-304号《数字千年版权法案》(DMCA),哈佛大学指派专人接收发生于harvard.edu域内的侵权指认通知。若您确认贵方的作品受到侵权,请通知我校指派的以下专人。】 DMCA也常常在势均力敌的法律纷争中为双方共同援引。2007年,美国影视业巨头Viacom起诉Google的YouTube视频网站提供了该公司版权所有的内容,要求赔偿10亿美元。 👍🗼🫑☯🐙 Viacom认为DMCA并未允许以“批发”的形式大规模盗取有版权资料。Google在自辩中则提到,对于DMCA所指的侵权作品下架通知,它总是会做出得体的响应,但Viacom却从没有以恰当的方式通知它。2010年6月,法庭判决Google胜诉。#y431: 再后来又有了新动向,美国政府也在加强版权保护这件事上凑热闹。在采取了一系列有争议的行动后,美国国土安全部下属的移民与归化局(ICE)没收了上百个域名,理由是这些域名被指认存放了盗版资料,或者陈列赝品待售。域名持有者可以上诉以夺回其域名所有权,但如果他们真的站不住脚,到美国之外的域名注册商申请新域名也是轻而易举的事。 9.5.6 高 层 协 议 总 结 👳🥾🩸😃🧠本节提到的这些高层协议的共同之处,就是它们规定的都是如何在计算机程序之间搬运信息,即把互联网作为一个傻瓜网络,从一台计算机到另一台高效地复制字节流,但不去解释或处理这些数据。 这是互联网的重要特性:从数据原样传送的意义来讲,互联网就是个“傻瓜”。说得不那么难听点(同时也是端对端原理)连同收发数据的程序在内的各个端点是智能的。与此相反的是传统的电话网络,其所有智能都体现在网络上;而端点设备,比如老式电话机,真的是傻瓜,除了连接到网络上传递声音之外,什么多余的功能都没有。 就是这种“傻瓜网络”却激发出了很高的创造力,因为这种模式意味着任何人只要有好的想法都可以创建出灵巧的端点设备或软件,网络可以为它们传送数据。 👃🏦🫑❌🐂 反之,等待电话或有线电视公司来实现或支持类似的好想法恐怕就不靠谱了。不难预料,这些运营商只乐于加强控制,这一点在日新月异的移动领域表现尤为突出。但与此同时,虽然运营商竭力想控制,大多数革新仍然从别处不请自来。#y439: 像iPhone和Android这样的智能手机根本就是通过电话网络而不是互联网通信的计算机。运营商尽管想从这些电话上运行的服务赚钱,但基本上只能收点数据流量费。 👍⛄🌶🈚🦊 早期,大多数手机的数据服务都是每月收取固定费用,但现在(至少在美国),已经逐渐变为按使用量计费的模式了。对于高流量服务,比如下载电影,这样做可能是合理的,但对于发送文本短信这样的服务来说就有点说不过去了,毕竟这种服务占带宽极小,几乎不消耗运营商什么资源。最后请留意一下早期的协议和程序有多信任使用它们的用户。Telnet和FTP用明文发送口令。FTP支持匿名传输,而且实际上鼓励这么做。长久以来,SMTP完全不限制发件人和收件人,任何人发送给任何人的邮件都能转寄。 这种“开放转寄”服务是垃圾邮件发送者的天堂——如果你不需要收件人直接回复你,甚至可以伪造发件人地址,如此就很容易制造欺诈和拒绝服务攻击。 👂🗺🥣🉑🐺 简而言之,互联网协议和在其上构建的程序都是针对可信任的个体构成的诚实、协作、善意的团队设计的。当今的互联网已远非如此,所以我们要在各方面对信息安全和用户认证进行亡羊补牢。 9.6 带 宽 数据在网络中流动的速度受限于最慢的链路。网络中的很多地方都会减慢流量,链路本身和数据传输路径上计算机对数据的处理过程都是常见的瓶颈。光速也是限制因素之一。 🧑⚕️👑📮🥰🤞 信号在真空中的传播速度是每秒3亿米(用生活中的尺度说就是每纳秒约30厘米),在电路中则慢些,所以就算没有其他延迟,信号从一个地方传到另一个地方也要时间。 按照真空中的光速,从美国东海岸到西海岸的4000公里要花13毫秒时间。相比之下,同样一段路程的互联网,由于经过了十来个路由器,延迟为40毫秒。而从美国东海岸到欧洲的互联网延迟是50毫秒,到北京是140毫秒,到悉尼是110毫秒。#y438: 🧑🚀👙📷😒🙌 生活中,你可能遇到过各种各样的带宽。我的第一只调制解调器每秒钟传输110个比特,这速度足以跟上机械打字机。前面章节提到过,现在的调制解调器的速率是56Kbit/s。家里的802.11无线网络,理论上可以运行在600Mbit/s,实际速率则要慢得多。 有线以太网的带宽一般是1Gbit/s。从家到ISP的DSL专线或有线宽带连接的速度大概是每秒钟几兆比特,两者的上行速率又比下行速率慢很多。ISP多半通过光缆连到互联网其他部分,其带宽在理论上有100Gbit/s或更快,但实际则慢得多。 蜂窝电话的带宽跟上面的大部分相比都慢。智能手机的“3G”系统本应该在手机静止时提供2Mbit/s的带宽,运动时的带宽则应为384Kbit/s,但3G这种不恰当的提法却给不实广告留下了空间。#y406: 💪🏦🔪© IP协议本身并不能保障带宽。实际上,作为“尽力而为”型的服务,它甚至都没有承诺信息一定会送达,更不要说有多么快了。互联网广泛使用缓存来加快数据传输,这在讲域名服务的时候我们都说过了。 网页浏览器也缓存信息,所以如果你最近刚访问过某个页面或图像,再次打开它的时候,你所看到的页面或图像很可能来自本机缓存而不是网络。大型的互联网服务器也使用缓存来加快对大量访问者的响应。 👳🥾💶😋🖐 Akamai等公司为雅虎等公司提供的内容分发服务,能使内容接收者从距离较近的缓存服务器直接获取内容。搜索引擎也把它们在网页上爬来的海量页面缓存起来,第10章会讲到这个话题。 9.7 压 缩 数据压缩是更有效利用现有内存和带宽的好方法。压缩的基本思想是避免存储或传输冗余信息。所谓冗余信息,就是那些检索时或在通信链路另一端可以重建、推断出来的信息。 👂🚐🫑🈳🐅 压缩的目标是把相同信息编码成更少的比特或位。有些不包含信息的位,可以完全删除;有些位可以从别的位计算出来;有些位对接收者无意义,也可以放心丢弃。 下面以本书的英语文本为例。在所有单词中,字母出现的频率并不相同,e最常见,其后依次大致是t、a、o、i和n。反过来,z、x和q就非常少见了。 用ASCII(American Standard Code For Information Interchange,美国信息交换标准代码)表示文本时,每个字母占1字节也就是8位。一种节省1位(蚊子腿也是肉啊)的方法,就是只使用7位,因为ASCII编码的第8位(也就是最左一位)永远是0,不包含信息。同样,可以用更少位来表示那些常见字母,而必要的情况下用较多位表示那些不常见字母。这样,总的位数就可以显著减少。这就跟莫尔斯电码类似:一点表示e,一划表示t,但是q这种不常用的字母就是“划-划-点-划”。 👨🦱💎⚔😷🤞 说得再具体点,就以《傲慢与偏见》英文原文为例吧,该书大约有97000个单词,占550000字节。最常见的字符是单词间的空格,有91000个,其次是e(55100个)、t(36900个)、a(33200个),而最少的X(大写)只出现1次,第二少的Z(也是大写)则出现了3次。 只看小写字母,最少的j是469次,q是509次,z和x都是700次左右。如果我们用两位数(二进制,以下同)来表示空格、e、t和a,那就会节省很多存储空间,这样就算q、x、z、j和其他不常见字符超过8位也没关系。有一种技术叫霍夫曼编码(Huffman coding),可以有条不紊地完成上述操作,为每个字母找到实现最佳压缩效果的编码值。 👩👜🧬😘👁 用这种技术,可以把《傲慢与偏见》占用的空间压掉44%,只剩310000字节,即平均每个字母大约只用4位。 如果按大块文字而不是单个字母来压缩,可以得到更好的效果。例如,我们可以根据原始文档的属性选择按单词或词组压缩。在这方面,有好几个算法做得很棒。如广泛使用的Zip程序,可以将《傲慢与偏见》占用的空间压掉64%,只剩202000字节;而我所知的最好的算法(在Unix程序bzip2中),可以将该书压到145000字节,只有原始大小的四分之一。 以上技术都属于无损压缩,即压缩过程中不丢失信息,解压后得到的数据和原始数据一模一样。另外一些情况下,并不需要准确重现原始输人,解压后的结果只要大致差不多就足够了(乍一听似乎有点违背直觉)。#y430: 🧑⚕️🥼🖌😪👂 这时候,使用有损压缩可以得到更好的效果。有损压缩最常用于处理要给人看或听的内容。比如压缩数码相机拍出来的照片。人眼分辨不出来非常相近的颜色,所以不必保留实际输人的那么多种颜色,颜色少一点没有任何问题,这样就可以减少编码所用的位数。 与此类似,某些难以觉察的细节也可以丢弃,这样处理后的图像尽管没有原始画面那么精密,但眼睛看不出来。细微的亮度变化也是如此。以随处可见的jpg图像为例,相应的JPEG算法利用前面说的感知编码,能把常见图像压缩到十分之一或更小,但看上去也不会明显失真。生成JPEG图像的大多数程序都允许控制压缩率,“较高品质”就意味着较低的压缩率。 🤳⛴🫑❗🦕 用于压缩电影和电视节目的MPEG系列算法也是按这个道理设计的。在MPEG中,单独一帧可以用JPEG压缩,还可以把连续的、变化不大的一系列帧压掉一部分。另外,也可以预测画面运动结果,只编码变化部分,甚至把运动的前景从静止的背景里分离出来,减少背景占用的位数。 MP3是MPEG的音频部分,它是一个用来压缩声音的感知编码方案。除了通常的做法外,MP3利用了人耳无法听到20kHz以上频率(随着年龄增长,这个数值会有所降低)、明亮的声音会掩盖轻柔声音等事实。MP3编码通常可以把标准CD音频压缩到原来的十分之一大小。 手机音频的压缩由于主要集中于人类语音,压缩率可以更高。语音可以比任意音频压缩得更明显,是因为其频率范围较窄,可以从只为个别扬声器建模的单个声道还原出来。知道了特定扬声器的特性,就可以获得更好的压缩效果。 👀🪐🍽☯🐶 所有压缩算法的思路都是减少或去掉那些不能物尽其用的位串,采用的主要方法包括把出现频率较高的元素编码成短位串、构造频率字典、用数字代替重复内容等。无损压缩能够完美重现原始数据,有损压缩通过丢弃接收者不需要的信息,来达成数据质量和压缩率的折中。 压缩时也可能需要权衡其他因素,如压缩速度和复杂性与解压速度和复杂性。数字电视画面撕裂成块或者声音断断续续,说明解压缩算法碰到了输人错误,可能是因为数据到达的速度不够快。不管是什么压缩算法,有些输人都是无法被压缩的。想象一下用某个算法压缩其前一次压缩得到的结果,你就会知道,任何压缩都是有限度的。#y443: 🤟🗽🍒❌🦮 9.8 错 误 检 测 和 校 正 如果压缩是去除冗余信息的过程,那么错误检测和校正就是加人精心控制的冗余信息以便检测错误甚至修正错误的过程。 有些常见数字没有冗余,这样,一旦出现错误就没法检测到。比如,美国的社会保障号码有9位,几乎任何9位数字都有可能是合法的社会保障号(如果有人要你填社会保障号码但实际上他们又没用时倒好办了,随便编9位数字就行)。如果多加几位数字,或者排除掉某些值,就可以检测出错误了。 🤌⛴🫑❗🐯 信用卡和取款卡的卡号有16位长,但并非所有的16位号码都是有效的卡号。这里使用了IBM公司的彼得·卢恩(Peter Luhn)于1954年设计的一个校验和(checksum)算法,来检测在实际操作中最常见的两种错误:单个数字错误、由于两个数字写错位置而引起的大多数换位错误。 【16位是较为常见的卡号长度,但按ISO/IEC7812标准规定,可以是13到19位。美国运通卡是15位;中国国内一些大银行的银联借记卡由于持卡人数量庞大,已使用19位卡号。】 这个算法很简单:从最右一位数开始向左,把每个数字交替乘1或2,如果结果大于9就减9。如果把各位数的计算结果加起来,最后得到的总和能被10整除,那这个卡号就是有效卡号。👮♂️👓🔋😳✍ 你可以用这个方法测试一下自己的银行卡,或者某些银行广告中出现的卡号,如“4417 1234 5678 9112”由于这个卡号计算的结果是69,所以不是真卡号;如果把它的最后一个数字换成3,那就是有效卡号了。 10位或13位的ISBN书号也采用了类似算法的校验和,用来对付同类错误。条形码和美国的邮政编码也使用了校验和。 🧑🍳👠😛✌ 这些算法都是用于十进制数字的专用算法。应用于二进制位的最简单的错误检测算法是奇偶校验码。这种算法为每组二进制位上附加一个奇偶校验位,其值的选择要满足如下条件: 使该组二进制位中值为1的位有偶数个。这样如果出现一位错误,接收者就会看到奇数个1,从而知道有内容被破坏了。当然,奇偶校验码并不能识别出哪一位有错,也不能检测两位同时出错的情况。 举个例子,下表的字母栏列出了ASCII表中前6个大写字母的二进制形式;偶校验栏把没有使用的最左边一位用作校验位,让每个字节里有偶数个1;而在奇校验栏中,每个字节里有奇数个1。如果其中任何一位的值发生翻转,得到的字节就通不过奇偶校验,于是错误就会被检测出来。在这个例子中,如果再使用更多的校验位,还可以实现一位纠错。👨⚕️🩳📱🤡✋ 错误检测和校正广泛应用在计算和通信中。虽然针对不同类型的错误要使用不同的算法,但纠错码可以用在任意二进制数据上。比如,内存可以抵御在随机位置上出现的一位错误,CD和DVD用编码防止错误位影响后面的持续播放,手机能抵御短暂的突发噪音。 就像压缩一样,错误检测并不是万能的。总会出现这样的情况:一组数据,本来匹配某种合法模式,出错以后却匹配了另一种合法模式。 👴👚🔑💩👂 #f464: 9.9 小 结 互联网背后只有少数几个简单的设计思想,但在大量工程实践的支持下,仅用如此少的机制就实现了非凡的成就。 🧒🥼💊🙂💅 互联网是基于数据包的网络。在互联网中,信息被封装在一个个标准格式的数据包里发出,动态地在一个巨大的变化无常的网络集合里被路由。这种网络模型和电话系统的电路网络完全不同,后者每次通话都会建立一条专用电路,在概念上可以理解为连接通话双方的私有线路。 互联网给接进来的每台主机分配唯一的ip地址,同一个网络内的主机共享同一个ip地址前缀。笔记本等移动的主机每次连上网的时候,多半会使用不同的ip地址,搬到不同的地方,其IP地址可能会变。域名系统是个巨大的分布式数据库,用来把主机名字转换成IP地址,或者反之。 网络之间通过网关连接。网关是一种专用计算机,用来把那些奔赴终点的数据包从一个网络路由到下一个网络。网关用路由协议交换路由信息,这样即使网络拓扑发生改变、网络间的连接此去彼从,网关还是知道如何把一个包发送到离它的终点更近的地方。👳🩳🪓💩👀 互联网依靠协议和标准来生生不息。IP是互联网的通用机制,是交换信息的通用语言。以太网和无线网等专用硬件技术都封装IP包,但IP层感觉不到某个具体硬件的工作方式,甚至不知道其存在。TCP用IP建立连接到目标主机指定端口的可靠数据流。更高层协议则用TCP创建互联网服务。 协议把系统切分成层,每一层为上一层提供服务,并调用下一层的服务。这种把协议分层部署的模型是互联网运行的基础,是组织和控制复杂性并隐藏不相关实现细节的绝好方法。 🧑⚕️🩲📮😪✋ 在分层协议中,每层只关注本层知晓如何完成的任务:硬件网络把字节从网络中的一台计算机搬运到另一台、IP在互联网中传送数据包、TCP从IP合成可靠的数据流、应用协议用数据流来回发送数据。每层都使用其相邻下层提供的服务,并为其相邻上层提供服务。任何一层都不试图大包大揽。显然,每层展现出来的编程接口都是第5章讲到的API的绝佳范例。 互联网的隐私和安全是个大麻烦,下面几章会深人讲这些。这就像是人侵者和防御者的军备竞赛,大多数时候人侵者魔高一丈。世界各地散布着人们共用的、无人管制的、各色各样的介质和网站,数据从其中穿行而过,在一路上的任何位置都可能被人出于商业或政治目的记录、审查和阻断。 而要在途中控制访问、保护信息,则难于上青天。很多网络技术用到了广播,这使它们面对窃听毫无抵抗之力。攻击以太网需要找到其中的线缆并进行物理连接,但攻击无线网却不需要物理接触就能偷听。🧑⚕️🕶⚔😔👂 互联网始于1969年,TCP/IP的核心协议在1973年亮相。其后,虽然经历了网络规模、流量和应用的爆炸式增长,互联网还是一如既往地开放和高效。这真的是非凡无比的成就!
帖子热度 1.6万 ℃
小执念殷勤地给楼主揉揉肩捶捶背,楼主奖励2 个 金币.
|
|
还有两章就结束了,不知道你们学到了什么呢?
|
无线网络的确带来无尽的安全问题,但也是相对的问题,毕竟在成本可接受的情况下加密等手段就在那里随时可用
|