- IP——互联网协议
- UDP——用户数据报协议
- 校验和
- TCP——传输控制协议
- DNS——域名系统
- OSI——开放式系统互联通信参考模型
上集提到,你的计算机和一个巨大的分布式网络连接在一起。这个网络就叫做互联网。互联网由无数互联设备构成,而且日益增多。计算机为了获取这个视频,首先要连接到局域网(Local Area Network,LAN)。你家WiFi路由器连着的所有设备,组成了局域网。局域网再连接到广域网(wide area network,WAN)。WAN的路由器一般属于你的互联网服务提供商(Internet Service Provider,ISP),比如Comcast,AT&T,Version这样的公司。广域网里,先连到一个区域性路由器,这个路由器可能覆盖一个街区。然后再连到一个更大的WAN,可能覆盖整个城市。可能再跳几次,但最终会到达互联网主干。互联网主干由一群超大型、带宽超高路由器组成。假设我们现在从YouTube上看视频,为了从YouTube获得这个视频,数据包(packet)要先到互联网主干,沿着主干到达有对应视频文件的YouTube服务器,数据包从你的计算机跳到YouTube服务器,可能要跳个10次。先跳4次到互联网主干,2次穿过互联网主干,从互联网主干出来可能再跳4次,然后到YouTube服务器。我们可以用软件traceroute来看跳了几次。以下是我们在“印第安纳波利斯”的Chad&Stacy Emigholz工作室,访问加州的DFTBA服务器的路由跳转情况。可以看到数据包从192.168.0.1跳转到104.24.109.186。
但是数据包传到过去的细节是怎么样的?如果传输时数据包被弄丢了,会发生什么?如果在浏览器中输入"DFTBA.com",浏览器怎么知道服务器的地址是多少?
上集说过,互联网是一个巨型分布式网络,会把数据拆成一个个数据包来传输。如果要发的数据很大,数据会被拆成很多的小数据包。比如你在看的网络视频就是一个个地到达你电脑上的数据包,而不是一整个文件直接发过来。数据包(packet)想在互联网上传输,要符合“互联网协议”(Internet Protocol)的标注,简称IP。就像邮寄手写信一样,邮寄是有标准的,每封信需要写一个地址,而且地址必须是独特的,而且大小和重量是有限制的。违反这些规定,信件就无法送达。IP数据包也是如此。
因为IP是一个非常底层的协议,按照此协议传输的数据包的头部(或者说前面)只有目标地址——头部存“关于数据的数据”也叫做元数据(metadata)。这意味着当数据包到达对方电脑是,对方并不注意到把包交给哪个程序——是交给Skype还是使命召唤?因此需要在IP之上,开发更高级的协议。这些协议里,最简单最常见的叫“用户数据包协议”(User Datagram Protocol),简称UDP。UDP也有头部,这个头部位于数据的前面,头部里包含着有效的信息。信息之一是端口号,每个想访问网络的程序都要向操作系统申请一个端口号。比如Skype会申请端口3478,当一个数据包到达时,接收方的操作系统会读UDP头部,读里面的端口号。如果看到端口号是3478,就把数据包交给Skype。
总结:IP负责把数据包送到正确的计算机,UDP负责把数据包送到正确的程序。
UDP头部里还有“校验和”(checksum),用于检查数据是否正确。正如校验和这个名字所暗示的,检查方式是把数据求和来对比。以下是一个简单的例子。
假设UDP数据包里原始数据是89 111 33 32 58 41,在发送数据包前,电脑会把所有数据加在一起,计算出“校验和”:89+111+33…以此类推,得到364,这就是校验和。UDP中,“校验和”以16位形式存储(16个0或者1)。如果算出来的和,超过了16位所能表示的最大值,高位数就会被扔掉,保留低位。当接收方电脑收到这个数据包,它会重复这个步骤并把所有数据加在一起,89+111+33…以此类推。如果结果和头部中的校验和一致,代表一切正常。如果不一致,数据肯定坏掉了。
如果不一致,数据肯定坏掉了。也许是传输时碰到了功率波动,或者电缆出故障了。不幸的是,UDP不提供数据修复或数据重发的机制,接收方知道数据损坏后,一般只是扔掉。而且,UDP无法得知数据包是否到达。发送方发了之后,无法得知数据包是否到达目的地。有些程序并不在意这些问题,因为UDP又简单又快。拿Skype举例,它用UDP来做视频通话,能处理坏数据或者缺失数据。当网速慢的时候,Skype卡卡的,因为只有一部分数据包到了你的电脑。
对于其他一些数据,这个方法不适用,比如发邮件,邮件不能只有开头和结尾,没有中间,邮件要完整到达收件方。如果要求“所有数据必须到达”,就使用“传输控制协议”(Transmission Control Protocol,TCP)。TCP和UDP一样,头部也存在数据前面。因此人们叫这个组合TCP/IP。
就像UDP,YCP头部也有“端口号”和“校验和”。但TCP有更高级的功能,我们这里只介绍重要的几个。
- TCP数据包有序号。15号之后是16号,16号之后是17号,以此类推发上百万个数据包也是有可能的。序号使接收方把数据包排成正确顺序,即使到达时间不同。哪怕到达顺序是乱的,TCP协议也能把顺序排对。
- TCP要求接收方的电脑收到数据包,并且和“校验和”检查无误后(数据没有损坏)给发送方发一个确认码,代表收到了。“确认码”简称ACK,得知上一个数据包成功抵达后,发送方会发送下一个数据包。假设这次发出去之后,没有收到确认码,那么肯定哪里错了。如果过了一段时间还没收到确认码,发送方会再发一次。
注意,数据包可能的确到了,只是确认码延误了很久,或传输中丢失了。但这并不碍事,因为收件方有序列号。如果收到重复的数据包就会删掉。还有,TCP不是只能一个包一个包地发,可以同时发多个数据包,收多个确认码,这大大增加了效率,不用浪费时间等确认码。
确认码的成功率和来回时间可以用来推测网络的拥堵程度。TCP用这个信息,调整同时发包数量,解决拥堵问题。
简单来说,TCP可以处理乱序和丢失数据包,丢了就重发,还可以根据拥挤情况自动调整传输率。相当厉害。既然TCP这么厉害,还有人用UDP吗?TCP最大的缺点是那些“确认码”数据包把数量翻了一倍,但是并没有传输更多信息。有时候这种代价是不值得的,特别是对时间要求很高的程序,比如在线射击游戏,如果你玩游戏很卡,你也会觉得这样不值!
DNS——域名系统当计算机访问一个网站时,需要两个东西:1.IP地址;2.端口号。比如172.217.7.238的80的端口时谷歌的IP地址和端口号。在浏览器输入172.217.7.238:80就可以进入谷歌首页。有了这两个东西就能访问正确的网站,但记一长串数字很讨厌,而google.com比一长串数字更好记。所以互联网有个特殊服务,负责把域名和IP地址一一对应。就像专为互联网的电话簿,它叫做“域名系统”(domain name system),简称DNS。
DNS的运作原理如下。在浏览器输入youtube.com。浏览器会访问DNS服务器,它的IP地址是多少。一般DNS服务器是互联网提供商提供的。DNS会查表,如果域名存在,就返回对应IP地址到你的浏览器。如果域名不存在,浏览器就会提示DNS错误。
如果你输入的是有效地址,比如YouTube.com,DNS按理会返回一个地址。然后浏览器会给这个IP地址发TCP请求。
如今有三千万个注册域名,所以为了更好管理,DNS不是存成一个超长超长的列表,而是存成树状结构。顶级域名(简称TLD)在最顶部,比如.com和.gov。下一层是二级域名,比如.com下面有google.com和dftba.com。再下一层叫子域名,比如image.google.com,store.dftba.com。
这个结构非常大,二级域名和子域名散布在很多DNS服务器上。不同服务器负责树的不同部分。
过去两集里,我们讲了线路里的电信号,以及无线网络里的无线信号。这些叫做“物理层”(physical layer)。而“数据链路层(data link layer)”负责操控“物理层”。数据链路层有:媒体访问控制地址(MAC),碰撞检测、指数退避以及一些其他底层协议。再上一层是“网络层”(network layer),负责各种报文交换和路由。而今天我们讲了“传输层”(transport layer)里的一大部分,比如UDP和TCP这些协议,负责在计算机之间进行点到点的传输,而且还会检测和修复错误。我们还讲了一点点“会话层”(Session Layer)。会话层会使用TCP和UDP来创建连接,传递信息然后关掉连接。这一整套就叫做“会话”(session),查询DNS或者看网页的时候就会发生这一套流程。
这是开放式系统互联通信参考模型(OSI)的底下5层,这个概念性框架把网络通信划分成多层,每一层处理各自的问题。如果不分层,直接从上到下混在一起实现网络通信,是完全不可能的。OSI模型还有两层,“表示层”和“应用程序层”。其中有浏览器,Skype,Html解码,在线看电影等等。
抽象使得科学家和工程师能分工同时改进多个层,不被整体复杂度难倒。



