# 综述

## 参考

* [CYC CS-Notes 计算机网络 - 概述](http://www.cyc2018.xyz/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%20-%20%E6%A6%82%E8%BF%B0.html)
* [《计算机网络》谢希仁](https://book.douban.com/subject/26960678/)

## 网络的网络

网络(network)由若干结点(node)和连接这些结点的链路(link)组成。网络中的结点可以是计算机、集线器、交换机或路由器等。

网络和网络还可以通过路由器互连起来，这样就构成了一个覆盖范围更大的网络，即互联网。因此互联网是“网络的网络”(network of networks)。

因此，我们可以先初步建立这样的基本概念：网络把许多计算机连接在一起，而因特网则把许多网络连接在一起。

## ISP

端系统通过因特网服务提供商(Internet Service Provider , ISP)接入因特网，包括如本地电缆或电话公司那样的住宅区 ISP 、公司 ISP、大学 ISP，以及那些在机场、旅馆、咖啡店和其他公共场所提供 WiFi 接入的 ISP。

ISP 可以从互联网管理机构获得许多 IP 地址，同时拥有通信线路以及路由器等联网设备，个人或机构向 ISP 缴纳一定的费用就可以接入互联网。

目前的互联网是一种多层次 ISP 结构，ISP 根据覆盖面积的大小分为第一层 ISP、区域 ISP 和接入 ISP。互联网交换点 IXP 允许两个 ISP 直接相连而不用经过第三个 ISP。

## 主机之间的通信方式

客户端 - 服务器（C/S）：客户端是服务的请求方，服务器是服务的提供方。

对等网络（P2P）：不区分客户和服务器。

## 电路交换和分组交换

通过网络链路和交换机移动数据有两种基本方法：电路交换 (circuit switching)和分组交换 (packet switching)。

### 1. 电路交换

> 电路交换用于电话通信系统，两个用户要通信之前需要建立一条专用的物理链路，并且在整个通信过程中始终占用该链路。由于通信的过程中不可能一直在使用传输线路，因此电路交换对线路的利用率很低，往往不到 10%。

在电路交换网络中，在端系统间通信会话期间，预留了端系统间通信沿路径所需要的资源(缓存，链路传输速率) 。（而在分组交换网络中，这些资源则不是预留的，会话的报文按需使用这些资源，其后果可能是不得不排队等待接入通信线路。）

传统的电话网络是电路交换网络的例子。考虑当一个人通过电话网向另一个人发送信息(语音或传真)时所发生的情况。在发送方能够发送信息之前，该网络必须在发送方和接收方之间建立一条连接。这是一个名副其实的连接，因为此时沿着发送方和接收方之间路径上的交换机都将为该连接维护连接状态。用电话的术语来说，该连接被称为一条电路(circuit) 。当网络创建这种电路时，它也在连接期间在该网络链路上预留了恒定的传输速率(表示为每条链路传输容量的一部分) 。既然已经为该发送方-接收方连接预留了带宽，则发送方能够以确保的恒定速率向接收方传送数据。

### 2. 分组交换

> 每个分组都有首部和尾部，包含了源地址和目的地址等控制信息，在同一个传输线路上同时传输多个分组互相不会影响，因此在同一条传输线路上允许同时传输多个分组，也就是说分组交换不需要占用传输线路。
>
> 在一个邮局通信系统中，邮局收到一份邮件之后，先存储下来，然后把相同目的地的邮件一起转发到下一个目的地，这个过程就是存储转发过程，分组交换也使用了存储转发过程。

在各种网络应用中，端系统彼此交换报文(message) 。报文能够包含协议设计者需要的任何东西。报文可以执行一种控制功能，也可以包含数据，例如电子邮件数据、JPEG图像或MP3音频文件。

为了从源端系统向目的端系统发送一个报文，源将长报文划分为较小的数据块，称之为分组(packet) 。在源和目的地之间，每个分组都通过通信链路和分组交换机(packet switch) (交换机主要有两类：路由器和链路层交换机)传送。

分组以等于该链路最大传输速率的速度传输通过通信链路。因此，如果某源端系统或分组交换机经过一条链路发送一个 L 比特的分组，链路的传输速率为 R 比特/秒，则传输该分组的时间为 L/R 秒。

## 时延

时延(delay或latency)是指数据（一个报文或分组，甚至比特）从网络（或链路）的一端传送到另一端所需的时间。时延是个很重要的性能指标，它有时也称为延迟或迟延。

需要注意的是，数据在网络中经历的总时延是由以下几个不同的部分组成的：

> 总时延 = 传输时延（发送时延）+ 传播时延 + 处理时延 + 排队时延

一般说来，小时延的网络要优于大时延的网络。在某些情况下，一个低速率、小时延的网络很可能要优于一个高速率但大时延的网络。

### 1. 发送时延

发送时延(transmission delay)是主机或路由器发送数据帧所需要的时间，也就是从发送数据帧的第一个比特算起，到该帧的最后一个比特发送完毕所需的时间。因此发送时延也叫做“**传输时延**”。发送时延的计算公式是：

$$
发送时延 = \frac{数据帧长度(b)}{发送速率(b/s)}
$$

由此可见，对于一定的网络，发送时延并非固定不变，而是与发送的帧长（单位是比特）成正比，与发送速率成反比。

### 2. 传播时延

传播时延(propagation delay)是电磁波在信道中传播一定的距离需要花费的时间。传播时延的计算公式是：

$$
传播时延 = \frac{信道长度(m)}{电磁波在信道上的传播速率(m/s)}
$$

电磁波在自由空间的传播速率是光速，即3.0×105km/s。电磁波在网络传输媒体中的传播速率比在自由空间要略低一些：在铜线电缆中的传播速率约为2.3×105km/s，在光纤中的传播速率约为2.0×105km/s。例如，1000km长的光纤线路产生的传播时延大约为5ms。

### 3. 处理时延

主机或路由器在收到分组时要花费一定的时间进行处理，例如分析分组的首部、从分组中提取数据部分、进行差错检验或查找适当的路由等等，这就产生了处理时延。

### 4. 排队时延

分组在经过网络传输时，要经过许多路由器。但分组在进入路由器后要先在输入队列中排队等待处理。在路由器确定了转发接口后，还要在输出队列中排队等待转发。这就产生了排队时延。排队时延的长短往往取决于网络当时的通信量。当网络的通信量很大时会发生队列溢出，使分组丢失，这相当于排队时延为无穷大。

## 计算机网络体系结构

OSI的七层协议体系结构的概念清楚，理论也较完整，但它既复杂又不实用。

TCP/IP体系结构则不同，它现在已经得到了非常广泛的应用。TCP/IP是一个四层的体系结构，它包含应用层、运输层、网际层和网络接口层（用网际层这个名字是强调这一层是为了解决不同网络的互连问题）。不过从实质上讲，TCP/IP只有最上面的三层，因为最下面的网络接口层基本上和一般的通信链路在功能上没有多大差别，对于计算机网络来说，这一层并没有什么特别新的具体内容。

因此在学习计算机网络的原理时往往采取折中的办法，即综合OSI和TCP/IP的优点，采用一种只有五层协议的体系结构，这样既简洁又能将概念阐述清楚。

![图源：《计算机网络》谢希仁](https://2867142549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJk0k2N3jdj765qaf1X%2F-MMOBJqQGw3S4dQLEdAl%2F-MMOBUFchjU6OQRgS59Q%2Fimage.png?alt=media\&token=ba9b2af7-fb3d-4447-9f63-51c55f5f3576)

### 1. 五层协议

_**应用层(application layer)**_

> 为特定应用程序提供数据传输服务，例如 HTTP、DNS 等协议。数据单位为报文。

应用层是体系结构中的最高层。应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程(process)就是指主机中正在运行的程序。对于不同的网络应用需要有不同的应用层协议。在因特网中的应用层协议很多，如支持万维网应用的HTTP协议，支持电子邮件的SMTP协议，支持文件传送的FTP协议，等等。我们将应用层交互的数据单元称为报文(message)。

_**运输层(transport layer)**_

> 为进程提供通用数据传输服务。由于应用层协议很多，定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议：传输控制协议 TCP，用户数据报协议 UDP。

运输层的任务就是负责向两个主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。所谓通用，是指并不针对某个特定网络应用，而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个进程，因此运输层有复用和分用的功能。复用就是多个应用层进程可同时使用下面运输层的服务，分用与复用相反，是指运输层把收到的信息分别交付上面应用层中的相应进程。

运输层主要使用以下两种协议：

* 传输控制协议TCP (Transmission Control Protocol)——提供面向连接的、可靠的数据传输服务，其数据传输的单位是报文段(segment)。
* 用户数据报协议 UDP (User Datagram Protocol)——提供无连接的、尽最大努力(best-effort)的数据传输服务（不保证数据传输的可靠性），其数据传输的单位是用户数据报。

_**网络层(network layer)**_

> 为主机提供数据传输服务。传输层协议是为主机中的进程提供数据传输服务，而网络层是把传输层传递下来的报文段或者用户数据报封装成分组在不同主机之间进行通信。

网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时，网络层把运输层产生的报文段或用户数据报封装成分组或包(packet)进行传送。在TCP/IP体系中，由于网络层使用IP协议，因此分组也叫作 IP数据报，或简称为数据报(datagram)。

网络层的另一个任务就是要选择合适的路由，使源主机运输层所传下来的分组能够通过网络中的路由器找到目的主机。

> 因特网是一个很大的互联网，它由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来。因特网主要的网络层协议是无连接的网际协议IP (Internet Protocol)和许多种路由选择协议，因此因特网的网络层也叫做网际层或IP层。网络层、网际层和IP层都是同义语。

_**数据链路层(data link layer)**_

> 网络层针对的还是主机之间的数据传输服务，而主机之间可以有很多链路，链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。

数据链路层常简称为链路层。我们知道，两台主机之间的数据传输，总是在一段一段的链路上传送的，这就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时，数据链路层将网络层交下来的IP数据报组装成帧（framing），在两个相邻结点间的链路上传送帧（frame）。每一帧包括数据和必要的控制信息（如同步信息、地址信息、差错控制等）。

在接收数据时，控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样，数据链路层在收到一个帧后，就可从中提取出数据部分，上交给网络层。

控制信息还使接收端能够检测到所收到的帧中有无差错。如发现有差错，数据链路层就简单地丢弃这个出了差错的帧，以免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在数据链路层传输时出现的差错（这就是说，数据链路层不仅要检错，而且要纠错），那么就要采用可靠传输协议来纠正出现的差错。这种方法会使数据链路层的协议复杂些。

_**物理层(physical layer)**_

> 考虑的是怎样在传输媒体上传输数据比特流，而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异，使数据链路层感觉不到这些差异。

在物理层上所传数据的单位是比特。发送方发送1（或0）时，接收方应当收到1（或0）而不是0（或1）。因此物理层要考虑用多大的电压代表“1”或“0”，以及接收方如何识别出发送方所发送的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各条引脚应如何连接。当然，解释比特代表的意思，就不是物理层的任务。请注意，传递信息所利用的一些物理媒体，如双绞线、同轴电缆、光缆、无线信道等，并不在物理层协议之内而是在物理层协议的下面。因此也有人把物理媒体当作第0层。

### 2. OSI

表示层和会话层用途如下：

* **表示层** ：数据压缩、加密以及数据描述，这使得应用程序不必关心在各台主机中数据内部格式不同的问题。
* **会话层** ：建立及管理会话。

五层协议没有包含表示层和会话层，而是转而将这些功能留给开发者来处理。

### 3. TCP/IP

![图源：CYC2018](https://2867142549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MJk0k2N3jdj765qaf1X%2F-MMOIsMHUoFtzHaZtP83%2F-MMOIyEnI6a6m3g1SIRZ%2Fimage.png?alt=media\&token=cf9d6fb8-c68e-4635-bac4-73ee75fc5b8a)

它只有四层，相当于五层协议中数据链路层和物理层合并为网络接口层。

TCP/IP 体系结构不严格遵循 OSI 分层概念，应用层可能会直接使用 IP 层或者网络接口层。

### 4. 数据在各层之间传递的过程

在向下的过程中，需要添加下层协议所需要的首部或者尾部，而在向上的过程中不断拆开首部和尾部。

路由器只有下面三层协议，因为路由器位于网络核心中，不需要为进程或者应用程序提供服务，因此也就不需要传输层和应用层。
