计算机网络
- 局域网 Local Area Networks - LAN
- 媒体访问控制地址 Media Access Control address - MAC
- 载波侦听多路访问 Carrier Sense Multiple Access - CSMA
- 指数退避 Exponential Backoff
- 冲突域 Collsion Domain
- 电路交换 Circuit Switching
- 报文交换 Message Switching
- 分组交换 Packet Switching
用户在全球网络中发送和接收信息的能力。
150年前,发一封信件从伦敦到加州,要花2~3周,而且还是特快邮件。如今,电子邮件只要几分之一秒,“时延”改善了上百万倍(时延指传播一条信息所需要的时间),帮助现代世界在遍布全球的光纤中快速发展。
可能觉得计算机和网络密切相关,但事实上,1970年之前,大多数计算机是独立运行的,然而,因为大型计算机开始随处可见,廉价机器开始出现在书桌上。分享数据和资源渐渐变得有用起来,首个计算机网络就出现了。
局域网
第一个计算机网络出现在1950~1960年代,通常在公司或研究室内部使用,为了方便信息交换。比把纸卡或磁带送到另一栋楼里更快速可靠,这叫“球鞋网络”,第二个好处是能共享物理资源。例如,与其每台电脑配一台打印机,可以共享一台联网的打印机,早期网络也会共享存储空间,因为每台电脑的配存储太贵了。
计算机近距离构成的小型网络,叫局域网,简称LAN。
局域网能小到是同一个房间里的两台机器或大到校园里上千台机器,尽管开发和部署了很多不同LAN技术,其中最著名和成功的是“以太网”,开发于1970年代,在施乐的“帕洛阿尔托研究中心”诞生,今日仍被广泛使用。
媒体访问控制地址
以太网的最简单形式是:一条以太网电线连接数台计算机。当一台计算机要传数据给另一台计算机时,它以电信号形式,将数据传入电缆,当然,因为电缆是共享的,连在同一个网络里的其它计算机也看得到数据。但不知道数据是它们的,还是给其他计算机的,为了解决这个问题,以太网需要每台计算机有唯一的媒体访问控制地址,简称 MAC地址。
这个唯一的地址放在头部,作为数据的前缀发送到网络中,所以,计算机只需要监听以太网电缆,只有看到自己的MAC地址,才处理数据。这运作的很好,现在制造的每台计算机都自带了唯一的MAC地址,用于以太网和无线网络。
载波侦听多路访问
多台电脑共享一个传输媒介,这种方法叫“载波侦听多路访问” 简称“CSMA“,载体指运输数据的共享媒介。以太网的“载体”是铜线,WiFi的”载体“是传播无限电波的空气,很多计算机同时侦听载体,所以叫“侦听”和“多路访问”,而载体传输数据的速度 叫“带宽”。
不幸的是,使用共享载体有个很大的弊端,当网络流量较小时,计算机可以等待载体清空,然后传输数据,但随着网络流量上升,两台计算机想同时写入数据的概率也会上升,这叫冲突,数据全都乱套了。就像两个人同时在讲话。
幸运的是计算机能够通过监听电线中的信号检测这些冲突,最明显的解决办法是停止传输,等待网络空闲,然后再试一遍。问题是,其它计算机也打算这样做,其他等着的计算机可能在任何停顿间隙闯入,导致越来越多冲突,很快,每个人都一个接一个的讲话,而且有一堆事要说,以太网有个超简单有效的解决方法,当计算机检测到冲突,就会在重传之前等待一小段时间。
当然,如果所有计算机用同样的等待时间,是不行的,它们会在一定时间内再次冲突,所以加入一个随机时间,一台计算机可能等1.3秒,另一台计算机等待1.5秒,要是运气好,等1.3秒的计算机会醒来,发现载体是空闲的,然后开始传输。当1.5秒的计算机醒来后,会发现载体被占用了,会等待其他计算机完成。这有用,但不能完全解决问题,所以要用另一个小技巧。如果一台计算机在传输数据期间检测到冲突。会等一秒+随机时间。(等待空令牌),然而,如果再次发生冲突,表明有网络拥塞,这次不等1秒,而是等2秒。如果再发生冲突,等4秒,然后8秒,16秒等等,直到成功传输。因为计算机的退避,冲突次数降低了,数据再次开始流动起来,网络变得顺畅。(二进制退避算法)
指数退避
这种指数级增长等待时间的方法叫:指数退避。以太网和WiFi都用这种方法,很多其它传输协议也用。但即便有了“指数退避”这种技巧,想用一根网线链接整个大学的计算机还是不可能的,为了减少冲突 + 提升效率,需要减少同一载体中设备的数量,载体和其中的设备总称“冲突域”。
为了减少冲突,可以用交换机把它拆成两个冲突域。交换机位于两个更小的网络之间,必要时才在两个网络间传数据,交换机会记录一个列表,写着哪个MAC地址在哪边网络。
如果A想传C,交换机不会把数据转发给另一边的网络。
如果E想同一时间传数据给F,网络仍然是空的,两个传输是同时发生的。
(链路层,处理的事情)
但如果F想发数据给A,数据就会通过交换机,两个网络都会被短暂占用。
分组主要目的时间减小冲突域的范围,switch是交换机,birdge是网桥
大的计算机网络也是这样构建,包括最大的网络:互联网。也是多个连接在一起的稍小一点网络。使不同网络间可以传递信息。
- 载体传输
- 减少冲突域,冲突检测,交换机。
这些大型网络有趣之处是,从一个地点到另外一个地点通常有多条路线,引出路由概念。
连接两台相隔遥远的计算机或网络,最简单的办法,是分配一条专用的通信线路,早期电话系统就是这样运作的。
电路交换
假设(X,Y)两地之间,有五条电话线,如果在1910年,A 想打电话给B,A要告诉操作员他想打到什么地方,然后工作人员手动将A的电话连到通往Y地的未使用线路,通话期间,这条线路就被占用,如果五条线都被占用了,A要等待某条线空出来。 这叫 “电路交换”,因为是把电路连接到正确目的地。
能用倒是能用,但不灵活而且价格昂贵,因为总有闲置的线路。
好处是,如果有一条专属于自己的线路,可以最大限度地随意使用,无需共享。
报文交换
因此军队,银行和其它一些机构,依然会购买专用线路来连接数据中心,传输数据的另一个方法是“报文交换”,“报文交换”就像邮政系统一样,不像之前X和Y有一条专有线路,消息会经过好几个站点。
如果A想写一封信给B,信件可能从X出发,到其它地点,然后转发最终到Y。每个站点都知道下一站发哪里,因为站点有表格,记录到各个目的地,信件该怎么传,报文交换的好处是,可以用不同路由使通信更可靠更能容错。在这个例子里,城市就像路由器一样,消息沿着路由跳转的次数,叫“跳数(hop count)”记录跳数很有用,因为可以分辨出路由问题。
例如,假设芝加哥认为去米苏拉的最快路线是奥马哈,但奥马哈认为去米苏拉的最快城市是芝加哥,这就导致,2个城市看到目的地是米苏拉,结果报文会在2个城市之间不停传来传去。不仅浪费带宽,而且这个路由错误需要修复。这种错误会被检测到,因为跳数记录在消息中,而且传输时会更新跳数。如果看到某条消息的跳数很高,就知道路由肯定哪里错了,这叫“跳数限制”(链路状态协议会用到距离)
报文交换的缺点之一是有时候报文比较大,会阻塞网络,因为要把整个报文从一站传到下一站后才能继续传递其它报文。传输一个大文件时,整条路都阻塞了,即便只有一个1KB的电子邮件要传输,也只能等大文件传完,或是选另一条效率稍低的路线。 解决方法是 将大报文分成很多小块,叫“数据包”。
就像报文交换,每个数据包都有目标地址,因此路由器知道发到哪里,报文具体格式由“互联网协议”定义,简称IP,这个标准创建于1970年代。每台联网的计算机都需要知道一个IP地址。以点分割的4组数字。数百万台计算机在网络上不断交换数据,瓶颈的出现和消失是毫秒级的。
路由器会平衡与其他路由器之间的负载,以确保传输可以快速可靠,这叫“阻塞控制”
分组交换
有时,同一个报文的多个数据包,会经过不同线路,到达顺序可能会不一样,这对一些软件是个问题。幸运的是,在IP之上还有其它协议,比如TCP/IP
,以解决乱序问题。将数据拆分成多个小数据包,然后通过灵活的路由传递,非常高效且可容错,如今互联网就是这么运行的。这叫“分组交换”。
有个好处是,它是去中心化的,没有中心权威机构,没有单点失败问题,事实上,因为冷战期间有核攻击的威胁,所以创造了分组交换。
如今,全球的路由器协同工作,找出最高效的线路,用各种标准协议运输数据,比如“因特网控制消息协议(ICMP)”和“边界网关协议(BGP)”世界上第一个分组交换网络,以及现代互联网的祖先是ARPANET
。
每个小圆表示一个点,比如大学或实验室,那里运行着一个路由器,并且有一台或多台计算机,能看到PDP-1
和IBM 360系统
,甚至还有一个伦敦的ATLAS
是通过卫星连到网络里的。
显然,互联网在这几十年发展迅速,如今不再只有几十台计算机联网,据估计,有接近100亿台联网设备,而且互联网会继续快速发展。特别是如今各种智能设备层出不穷,比如联网冰箱,恒温器,以及其它智能家电,它们组成了“物联网”。
互联网
- IP - 互联网协议 - Internet Protocol
- UDP - 用户数据报协议 - User Datagram Protocol
- 校验和 - Checksum
- TCP - 传输控制协议 - Transmission Control Protocol
- DNS - 域名系统 - Domain Name System
- OSI - 开放式系统互联通信参考模型 - Open System Interconnection
计算机和一个巨大的分布式网络连在一起,这个网络叫互联网。
互联网由无数联网设备组成,而且日益增多,计算机为了获取这个资源,首先要连到局域网,也叫LAN
。
家中WIFI路由器连着的所有设备,组成了局域网,局域网再连到广域网,广域网也叫WAN
。WAN
的路由器一般属于“互联网服务提供商”,简称“ISP”。比如,Comcast
, AT&T
, Verizon
这样的公司。
广域网里,先连到一个区域性路由器,这路由器可能覆盖一个街区,然后连到一个更大的WAN
,可能覆盖整个城市,可能再跳几次,但最终会到达互联网主干。互联网主干由一群超大型,带宽超高路由器组成。
为了从网络上获取视频,数据包(packet)要先到互联网主干,沿着主干到达对应有视频文件的网站服务器中。数据包从计算机到网站服务器,可能要跳个10次,先跳4次到互联网主干,2次穿过主干,主干出来可能再跳4次,然后到网站服务器。
如果用windows,Mac OS或Linux系统,可以用traceroute
来看跳了几次。
数据包到底是怎么过去的呢?
如果传输时数据包被弄丢了,会发生什么?
如果在浏览器里输入 segmentfault.com,浏览器怎么知道服务器地址是多少?
IP/TCP/UDP
互联网是一个巨型分布式网络,会把数据拆成一个个数据包来传输,如果要发的数据很大,比如邮件附件,数据会被拆成多个小数据包。
例如:,网络上的视频就是一个个到达电脑的数据包,而不是一整个大文件发过来。
数据包(packet)想在互联网上传输要符合“互联网协议”的标准,简称“IP”。
就像邮寄手写信一样,邮寄是有标准的,每封信需要一个地址,而且地址必须是独特的,并且大小和重量是有限制的。
IP数据包也是如此,因为IP是一个非常底层的协议。
数据包的头部只有一个目标地址,头部存“关于数据的数据”也叫元数据(metadata),这意味着当数据包到达对方电脑,对方不知道把包交给哪个程序,因此需要在IP之上,开发更高级的协议,这些协议里,最简单最常见的叫“用户数据报协议”,UDP
。
UDP
也有头部,这个头部位于数据前面,头部里包含有用的信息。
信息之一是端口号,每个想访问网络的程序,都要想操作系统申请一个端口号。
当一个数据包到达时(比如是skype端口号3478),接收方的操作系统会读UDP
头部,读里面的端口号。如果看到端口号是3478,就把数据包交给skype。
总结:
-
IP
负责把数据包送到正确的计算机。 -
UDP
负责把数据包送到正确的程序(端口负责送到正确的程序,因为TCP也有端口)。UDP
头部里还有“校验和”,用户检查数据是否正确。 正如“校验和”这个名字所暗示的检查方式是把数据求和来对比。
假设UDP
数据包里原始数据是89, 111, 33, 32, 58, 41。在发送数据包前,电脑会把所有数据加在一起,算出“校验和”。
例如,89 + 111 + 333...
,以此推类。得到364,这就是“校验和”。UDP
中,“校验和”以16位形式存储(就是16个0或1),如果算出来的和,超过了16位能表示的最大值高位会被扔掉,保留低位。
当接收方电脑收到这个数据包,它会重复这个步骤,把所有数据加在一起,89 + 111 + 333...
以此推类。如果结果和头部的校验和保持一致,代表一切正常。如果不一致,数据肯定坏掉了。也许传输时碰到了功率波动,或电缆出故障了。
UDP
不提供数据修复或数据重发机制,接收方知道数据损坏后,一般只是扔掉。而且,UDP
无法得知数据包是否到达。发送方发了之后,无法知道数据包是否到达目的地。
这些特性看起来很糟糕,但是有些程序不在意这些问题。因为UDP又简单又快。
例如,Skype,它用UDP来做视频通话,能处理坏数据或缺失数据。所有网速慢的时候,Skype卡卡的,因为只有一部分数据包到了电脑中,但对于其它一些数据,这个方法不实用。比如,邮件。
如果“所有数据必须达到”就用“传输控制协议TCP
”。TCP
和UDP
一样,头部也在数据前面,因此,一般叫做TCP/IP
。
就像UDP
,TCP
头部也有“端口号”和“校验和”,但TCP
有更高级的功能。
-
TCP
数据包有序号。 15号之后是16号,16号之后是17号,以此推类,发上百万个数据包也是有可能的。序号使接收方可以把数据包排成正确顺序,即使到达时间不同,哪怕到达顺序是乱的,TCP
协议也能把顺序排对。 -
TCP
要求接收方的电脑收到数据包并且“校验和”检查无误后(数据没有损坏)给发送方一个确认码,代表收到了。“确认码”简称ACK
,得知上一个数据包成功抵达后,发送方会发送下一个数据包。如果过了一定时间还没收到确认码,发送方会再发送一次。注意,数据包可能的确到了,只是确认码延误了很久,或传输丢失了。但不碍事,因为收件方有序列号。如果收到重复的数据包就会删掉。 -
TCP
不是只能一个包一个包发,可以同时发送多个数据包,收多个确认码,这大大增加了效率,不用浪费事件等确认码。
确认码的成功率和来回时间可以推测网络的拥堵程度,TCP
用这个信息,调整同时发包数量,解决拥堵问题。
简单说,TCP
可以处理乱序和丢失数据包,丢了就重发。还可以根据拥挤情况自动调整传输率。
迅雷是,P2P技术,是建立在TCP
协议之上的。
既然TCP
那么厉害,还有人用UDP
嘛?TCP
最大的缺点是,那些“确认码”数据包把数量翻了一倍,但并没有传递更多信息,有时候这种代价是不值得的,特别是对时间要求很高的程序,比如在线射击游戏。如果玩游戏很卡,也会觉得这样不值得。
当计算机访问一个网址时,需要二个东西:
- ip地址
- 端口号
有了ip和端口号,就能正确访问网站。但记忆一长串数字很讨厌,所以互联网有个特殊服务,负责把域名和ip地址一一对应。就像专为互联网的电话簿,它叫“域名系统”,简称DNS
。
它的运作原理:
在浏览器输入地址,浏览器会去问DNS
服务器,它的IP地址是多少,一般DNS
服务器是互联网供应商提供的。DNS
会查表,如果域名存在,就返回对应的IP地址。然后浏览器会给这个IP地址发TCP
请求。
如今有三亿个域名注册,所以为了更好管理,DNS
不是存在一个超长超长的列表,而是存成树状结构。顶级域名(简称TLD),在最顶部,比如.com
和.gov
。下一层是二级域名,比如.com
下面有baidu.com
和dftba.com
。更下一层叫子域名,比如image.baidu.com
。这个树超级大。
三亿个域名,只是二级域名,不是所有子域名。因此,这些数据散布在很多DNS
服务器上,不同服务器负责树不同部分。
可以进行再次封装。
线路里的电信号,以及无线网络里的无线信号。这些叫“物理层”。
而“数据链路层”负责操控“物理层”,数据链路层有:媒体访问控制地址(MAC),碰撞检测,指针退避,以及一些底层协议。
再上一层是“网络层”,负责各种报文交换和路由。
“传输层”里的一大部分是TCP
和UDP
这些协议,负责在计算机之间进行点到点的传输,而且还会检测修复错误。
“会话层”,会使用TCP
和UDP
来创建连接,传递信息,然后关掉连接。
开放式系统互联通信参考模型
开放式系统互联通信参考模型(OSI)的底下5层,这个概念性框架,把网络通信划分成多层,每一层处理各自的问题,如果不分层,直接从上到下捏在一起实现网络通信,是完全不可能的。抽象使得科学家和工程师能分工同时改进多个层,不被整体复杂度难倒。
OSI模型还有两层,“表示层”和“应用程序层”。其中有浏览器,Skype,HTML解码,在线看电影等。
万维网
- 超链接 Hyperlinks
- URL - 统一资源定位器
- HTTP - 超文本传输协议
- HTML - 超文本标记语言
- 第一个浏览器和服务器是Tim Berners-Lee 花了2个月在CERN写的
- 1991年正式发布,万维网就此诞生
- 开始讲搜索引擎的故事
- Jerry 和 David的万维网指南 后来改名成 Yahoo
- 搜索引擎 JumpStation
- 搜索引擎Google
- 网络中立性
互联网是传递数据的管道,各种程序都会用。
电线,信号,交换机,数据包,路由器,协议,它们共同组成了互联网。再抽象一层,就是万维网。
万维网(World Wide Web)和互联网(Internet)不是一回事,万维网在互联网之上运行,互联网之上有Skype,Instagram,互联网是传递数据的管道,各种程序都会用,其中传输最多的数据的程序是万维网。
分布在全球数百万个服务器上,可以用“浏览器”来访问万维网。
超链接
万维网的最基本单位,是单个页面。页面有内容,也有去其它页面的链接,这些链接叫“超链接”。这些超链接形成巨大的互联网络,这就是万维网的名字来源。Vannevar Bush
的形容是“关联式索引..选一个物品会引起,另外一个物品被立即选中”,他解释说:“将两样东西联系在一起的过程十分重要,在任何时候,当其中一件东西进入视线,只需要点一下按钮,立马就能回忆起另一件。”
为了使网页能相互连接,每个网页需要一个唯一的地址,这个地址叫“统一资源定位器”,简称URL
计算机首先会做“DNS查找”,“DNS查找”的输入是一个域名,比如“www.google.com”,DNS会输出对应的IP地址,现在有了IP地址,浏览器会打开一个TCP连接到这个IP地址,这个地址运行着“网络服务器”,网络服务器的标准端口是80端口,
下一步是 向服务器请求“courses”这个页面,这里会用“超文本传输协议”(HTTP),HTTP的第一个标准,HTTP 0.9,创建于1991年,只有一个指令,“GET”指令。该指令以“ASCII编码”发送到服务器,服务器会返回该地址对应的网页然后浏览器会渲染到屏幕上。
如果用户点击了另一个链接,计算机会重新发一个GET请求,浏览网站的时候,这个步骤会不断重复。
在之后的版本,HTTP添加了状态码,状态码放在请求前面。
“超文本”的存储和发送都是以普通文本形式,因为如果只有纯文本,无法表明什么是链接,什么不是链接。所以,有必要开发一种标记方法。因为有了超文本标记语言(HTML)。
HTML第一版的版本号0.8,创建于1990年,有18种HTML指令。最新版的HTML,HTML5,有100多种标签。
搜索引擎
网页浏览器和网页服务器沟通,浏览器不仅获取网页和媒体,获取后还负责显示。Tim Berners-Lee
在1990年写的,一共花了2个月,为了做出来,同时建立了几个最基本的网络标准,URL,HTML和HTTP,在内部使用了一段时间,在1991年发布出去,万维网就此诞生,重要的是,万维网有开放标准,都可以开发新服务器和新浏览器。
最早的搜索引擎,叫JumpStation
,它有3个部分,
- 第一个是爬虫,一个跟着链接到处跑的软件,每当看到新链接,就加进自己的列表里。
- 第二部分是不断扩张的索引,记录访问过的网页上,出现过哪些词。
- 查询索引的搜索算法。
与其信任网页上的内容,搜索引擎会看其他网站,有没有链接到这个网站。所以这些“反向链接”的数量,特别是有信誉的网站,代表了网站的质量。
网络中立性,应该平等对待所有数据包,不论是这个数据包是邮件,或则是在看对视频,速度和优先级应该是一样的。但很多公司会乐意让它们的数据优先到达。例如,Comcast,它们不但是大型互联网服务提供商而且拥有多家电视频道,比如,NBC和The Weather Channel,可以在线看。
Comcast可以让自己的内容优先到达,节流(Throttled,故意给更少的宽带和更低优先级)其他线上视频。
支持网络中立性的人说,没有中立性后,服务商可以推出提速的“高级套餐”,给剥削性商业模式埋下种子。互联网服务供应商成为信息的“守门人”,它们有着强烈的冬季去碾压对手。
另一方面,从技术原因看,也会希望不同数据传输速度不同。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。