暑假期间阅读了这本书,为即将学习的专业课打下一点基础。把大致讲到的内容都概括地记下来,到时候上课后再根据所学进行补充。
感觉这本书举例挺多而且易于理解,是挺易读的一本入门书籍。
基础
通信链路和分组交换机
通信链路和分组交换机把端系统连接在一起。
通信链路包括同轴电缆、铜线、光纤和无线电谱,它们的传输速率不同。
当一台端系统要向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节。由此形成的信息包称作分组。
分组交换机从它的一条入通信链路接收到达的分组,并从它的一条出通信链路转发该分组。分组交换机包括路由器(router)和链路层交换机(link-layer switch)
一种理解方式:分组类似于卡车,通信链路类似于高速公路和公路,分组交换机类似于交叉口,而端系统类似于建筑物。
从发送端系统到接收端系统,一个分组所经历的一系列通信链路和分组交换机称为通过该网络的路径(route/path)。
通过网络链路和交换机移动数据有两种基本方法:电路交换(circuit switching) 和 分组交换(packet switching)
- 分组交换
大多数分组交换机在链路的输入端使用存储转发传输(store-and-forward transmission) 机制。存储转发传输是指在交换机在开始向输岀链路传输该分组的第一个比特之前,必须接收到整个分组的所有比特并缓存,此时它才能开始向出链路传输。
每台分组交换机有多台链路与之相连。路由器以这种方式来确定向哪条链路进行传输:通过转发表(forwarding table) 将分组首部的IP地址映射为输出链路。对于每一个链路,分组交换机都有一个输出缓存(或输出队列)。在网络拥塞时,一个到达的分组可能发现该缓存已经被占满,此时就会发生分组丢失(丢包)(packet loss),即到达的分组或已经排队的分组之一将被抛弃。
分组交换又分为数据报方式和虚电路方式:
数据报 | 虚电路 | |
---|---|---|
是否需要建立连接 | 否 | 是 |
目的地址 | 每个分组有完整的地址 | 仅在建立连接时使用,之后每个分组使用虚电路号 |
路由选择 | 每个分组独立选择路由并转发 | 同一虚电路的分组按同一路由转发 |
分组顺序 | 不保证 | 保证 |
可靠性 | 不保证 | 保证 |
- 报文交换
和分组交换类似,都采用存储转发方式,加上辅助信息(源、目标地址等),也要通过查找转发表,确定下一个结点。
区别是报文交换不等长,而分组交换是较短的固定的数据块。 - 电路交换
每台主机都与一台交换机直接相连。 当两台主机要通信时,电路交换网络在两台主机之间创建一条专用的端到端连接(end-to-end connection),称作电路,电路是通过频分复用(Frequency-Division Multiplexing, FDM ) 或 时分复用(TDM) 来实现的。
对于FDM,链路的频谱由跨越链路创建的所有连接共享。在连接期间链路为每条连接专用一个频段,该频段的宽度称为带宽(bandwidth)。
对于TDM链路,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。当网络跨越一条链路创建一条连接时,网络在每个帧中为该连接指定一个时隙。 这些时隙专门由该连接单独使用,一个时隙(在每个帧内)可用于传输该连接的数据。
分组交换网的时延、丢包和吞吐量
时延
分组在沿途的每个节点会经受几种不同类型的时延。最为重要的是节点处理时延(nodal processing delay)、排队时延(queuing delay)、传输时延(transmission delay)(也叫发送时延)和传播时延(propagation delay),这些时延总体累加起来是节点总时延(tolal nodal delay)。
- 处理时延
检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分,处理之后,路由器将该分组引向通往下一个路由器链路之前的缓存队列。高速路由器的处理时延通常是微秒或更低的数量级。 - 排队时延
节点时延中最复杂的是排队时延。
令a表示分组到达队列的平均速率,以分组/秒(即packet/s)为单位。R表示传输速率,以bps(即b/s)为单位。假定所有分组都是由L比特组成的,则比特到达队列的平均速率是L*a(bps),比率La/R被称为流量强度(traffic intensity)。
如果La/R>1,就会出现丢包的情况(动画演示)。而如果La/R≤1,则可能出现排队时延。 - 传输时延
这是将所有分组的比特推向链路所需要的时间,即分组比特长度/传输速率(单位是Mbps)。实际的传输时延通常在毫秒到微秒量级。 - 传播时延
分组被推向链路之后,从该链路的起点到下一个路由器的时间是传播时延,传播速率取决于该链路的物理媒体,速率范围是2xl08~3xl08m/s。
对于传输时延和传播时延的区别,前者是路由器推出分组所需要的时间,而后者是一个比特从一台路由器传播到另一台路由器所需要的时间。
下面是3个节点之间的一个传播过程。演示传播-传输-传播的过程。注意要等整个分组到达第二个节点并完成缓存之后才开始传输分组。
做一个类比:假设高速公路收费站间的公路段是链路,收费站是路由器。有10辆汽车(每辆汽车是一个比特)作为一个车队(一个分组)在行驶。首先要先确认每辆车都到达了该收费站(这个时间是排队时延),然后假定每个收费站以每辆车10s的速度(即传输速率)服务一辆汽车,这个车队必须在服务时间100s(传输时延)后才可以出发。
注意如果车速很快或两个收费站之间的路程很短,而服务时间很长的话,可能在最后几辆车离开之前,前面几辆车就已经到达了下一个收费站。(动画演示)
吞吐量
吞吐量(throughput) 就是从客户端到服务器中所有链路的传输速率的最小值。
协议栈
网络以 分层(layer) 的方式组织协议以及实现这些协议的网络硬件和软件,每层通过在该层中执行某些动作或使用直接下层的服务来提供服务。各层的所有协议被称为协议栈(protocol stack)。因特网的协议栈由5个层次组成:物理层、链路层、网络层、运输层和应用层。
- 应用层
应用层是网络应用程序及它们的应用层协议存留的地方。把位于应用层的分组称为报文(message)。 - 运输层
运输层在应用程序端与端之间传送应用层报文。把运输层的分组称为报文段(segment)。 - 网络层
网络层的分组称为数据报(datagram),网络层负责将数据报从一台主机移动到另一台主机。 - 链路层
链路层将数据报沿路径传向下一个节点并上传给网络层。功能包括组装成帧、流量控制、差错检测。把链路层分组称为帧(frame)。 - 物理层
物理层将帧中的一个个比特从一个节点移动到下一个节点。
ISO/OSI模型在应用层下还有表示层、会话层。
- 表示层
处理两个通信系统中交换信息的表示方式。采用不同的编码、压缩、加密解密。 - 会话层
管理主机间的会话进程,恢复通信,实现数据同步。
OSI在网络层支持无连接和面向连接的通信,在传输层只有面向连接的通信。但TCP/IP在网际层只有一种无连接的通信模式,而在传输层支持两种模式。
安全
-
将有害程序放入电脑:
- 病毒(virus) 是一种需要某种形式的用户交互来感染用户设备的恶意软件。典型的例子是包含恶意可执行代码的邮件附件。
- 蠕虫(worm) 是一种无须任何明显用户交互就能进入设备的恶意软件。
-
另一种安全性威胁称为拒绝服务攻击(Denial-of-Service attack,DoS),攻击服务器和基础设施使得不能由合法用户使用。大多数DoS攻击属于下列三种类型之一:
- 弱点攻击:向一台目标主机上运行的易受攻击的应用程序或操作系统发送制作精细的报文,导致服务器停止运行或主机崩溃。
- 带宽洪泛:向目标主机发送大量的分组使得目标的接入链路变得拥塞,导致合法的分组无法到达服务器。
- 连接洪泛:在目标主机中创建大量的半开或全开TCP连接,导致主机停止接受合法的连接。
-
分组嗅探机
在无线传输设备的附近放置一台接收机,该接收机就能得到传输的每个分组的副本。这样的接收机被称为分组嗅探器(packet sniffer)。由于分组嗅探机只是被动地接受信息而不注入,因此难以检测。最好的防御方法都与密码学有关。 -
IP哄骗
生成具有任意源地址、分组内容和目的地址的分组,然后将这个人工制作的分组传输到因特网中,就可以让接收方执行某些嵌入在该分组内容中的命令。将具有虚假源地址的分组注入因特网的能力被称为IP哄骗(IP spoofing)。为了解决这个问题,我们需要采用端点鉴别,即一种使我们能够确信一个报文源自我们认为它应当来自的地方的机制。
可靠数据传输原理
可靠数据传输协议(reliable data transfer protocol) 的下层协议可能是不可靠的,例如,TCP是在不可靠的(IP)端到端网络层之上实现的可靠数据传输协议。
出现比特差错怎么办
自动重传请求(Automatic Repeat reQuest, ARQ)协议是基于重传机制的可靠数据传输协议。它使用肯定确认(ACK)和否定确认(NAK)通知发送方哪些内容被正确接收,哪些有误需要重传。ARQ包括停等协议、GBN协议和SR协议。
停等(stop and-wait)协议发送方需要一直等待接收方发回肯定确认才会发送新的数据。
但这有一个致命的缺陷,就是ACK或NAK也可能受损。解决方法是遇到含糊不清的ACK或NAK时重发数据。在数据分组中添加一个新的字段,存储发送数据的序号,以告知接收方这次数据是重发的还是新的。
停等协议是接受窗口 = 发送窗口 = 1的情况。
丢包怎么办
发送方需要一个定时器,选择一个最大时间,如果超过这个时间还没有收到ACK就重传数据。对于因此而导致的可能出现的冗余数据分组,也可以通过上面序号的方式解决。
对于简单的情况,1比特的序号就足够了。与上一个数据相同则表示重传,否则就是新的数据。由于分组序号在0和1之间交替,因此这样的协议被称为比特交替协议(alternating-bit protocol)
流水线技术
上面的协议主要性能缺陷来源于停等协议。因此解决方法就是不以停等的方式运行,允许发送方发送多个分组,这被称为流水线技术(pipelining)。要保证这个技术,必须增加序号的范围,发送方和接收方都要能缓存多个分组。解决流水线的差错恢复有两种基本方法:回退N步(Go-Back-N,GBN) 和 选择重传(Selective Repeat,SR)。
回退N步(GBN)协议
即使可以同时发送多个分组,但最大数量仍受限制。
假设序号字段的比特为n位。那么序号空间就可以看做是一个长度为
2
n
2^n
2n的环。那些已发送但还未被确认的分组的序号范围可以被看成是一个在序号范围内长度为N的窗口,因此N被称为窗口长度(window size),GBN协议也被称为滑动窗口协议(sliding-window protocol)。它的接受窗口为1,发送窗口<
2
n
2^n
2n。因为若发送窗口=
2
n
2^n
2n,当0~
2
n
2^n
2n都收到,但ACK都丢失时,无法分清新收到的是新帧还是旧帧。
通过这个动画可以直观地看到GBN的过程
GBN发送方在发送分组时,首先检查窗口是否已满,即是否有N个已发送但未确认的分组。如果满了则缓存数据或使用同步机制。发送后如果出现超时,就重传所有已发送但未确认分组,这就是回退N步的意思。
接收方丢弃所有失序分组。比如此时期望收到n分组,但却先收到了n+1分组。接收方就将该分组缓存,如果n分组丢失,那么它将丢弃该n+1分组。这就是累积确认的方式,即当序号为n的分组发送ACK时,表示序号小于n的分组都成功交付。
也因此,GBN可能会因为一个分组的差错而引起大量分组的重传。这会大大降低性能。
注意窗口的单位是字节而非分组。TCP为每一个连接都设有一个持续计时器,若时间到期则发送一个探测报文段,对方收到后给出自己当前的窗口值,以此解决互相等待的死锁问题。
选择重传(SR)协议
SR协议通过发送方仅重传出错的分组来解决这个性能问题。
SR接收方不管这个分组是否是按顺序的都会接收它,失序的分组会被缓存直到所有序号小于它的分组都被接收。每个收到的分组都有两个边界,表示其字节序号的范围,采用左闭右开的表示方法。
相当于发送窗口 = 接收窗口 ≤ 2 n − 1 2^{n-1} 2n−1。
也可能不相等,只需满足之和小于等于即可。但只有相等时才有意义。
应用层
应用程序体系结构规定了如何在各种端系统上组织该应用程序。包括 客户-服务器体系结构(client-server architecture,C/S) 和 P2P体系结构(Peer to peer architecture, P2P)。
前者中有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。而后者对服务器的依赖极低,甚至可以没有。应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。并且,某些应用具有混合的体系结构。
可以从四个方面对应用程序服务要求进行分类,来选择合适的运输层:可靠数据传输、吞吐量、定时和安全性。
应用层协议
在运行在多个端系统上的应用程序间进行通信的实际上是 进程(process) 而不是程序。当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。
进程通过一个称为 套接字(socket) 的软件接口向网络发送和接受报文。套接字是应用层和运输层之间的接口。由IP地址+端口号组成。
Web
Web是万维网(Wrold Wide Web) 的简称。Web页面(也叫文档)是由 对象(object) 组成的。一个对象只是一个文件,诸如一个HTML文件、一个JPEG图形、一个Java程序或一个视频片段这样的文件, 且它们可通过一个统一资源定位符(Uniform Resource Locator,URL) 地址寻址。
URL的一般格式是协议://主机:端口/路径
。
Web的应用层协议是超文本传输协议(HyperText Transfer Protocol,HTTP)。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。Web浏览器(Web browser) 实现了HTTP的客户端,“浏览器”和“客户”在这里是一个意思。Web服务器(Web server) 实现了HTTP的服务器端,用于存储Web对象。
以前一直不知道超文本是超在哪了,其实所谓超文本就是指包含指向其他文档的链接的文本。
HTTP
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。HTTP使用TCP作为它的支撑运输协议。HTTP客户首先发起一个与服务器的TCP连接。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。客户向它的套接字接口发送HTTP请求报文并从它的套接字接口接收HTTP响应报文。类似地,服务器从它的套接字接口接收HTTP请求报文和向它的套接字接口发送HTTP响应报文。
因为HTTP服务器并不保存关于客户的任何信息,所以说HTTP是一个无状态协议(stateless protocol)。
应用程序可以将每个请求/响应对通过一个单独的TCP连接发送,这种方法被称为非持续连接(non-persistent connection),是HTTP1.0的方法;而HTTP1.1使用 持续连接(persistent connection) 将所有的请求和响应经相同的TCP连接发送。
HTTP请求报文
以下面这个请求报文为例:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: zh-CN
HTTP请求报文的第一行叫作请求行(request line),其后继的行叫作首部行(header line)。
请求行有3个字段:方法、URL和HTTP版本。方法字段可以取几种不同的值,常见的方法有以下几个:
方法 | 含义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求由URL标志的信息 |
HEAD | 请求由URL标志的信息的首部 |
POST | 给服务器添加信息 |
PUT | 在指明的URL下存储文档 |
DELETE | 删除所指明的URL的资源 |
TRACE | 进行环回测试 |
CONNECT | 用于代理服务器 |
首部行Host: www.someschool.edu
指明了对象所在的主机;Connection: close
指明使用非持续连接的方法;User-agent:
用来指明用户代理,即向服务器发送请求的浏览器的类型。如本例的Mozilla/5.0即Firefox浏览器;Accept-language:
表示想要的该对象的语言版本,如本例的zh-CN表示简体中文。
首部行的最后其实还有一个实体体(entity body),只是在使用GET的时候为空。如果请求行的方法使用POST,如用户提交表单的时候,实体体中包含的就是用户在表单字段中的输入值。要注意GET也可以提交表单。
HTTP响应报文
以下面这个响应报文为例,它响应上面的请求报文:
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2021 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2021 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
响应报文包括三部分:状态行(status line),首部行和实体体。
状态行是第一行,有3个字段:协议版本、状态码和相应状态信息。其中一些常见的状态码和相关的短语包括:
- 200 OK:请求成功,信息在返回的响应报文中。
- 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
- 400 Bad Request: 一个通用差错代码,指示该请求不能被服务器理解。
- 404 Not Found:被请求的文档不在服务器上。
- 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
首部行中Data:
指明发送该响应报文的时间;server:
指明服务器;Last-Modified:
指示了对象创建或者最后修改的日期和时间;Content-Length:
指发送对象的字节字数;Content-Type:
指明实体体中的对象是HTML文本。
实体体包含了所请求的对象本身,即本例中的(data data…)。
cookie、session和token
由于HTTP是无状态的,因此需要让站点对用户进行跟踪。
- cookie
使用cookie实现用户和服务器的交互。cookie技术有4个组件:①在HTTP响应报文中的一个cookie首部行;②在HTTP请求报文中的一个cookie首部行;③在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;④位于Web站点的一个后端数据库。 - session
session数据放在服务器上,安全性相对更高。
单个cookie保存的数据不能超过4K。session无限制。 - token
当第一次登录后,服务器生成一个Token存储给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
Web缓存器
可以配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器(Web cache) (也叫 代理服务器(proxy server))。一旦某浏览器被配置,每个对某对象的浏览器请求会被首先定向到Web缓存器。
至于Web缓存器的作用,Web缓存器首先可以大大减少对客户请求的响应时间。其次可以大大减少一个机构(如公司或大学)的接入链路到因特网的通信量(一般这会比直接提升链路的速率更经济且有效)。
但是仔细想想的话就会发现问题,即存放在缓存器中的对象副本可能是陈旧的。为了解决这个问题,HTTP通过条件GET方法来确保副本是最新的:缓存器在向服务器发送GET请求时,会包含一个If-Modified-Since:
首部行,其值应该等于上一次请求时得到的响应的Last-Modified:
值。意为只有在指定日期后对象被修改过,才需要发送该对象。如果没有被修改过,服务器则会响应一个状态行为304 Not Modified
的报文。
FTP协议
文件传送协议(File Transfer Protocol, FTP) 提供一些文件传送的基本服务,使用C/S方式,其服务器进程分为一个主进程和若干个从属进程。它提供交互式的访问,允许客户指明文件的类型和格式。使用两个TCP连接:控制连接和数据连接,端口号分别是是21和20。主要功能是减少在不同操作系统下处理文件的不兼容性。
简单文件传送协议(Trivial…,TFTP) 不支持交互,使用UDP连接。
电子邮件
电子邮件系统有3个主要组成部分:
- 用户代理(user agent)
用户代理允许用户阅读、回复、转发、保存和撰写报文。 - 邮件服务器(mail server)
- 简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)
邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器(采用SMTP协议),再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中(用户代理从服务器获得邮件采用POP3协议)。
电子邮件的报文必须包含From:
和To:
首部行。之后是以ACSII格式表示的报文体。
DNS
一个主机可以由主机名(例如www.google.com)来标识,也可以由IP地址来标识。一个复杂主机名可以有多个主机别名(host aliasing),原名则被称为规范主机名(canonical hostname)。
域名系统(Domain Name System,DNS) 进行主机名到IP地址转换的目录服务。它是一个由分层的DNS服务器实现的分布式数据库,也是一个使得主机能够查询分布式数据库的应用层协议。它运行在UDP之上,使用53号端口。
DNS采用了分布式的设计方案,使用了大量的服务器,分布在全世界。有3种类型的DNS服务器:
- 根DNS服务器
有400多个根DNS服务器由13个不同的组织管理。它提供TLD服务器的IP地址。管理顶级域。 - 顶级DNS(Top Level Domain,TLD) 服务器
对每个顶级域(如com, org, net等)和国家的顶级域(如cn, fr等),都有TLD服务器。它提供权威DNS服务器的IP地址。管理二级域名。 - 权威DNS服务器。
拥有将主机名映射为IP地址的DNS记录。
解析过程是这样的:主机向本地域名服务器查询采用递归查询的方式,本地域名服务器向根域名服务器采用迭代查询。应用程序调用DNS客户端,指明需要被解析的主机名。用户主机上的DNS接收到后,向网络中发送一个DNS查询报文,然后接收到一个回答报文(所有的DNS请求和回答报文使用UDP数据报经端口53发送)。最后将映射缓存到本地存储器中(一段时间后将会丢弃缓存的信息)。
所有DNS服务器都存储了资源记录(Resource Record,RR),RR提供主机名到IP地址的映射。它是一个包括4个字段的4元组:(Name, Value, Type, TTL)
。TTL指记录的生存时间,即什么时候从缓存中删除。而Name和Value则取决于Type:
- Type = A:Name是主机名,Value是IP地址。
- Type = NS:Name是一个域(如foo.com),Value是一个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
- Type = CNAME:Value是别名为Name的主机对应的规范主机名。
- Type = MX:Value是别名为Name的邮件服务器的规范主机名。
在命令行输入
nslookup
就可以发送DNS查询。
运输层
网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。运输层使用16位的端口号对网络应用进程进行编址(非网络进程不标识端口号)。可以分为以下三类:
- 熟知端口号
数值为0~1023(0号不用),是规定好的一些端口号。 - 登记端口号
数值为1024~49151,使用这些端口号必须在IANA登记。 - 短暂端口号
数值为49152~65535,在客户进程运行时动态选择。
书中将主机和网络层协议类比为家庭和邮政服务,进程和运输层协议比作两个家庭的所有成员和他们之中负责收发邮件的人。
UDP(用户数据报协议) 和 TCP(传输控制协议) 是运输层的两个协议,它们负责将主机间的交付扩展到进程间的交付,这被称为运输层的多路复用(transport-layer multiplexing)与多路分解(demultiplexing)。
注意UDP和TCP是不相关的,因此可以同时使用相同的端口号。
一个进程有一个或多个套接字。
将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。
从不同套接字中收集数据块,并为其封装上首部信息从而生成报文段,然后将报文段传递到网络层。这个工作称为多路复用。
家庭中负责收发邮件的人将邮件发给各个成员就是多路分解,而将他们写的邮件送给邮政则是多路复用。
UDP
UDP提供不可靠、无连接的服务。应用层交给UDP多长的报文,UDP就照样发送它。
它除了复用、分解功能及少量的差错检测外,几乎没有对IP增加别的东西。在发送报文段之前,发送方和接收方的运输层实体没有握手,因此说UDP是无连接的。
那么为什么不使用更可靠的TCP呢?概括地讲,由于不需要经过握手,且没有拥塞机制,UDP可以保证发送报文段的实时性。并且省去了维护连接状态的开销也使得UDP能支持更多的活跃用户。
UDP的首部包括四个字段:源端口号、目的端口号、长度和校验和。每个字段由2个字节组成。长度字段指明了包括首部在内的UDP报文段长度是多少字节。校验和用于检查报文段是否出现差错。
校验和
发送方的UDP首先增加12个字节的伪首部(既不向上也不向下传递,只用于计算校验和),然后对报文段中的所有16比特字(不足则补0)求和再进行反码运算,求和时如果遇到溢出就要回卷(即给结果再加1,例如101+100溢出后应为001,回卷后的结果就是010)。将结果放到校验和字段中。
接收方将所有16比特字(包括了校验和)加在一起。如果该分组没有出现差错,那么结果应该是16位1。
TCP
TCP提供可靠的、面向连接的服务。它连接的端点就是套接字。
当一侧要向另一侧发送数据时,它只需经过其套接字将数据丢进TCP连接。这与UDP不同,UDP服务器在将分组丢进套接字之前必须为其附上一个目的地址。
TCP是面向字节流的,它把应用层交下来的数据看成一连串无结构的字节流,将这些来自套接字的字节放到 发送缓存(send buffer) 里,然后时不时从中取出数据传递给网络层。TCP可以从中取出并放入报文段中的数据数量叫做最大报文段长度(Maximum Segment Size,MSS)。它通常由最大链路层帧长度(即最大传输单元(Maximum Transmission Unit,MTU) )决定。要保证一个TCP报文段+TCP/IP首部长度≤MTU。
注意MSS指报文段中应用层数据的长度,而不包括其首部。
MTU指链路层帧的数据部分的最大长度,而非帧的总长。
TCP首部一般有20个字节:
- 各2字节的源端口、目的端口
- 4字节的序号字段、4字节的确认号字段。用于可靠数据传输。
序号是该报文段首字节的字节流编号。例如数据流包含500 000字节,MSS为1000字节,数据流的首字节编号为0。TCP将为该数据流构建500个报文段,第一个序号为0,第二个为1000,以此类推。
确认号是发送方期望从对方那收到的下一字节的序号。因为TCP是全双工的,即A向B发送数据的时候也可能收到来自B的数据。例如A收到了包含字节0 ~ 50以及60 ~ 100的报文段而没有收到51 ~ 59的报文段。那么A到B的下一个报文段中的确认号字段将包含51。因此称TCP提供累计确认。
当接收方收到比期望序号大的报文段时,会发送冗余ACK(即再次确认已经确认过的某个报文段的ACK)。当接收方收到3个冗余ACK时,TCP就会执行快速重传(即在该报文段的定时器过期之前重传丢失的报文段)。 - 4位数据偏移
实际上是指首部长度,单位是32位(双字)。 - 6位保留用于以后使用
- 6位的标志字段
- URG(urgent) 表示紧急指针字段是否有效。TCP缓存(buffer)优先发送紧急报文段。
- ACK(acknowledgment) 表示确认字段是否有效。在连接建立后所有报文的ACK都必须置1。
- PSH(push) 发送方希望在键入一个命令后立即就能收到对方的响应(不然对方可能会因为拥塞、缓存等原因推迟发送),则将PSH置1。TCP缓存(buffer)优先向进程交付PSH为1的报文段。
- RST(reset) 置1时表示TCP连接出现严重差错,必须释放并重新连接。也可以用来拒绝一个连接。
- SYN(synchronization) 用于建立连接。
- FIN(finis) 用于释放连接。
- 2字节的接收窗口字段,用于流量控制。
TCP提供了 流量控制服务(flow control service) 以消除因发送方和接收方速度不匹配而出现的缓存溢岀的可能性。接收窗口指示自己还有多少可用的缓存空间。
接收窗口大小rwnd = 缓存大小 - (到达缓存的最后一个字节的编号 - 从缓存读出的最后一个字节的编号)
- 2字节校验和
- 2字节紧急指针
指出本报文段紧急数据的字节数。注意即使窗口为0也可以发送紧急数据。 - 最多40字节的选项字段。
下面是TCP建立和关闭连接的过程:
3次握手
首先服务器要先创建传输控制模块TCB用以存储每一个连接中的重要信息。此时服务器就处于LISTEN(收听)状态。
- 第一次
首先客户端也创建TCB。然后发送一个不包含应用层数据的特殊报文。将标志字段中的SYN置1,并随机选择一个初始序号client_isn
放在序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。 - 第二次
到达后,服务器为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。其中也包括了置为1的SYN、置1的ACK和随机的初始序号server_isn
,以及确认号client_isn + 1
。该报文被称为SYNACK报文段(SYNACK segment)。 - 第三次
收到SYNACK报文段后,客户端也给该连接分配缓存和变量,并向服务器发送一个确认报文。其中SYN置为0、ACK置1,确认号为server_isn + 1
。该报文段可以携带数据,且在不携带数据的时候不消耗序号。
为什么是三次握手而不是两次握手呢? 即为什么客户端最后还要发一次确认报文?一言以蔽之是为了避免服务器资源浪费。考虑以下情况:客户端发出了连接请求但超时了,因此发出了第二次连接请求。第二次顺利地建立了连接,但在释放后服务器才收到第一次发出的连接请求,此时服务器会再返回SYNACK报文段。如果没有第三次握手,就会建立一条本来不需要的连接。
4次挥手
- 第一次
关闭连接时,客户端发出一个特殊的报文段。其中标志字段中的FIN置1,序号client_isn
为上一个最后的字节序号+1。此时客户端进入FIN_WAIT_1状态 - 第二次
服务器发回一个ACK,确认号为client_isn + 1
。此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。客户端到服务器的连接就被释放了,此时TCP连接处于半关闭(half-close) 状态。即客户端不用发送数据了,但如果服务器发送数据客户端还得接受。 - 第三次
服务器发送自己的终止报文段,即FIN置为1,确认号和上一次相等。此时服务器进入LAST_ACK状态。 - 第四次
客户对服务器的终止报文段发送ACK。此时客户端进入TIME_WAIT状态。必须经过时间等待计数器(TIME_WAIT timer) 设置的时间2 * MSL
后才进入CLOSED状态,MSL叫做最长报文段寿命(Maximum Segment Lifetime)。在此期间如果ACK丢失,客户端将重传最后的ACK报文。
为什么是四次挥手而不是三次挥手呢? 因为TCP是全双工的,在客户端确定关闭连接时,服务器可能还有要发送的数据,因此前两次挥手只是关闭了客户端的连接。如果客户端要关闭连接时服务器也不需要发送数据了,那么它可以把第二次和第三次挥手的内容合并到一个报文段发送,这样就变成了“三次挥手”。
流量控制
是点对点的通信量控制,目的是抑制发送端的发送速率,以便让接收端来得及接受。
TCP为每一个连接维护一个持续计时器(persistence timer),每当收到对方的零窗口通知时,就启动持续计时器。在计时器时间到期后,发送一个仅携带一个字节数据的探测报文段,来获取当前的窗口值。
拥塞控制
让网络能承受现有的负荷,是一个全局性的过程,涉及所有主机、路由器。
TCP在出现超时或者收到3个冗余ACK时认为出现了拥塞。TCP在顺利交付报文段后会增加发送速率,但在检测到拥塞时降低速率。
发送方维护一个额外变量拥塞窗口(cwnd),限制其发送流量的速率。已发送但未确认的数据流不超过rwnd和cwnd中的最小值,即:
LastByteSent - LastByteAcked ≤ min(cwnd, rwnd)
TCP拥塞算法主要包括3部分:慢启动、拥塞避免和快速恢复。前两者是强制实现的,区别在于增加cwnd的方式;后者对发送方不是必需的。
- 慢启动
当TCP建立连接时,cwnd通常初始值设为一个MSS,在每次收到ACK后都增加一个MSS。例如一开始发送一个报文段,收到ACK后发出2个报文段,分别收到ACK后则发出4个报文段。因此慢启动是指数增长的。并且维护并初始化一个变量ssthresh(slow start thresh,慢启动阈值)
。
慢启动的结束有以下三种情况:① 在检测到拥塞时,TCP令ssthresh = cwmd / 2
,cwmd = 1
,并重新开始慢启动。② 当cwnd增加到ssthresh时,结束慢启动并转移到拥塞避免模式。③ 检测到3个冗余ACK时,进入快速恢复模式。 - 拥塞避免
此时从每个ACK增加一个MSS变为每个RTT增加一个MSS。例如在一个RTT内发送10个报文段,则每个报文段在确认后增加1/10个MSS。因此拥塞避免是线性增长的。 - 快速恢复
对于快速恢复,必须使用快速重传算法。即接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认。发送方在连续收到三个冗余ACK时不从cwnd=1开始慢启动,而是令ssthresh = cwmd / 2
,cwmd = ssthresh
。
TCP拥塞控制方式是在每个RTT内线性增加,出现3个冗余ACK时减半,因此也被称为 加性增、乘性减(Additive-Increase, Multiplicative-Decrease,AIMD) 拥塞控制方式。
网络层
网络层要实现两个功能:转发和路由选择。
因此网络层也分为数据平面和控制平面来分别实现这两个功能。
前者是网络层中路由器的功能,决定了到达路由器输入链路的数据报如何转发到该路由器的输出链路。转发的过程只有纳秒级;后者是网络范围的逻辑,控制平面决定数据报所采用的路由或路径。路由选择则通常为几秒。
可以理解为路由选择是出门旅行前做的规划,而转发则是路上从A路口走到B路口。
因特网的网络层提供尽力而为服务(best-effort service),即不保证分组的接收、顺序和时延。
网络层把链路层的网络连接起来,因此称为“网络的网络”。
要注意TCP/IP协议其实是不严格分层的
例如IP报的数据部分可以包含同是网络层的ICMP协议内容。
又例如一般而言是下层向上层提供服务,但对于TCP/IP协议,却是运输层向网络层提供了可靠保证。
数据平面
IP协议
主机或路由器与物理链路通过接口相连,一个IP地址与一个接口相关联。IP地址的写法是点分十进制记法(dotted-decimal notation),由4个十进制数构成,每个数字占8比特,例如192.168.1.1。
IP地址分两部分:网络号+主机号。网络号为8、16、24位分别对应A、B、C类IP地址。网络号或主机号为0时有特殊含义,例如网络号全0时表示本网络,总结如下表所示:
网络号 | 主机号 | 含义 |
---|---|---|
全0 | 全0 | 本主机 |
全1 | 全1 | 在本网络进行广播(不交给路由器) |
net-id | 全1 | 对net-id网络进行广播 |
127 | 非(全0或全1) | 用于本地软件环回测试 |
IPv4
IPv4数据报关键字段包括:
- 版本号。
4比特,一般是4或6。 - 首部长度
4比特。要注意其单位是4B。例如首部的固定长度部分是20字节,因此首部长度字段的最小值就是5(即5个32位)。 - 区分服务
8比特。用于区分不同服务类型(例如低时延或可靠性)的数据报。一般为0。 - 数据报长度
16比特。表示首部加上数据的长度,其单位为B。 - 16比特标识、3比特标志、13比特片偏移
与IP分片有关。
由于各个链路层协议所能承载的网络层数据报长度不同,而一个链路层帧能承载的最大数据量就是MTU(例如以太网是1500字节),这要小于数据报的最大长度。因此IPv4将数据报分成很多片(fragment)。
每产生一个数据报,标识就+1,路由器在分片时,让一个数据报的所有片都具有相同的标识。
标志字段只有后两位在使用。最低位MF(more fragment)为1时表示后面还有分片。中间位DF(don’t fragment)为1时表示不能分片。
使用偏移字段指定该片应该放在原数据报的哪个位置。其单位为8B,即其值等于该片前面的所有片的字节数除以8。例如将3800字节的数据分为1400、1400、1000三个片。它们的片偏移分别为0、1400/8=175、2800/8=350。 - 寿命(Time-To-Live,TTL)
寿命字段用以确保数据不会永远在网络中循环。每当一台路由器处理数据报时,其TTL减一,当其为0时会被抛弃。 - 协议
该字段当数据报到达最终目的地时才有用,它指示了数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明数据部分要交给TCP,而值为17表明交给UDP。 - 首部检验和
用于帮助路由器检测收到的IP数据报中的比特错误。只检验首部部分,而不检验数据部分。 - 源、目的IP地址
各32位比特。 - 选项
如果对首部有其他的需求,通过选项字段以扩展首部。 - 数据
IPv6
IPv6地址共128位,使用冒号十六进制记法。
IPv6数据报字段包括:
- 版本
- 流量类型
8比特,与IPv4的TOS字段类似。 - 流标签
IPv6有关于 流(flow) 的定义。该字段用于给属于特殊流的分组加上标签。这些特殊流是发送方要求进行特殊处理的流,比如一种非默认服务质量或需要实时服务的流。 - 有效载荷长度
是一个16比特的无符号整数。指40字节的首部后面的字节数量。 - 下一个首部
指明数据字段交付给哪个协议(如UDP或TCP),其值与IPv4的协议字段相同。 - 跳限制
类似IPv4的寿命字段。 - 源/目的地址
IPv6将地址从32比特增加到128比特。 - 数据
IPv6去除了路由器的分片操作,并移到了网络边缘的主机。由于分片和重装很费时间,因此这大大加快了IP转发速度。在遇到数据报太大的情况时,会向发送方发回一个“分组太大”的ICMP差错报文。
一种广泛的从IPv4迁移到IPv6的方法是建隧道(tunneling)。在两个使用IPv6数据报交互的节点之间的IPv4路由器的集合称为隧道,将整个IPv6的数据报放到一个IPv4的数据中,其中IPv4数据报的协议字段的值为41。
ARP协议
寻址的最终目的一定是MAC地址,那么一个IP数据报怎么找到对应的目的MAC地址呢?这就需要用到 地址解析(Address Resolution Protocal,ARP) 协议。
每台主机都有一个ARP高速缓存(ARP cache),里面存储本局域网上各主机和路由器的IP地址到MAC地址的映射表。每当发送IP报时,就在ARP cache中查找对应MAC地址并写入MAC帧。ARP协议是这样得到该映射关系的:
(1)ARP进程在本局域网上广播一个ARP请求分组,其内容为“我的IP地址是XX,我的MAC地址是XX,我想要知道IP地址为XXX的主机的MAC地址是什么”。
(2)所请求的目的主机收下该帧,在其中写入自己的MAC地址,将其发给源地址(单播),并且把源主机的IP地址到MAC地址的映射写入自己的ARP cache中以备之后用到。
ARP对每一个映射都设置一个生存时间,当过期时就将其删除,这样做避免了因为更换MAC地址而永远找不到对方。
子网划分
使用 子网掩码(network mask) 进行子网划分以重新定义网络号和主机号的位数。子网掩码的网络号位为1,主机号位为0。例如有3个IP分别是223.1.1.1,223.1.1.2,223.1.1.3的主机,和与它们连接的路由器接口223.1.1.4。这四个接口通过一个不包括路由器的网络互联起来,即互联这3个主机接口与1个路由器接口的网络形成一个子网(subnet)。IP编址为这个子网分配一个地址223.1.1.0/24,其中/24被称为子网掩码,指明了32位比特的前24位定义了子网地址。其他要连到223.1.1.0/24网络的主机都要有相同的前24位。
RTF文档没有规定但却极力推荐子网掩码使用连续的1。
子网掩码将IP地址从二级编址(网络号、主机号)变为三级编址(网络号、子网号、主机号)
CIDR
因特网的地址分配策略是无类别域间路由选择(Classless Interdomain Routing,CIDR),它规定了子网寻址的规范。当使用子网寻址时,IP地址 a.b.c.d/x 被分为两部分,其中x指的是第一部分的位数,第一部分被称为该地址的前缀(prefix),用来指明网络号,剩下的则是主机号。CIDR将IP地址又改回了二级编址(前缀、主机号)。为了兼容子网划分,CIDR也有地址掩码(也可以叫做子网掩码),唯一区别是它的1、0必须是连续的。
路由器用分组目的地址的前缀与转发表中的表项进行匹配,而由于转发表中的表项长度可能不同,因此可能出现多个匹配的情况,路由器使用最长前缀匹配规则。之所以“前缀”而非整个地址,是因为前缀可以表示范围,否则每个地址对应一个链路接口的话就需要几十亿个接口了。之所以“最长”是因为前缀越长,地址就越具体。
路由器
路由器包括输入端口、交换结构、输出端口和路由选择处理器。
每台路由器都有一个转发表(fowarding table)。每张转发表主要存储目的IP地址、子网掩码和下一跳IP地址。(其实还有一些其他信息)。
输入端口的处理就是查找目的IP地址,然后发送该分组进入交换结构。
交换结构位于路由器的核心部位,通过交换结构,分组从输入端口转发到输出端口。交换有以下几种方式:
- 经内存交换
输入分组被复制到路由选择处理器的内存中,由处理器提取提取地址,找到合适的输出端口,并将分组复制到输出端口的缓存中。 - 经总线交换
让输入端口给分组添加一个标签以指示输出端口。所有输出端口都可以收到该分组,但只有与标签匹配的可以缓存它,并将其标签去除。 - 经互联网络交换
如纵横式交换机。当分组要从端口A到B时,交换机控制器闭合总线A和B的交叉点,然后A发送分组,因此只有B可以收到。与前两者不同,纵横式交换机是非阻塞的。
考虑纵横式交换机中A和B都要向C发送分组。即使输出端口C没有竞争,但A和B则要排队等待。这种现象叫做输入排队交换机中的线路前部(Head-Of-the-Line,HOL)阻塞。有一个结论是,如果输入链路上的分组到达速率达到其容量的58%,输入队列就可能无限制增大(也即可能出现大量丢包)。
如果是很多端口都向A端口发送分组,那么A的缓存可能会不足,此时就要做出决定:要么丢弃新来的分组(弃尾(drop-tail)),要么删除已经排队的分组。目前有很多分组丢弃策略,统称为主动队列管理(Active Queue Management,AQM)算法,其中使用最广泛的是随机早期检测(Random Early Detection,RED)算法。
队列可以是普通的FIFO队列,也可以是优先队列,也可以是实现加权公平排队(Weighted Fair Queueing,WFQ)规则的队列,后者指将每个分组进行分类,然后对每个类分配其权重以计算优先级。然后轮流服务类1,类2…
NAT
可能很多家庭都有相同的诸如192.168.0.0/16这样的IP地址,网络地址转换(Network AddressTranslation ,NAT) 路由器使用其NAT转换表将这些专用网转化为全球唯一的IP地址。
DHCP协议
使用动态主机配置(Dynamic Host Configuration Protocol,DHCP)协议以避免人工配置IP地址。
DHCP使用客户服务器模式。主机在需要IP地址时会向服务器发送发现报文,服务器返回数据库中该主机的配置信息,若没有则为其分配一个IP地址。
DHCP服务器分配的IP地址是临时的,称这段时间为租用期(lease period)。另外DHCP协议其实是基于UDP的应用层协议,客户端口为68,服务器端口为67。
一般每个网络至少有一个DHCP中继代理(realay agent)(通常是一个路由器),它配置了DHCP服务器的IP地址,当收到主机广播的发现报文后,就将其单播给DHCP服务器。
控制平面
将整个互联网划分为多个自治系统(Autonomouos System,AS),每个AS都是使用相同路由选择协议的一组路由器。
路由选择协议分为两大类:
- 内部网关协议IGP(interior gateway protocol)
用于AS内部的路由选择。例如RIP协议和OSPF协议。 - 外部网关协议EGP(external gateway protocol)
用于AS间的路由选择。例如BGP协议。
ICMP协议
主机和路由器用 因特网控制报文协议(ICMP) 来沟通网络层的信息,允许主机或路由器报告差错情况和异常报告。
ICMP报文有一个类型字段和一个代码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节。
ICMP报文有两种:
- 差错报告报文
- 终点不可达(类型值为3)
不能交付数据报时,向源点发送该报文。 - 时间超过(11)
收到TTL为0的报文时,发送该报文。 - 参数问题(12)
收到的数据报首部有字段的值不正确时,发送该报文。 - 改变路由(重定向)(5)
告知主机下次将数据报交给另一个路由器。
- 终点不可达(类型值为3)
- 询问报文
- 回送(echo)请求或应答(8或0)
收到echo请求的必须回发一个echo回答。 - 时间戳请求或回答(13或14)
回发当前的日期。
- 回送(echo)请求或应答(8或0)
ICMP报文就放在IP报的数据部分。并且对ICMP差错报文不再发送ICMP差错报文,对第一个分片之后的数据报也不发送ICMP差错报文。另外,对多播或特殊地址的数据报也不发送ICMP差错报文。
RIP协议
路由信息协议(Routing Information Protocol,RIP) 是一种分布式的基于距离向量的路由选择协议。是应用层协议,基于UDP,端口520。
RIP协议要求每一个路由器都维护一张它自己到其他每一个目的网络的距离(要注意这里的距离指的是跳数,即经过的路由器数量)记录表,包括目的网络,距离和下一跳地址。RIP协议规定距离的最大值为16,表示不可达。
RIP协议让每个相邻的路由器按固定的时间间隔交换自己的所有已知信息,直到路由表稳定下来(这段时间称为收敛时间),这取决于拓扑结构是否变化。
RIP协议使用距离向量算法计算最短距离,其基础是Bellman-Ford算法,对每一个相邻路由路由器发来的RIP报文,进行以下步骤:
(1)将从X收到的所有信息进行修改:下一跳地址改为X,然后距离+1。
(2)对比修改后的RIP报文的每一项
- 若原来没有该网络,则加入。
- 否则,若下一跳是X,则用收到的信息替换之前的。(因为这是最新信息)
- 否则(即下一跳不是X),若到目的地址的距离更小了则更新,否则什么也不做。
RIP协议的缺点是当网络出现故障时,要经过较长的时间才可以将消息传给所有路由器,这个特点叫做好消息传得快,坏消息传的慢。并且可能出现无穷计数问题(一条路由路径坏了之后路由表却一直在更新且增加距离),解决方法有触发更新(路由表更新时立即广播而非等待周期)、水平分割和毒性逆转(有断路时将其距离设为255,即IP报TTL的最大值)。
现在使用的都是RIP2协议,它支持了子网掩码和CIDR,还支持验证路由器(防止主机冒充路由器)。
OSPF协议
开放最短路径协议(Open Shortest Path First,OSPF) 是一种使用分布式的链路状态(link state)协议,使用Dijkstra算法SPF计算最短路径。是网络层协议,直接使用IP报传送,首部协议字段值为89。
OSPF协议向本AS中的所有路由器发送与本路由器相邻的所有路由器的链路状态(相邻的路由器以及该链路的度量(metric),即费用、距离、时延、带宽等综合代价)。且只有链路状态发生变化时才发送信息,而非像RIP那样有周期。
最终所有的路由器都可以建立一个链路状态数据库(即一张根据邻居表建立的拓扑表),收敛快是OSPF的一个优点。并且OSPF在IP报的数据部分,而非使用UDP报文。
BGP协议
每个AS有一个AS号(ASN),每个AS中都有网关路由器(gateway router)和内部路由器(internal router),前者负责连接其他AS。
需要有各个AS间的路由选择协议,这就是边界网关协议(Broder Gateway Protocal,BGP)。 采用路径向量路由选择协议找到一条较佳的路由。BGP的分组不是一个特定的目的地址,而是CIDR化的一个前缀。BGP可以做到以下两点:
- 从邻居AS获得前缀的可达性信息。如果没有BGP,每个子网将会是隔离的孤岛。
- 确定到该前缀的最好的路由。
每一个AS都要选择一个BGP发言人,每对发言人使用179端口的半永久TCP连接,称为BGP连接。跨越两个AS的BGP连接称为外部BGP(eBGP)连接,AS内部的BGP连接称为内部BGP(iBGP)连接。BGP使用TCP。
数据链路层
把运行链路层协议的设备都称为节点(node),把沿着通信路径连接相邻节点的通信信道称为链路(link)。
可以这样理解链路层和网络层的关联:旅游社(路由选择协议)为游客(数据报)规划了旅游路线:坐火车从A到B,再坐飞机从B到C。其中每种运输方式就是一种链路层协议,而每个运输区段就是一条链路。
链路层的主体部分是在 网络适配器(network adapter) 中实现的。它可以提供的服务包括:
- 成帧(framing)
将数据报打包为帧。需要添加给帧数据添加首部和尾部。
有两种方法:字符填充和位填充。
前者分别使用SOH(Start Of Header)和EOT(End Of Transmission)两个不同的字节做标志。如果在数据中出现了和它们相同的字节数据,那么就在其前面加上转义字符ESC。
后者目前广为使用,以01111110作为开始和结束标志,并且每遇到5个连续的1就在其后插入一个0 - 链路接入
广域网使用点对点信道,而局域网使用广播信道。 - 可靠交付
通过确认和重传保证无差错地经链路层移动每个网络层数据报。 - 差错检测和纠正
通过让发送节点在帧中包括差错检测比特,让接收节点进行差错检查。
差错检测和纠正
奇偶校验
普通的奇偶校验不太健壮,可以使用二维奇偶校验:将比特划分为i行j列,对每行和每列都进行奇偶校验,这样就可以校验差错并且确定位置来纠正。
这种接收方检测和纠正差错的能力被称为前向纠错(Forward Error Correction,FEC)。
循环冗余校验
现今的计算机网络中广泛应用的差错检测技术基于 循环冗余检测(Cyclic Redundancy Check,CRC)编码,也叫做多项式编码。
首先需要发送方和接收方协商一个n+1位的生成多项式(generator) P,要求P的最高有效位必须是1。然后发送方根据P确定一个n位的冗余码FCS(Frame Check Sequence),附在数据比特之后。
具体做法是,先在待发送数据后加上n个0,然后做模2除法,得到n位余数作为冗余码(注意余数不满n位的话需要在前面补0)。
接收方用收到的数据除以生成多项式,如果余数为0则表示没有差错,否则差错位就是余数表示的位。
一般各种数据都有广泛使用的P
注意做除法(取模)过程中的减法不借位,即等价于异或。
由于只能检查比特差错而不能检查传输差错(如帧丢失或失序),因此链路层不是可靠传输。
PPP协议
点对点(Point-to-Point Protocol,PPP)协议 是一个针对广域网的协议。它要完成以下几个功能:
- 对链路层帧,不纠错,不排序号,不流量控制(只做CRC检验)。
- 封装成帧。
- PPP协议必须能在同一条物理链路上同时支持多种网络层协议。
- 检测连接状态。
- 对每种类型的点对点链路设置MTU。
因此PPP协议由三部分组成:
- 一个将IP数据报封装的方法。
- 一个用来建立、配置和测试数据链路连接的链路控制(Link Control Protocol,LCP)协议。
- 一套网络控制(Network Control Protocol,NCP)协议。
PPP是面向字节的,只支持全双工信道。又因为其拓扑结构为点对点而非总线型,所以不用CSMA/CD,也就没有最短帧。两端可以运行不同网络层协议。
PPP帧
PPP帧除数据部分外,首部和尾部分别有4个字段。
- 首部标志字段F
规定为0x7E。 - 首部地址字段A
规定为0xFF。 - 首部控制字段C
规定为0x03。 - 首部协议字段
当其为0x21时表示信息字段为IP数据报。 - 信息字段
- FCS字段
用于CRC检验。 - 标志字段F
规定为0x7E。
关于字节填充:
- 异步传输时
定义转义字符为0x7D(即01111101)。将每个0x7E(即标志字段)变为0x7D5E;将每个0x7D变为0x7D5D;将ASCII的控制字符(即小于0x20的)加0x20再填充转义字符,如0x03变为0x7D23。 - 同步传输时
在发送端,只要发现有5个连续的1,就在其后插入一个0,以避免数据被误认为标志字段F。
PPP协议是这样工作的:
局域网
局域网使用广播信道。IEEE802.3标准的局域网称为以太网(Ethernet) 。目前的局域网已经可以和以太网划等号了。而以太网被划分为两个子层:逻辑链路控制(LLC)子层 和 媒体访问控制(Medium Access Control,MAC) 子层,前者也已经几乎不用了。
另一个重要的标准是802.11,无线以太网标准。采用星形拓扑结构的CSMA/CA协议。
计算机与局域网的连接是通过适配器进行的。适配器上装有处理器和存储器,它和局域网的通信依靠电缆或双绞线以串行传输方式进行,和计算机的通信则依靠I/O总线以并行传输方式进行。
链路层地址称为LAN地址、物理地址或MAC地址。对于大多数局域网,MAC长度为6字节,用十六进制表示,且没有重复的MAC地址。与IP地址不同,MAC地址到哪里都不会改变。MAC地址则存储在适配器的ROM中。
多路访问协议
多路访问问题(muhiple access problem) 指当多个节点同时传输帧的时候,所有接收方收到不同的帧并放生碰撞,使得所有的帧都丢失。即如何协调多个发送和接收节点对一个共享广播信道的访问。
节点根据 多路访问协议(multiple access protocol) 来解决多路访问问题。
- 信道划分协议
信道划分协议(channel partitioning protocol) 有时分多路复用(TDM)和频分多路复用(FDM)两种带宽划分协议。都是将带宽划分给不同的节点。
第三种是 码分多址(Code Division Multiple Access,CDMA) 协议。CDMA对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码,它可以实现不同节点的同时传输。 - 轮流协议
轮流协议(taking-turns protocol) 主要有轮询(polling)协议和令牌传递(token-passing)协议。
前者要求所有节点中有一个主节点,以循环的方式轮询每个节点,告诉每个节点它们能够传输的帧的最大数量。
后者有一个被称为令牌的特殊帧在节点间以固定的次序进行交换。当一个节点拥有令牌且有一些帧要发送时才去传输帧,否则将令牌传给下一个节点。 - 随机访问协议
随机访问协议(random access protocol) 规定当发生碰撞时,每个节点各自等待一个随机时延,然后重发帧。最常见的随机接入协议是ALOHA协议和载波侦听多路访问/碰撞检测(Carrier Sense Multiple Access with Collision Detection,CSMA/CD)协议。- ALOHA协议
需要发送帧的时候立即发送而不是等待一个时隙的开始,其最大效率会低于时隙ALOHA。 - 时隙ALOHA协议
假设帧长为L,传输速率为R,将时隙定义为L/R(即一个时隙传输一帧)。每帧都在一个时隙的开始时进行传输。其优点是只有一个活跃节点时它可以以最大速率R来传输帧。 - CSMA/CD协议
下面详细写CSMA/CD协议。
- ALOHA协议
CSMA/CD协议
节点在发送帧时要遵循两个规则:
1.载波侦听。即持续监听信道上有没有其他节点在发送帧。
2.碰撞检测。即侦听到其他节点在传输干扰帧时,停止传输。适配器边发送数据边检测信道上信号电压的变化情况。
(也因此局域网之所以局域,是因为长度过长时载波监听和碰撞检测的效率就会极其低下,碰撞率也会提高)
把单程端到端传播时延记为
τ
τ
τ,因此确定是否发生碰撞的最长时间就是
2
τ
2τ
2τ,称为争用期(contention period)或碰撞窗口(collision window)。
争用期也就决定了它有最小帧长 = 总线传播时延 x 数据传输速率 x 2(即
2
τ
2τ
2τ期间可以发送的帧长)。
下面介绍以太网用来确定随机的重传时间的算法:截断二进制指数退避(truncated binary exponential backoff) 算法。
(1)称推迟重发的动作为退避。规定基本的退避时间为争用期
2
τ
2τ
2τ,并规定争用期为512bit,即发送512比特所需要的时间。如果在争用期(共发送了64字节)没有发生碰撞,那么后续数据也不会发生碰撞,这也是后面MAC帧要规定最小长度的原因。
(2)令
k
=
m
i
n
(
重传次数,
10
)
k=min(重传次数,10)
k=min(重传次数,10),从整数
[
0
,
2
k
−
1
]
[0,2^k-1]
[0,2k−1]中随机取一个数r,退避时间即为r倍的争用期。
(3)当重传达到16次仍不成功时,丢弃该帧并向上层报告。
截断二进制指数退避算法使得重传所需要推迟的平均时间随重传次数增大,这被称为动态退避。此外,该算法害包括强化碰撞和帧间最小间隔。前者指发生碰撞时发送方停止后还要继续发送32比特或48比特的人为干扰信号,以通知其他所有用户发生了碰撞;后者为96比特时间,是为了让接收方清理缓存以接收下一帧。
CSMA/CA协议
无线局域网因为不能使用CSMA/CD,因为①难以检测碰撞,②存在隐蔽站,即并非所有站点都可以听到对方。因此每发送一帧就必须收到ACK后才能发送下一帧。为了避免碰撞,802.11规定发送后必须再等一段时间才能发送下一帧,这叫做帧间间隔(InterFrame Space,IFS)
CSMA/CA(Collision Avoid)算法如下:
1)若最初有数据要发送(而非重传),且检测到信道空,则等待DIFS后发送。
2)否则执行退避算法,选择一个随机值。在检测到信道忙的时间内计时器不变,只要空闲就开始倒计时,直到为0,此时发送。
3)若收到ACK,则从2)开始发送下一帧。否则重新用CSMA/CA争用信道。
为了处理隐蔽站问题,发送站可以预约信道:在发送数据帧之前广播一个RTS(Request To Send)控制帧,包括源地址、目的地址、这次通信的持续时间。若信道空闲,则范围内的AP都广播一个CTS(Clear To Send)控制帧,包括这次通信的持续时间。这样就可以即允许源站点发送,又阻止其他站点争用信道。
CSMA/CD和CSMA/CA的对比:
CSMA/CD | CSMA/CA | |
---|---|---|
冲突 | 可以检测,无法避免 | 发送时不能检测,只能尽量避免 |
用于 | 总线型以太网 | 无线局域网802.11a/b/g/n等 |
检测方式 | 电压变化 | 能量检测、载波检测 |
MAC帧
以太网是一种有线局域网。以太网帧有以下结构:
- 前同步码(Preamble)
8字节,位于一个以太网帧的开头。前7字节的值都是10101010;最后一个字节是10101011。前同步码字段的前7字节用于“唤醒”接收适配器,并且将它们的时钟和发送方的时钟同步。 - 目的地址和源地址
分别6字节。 - 类型字段
2字节。标志上层是什么协议。 - 数据字段
其大小为46~1500字节。若小于46字节,则在后面填充一个整数倍的字节。
其中46 = 64(争用期发出的最小长度) - 18(其他字段的字节和);1500即MTU。 - FCS
4字节。用于CRC校验。
物理层
编码方式
- 归零编码
每个时钟周期的中间变成低电平。 - 非归零编码
不用归零。波特率 = 1/2 * 数据率。 - 反向非归零编码
用信号翻转表示0,不变表示1。 - 曼彻斯特编码
将一个时钟周期分为两个相等间隔,前高后低表示1,反之表示0。波特率 = 2 * 数据率。
能从数据信号波形中提取同步信号。有两个优点是自同步和差错控制。
以太网使用该编码。 - 差分曼彻斯特编码
时钟周期前半个码元与上一个的后半个相同表示1,不同表示0。波特率 = 3/2 * 数据率。
码元:若干位比特的组合。
如二进制码元为0,1
4进制码元为00,01,10,11。
码元的传输速率叫做波特率,单位是Baud/s。表示每秒信号变化的次数。
信道利用率
=
L
C
T
=\frac{L}{CT}
=CTL。
其中L为传输比特数,C为传输速率,T为开始发送数据到收到第一个ACK的时间。
- 奈奎斯特定理
理想低通信道下的极限数据传输率 = 2 W l o g 2 V 2Wlog_2V 2Wlog2V。
其中W为带宽,V为码元进制数。 - 香农定理
信道的极限数据传输率 = W l o g 2 ( 1 + S / N ) Wlog_2(1+S/N) Wlog2(1+S/N)。
其中S为信道传输信号的平均功率,N为信道内部的高斯噪声功率。 S / N S/N S/N为信号与噪声的平均功率之比,信噪比为 10 l g ( S / N ) 10lg(S/N) 10lg(S/N)。
传输介质
- 双绞线
分为屏蔽、无屏蔽双绞线。 - 同轴电缆
分基带、宽带同轴电缆。 - 光纤
利用全反射的多模光纤,适用于近距离。
单模光纤适用于远距离。
参数 | 10BASE5 | 10BASE2 | 10BASE-T | 10BASE-FL | 100BASE-T |
---|---|---|---|---|---|
传输媒介 | 基带同轴电缆(粗缆) | 基带同轴电缆(细缆) | 非屏蔽双绞线 | 光线对 | 双绞线 |
拓扑结构 | 总线 | 总线 | 星型 | 点对点 | 星形 |
最多结点数 | 100 | 30 | 2 | 2 | |
最大段长 | 500m | 185m | 100m | 2000m |
物理设备
- 中继器
在物理层。将信号整形放大再转发出去,以消除失真和衰减。注意中继器的两端要使用同一个协议。 - 集线器
在物理层。将信号放大并转发,是一个多端口的中继器。将多个结点连接成一个共享式局域网。 - 网桥
在数据链路层。过滤、存储转发帧。 - 交换机
在数据链路层,相当于多端口的网桥。构成交换式局域网,多个结点并发传输,是全双工的。
存储转发或直通方式。
它有两个功能:过滤和转发。前者决定一个帧应该转发到某个接口还是应当丢弃;后者决定一个帧应该被导向哪个接口,并把该帧移动过去。这两个功能是由交换表实现的。交换表包含一个MAC地址,一个通往该地址的接口以及该表项放置在表中的时间。
交换机是自学习的。其初始状态为空,在每收到一个帧时,将其源地址、到达接口、当前时间存储下来。经过一段老化期后,如果没有收到该地址作为源地址的帧,则将其删除。
在接口1收到一个A发往B的帧时,如果表中有该目的地址,则只向目的接口转发。否则广播该帧,被目的地址和自己的地址相同的交换机接收,其他丢弃。然后在交换表中存下正确的对应关系。
交换机的每个端口都是是一个冲突域,故可以并行传输。N个端口的交换机,其总容量 = N x W - 路由器
功能为连接异构网络,完成路由转发。包括输入端口、交换结构、输出端口。
一个网段是一个冲突域,一个局域网是一个广播域。
设备 | 能否隔离冲突域 | 能否隔离广播域 |
---|---|---|
中继器 | × | × |
集线器 | × | × |
网桥 | √ | × |
交换机 | √ | × |
路由器 | √ | √ |