计算机网络漫游

京东图书日买了几本专业书籍。其中一本是《计算机网络:自顶向下方法》,算是很知名的一本介绍计算机网络的书了。今天晚上看了第一章,很是过瘾。大二的计算机网络课程,虽然拿了90+的成绩,但说实话,对计算机网络的很多概念(包括七层模型)都是模糊的。希望看完这本书,能补一补大二欠下的计算机网络的知识吧。决定开坑,把这本书的一些知识点归纳到博客里。


一、从物理角度理解

因特网(Internet)是世界范围的计算机网络。计算机网络,即是计算设备互联互通的一个网络。这里的设备,可以是我们的PC个人电脑,可以是服务器,也可以是我们的手机、平板电脑、电视、游戏机等等。也就是说,计算机网络把我们的这些设备连接了起来,实现不同设备之间的信息传输。

上面提到的设备,可以统称为主机(host)端系统(end system),端系统通过通信链路(communication link)分组交换机(packet switch)连接到一起。一台端系统向另一台端系统发送数据时,发送端将数据分段,并给每段加上首部字节,首部+数据段这样的信息包,就称为分组(packet)

分组交换机包括路由器(router)链路层交换机(link-layer switch),路由器常用于网络核心,链路层交换机则常用于接入网。一个分组,从发送端系统到接收端系统,所经历的一系列通信链路和分组交换机,称为路径(path/route)

那么有了端系统,我们怎么接入因特网呢?这个工作就要由因特网服务提供商(Internet Service Provider, ISP)来做。ISP有很多,比如住宅区ISP,公司ISP,大学ISP,这些低层的ISP,通过区域的ISP(比如市级、省级ISP)互联,区域ISP又由国家或国际的高层ISP互联起来。形成了一个网络的网络。


二、从服务角度描述

我们平时收发电子邮件、浏览web网页、使用QQ微信等即时通讯软件,这些应用程序涉及到多台相互交换数据的端系统,我们称这类应用程序为分布式应用程序(distributed application)。与因特网相连的端系统,有一个应用程序编程接口(Application Programming Interface,API),这个接口规定了一个端系统应用软件(比如小明手机上的微信)如何通过因特网向另一个运行在另一台端系统的软件(比如小红手机上的微信)交付数据。

端系统也叫做主机,是因为它用来运行应用程序。主机可以划分为客户端(client)服务器(server),常见的客户端包括我们的PC,智能手机等,常见的服务器有Web服务器等。大部分为我们提供web、搜索、电子邮件、视频等服务的服务器,属于数据中心(data center)。Google就有50个左右的数据中心,其中许多数据中心有10万台以上的服务器。


三、从接入网到网络核心

普通家庭可通过数字用户线(DSL)、电缆、光纤(FTTH)、拨号和卫星来接入(access)互联网,或者用以太网以及Wi-Fi来接入。智能手机,上网本等还可用3G、LTE等接入互联网。

接入了互联网,我们还需要物理媒体来承载我们的信息(用电磁波或光脉冲来发送比特)。这些物理媒体包括:双绞铜线、同轴电缆、光纤、陆地无线电信道、卫星无线电信道。

前面提到,端系统发送数据时,要分段成为很多分组。这些分组不是一下子就发送到目的端系统,而是首先会被发送到分组交换机中去,分组交换机有一个存储转发传输(store-and-forward transmission)机制,这个机制规定,要从链路输入端接收到整个分组后,才能开始向链路输出端传输比特。

由于每个分组交换机有很多条链路,如果某条链路接收到一个分组,要传输到另一条链路上(这个过程中需要时间,称为存储转发时延),但是另一条链路正忙于传输其他分组,那么这个分组就会被暂时放到输出缓存(output buffer)中等待。这就是排队时延(queue delay)

由于缓存空间有限,如果一个到达的分组发现缓存空间已经被其他过来排队等待的分组充满了,那么这个分组或者已经在排队的分组之一,就会被丢弃。这种现象就叫做丢包(packet lost)

我们已经知道,路由器从一条链路得到分组,将分组转发到另一条链路中去。那么路由器是怎么知道要往哪条链路转发的呢?前面提到,每个分组都被加了首部,首部里面包含了目的地的IP地址。而路由器有一个转发表(forwarding table),用于将目的地址映射成输出链路。当路由器接收到一个分组,路由器会搜索转发表找到适当的输出链路。那么,转发表又是如何设置的呢?事实上,因特网有一些特殊的路由选择协议(routing protocol)会自动设置这些转发表,不用我们操心。

上面我们讨论的,是链路和交换机移动数据的分组交换(packet switching),事实上,还有一种交换数据的方式,叫做电路交换(circuit switching),在这里就不介绍了。


四、协议层次

计算机网络中,为了实现数据的传输,我们需要定义很多通信协议来告诉计算机在每一个地方(应用程序中、传输链路中、物理介质中)应该怎样去传输数据。为了给这些协议一个清晰的结构,我们引出分层(layer)的概念。

因特网的协议栈有5个层次:物理层、链路层、网络层、运输层和应用层。

1. 应用层

应用层用于网络应用程序之间,如HTTP、SMTP、FTP等协议。一个端系统中的应用程序(如微信)使用应用层协议与另一个端系统中的应用程序交换信息分组。这种应用程序之间的分组,称为报文(message)

2. 运输层

应用层的报文,需要在某一个端点传送出去或者接收进来。如何传?如何接?就需要运输层协议来规定了。运输层协议有TCP和UDP,都可以传输应用层的报文,只是怎么传的区别罢了。运输层的分组,称为报文段(segment)

3. 网络层

运输层协议把报文段和目的地址,交付给网络层。网络层将报文段和目的地址打包成数据报(datagram),然后把他们从一台主机移动到另一台主机。网络层最著名的协议是IP协议。

4. 链路层

网络层的分组要从一台主机移动到另一台主机,不是一下子就能移动过去的,而是要经过很多结点(结点可以是主机或路由器)。为了将分组从一个结点移动到路径上的下一个结点,我们需要链路层来完成这个工作。链路层把数据包封装成帧(frame),一个帧从一个结点传输到下一个结点之后,就会解包成数据包上传给下一个结点的网络层。链路层的例子包括以太网、Wi-Fi等。

5. 物理层

链路层的任务,是把整个帧从一个结点移动到下一个结点。一个帧中有很多比特的数据,物理层就是用来把帧中的一个又一个的比特。从一个结点移动到下一个结点的。以太网是链路层的协议,但以太网也有物理层的协议,这些帧的每一个比特,是要用双绞铜线来传输,还是用同轴电缆,或者光纤,这是物理层所要决定的。

OSI 七层模型

因特网采用的是上述五层的协议栈。但事实上,在20世纪70年代后期,国际标准化组织(ISO)提出的计算机网络应为7层模型(称为开放系统互联(OSI)模型),要比因特网多2层,即应用层和运输层中间多了表示层和会话层。在因特网的实践中,如果应用程序的开发者觉得这两层重要,开发者应该在应用程序中实现这两层的功能。