计算机网络复习
计算机网络温习资料
作者:哈利波特👑
相信自己,I can do it!
希望可以帮助到大家,祝大家都考100!
第一章 计算机网络和因特网
什么是因特网?
**定义:**因特网是一个世界范围的计算机网络,,即一个互联了全世界的数十亿计算设备的网络。
**组成结构:**端系统(主机)、通信链路、分组交换机(路由器、链路层交换机)、因特网服务提供商(ISP)。
- 端系统(主机):例如个人电脑、智能手机、服务器等,通过通信协议相互连接,形成因特网的终端。根据功能可分成客户和服务器。
- **通信链路:**包括光纤、电缆、无线信号等,用于在端系统之间传输数据。负责在两点之间传输数据,提供基础的物理连接。
- **分组交换机:**包括路由器和链路层交换机,用于在网络中转发分组数据,确保数据从源端传递到目的端。负责将传输数据从一个通信链路转发到另一通信链路,实现数据的路由和中转。
- **因特网服务提供商:**帮助端系统连接入因特网。
可以发现因特网是网络的网络。
其他概念:
- **分组:**发送端将数据分段,并为每个数据段增加新的头部成为数据包。这个操作叫做分组。
什么是协议?(感觉会考)
**定义:**确定多个通信实体之间交换报文的格式以及顺序和收到报文后执行的操作。
网络协议的三要素:语法、语义和同步。
什么是网络边缘?
网络结构 = 网络边缘(应用、主机)+ 网络核心(路由器)+ 接入网和通信链路
- 接入网:将端系统物理连接至边缘路由器的网络。
- **边缘路由器:**端系统到其他远程端系统路径上经过的第一个路由器。
计算机网络设计的理念:尽量让复杂的事情在网络边缘处理,使得网络核心越简单越好!
什么是网络核心?
定义:由分组交换机和数据链路组成的网状结构。
**功能:**实现数据交换。
-
存储转发传输
**定义:**交换机开始向输出链路传输该分组的第一个比特之前,必须先接收到整个分组,即将前面该分组的比特都缓存起来。
**链路的传输时间:**假设一条链路发送L bit 的分组,链路的传输速率为R bps,则链路传输该分组的时间为$$\frac{L}{R}s$$ 。 (是将数据包从路由器传向链路)
记得区分传输时间和传播时间的定义!
通过 N条速率为R的链路组成的路径(所以一共有N-1个路由器),从源到目的地发送一个分组,端对端时延为。
-
排队时延和分组丢失
**排队时延:**由于节点存储有限,如果不能及时转发出去,会导致收到的信息等一段时间才能转发出去。
**分组丢失:**大概率由于缓存满了,导致新接收的包被丢弃。
-
转发表和路由选择协议
转发表可以看成路牌,告诉分组交换机(路由器)将该分组传向哪个分组交换机。
路由选择协议看成 GPS,告诉你源端系统到目的端系统的最佳路径。
互联网络结构与ISP
ISP的中心目标:使所有端系统能够彼此发送分组。
- 多层等级结构:接入(本地)ISP,区域(地区)ISP,第一层(主干)ISP(层级由低到高)。
- 对等:同一层相互连接,降低成本。
- IXP:提供多个ISP的对等。
为了更快地转发分组,IXP 允许两个网络直接连接并交换分组,而不需要通过第三个网络来转发分组。例如上图中,主机 A 和主机 B 通过2个地区ISP连接起来了,就不必经过最上层的的主干ISP来转发分组。
分组交换网络中的延迟与丢失(本章重点)
总时延定义
节点总时延 = 处理时延 + 排队时延 + 传输时延 + 传播时延
-
处理时延
决定将该分组导向何处所需要的时间(即查看路由转发表),基本上不会考虑。
-
排队时延
分组在链路上等待被传输的时间。
-
传输时延
假设用$$L$$表示该分组的长度,对于 10Mbps 的以太网链路,速率$$R=10Mbps$$,传输时延为$$\frac{L}{R}$$。
简单理解就是,传输时延是路由器将分组推向链路的时间。
与分组大小和传输速率有关。
-
传播时延
从链路的起点到达链路终点的所需时间。假设链路长度为$$d$$,传播速率为$$s$$,传播时延为$$\frac{d}{s}$$。
与链路长度与链路的物理媒介(光纤)有关。
流量强度与排队时延的关系
假设$$\alpha$$为分组到达队列的平均速率(即每秒到达$$\alpha$$个分组),所有分组的长度为$$L bit$$,传输速率为$$R$$。
定义流量强度为$$\frac{L\alpha}{R}$$。($$L\alpha$$为每秒到达队列的比特总数,$$R$$为每秒分组交换机向链路推送的比特总数)
流量强度一定不能大于1,大于1则表示到达队列的比特数量大于交换机处理的比特数量,即永远处理不完分组,排队时延接近无穷!
如果流量强度接近 0,排队时延接近 0;当流量强度接近 1,排队时延迅速增加,甚至接近无穷。
当到达速率小于传输速率时,队列中的分组数量将会减少。
丢包
因为排队容量是有限的,如果到达的分组发现排队容量已满,则路由器会丢弃该分组。
所以实际上,当流量强度接近 1 时,排队时延并不会真正的趋向无穷,因为会丢包。
吞吐量
- 瞬时吞吐量:主机 B 接收到文件的速率。
- 平均吞吐量:主机 B 接收所有$$F bit$$用去$$Ts$$,平均吞吐量为$$\frac{F}{T}$$。
- **瓶颈链路定义:**一个路径中带宽(传输速率)最小的链路。
考虑下列情况:
在一个服务器和一个客户之间具有 $$N $$条链路的网络,这N条链路的传输速率分别是$$R_1, R_2, … , R_N$$。应用短板效应(瓶颈链路)的分析方法,在理想状态下从服务器到客户的文件传输吞吐量是$$min{R_1, R_2, … , R_N}$$。
再考虑下列情况:
在例子中有 10 台服务器和 10 个客户与计算机网络连接。在该核心中有一条所有 10 个下载通过的链路$$R$$,设其传输速率为 $$R$$。假定所有服务器的接入链路具有相同的速率$$R_s$$,所有客户接入链路具有相同的速率$$R_C$$。求该例子的下载吞吐量是多少?
如果$$R$$比$$R_s$$和$$R_C$$要大的太多(而事实上往往如此),那么吞吐量为 $$min {Rs,RC}$$;而假如$$R$$并不大,假定$$RS=2Mbps,RC=1Mbps,R=5Mbps$$,那么下载的吞吐量则不再是由$$ min {R_S,R_C} $$决定,而是为$$500kbps$$。
吞吐量与带宽的比较:带宽是单位时间内,链路能传输的最大比特数量;吞吐量是单位时间内,链路传输的真实比特数量。
交换
交换有分组交换和电路交换两种方式。
协议层次及其服务类型(感觉也重点)
协议层次(5层因特网协议栈)
层次 | 协议 | 封装 |
---|---|---|
应用层 | HTTP、DNS、SMTP等 | 报文 |
传输层 | TCP、UDP | 报文段 |
网络层 | IP | 数据报 |
链路层 | Ethernet、802.11 | 帧 |
物理层 | ~ | ~ |
-
链路层交换机: 实现了链路层协议(第二层协议),在局域网中通过 MAC 地址进行数据转发,因此不需要解析网络层的 IP 地址。
路由器: 实现了网络层协议(第三层协议),需要解析 IP 地址以确定数据分组的转发目标,从而实现跨网段的通信。
-
**封装:**是指当数据从发送端应用层向下传输到物理层时,每一层都会在数据前或后添加的控制信息。
对每一层而言,上一层的整个分组被视为有效载荷字段,再加上这一层的首部字段,形成新的数据单元。
-
解封装:当数据到达接收端时,数据从物理层向上传输到应用层的过程中,每一层会移除对应的控制信息,并将处理后的数据交给上一层,直到应用层获得原始数据。
-
分组结构:
在每一层,一个数据单元由两部分组成:- 首部字段: 包含与该层相关的控制信息。
- 有效载荷字段: 即从上一层传递过来的数据。
注意主机实现了整个5层协议,链路交换机和路由器分别实现了2层与3层。这与:网络体系结构把更多的复杂性放在了网络的边缘的观点 不谋而合。
第二章 应用层
研发网络应用的核心是写出能够运行在不同的端系统和通过网络彼此进行通信的程序。
网络应用原理
应用体系结构
由应用程序开发者所设计,规定了如何在各种端系统上运行程序。
主要使用的两种应用体系结构是客户-服务器和对等(P2P)体系结构。
-
客户-服务器体系结构
有一个总是打开的主机,称为服务器,总是接收很多称为客户的其他主机的请求。
特征:
- 服务器具有固定的、周知的 IP 地址,并且总是打开,所以客户通过向服务器周知的 IP 位置发送分组来表示请求。
- 客户之间不会进行直接通信,集中式服务,可扩展性差。
-
对等(P2P)体系结构
任何主机都可以作为服务器方和客户方。
特征:
-
基本没有专门作为服务器的主机。
-
分布式服务,可扩展性好和成本低。
-
进程通信
发送端和接收端通过计算机网络交换报文进行通信。
主要考虑的是运行在不同端系统的进程(程序)进行通信。发起通信的进程称为客户,接收通信的进程是服务器。
进程通过套接字(Socket)向网络发送报文和接收报文。
类似于寄信,进程可类比于一座房子,而它的套接字可以类比于它的门。当一个进程想向位于另一套主机上的进程发送报文时,它把报文推出该门(套接字)。该发送进程假定该门到另外一侧之间有运输的基础设施(下层网络结构),该设施将报文传送到目的进程(另一座房子)的门口。一旦该报文抵达目的主机,它通过接收进程的门(接收进程的套接字)传递,然后接收进程对该报文进行处理。
进程寻址
在一台主机上运行的客户进程为了向另一台主机运行的进程发送分组,需要得知接收进程的地址。接收进程的地址由主机地址和该接收进程在目的主机上的标识符(因为一个主机可能同时运行多个网络应用)。
- 主机地址:即主机的 IP 地址。
- 接收进程在目的主机上的标识符:即目的端口号。
即通过 IP地址 + 端口号 来唯一地标识网络上的进程。
因特网提供的运输服务
因特网为应用程序提供 TCP 和 UDP 两个运输层协议。
- TCP协议:提供面向连接服务和可靠数据传输服务。
- UDP协议:只提供最低限度的服务,提供一种不可靠数据传输服务。开销比TCP协议小。
当一个运输层协议不提供可靠数据传输服务,可能会导致从发送进程发送的某些分组不能到达接收进程。
- **容许丢失的应用:**某些应用允许丢包的情况,例如打电话。容许丢失的应用可以使用 UDP 协议。
具有吞吐量要求的应用程序称为带宽敏感的应用,能够根据当前可用的带宽或多或少的利用可使用的吞吐量的应用程序称为弹性应用。
- 带宽敏感的应用:视频会议的音频和视频、交互式游戏。
- 弹性应用:文件传输、电子邮件、Web文档、智能手机讯息。
应用层协议内容
- 交换的报文类型(请求/响应报文)
- 各种报文之间的语法(报文内包括了哪些字段)
- 报文中字段的含义(字段如何解读)
- 报文的响应规则(何时以及如何发送报文)
Web和HTTP(本章重点)
Web 可以想象成是一个应用,HTTP 是 Web 的应用层协议。
Web(不重要)
首先先介绍 Web 的组成:
-
Web页面:由对象组成,对象可以是 HTML文件,JP、EG图像 等,Web页面包含一个基本的 HTML文件 和多个引用对象。通过URL对每个对象进行引用。
-
URL地址 :存放该对象的服务器名(主机名)+ 对象在该服务器中的路径名。
例如
URL:http://www.someschool.edu/somedepartment/picture.gif
,其中的www.someschool.edu
就是主机名,/somedepartment/picture.gif
就是路径名。
HTTP(非常重要)
Web的应用层协议就是HTTP协议(超文本传输协议),它是Web的核心。
-
Web浏览器实现了 HTTP 客户端,Web服务器实现了 HTTP 服务器端,用于存储 Web 对象。
-
HTTP使用了TCP作为它的支撑运输协议。
这里我们看到分层结构的优点,即HTTP不用担心分组会丢失,也不关心TCP协议如何处理丢失的分组如何恢复。
-
HTTP是一个无状态协议,即服务器不会记录任何有关客户的状态信息。
-
端口号为80。
非持续连接和持续链接
首先先介绍**RTT(往返时间):**是指一个分组从客户发送到服务器然后再从服务器到达客户所用的时间。
-
非持续连接:每个请求\响应报文都经一个单独的TCP连接进行传送。
假设采用非持续连接的情况从服务器向客户发送一个Web页面:
- 一个Web页面有1个HTML基本文件和10个其他对象,每次都建立TCP连接、请求响应,共11次。
粗略的讲,传输一个对象所用的时间 = 两个RTT + 服务器传输对象文件所用的时间。
TCP建立连接需要三次握手,前两次握手算作一个RTT,第三次握手时客户实际上已经向服务器发送 HTTP请求了,所以一共是两个RTT。
-
持续链接:所有的请求\响应报文都经同一个TCP连接进行传送。
减少了TCP连接创建和关闭的开销。
HTTP报文格式(这里简单看看)
HTTP报文格式分为两种,请求报文和响应报文。
HTTP请求报文
请求报文的第一行叫做请求行,其后续的行叫做首部行,最后的是实体体(实体体和首部行中有一个空行)。
请求行由三个字段组成:方法字段、URL字段、HTTP版本字段。
-
方法字段:可以取很多不同的值(不单单只是 GET)。
使用GET方法时,实体体(即回车换行符右边的部分)是全空的。
当使用POST方法才会使用实体体,例如用户在搜索引擎打出关键字搜索时,(如果使用POST方法)客户的HTTP请求报文的实体体内容是该关键词。
用户在搜索引擎打出关键字搜索时,也可以使用GET方法,不过要更改请求行中URL结构,例如输入关键词banana,monkey,则URL = 原本URL?name1=banana&name2=monkey,如果输入重要信息可能会泄露!
-
URL字段:请求对象的标识。
-
HTTP版本字段:表示 HTTP 使用的版本。
首部行由 Host字段、Connection字段、User-agent字段、Accept-language字段组成。
-
Host字段:表示所请求对象在的主机。
-
Connection字段:表示是否持续连接。
-
User-agent字段:向服务器发送的浏览器的类型。
User-agent字段可以让服务器根据不同的浏览器,返回相同对象的不同版本。即类似iphone和电脑浏览相同网页,但是网页的输出大小肯定不一样。
-
Accept-language字段:表示客户想得到该对象的语言版本。
HTTP响应报文
由三个字段:初始状态行、首部行、实体体组成。
状态行由三个字段组成:协议版本字段、状态码、相应状态信息。
- 一些常见的状态码:200(请求成功,信息在返回的报文内)、404(被请求的文档不在服务器上)、301(请求的对象被永久转移了,新的URL定义在响应报文的
Location
字段中)…
首部行由Connection字段、Date字段、Server字段、Last-Modified字段、Content-Length字段、Content-Type字段组成。
- Date字段:表示服务器检索到请求对象并加入到响应报文发送的时间。
- Server字段:表示这份报文由哪个类型的服务器产生。
- Last-Modified字段:表示该请求对象最后更改的日期。
- Content-Length字段:表示该请求对象的字节数。
- Content-Type字段:表示请求对象的类型。(例如Html文本之类的)
cookie
HTTP服务器是无状态的,但是一个Web网站希望去识别一个用户,就出现了cookie,可以对用户进行跟踪。
cookie被认为是一种对用户隐私的侵害!
cookie有以下四个组件:
- 在HTTP请求报文中有一个cookie首部行。
- 在HTTP的响应报文中有一个cookie首部行。
- 在用户端系统中保留有一个cookie文件,由用户的浏览器进行管理。
- 位于Web服务器的一个后端数据库。
注意客户端系统中保留一个cookie文件,由客户端系统的浏览器进行管理,发现客户主机的cookie文件中一开始有ebay
表项,说明该客户主机之前已经访问过ebay
网站。
当第一次访问amazon.com
网站时,服务器为它创建一个ID,并携带在HTTP响应报文中,客户端浏览器收到HTTP响应报文后,该浏览器会在它管理的cookie文件中添加一个新表项,用以记录该ID的访问记录。
过了一段时间之后,再次使用该浏览器访问amazon.com
网站时,浏览器首先在cookie文件下找到了记录访问amazon.com
的数据表项,将ID携带在HTTP的请求报文中发送给服务器,服务器后端数据库查找到这个ID的记录,假如这个ID之前收藏了什么想要购买的物品(购物车),那么后端服务器都有记录,当用户想要查询之前的收藏记录时,服务端自然能把该id对应的收藏的物品信息发送过去。
Web缓存
目的:不访问原始服务器,就满足客户的请求。
Web缓存器也被称为代理服务器。
Web缓存器有自己的存储空间,可以记录最近请求过的对象的副本。
Web缓存访问流程如下:
- 浏览器(HTTP客户端)向Web缓存器建立一个TCP连接,并向Web缓存器的对象发送一个HTTP请求。
- Web缓存器检查自己的磁盘存储空间,看看本地是否有存储该对象。如果有的话直接HTTP响应报文返回。
- 如果没有该对象,则Web缓存器向存储该对象的服务器建立TCP连接并发送该对象的HTTP请求。收到该请求后,存储该对象的服务器向Web缓存器发送该对象(HTTP响应报文)。
- Web缓存器接收到该对象之后,首先在自己本地先存储一份副本,然后再透过HTTP响应报文发送该对象给浏览器(透过先前建立的TCP连接)。
值得一提的是,Web缓存器既是服务器端也是客户端。
Web缓存的优点
-
Web缓存器大大减少了客户的响应时间,特别是从浏览器到初始服务器的瓶颈带宽远远小于浏览器到Web缓存器的瓶颈带宽时。
瓶颈带宽就是数据流经过的最慢的环节所能提供的最大带宽。可以想象为一条宽大的高速公路,如果其中某个狭窄的路段(即瓶颈)限速,那么即使其他路段很宽阔,整体的车流速度也无法超过这个限速。
-
Web缓存器大大减少了局域网(机构)的接入链路的通信量,使得接入链路的带宽可以大大减少。
条件GET方法
高速缓存减少响应时间的同时也引入了一个问题:存放在缓存器中的副本可能是陈旧的,即原对象可能已经被更新修改了。
而HTTP协议有一种机制,允许缓存器证实它的对象是最新的,这种机制就是条件GET方法。
目的:确认Web缓存器中的对象是否有被更改。
格式:如果请求报文是 GET 方法,并且包含 If-Modified-Since: 首部行,那么就是一个条件 Get 请求报文。
If-Modified-Since记录了存储在Web缓存器中该对象最后的修改时间,在Web缓存器向初始服务器获取该对象的请求报文中的Last-Modified首部行中得到。
流程如下:
-
客户 A 发送 HTTP 请求报文给 Web 缓存器。
-
Web 缓存器有该对象,然后向初始服务器发送条件 Get (包含If-Modified-Since: 首部行)。
-
初始服务器上的对象若没有改动,于是返回 HTTP 响应报文,状态码为 304(返回的 HTTP 响应报文并没有该对象实体)。
因为如果包含该对象就会浪费带宽。
-
Web 缓存器使用本地存储的对象返回给客户端。
因特网中的电子邮件系统
由三个部分组成:用户代理、邮件服务器、简单邮件传输协议(SMTP)。
-
用户代理:这是用户用来发送、接收和管理电子邮件的软件或应用程序。
-
邮件服务器: 每个邮件服务器上会对应每个接收方有个邮箱。邮箱管理和维护着接收方的报文。
具体流程:
- 发送方代理将邮件发送到发送方的服务器邮箱。
- 发送方的服务器将邮件发送到接收方的服务器邮箱。
- 接收方的服务器再将邮件发送给接收方代理。
-
简单邮件传输协议(SMTP):是因特网电子邮件的主要应用层协议。
SMTP
邮件服务器之间借助 SMTP 发送 Email 报文,它定义了邮件服务器之间交换电子邮件的规则和格式。
- SMTP 使用 TCP 在客户端和服务器之间传送报文,端口号为25。
- SMTP 要求各个服务器之间不存在中间服务器。也就是发送方服务器和接收方服务器之间不存在其他中介服务器。
- 要求报文必须转化成 ASCII 码再进行传输。
- SMTP 要求报文(首部和主体)必须都是7位的ASCII编码。
邮件发送的流程:
- 邮件从发送方 A 的用户代理开始,传输到发送方 A 的邮件服务器,邮件放在报文队列中(不会立即发送,而是定时统一进行发送)
- SMTP 的客户端打开到接收方B邮件服务器的 TCP 连接,通过 TCP 连接发送邮件(可以发现这里 TCP 的连接是由发送方的机器发起的)
- 接收方 B 的邮件服务器将邮件放到 B 的邮箱中,B 调用他的用户代理来阅读邮件。
SMTP与HTTP的区别
二者都采用请求 命令 - 响应 模型。
-
SMTP是推协议:邮件从发送方主动“推”到接收方的服务器。HTTP是拉协议:客户端(如浏览器)向服务器发出请求,服务器返回相应的数据。
在网络通信中,“拉协议”指的是客户端主动向服务器请求数据,服务器根据请求返回相应的数据。这与“推协议”(如 SMTP)相对,推协议是服务器主动将数据发送给客户端。
-
SMTP 要求 ASCII 码格式。HTTP 不需要。
-
SMTP 是面向电子邮件传输的文本协议(以文本为主),而 HTTP 是面向超文本传输的应用层协议(以传输网页内容、图片为主)。
SMTP报文格式
-
每一个典型的邮件报文都包含首部行和报文体。
-
每个报文的首部行都会包含 From: 首部行和 To: 首部行。
-
首部行与报文体中间有一个间隔。
-
格式类似如下:
1
2
3
4From: ilovesysu@123.com
TO: sysuloveme@123.com
ASCII data...
邮件访问协议
邮件访问协议是拉协议,因为接收用户代理主动向接收方邮件服务器请求并获取邮件内容。
常见的邮件访问协议有:IMAP…
DNS(本章重点)
识别一部主机的方式:主机名、IP地址。
人们喜欢便于记忆的主机名,但路由器喜欢格式统一的IP地址。
目的:实现主机名与 IP 地址之间的转换,可以去识别主机。
-
DNS是一个分层的 DNS 服务器实现的分布式数据库。
-
是应用层协议。
但是与一般的应用层协议不同,DNS是与客户的应用程序打交道而不是与客户打交道。
-
使用 UDP 协议作为运输层协议。
DNS提供的服务
-
域名解析
DNS 的核心服务是将域名与对应的 IP 地址互相解析。
- 正向解析:将域名解析为 IP 地址(如
www.example.com
→93.184.216.34
),便于用户访问网站或其他网络服务。 - 反向解析:将 IP 地址解析为域名(如
93.184.216.34
→www.example.com
),通常用于网络故障排查或安全认证。
- 正向解析:将域名解析为 IP 地址(如
-
负载均衡
DNS 可以根据用户的地理位置或其他策略,将请求分配给不同的服务器,实现流量分发和负载均衡。例如,访问同一域名时,可能解析到不同的数据中心的 IP 地址,从而优化访问速度。
DNS的层次结构
大致说来,一共有三种不同类型的DNS服务器:根DNS服务器、顶级域DNS服务器(TLD)、权威DNS服务器。
- 根DNS服务器
- 根域名服务器存储了所有顶级域(TLD)服务器的地址信息(每一个根域名服务器并不存储全部顶级域服务器的地址信息,而是只存储一部分TLD服务器的地址信息)
- 主要功能是告诉查询者下一步应该访问哪个顶级域 DNS 服务器(如
.com
、.org
、.cn
等)。
- 顶级域DNS服务器(TLD)
- 负责顶级域名(如com,org,net等)和所有国家级的顶级域名(如cn,uk,jp等)。
- 权威DNS服务器
- 权威 DNS 服务器负责存储特定域名的实际记录,包括正向解析(域名到 IP)和反向解析(IP 到域名)的映射。
你可以把这三类服务器比作一个分布式的导航系统:
- 根服务器:像是地图的目录,告诉你去哪个分区(比如
.com
)。- TLD 服务器:像是分区内的管理员,指向目标(比如
example.com
的权威服务器)。- 权威服务器:像是目的地的接待员,直接告诉你最终答案(域名对应的 IP 地址)。
以上三种 DNS 服务器都属于 DNS 服务器的层次结构中,但是还有一种重要的 DNS 服务器,它不属于 DNS 层次结构,但是它非常重要,就是本地服务器。
- 本地DNS服务器
- 每一个 ISP 都有一台本地 DNS 服务器。
- 当一个主机发起 DNS 查询时,查询被送到其本地 DNS 服务器,起着代理的作用,将查询转发到层次结构中。
- **优点:**可以实现缓存!
DNS 查询分为迭代查询和递归查询。
**迭代查询:**在迭代查询中,客户端向本地 DNS 服务器发送查询请求,本地 DNS 服务器若无法解析该请求,会返回一个指向下一个 DNS 服务器的参考。客户端自己继续向返回的 DNS 服务器发送查询,直到找到最终答案。
**递归查询:**在递归查询中,客户端将查询请求发送给本地 DNS 服务器。如果本地 DNS 服务器无法直接返回结果,它会继续向其他 DNS 服务器发起查询,直到找到最终的答案。
**区别:**递归查询下,根 DNS 服务器的压力较大。主机向本地 DNS 服务器查询常使用递归查询,为了减少根 DNS 服务器的压力,域名服务器之间的查询常使用下面这种方式:
-
从主机到本地 DNS 是递归查询,其余查询都是迭代查询。
-
所有查询都是递归查询:
DNS缓存
- 如果在 DNS 服务器中缓存了一个 主机名/IP地址对,另一个对相同主机名的查询到达该 DNS 服务器时,该 DNS 服务器就能立刻返回对应的 IP 地址,即使它并不是该主机名的权为服务器。
- 经过了 TTL 时间后,DNS 服务器就会删除缓存中的资源。
- 优势
- 速度提升:减少了域名解析所需的时间和网络延迟。
- 减少负载:降低了 DNS 服务器的压力,尤其在高访问量的网络中。
- 问题
- 缓存过期:当缓存记录的 TTL 到期时,必须重新查询,可能导致短暂延迟。
- 更新延迟:当域名的 IP 地址发生变化时,旧的缓存记录可能导致访问失败或错误。
- 优势
DNS记录和报文
实现 DNS 分布式数据库的所有 DNS 服务器存储了资源记录(Resource Record,RR),RR 提供了主机名到IP地址的映射。
RR 是一个四元组:(Name, Value, Type, TTL)
-
TTL 是该记录的生存时间,决定了该资源记录应当从缓存中删除的时间。
-
Name 和 Value 的意义取决于 Type。
TYPE NAME VALUE EXAMPLE A 主机规范名 对应的IPV4地址 example.com → 192.0.2.1 NS 域名 请求链中的下一个域名 example.com → dns.example.com CNAME 主机别名 主机规范名 www.example.com → example.com MX 邮件服务器别名 邮件服务器规范名 example.com → mail.example.com 一个主机只会有一个主机规范名,但可以有很多个主机别名。
不记得了看看这篇博客:[计算机网络之域名、主机名、IP地址和URL-CSDN博客](https://blog.csdn.net/weixin_45437521/article/details/109037537#:~:text=主机别名(当存在时)比主机规范名更加容易记忆。 应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。 主机别名不是一定要有的,也有很多主机只有一个主机名。,规范主机名具有唯一性。 规范主机名对应多个别名,多个IP地址。 一个别名也可以对应多个IP地址。 计算机名称是在我的电脑–>属性–>计算机名称,它是表明这台计算机的名称叫什么。)
-
CNAME 记录本身不直接关联 IP 地址,它只会提供一个域名到另一个域名的映射。然后,后续的 DNS 查询会继续解析这个规范主机名(
VALUE
)到其对应的 IP 地址。从实现的功能来看,A记录和CNAME记录并无太大差别。但是CNAME记录在做IP地址变更时要比A记录方便。
CNAME记录允许将多个名字映射到同一台计算机,当有多个域名需要指向同一服务器IP,此时可以将一个域名做A记录指向服务器IP,然后将其他的域名做别名(即:CNAME)到A记录的域名上。
-
当一个 DNS 服务器是某个特定主机名的权威 DNS 服务器时,它负责存储和管理该主机名的所有 DNS 记录。这时,权威服务器通常会包含该主机名的 A 记录(将域名映射到其对应的 IP 地址)。
即使不是权威 DNS 服务器,也有可能缓存一条 A 记录。
-
当一个 DNS 服务器不是某个特定主机名的权威 DNS 服务器时,它并没有该域名的直接记录(如 A 记录)。这时,非权威 DNS 服务器会通过 NS 记录 指向该主机名的权威 DNS 服务器,并通过 A 记录 提供该权威 DNS 服务器的 IP 地址。
这意味着非权威 DNS 服务器并没有该域名的最终 IP 地址,而是通过查询权威 DNS 服务器来获取正确的记录。
-
DNS报文格式
DNS 请求和应答都是用相同的报文格式,分成5个段(有的报文段在不同的情况下可能为空),如下:
1 |
|
DNS域名解析流程
-
客户端查询
- 当用户在浏览器中输入一个域名(如
www.example.com
)时,首先会检查操作系统的本地 DNS 缓存,看是否已经有该域名对应的 IP 地址。
- 当用户在浏览器中输入一个域名(如
-
查询本地 DNS 服务器
- 如果操作系统没有缓存结果,客户端会将 DNS 查询请求发送给 本地 DNS 服务器(通常是 ISP 提供的 DNS 服务器)。这就是 DNS 查询的起点。
- 本地 DNS 服务器会首先检查自己是否有该域名的解析记录,如果有,则直接返回该 IP 地址给客户端。
-
本地 DNS 服务器查找(递归或迭代查询)
- 如果本地 DNS 服务器没有该域名的解析记录,它会以递归查询或迭代查询的方式向更高级别的 DNS 服务器请求解析。
-
根 DNS 服务器查询
- 如果本地 DNS 服务器需要从根 DNS 服务器开始查询,它会向根 DNS 服务器发起请求。根 DNS 服务器返回一个 顶级域(TLD)DNS 服务器 的地址,如
.com
的 TLD 服务器。
- 如果本地 DNS 服务器需要从根 DNS 服务器开始查询,它会向根 DNS 服务器发起请求。根 DNS 服务器返回一个 顶级域(TLD)DNS 服务器 的地址,如
-
TLD DNS 服务器查询
- 本地 DNS 服务器根据根 DNS 服务器提供的指引,查询到对应的 TLD DNS 服务器(例如:
com
域名的 TLD DNS 服务器)。TLD DNS 服务器返回指向 权威 DNS 服务器 的地址。
- 本地 DNS 服务器根据根 DNS 服务器提供的指引,查询到对应的 TLD DNS 服务器(例如:
-
权威 DNS 服务器查询
- 本地 DNS 服务器向 权威 DNS 服务器 发起查询,权威 DNS 服务器知道该域名的最终解析结果(即对应的 IP 地址)。
- 权威 DNS 服务器返回该域名的 A 记录(如果是 IPv4)或者 AAAA 记录(如果是 IPv6)给本地 DNS 服务器。
-
返回结果
- 本地 DNS 服务器将查询到的 IP 地址返回给客户端。客户端就可以使用这个 IP 地址与目标服务器建立连接(例如加载网页)。
P2P文件分发
目前我们讨论的都是客户 - 服务器(CS) 模型:
-
结构:在 CS 模型中,网络中有明确的角色分配。客户端发起请求,而服务器提供资源或服务。服务器通常是强大的计算机或设备,负责管理和处理客户端的请求。
-
**通信:**客户端向服务器发送请求,服务器响应并处理这些请求。客户端和服务器之间通常有一对多的关系。
客户之间是不会进行通信的。
-
极大地依赖总是打开的基础设施服务器。
而在P2P模型中
- **结构:**节点没有明确的角色区分,所有节点既可以是资源的提供者,也可以是资源的请求者。
- **通信:**节点之间直接相互通信,数据和资源可以在节点之间共享,不依赖于中心服务器。
C/S与P2P模型分发时间比较
-
u_s$$表示服务器接入链路的上载速率。
-
N$$表示想要获得该文件副本的对等方数量。
- **分发时间:**所有 N 个对等方得到该文件的副本所需要的时间。
C/S分发时间
-
服务器需要向 $$N$$ 个对等方传输该文件的副本,一共是$$NF$$ bit。服务器上载速率为$$u_s$$。因此服务器分发该文件的时间必定至少为$$\frac{NF}{u_s}$$。
-
令$$d_{min} = min{d_1,d_2,…,d_N}$$,具有$$d_{min}$$下载速率的对等方至少需要$$\frac{F}{d_{min}}$$下载该副本,因此分发该文件的时间至少为$$\frac{F}{d_{min}}$$。
-
综合以上两点可以得出:
可以发现,当$$N$$很大的时候,分发时间被第一项所支配了。并且还是线性增长的。
P2P分发时间
-
在分发开始的时候,只有服务器有文件,分发该文件至少需要$$\frac{F}{u_s}$$。
-
令$$d_{min} = min{d_1,d_2,…,d_N}$$,具有$$d_{min}$$下载速率的对等方至少需要$$\frac{F}{d_{min}}$$下载该副本,因此分发该文件的时间至少为$$\frac{F}{d_{min}}$$。
-
考虑整个系统的上载,一共需要上传 $$NF$$ bit的文件,整个系统的上载速率为$$u_{total}=u_s+u_1+u_2+…+u_N$$,因此最小的分发时间至少为$$\frac{NF}{U_{total}}$$。
-
综合以上三点可以得出:
可以发现,当$$N$$很大的时候,第三项的$$u_{total}$$也会相应增大。
分发时间随N变化图
发现 C/S 模型是线性增长的,但是 P2P 模型不是。
BitTorrent(这个真的不太重要,感觉不太重要)
一种用于文件分发的P2P协议。
一些术语定义如下:
- **洪流:**参与一个特定的文件分发的所有对等方集合。在一个洪流中的对等方彼此下载等长度的文件块。
- **文件块:**将一个文件拆分成很多个块,典型的一个块为256KB。
- **追踪器:**每个洪流都有一个追踪器。
当有一个新节点 Alice 加入洪流,会有以下流程:
- 向追踪点注册自己,并且周期性的通知追踪器自己仍在洪流中。
- 追踪点会随机选择洪流中对等方的节点子集告诉新节点 Alice,Alice会与这些节点并行建立 TCP 连接。
- Alice 从这些邻居中获取它们拥有哪些块,并思考做出以下两个决定:
- 应该从哪个邻居当中获取哪些块
- 应该向哪个向她发出请求块的邻居发送块
- 应该从哪个邻居当中获取哪些块:
- 最稀缺算法:选择在所有的邻居中副本数量最少的块来获取。
- 应该向哪个向她发出请求块的邻居发送块
- Alice 根据当前能够以最高速率向她提供数据的邻居中选择。
内容分发网 cdn(看看概念就行)
简单来说,就是想让客户访问距离客户最近的服务器,增快访问速度。
流程如下:
- 用户向 Local DNS 服务器发起请求
- DNS 服务器将请求重定向到 CDN 服务器。
- CDN 服务器提供最优 CDN 服务器的 IP 地址。
- 用户向该 CDN 服务器请求内容。
- 该 CDN 服务器提供内容。
其他
- HTTPS 是 HTTP(应用层协议)+ TLS/SSL 的结合,而 HTTP 数据通过 TLS 加密后,再传输到 TCP(传输层协议)进行数据传输。
题目(随便选几题)
-
**R3:**对于两个进程的通信而言,哪个进程是用户,哪个进程是服务器?
答:一般而言,主动发起通信的进程是用户,等待接受通信的是服务器。
-
**R6:**假定你想尽快处理从远程客户到服务器的事务,你会选择TCP还是UDP?
答:选择 UDP,因为 UDP 进行通信成本更低,不需要向 TCP 一样进行三次握手等等。
-
**R10:**什么是握手协议?
答:实际上是一个同步机制,类似交换信息,双方都告诉对方自己的信息,以及一些预备动作。
-
**R19:**一个机构的 Web 服务器和邮件服务器可以有完全相同的主机名别名(例如:foo.com) 吗?包含邮件服务器主机名的 RR 有什么样的类型?
答:可以有相同的主机名别名,包含邮件服务器主机名的 RR 可以有 MX、A类型。
- MX 类型完成邮件服务器主机名到邮件服务器规范主机名的映射。
- A 类型完成邮件服务器规范主机名到邮件服务器 IP 地址的映射。
-
**R22:**考虑一个新对等方 Alice 加入 BitTorrent 而不拥有任何文件块。没有任何块,因此她没有任何东西可上载,她无法成为任何其他对等方的前 4 位上载者。那么 Alice 将怎样得到她的第一个文件块呢?
答:太工程了,感觉不会考。
-
**R26:**2.7 节中所描述的 UDP 服务器仅需要一个套接字,而 TCP 服务器需要两个套接字。为什么?如果 TCP 服务器支持 n 个并行连接,每条连接来自不同的客户主机,那么 TCP 服务器将需要多少个套接字?
答:UDP 没有欢迎套接字,UDP 的连接和发送都是通过一个套接字进行的。而 TCP 需要一个欢迎套接字建立三次握手过程,当连接建立时,又创建一个新套接字用于通信,所以如果 TCP 服务器需要支持 n 个并行连接,那么需要有 n + 1 个套接字。
-
**R27:**对于 2.7 节所描述的运行在 TCP 之上的客户-服务器应用程序,服务器程序为什么必须先于客户程序运行?对于运行在 UDP 之上的客户-服务器应用程序,客户程序为什么可以先于服务器程序运行?
答:基于 TCP 的程序,客户端必须与服务器程序建立持续性的连接,服务器必须先通过
bind()
和listen()
在一个固定的端口上等待客户端的连接请求,所以服务器程序必须先于客户程序打开。基于 UDP 的程序,因为 UDP 的客户程序本身并不期待报文能无差错可靠的到达。
第三章 运输层
经典的运输层协议有:TCP、UDP。
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信。
运输层协议是在端系统中实现的,而不是在路由器中实现。
实现方法如下:
- 将应用报文拆分成很多小块,并且每个小块加上运输层头部形成运输层报文段。
- 在发送端系统中,运输层将运输层报文段交给网络层,网络层进行封装成网络层分组,并向目的地发送。
- 接收端系统中,网络层提取出分组的运输层报文段并交给接收端运输层进行处理。
运输层与网络层区别
运输层位于网络层之上。
运输层提供了应用进程之间的逻辑通信。
网络层提供了主机之间的逻辑通信。
运输层实际上是透过网络层实现的。
设想一下有两所房子,每所房子里都住着12个小孩。两所房子里的孩子喜欢互相通信,每一封信都由老式的邮局分别用信封来寄。在每一家里面都由一个孩子——西海岸的房子里的Ann和东海岸房子里的BilI——负责邮件的收集和分发。每周Ann都从她的兄弟姐妹那里收集起来信件,并将这些信件送到每天都来的邮递服务员那里。当信件到达西海岸的房子,Ann又将这些信件分发给她的兄弟姐妹。BilI在东海岸有着同样的工作。
在这个例子中,邮递服务提供着两所房子之间的逻辑通信——邮递服务在两所房子之间传递邮件,而不是针对每个人的服务。
另一方面,Ann和BilI提供堂兄妹之间的逻辑通信——Ann和BilI从他们的兄弟姐妹那里收集邮件并将邮件递送给他们。
注意,从这些堂兄妹的角度看,Ann和BilI是邮件的服务人,尽管他们俩只是端到端寄送服务的一部分(终端系统部分)。
- 主机(也称为终端系统)=房子
- 进程=堂兄妹
- 应用程序消息=信封里的信
- 网络层协议=邮递服务(包括邮递员)
- 传输层协议=Ann和Bill
传输层协议
TCP
- 提供可靠的、面向连接的服务。
- 提供拥塞控制。
- 提供流量控制。
- 多路复用、解复用。
UDP
- 提供不可靠、无连接的服务。
- 基本上只有最基本的运输层功能。
- 没有为尽力而为的 IP 服务添加更多功能。
- 多路复用、解复用。
多路复用与多路分解
我们已经知道,网络层向传输层提供的提供的服务是主机-主机的,而传输层提供的服务是进程-进程的,如何在传输层实现这一细分的服务的实现,所依靠的就是端口号。
- 端口号实际上是将收到的报文定位到相应的套接字,再由相应的套接字发送给对应的进程。
通常一部主机上都会运行多个网络应用程序进程,即一部主机会同时运行多个套接字。
考虑接收主机如何将一个到达的运输层报文段定向到合适的套接字。
多路分解(接收方): 根据报文段的头部信息中的IP地址和端口号将接收到的报文段发给正确的套接字(和对应的应用进程)。
多路复用(发送方):从多个套接字接收来自多个进程的报文,根据套接字对应的IP地址和端口号等信息对报文段用头部加以封装。
考虑到上述的例子:当 Bill 从邮递员收到一批信件,并且通过查看收件人来分发信件,就是多路分解;当 Ann从兄弟姐妹收集要发送的信件给邮递员,就是一个多路复用。
UDP的多路复用与多路分解
一个 UDP 套接字由一个二元组全面标识,包含一个目的 IP 和目的端口号。
若两个 UDP 报文段具有不同的源地址IP和源端口号,但是具有相同的目的IP和目的端口号,则两个报文段会经过相同的目的套接字被定向到相同的进程。
当一个 UDP 报文段到达接收主机,接收主机运输层检查该报文段中的目的端口号,并将该报文段交付给目的端口号所标识的套接字。
TCP的多路复用与多路分解
一个 TCP 套接字由一个四元组全面标识,包含一个目的 IP 和目的端口号和一个源 IP 和源端口号。
两个具有不同源 IP 地址或源端口号的到达 TCP 报文段将被定向到两个不同的套接字。
UDP 是传输到同一套接字,TCP 为每个客户创建一个 socket。
当一个 TCP 报文段到达接收主机,接收主机利用上述四个值来定向(分解)一个套接字,并将该报文段交付给该套接字。
查看下图,就算主机 A 和主机 C 都分配源端口 26145,但是服务器 B 仍然能够正确分解这两个具有相同端口号的连接,因为具有不同的 IP 位置。
无连续运输:UDP
UDP 提供的服务
- 尽力而为的服务,数据包可能会丢,乱序。
- 在发送报文段之前,发送方和接收方的运输层实体之间没有握手(无连接)。
UDP 好处(对比 TCP)
-
应用层可以更好的控制发送数据的时间
因为 TCP 有拥塞控制机制,所以当网络情况变得极度拥塞的时候,就会抑制 TCP 发送方。
-
无需建立连接
因为 TCP 需要三次握手建立连接,UDP 没有连接时延。
-
无连接状态
TCP 需要维护连接状态,例如发送和接收方缓存。
-
分组首部开销更小
UDP 首部只需要 8 个字节,TCP 首部需要 20 个字节。
UDP报文段
UDP 头部只有四个字段,每个字段占两个字节。
分别是 源端口号,目的端口号,长度,检验和。
UDP 检验和
检验和计算:就是当加法溢出后,回卷,然后再执行反码运算。
如何检验:将所有的分组和检验和相加,结果需要为全1。
如果未通过检验则说明数据报存在差错,但通过检验也只能说明未检测到差错,不能证明接收到的数据报一定正确无误。
举个简单的例子:0000 和 1111,检验和计算为 0000;若出现差错,为0001 和 1110,则检验和计算不出来。
可靠数据传输原理(很重要这部分)
可靠数据传输协议为上层实体提供的抽象是可以通过一条可靠的信道进行传输。
但是实际上可靠传输协议的下层协议是不可靠的。
利用不可靠的协议来实现可靠的信道。
rdt 1.0(在可靠信道上的可靠数据传输)
假设信道是完全可靠的。
有限状态机为:
rdt 2.0(经具有比特差错信道的可靠数据传输)
引入了**否定确认(NAK)和肯定确认(ACK)**控制报文。
发送端有两个状态,当它在等待接收端传控制报文的时候,它不能从上层获取数据。
类似这种行为的协议叫做停等协议。
rdt 2.2(无NAK)
rdt 2.1和 rdt 2.2都一样,只不过 2.1 有 NAK,2.2 是全部使用 ACK 包了。
但是有个问题,当控制报文(ACK NAK)分组受损,要怎么办?
因此在数据分组中增加序号,让发送方对于其数据分组编号(0 / 1),并且当发送方收到重复的 ACK 序号则重发。
接收方接受到序号为什么的包,就 ACK 什么序号回去。
rdt 3.0(经具有比特差错的丢包信道的可靠数据传输)
现在假设底层信道除了比特会出差错,还假设会丢包。
引入超时重传机制,以解决丢包问题。
但是有可能只是网络塞车,并不是丢包,这个时候导致冗余数据分组;但是因为我们有序列号,所以可以解决这个问题。
也称为比特交替协议。
下面展示rdt 3.0在无丢包操作、分组丢失、ACK丢失、过早超时四种情况下的运行流程:
总结
- rdt 1.0:完全正常
- rdt 2.0:可能会出比特差错
- 引入 ACK/NAK 控制报文,重传机制,序号。
- rdt 3.0:可能会丢包
- 引入超时重传机制。
重传是无敌的!!
流水线可靠数据传输协议
因为 rdt 3.0 是一个停等协议,即发送方发送完包之后需要等待接收方的响应控制报文。
这个效率是非常慢的,考虑已知链路带宽R为1Gbps,端到端传播延时T为15ms,分组大小L为1kB。
传输延时为:$$8us$$。
往返传播延时RTT为:$$30ms$$。
利用率为:$$\frac{8us}{30ms+8us}$$ 十分的低效!!
所以考虑流水线:允许发送方发送多个分组而无需等待确认。
但是必须满足:
- 增加序号范围:每个运输中的分组和多个在传输中的未确认报文。
- 发送方和接收方需要缓存分组:发送方需要缓存发送但是没有确认的分组,接收方需要缓存已正确接收但是还没有处理的分组。
对于流水线的差错恢复,可以用回退N步和选择重传进行解决。
回退N步
设定流水线中未确认的分组数不能超过 N。
N 也被称为窗口长度,GBN也被称为滑动窗口协议。
简单来说,就是将 N 个未确认分组看成一个整体(窗口),如果其中一个包丢失了,则整个窗口的包重传。
使用累计确认,即假设发送方接收到对序号为 n 的分组的确认,则表明接收方已正确接收到序号为 n 和 n 以前的包。
下图为 N 为4的一个情况。
选择重传
刚刚的 回退N步 有个很明显的问题,就是假设只有一个包出错了,但是却需要重传全部窗口内的分组。
选择重传的基本思想是只重传可能出错的包。
接收方将确认一个正确接收的分组而不管它是不是按序的(先放到缓存)。
在图 3.26 中接收方初始缓存了分组3 4 5,最后接收到分组 2 之后再一并上传给上层。
需要限制窗口长度小于等于序号空间的一半!!
面向连接的运输:TCP
TCP是面向连接的,这是因为两个应用进程发送数据之前,必须先进行握手。
TCP是点对点的,因为单个发送方和单个接收方。
TCP是全双工的,因为建立连接之后数据可以从任意一方流向另一方。
TCP是流水线协议,有拥塞控制和接收窗口大小。
TCP数据传输流程
- 进程将数据给 TCP 套接字后,TCP 将数据引导至发送缓存。
- TCP 会在合适的时间点从发送缓存中取出数据,加上TCP头部,并传递给网络层。
- 因数据链路层最大传输单元为1500字节,TCP头部和IP头部各需要20个字节,所以最多可取出1460字节的数据。
- TCP 的另一端接收该报文段后,应用程序从接收缓存中读取数据。
TCP报文段结构
TCP报文段由首部字段(20字节)和一个数据字段组成:
源端口号(16位)和目标端口号(16位):
- 源端口号:表示发送数据的进程的端口号,用于标识发送方的应用。
- 目标端口号:表示接收数据的进程的端口号,用于标识接收方的应用。
- 这两个字段共同完成了端到端的通信连接。
序号(32位):
- 用于标识数据字节流中的每一个字节的位置。
- 在连接建立时,初始序列号(ISN)是随机生成的,后续每发送一个字节,序号会递增。
确认号(32位):
- 用于确认接收到的数据,表示期望收到的下一个字节的序列号。
- 例如,如果接收到的最后一个字节的序列号是 100,那么确认号会是 101。
- 只有当 ACK 标志位被设置时,确认号字段才有效。
窗口大小(16位):
- 用于流量控制,表示接收端当前能够接收的最大字节数。
标志位(6位,常用位如下):
- URG(紧急标志):标志该段包含紧急数据,通常不使用。
- ACK(确认标志):标志确认号字段有效。
- PSH(推送标志):表示要求接收方立即将数据交付给应用层。
- RST(重置标志):用于重置连接。
- SYN(同步标志):用于建立连接。
- FIN(终止标志):用于断开连接。
TCP序列号和确认号
最重要的两个部分:序列号、确认号。
TCP 将数据看成一种字节流,所以序列号和确认号是基于字节上定义的,而不是按照报文段的序列。
TCP序号表示的是当前报文段数据部分第一个字节的序号,序列号用于跟踪数据流的顺序和确保数据包的完整性,接收方通过序列号来重新排序数据包,以便正确重组原始数据流。
确认号表示期望收到的下一部分数据的首字节序号,代表确认号之前的数据(不包括确认号本身)已被成功接受。(累计确认)
如下图,第一个报文段的序号为0,第二个报文的序列号为1000…
TCP往返时间的估计与超时(感觉不是重点)
假设你有一个估计RTT的值,并且还有一个测量RTT跟估计RTT的偏离程度的值:偏离RTT。
一般TCP设置超时时间为 估计RTT + 4 * 偏离RTT。
TCP可靠数据传输
TCP在IP不可靠的尽力而为服务之上创建了一种可靠数据传输服务。
TCP的可靠数据传输是一种流水线协议,是GBN和SR两种协议的混合体。
-
TCP采用累计确认(类GBN)
-
TCP使用单个重传计时器(类GBN)
这个重传计时器与最早的未被确认的报文段相关联
-
TCP触发超时重传时只重发那个最早的未确认的段(类SR)
超时间隔加倍
每当有超时事件发生,TCP只重传当前未被确认的最小序号的报文段,然后设置超时间隔为先前值的两倍,而不是刚刚的用估计RTT和偏移RTT所计算的值。
这是因为发生超时事件,意味着网络很堵塞,所以超时时间长点。
快速重传
接收方接收到报文段后,发出ACK有四种情况:
我只分析第一和第三种情况:
- 当接收方接收到期望序号的报文后,选择等500ms再发送ACK,这是因为假设下个期望序号的报文若此时到达,则只需要发送一次ACK(TCP是累计确认)。
- 发送ACK的序号为当前的期望序号。
当发送方根据上面的第三种情况连续收到三次冗余ACK,则意识到这个冗余ACK的期望序号的报文没有成功到达,所以立即重传。
流量控制
主要考虑的是发送端和接收端的速率差太大,即发送方发的很快,但是接收方处理的很慢,并且接收方缓存会慢慢变满。
流量控制服务可以消除接收方缓存溢出的可能。
TCP 让发送方维护一个接收窗口的变量来控制流量,接收窗口可以用来给发送方一个指示–接收方还有多少可用的缓存空间。
这个变量就是TCP头部的窗口大小值。
发送方根据接收到的接收窗口值,调整接下来要发送的数据量。如果接收窗口值较大,发送方可以加快数据发送速率;如果接收窗口较小,发送方会减缓发送速率,甚至停止发送数据,直到接收窗口再次打开。
若是UDP协议,若接收方在缓存中读取数据的速度不够快,则缓存会满,报文段会丢失。
TCP连接管理
主要讲的是三次握手和四次挥手。
刚刚前面有说到,TCP是面向连接的,即发送方和接收方会先进行握手协议。
三次握手
- 第一步:客户端生成 SYN 报文,将 TCP首部的SYN位置 1,随机生成一个初始序号值 X,没有任何数据内容。
- 第二步:服务器端返回 SYN-ACK报文,将 TCP首部的SYN位和ACK位置 1,随机生成一个初始序号值 Y,确认号为 X+1,并且为该 TCP 连接分配缓存。
- 第三步:客户端生成 ACK 报文,将 TCP首部的ACK位置 1,确认号为 Y+1,在客户端分配缓存。在这个时候已经可以携带数据传输了。
为什么不使用二次握手呢?
- 因为可能服务器响应不够快,客户端直接重传了。
四次挥手
- 第一步:客户端生成 FIN 报文,将 TCP首部的FIN位置 1,随机生成一个初始序号值 X,没有任何数据内容。
- 第二步:服务端生成 ACK 报文,将 TCP首部的ACK位置 1,确认号为 X+1。
- 第三步:服务端生成 FIN 报文,将 TCP首部的FIN位置 1,随机生成一个初始序号值 Y,没有任何数据内容。
- 第四步:客户端生成 ACK 报文,将 TCP首部的ACK位置 1,确认号为 Y+1。
需要记得FIN报文和SYN报文是会占据序列号的,ACK报文不会。
TCP拥塞管理
需要在发送方增加多一个变量–拥塞窗口值。
拥塞窗口是发送方维护的变量,表示网络当前能够安全传输的数据量上限。
接收窗口是接收方维护的变量,表示接收方当前能够接收并缓存的数据量上限。
拥塞窗口对一个TCP发送方能向网络中发送流量的速率进行了限制,在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值。
在每个往返时间RTT的起始点,允许发送方向该连接发送cwnd个字节的数据,在该RTT结束时发送方接收对数据的确认报文。因此发送方发送的数据大概为cwnd/RTT 字节/秒。可以调整cwnd的值来控制发送方速率。
这里主要考虑拥塞管理,所以假设接收窗口为无穷大。
TCP发送方定义的丢包事件为:
- 超时。
- 收到三个冗余ACK报文。
拥塞控制算法思想:当TCP发生丢包事件,就减少cwnd的值;如果接收到ACK,就增加cwnd的值(ACK意味着一切安好)。
拥塞控制算法
-
慢启动
在慢启动 阶段,cwnd的值以一个MSS开始,并且每当传输的报文段被确认就增加一个MSS。
在这个过程中,每经过一个RTT,发送速率就会翻倍。
-
若发生超时事件
当出现超时情况后,TCP发送方会把cwnd的大小设置为1并重新开始慢启动过程,同时将慢启动阈值ssthresh设置为cwnd大小的一半,即ssthresh=cwnd/2。
后面当cwnd到达或超过慢启动阈值后,说明此时快要触碰到上限了,继续指数增长过于鲁莽,因此会结束慢启动阶段,进入拥塞避免阶段。
在拥塞避免阶段,cwnd线性增长。当再次发生超时事件,发送方会更新慢启动阈值,将其设置为当前cwnd大小的一半,然后把cwnd的大小设置为1重新开始慢启动,以此类推。
-
若接收到三个冗余ACK
因为这个情况没有超时这么严重,会将慢启动阈值设置为cwnd大小的一半,然后进入快速恢复阶段。
-
-
拥塞避免
一旦进入了拥塞控制阶段,cwnd的值大约是上次遇到拥塞时值的一半,说明距离拥塞已经不远。
TCP选择采用了一种更保守的方式,即每个RTT只将cwnd增加一个MSS。
-
若发生超时事件
若触发超时,会更新慢启动阈值并进入慢启动阶段。
-
若接收到三个冗余ACK
更新慢启动阈值为cwnd的一半并且将cwnd设置为cwnd/2 + 3,进入快速恢复状态。
-
-
快速回复
分成早期版本TCP Tahoe和新版本TCP Reno。
-
TCP Tahoe
将收到三个冗余ACK的事件跟超时事件处理一样,将cwnd设置为1,阈值为cwnd一半,并进入慢启动阶段。
-
TCP Reno
将cwnd设置为cwnd/2 + 3,阈值为cwnd一半,继续拥塞避免阶段。
-
TCP吞吐量
TCP拥塞控制算法是加性增,乘性减的。
假设 W 为拥塞窗口极限大小,每次cwnd的值一到达W就会发生三次冗余ACK。
TCP的发送速率在0.5*W/RTT 和W/RTT 反复横跳。
最终:
TCP公平性
如果K个TCP会话分享一个链路带宽为R的瓶颈,每一个会话的有效带宽为R/K,我们将TCP的这种特点称之为TCP的公平性。
-
我们首先假设两条连接最开始的状态位于A点,此时连接1的吞吐量大于连接2,由于A点位于RR的下方,说明两条连接都处于拥塞控制状态(忽略慢启动)。
-
此时每过一个RTT,两条连接的cwnd都会加一,也就是说此时的状态会由A点45度向右上角移动。
-
当到达B点后,由于B点位于RR上方,超过了带宽的承受能力,两条连接的吞吐量都会回退到原本来的一半(依旧忽略慢启动)。
-
因为连接1的吞吐量比较大,减半后减少的吞吐量会更多,所以会退到C点,然后继续进入拥塞控制状态慢慢移动到D点。
-
以此类推,最终会收敛到两条连接的吞吐量相等的位置。
其他
-
-
TCP的流量控制主要是防止发送方发送的数据量超过接收方的处理能力,避免接收端的缓冲区溢出。
而拥塞控制是防止发送方过快地向网络中注入数据,避免造成网络拥塞。
第四章 网络层(数据平面)
为主机和主机之间提供了逻辑通信。
网络层提供的功能其实就是转发和路由选择。
- 转发(做搬运工):将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。
- 路由选择:指确定分组从源到目的地所采取的端到端路径的网络范围处理过程。计算路径的算法叫路由选择算法,在网络中交换路由信息的通信协议被称为路由选择协议。
网络层可以分解成数据平面(转发)和控制平面(路由选择)。
数据平面
目的是实现转发功能。
每个路由器都有一个转发表。
传统:基于目标地址 + 转发表
- 路由器会检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。
SDN 方法:基于多个字段 + 流表
- 传统方法只使用目标地址进行转发,SDN 方法利用了更多信息(如源IP地址和目的IP地址)。
- SDN 中流表指分组交换机中用于转发的表(即记录流转发方式的表)。SDN使用流表取代传统路由器中的转发表。
控制平面
目的是决定数据报从源到目标主机之间的端到端路径。
传统:分布式计算转发表
- 路由选择算法运行在每台路由器中,并且在每台路由器中都包含转发和路由选择两种功能。
- 一台路由器中的路由选择算法与其他路由器中的路由选择算法通信,以计算出它的转发表的值。
SDN方法:集中计算流表
- SDN 方式下控制平面路由选择功能与物理的路由器是分离的,即路由器选择设备仅执行转发,而远程控制器计算并分发流表。
- SDN 允许网络管理员在不手动处理网络硬件设备的前提下,使用集中化程序重新规划网络,控制复杂网络拓扑以及网络流量。将传统的分布式规则计算演变为集中计算。
SDN 方法了解即可。
网络层提供了单一的服务,称为尽力而为服务。
路由器工作原理
路由器由四个组件组成:输入端口、输出端口、交换结构、路由选择处理器。
-
上方为控制平面,负责路由:运行路由选择算法/协议(RIP、OSPF、BGP) - 生成路由表。
-
下方为数据平面,负责转发:从输入到输出链路交换数据报 - 根据路由表进行分组的转发。
输入端口处理和基于目的地转发
流程:数据链路的帧进入到通信链路输入端口,将帧拆封,在路由器内进行查找(按照转发表选择对应的输出端口)、转发、排队(等待将IP数据包传输到输出端口)。
最长前缀匹配(必考)
在基于目的地转发模式下,我们使用最长前缀匹配规则 来查找路由。
路由器使用分组目的地址(IP)的前缀与路由表中的表项进行匹配。
当有多个匹配时,在该表中寻找最大的匹配项。
例如 11001000 00010111 0011000 11111111,则同时匹配第二项和第三项,根据最长前缀匹配规则,转发至链路接口2。
输入端口缓存
如果来自其他输入端口的分组当前正在使用该交换结构,一个分组可能会在进入交换结构时被阻塞,所以需要存放在输入端口缓存。
交换
交换结构位于一台路由器的核心部位。
有三种方式实现:内存、总线、互联网。
-
内存
该交换结构下,输入端口与输出端口之间的交换是在CPU(路由选择处理器)的直接控制下完成的。
在这种情况下,如果内存带宽为每秒可写进内存或从内存读出最多B个分组,则总的转发吞吐量(分组从输入端口被传送带输出端口的总速率)必然小于B/2,因为每个数据包需要写入和读出这两次操作。
一次只能转发一个分组。
-
总线
该交换结构下,数据报通过共享总线,从输入端口转发到输出端口。
如果多个分组同时到达路由器,每个位于不同的输出端口,除了一个分组外所有其他分组必须等待,因为一次只有一个分组能够跨越总线。
因为每个分组必须跨过单一总线,故路由器的交换带宽受总线速率的限制;
-
互联网
该交换结构下,同时并发转发多个分组,克服单一、共享式总线带宽限制。
纵横式网络能够并行转发多个分组。例如当分组达到端口A,需要转发到端口Y时,交换机控制器闭合总线A和Y交叉部位的的交叉点,然后端口A在其总线上发送该分组,该分组仅由总线Y接收。
而来自端口B的一个分组在同一时间能够转发到端口X,因为A到Y和B到X的分组使用不同的输入和输出总线。
输出端口处理
与输入端口对应,输出端口处理取出已经存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。
缓存并不是越大越好,虽然更大的缓存可以降低路由器的分组丢失率,但是意味着更长的排队时延!!
分组调度
这里跟操作系统的原理一样,我就不细写了。
-
先进先出(FIFO)
-
优先权排队
在非抢占式优先权排队 规则下,一旦分组开始传输,就不能打断。例如在下面的这个过程中,分组1、3和4属于高优先权类,分组2和5属于低优先权类。分组4到达时,分组2正在传输中,分组4不会将其打断,而是排队等待传输,等其传输完成后开始传输。
-
循环排队
传输完类1的一个分组后,开始传输类2的一个分组,然后是类3,以此类推,最后循环到类1。
分组1 2 4属于第一类,分组3 5属于第二类。
-
加权平均排队
在加权公平排队 规则下,分组会被分到不同的类,WFQ调度器也以循环的方式为各个类提供服务。但是由于每个类在任何时间间隔内可能收到不同数量的分组,因此每个类都会被分配一个权w,每一个类在一个循环中获得不同权重的服务量。
每个队列得到的服务时间并不是严格按照权重比例的,因为它不会打断一个分组的传输来开始传输另一个分组。
IPV4
IPV4 数据包格式
- **版本:**占4比特,指ip协议版本号,ipv4分组中此处应为4。
- **首部长度:**占4比特,表示ip首部的长度,以4字节为单位,最小值为5(即20字节)。
- 服务类型:占8比特,用于指定服务质量需求,如延迟、吞吐量和可靠性。
- **数据报总长度:**占16比特,表示整个ip数据报(包括首部和数据)的总长度,单位是字节,最大值为65535字节。
- **标识:**占16比特,用于唯一标识每个ip数据报,在分片传输时帮助分片重组。
- **标志:**占3比特,用于控制数据报的分片行为,包括是否允许分片(df)和是否有更多分片(mf)。
- **片偏移:**占13比特,用于指示当前分片在原始数据报中的相对位置,单位是8字节。
- 生存时间:占8比特,表示数据报的最大生存周期,每经过一个路由器减1,防止数据报在网络中无限循环。
- 上层协议:占8比特,表示数据报承载的上层协议类型,例如tcp(值为6)或udp(值为17)。
- **首部校验和:**占16比特,用于检测ip首部在传输过程中是否损坏,不校验数据部分。
- **源ip地址:**占32比特,表示数据报的发送方ip地址。
- **目标ip地址:**占32比特,表示数据报的接收方ip地址。
- **选项:**可变长度,用于携带额外控制信息,例如路由记录或时间戳,不是必选字段。
- **数据部分:**可变长度,承载实际应用层或传输层的数据内容,其长度等于数据报总长度减去首部长度。
**要记得IP头部至少为20字节!**TCP头部是20字节,UDP头部为8字节。
数据链路的帧的数据部分最大(MTU)为1500字节,如果IP数据包过大则会分片。
假设一个无分片的TCP报文封装的数据帧,至少承载了40字节的首部信息!!
IPV4地址
IP地址是对主机或者路由器与网络的接口的编址,共32位。
IP地址不能唯一的识别设备,MAC地址可以。
子网
一个子网内的节点(主机或者路由器)的IP地址的高位部分相同,这些节点构成的网络的一部分叫做子网,IP地址的高位表示子网部分,低位表示主机部分。
子网内的各主机之间通信无需路由器能直接连通,因为数据链路层连通。
例如为左边的子网分配地址223.1.1.0/24,其中的/24就是掩码,意味着前24个比特组成了子网地址。
划分子网时,将每一个接口从主机或路由器上分开,构成一个个网络的孤岛,每一个孤岛都可称之为子网。以下图为例,将其划分为6个子网,因为每个路由器之间的网络也是一个子网。
IP地址分配
**分类编址:**将IP地址分成A B C三类,三类的网络部分比特分别为8 16 24。
CIDR编址:就是我们现在用的方法,将IP地址用a.b.c.d/x来分类。
获取IP地址
可以从一个大子网(主机比特更多)拆分成多个小子网(主机比特更少)。
将一个 ISP 拆分成了8个子 ISP。可以观察主机部分的比特,原本为12位,拆分之后变成9位,即每个小子网的主机数量是原本子网的1/8。
要记得IP地址全0和全1都是保留的,不可以使用!
- 全1是广播地址。
DHCP(动态主机配置协议)重要
DHCP允许主机自动获得一个IP地址。
使用UDP作为传输层。
DHCP是应用层协议。
除了为主机发送IP地址之外,还会发送网关IP,DNS服务器IP。
DHCP一共有四个流程:DHCP发现、DHCP提供、DHCP请求、DHCP ACK:
-
DHCP服务器发现:新接入网络的主机会尝试获取 IP 地址,它会向网络发送一个DHCP发现报文。该报文是广播报文,目的是寻找网络中可用的 DHCP 服务器。
由于主机在初始阶段还没有 IP 地址,所以报文是从源 IP
0.0.0.0
广播到目的 IP255.255.255.255
。这个过程使 DHCP 服务器得知有新设备需要分配 IP 地址。
-
DHCP服务器提供:DHCP服务器收到一个DHCP发现报文时,会从其可用的 IP 地址池中选取一个地址,并用DHCP提供报文向客户做出回应,告知主机它可以使用这个 IP 地址,该报文依旧使用IP广播地址
255.255.255.255
。 -
DHCP请求:新到达的客户从一个或多个服务器提供中选择一个,并向其发送DHCP请求报文,来告知 DHCP 服务器它选择了哪个提供的 IP 地址。
-
DHCP ACK:当 DHCP 服务器收到主机的请求报文后,会发送一个DHCP确认报文给主机,告知其正式使用提供的 IP 地址及配置信息。
一直都将目的IP设为广播。
网络地址转换NAT
将家庭中的私有地址和公网地址进行映射。
可以实现一块局域网内部的设备公共一个IP地址,而不需要从ISP分配一块地址。
主要是通过NAT路由器的NAT转换表工作!
流程如下:
-
主机
10.0.0.1
向128.119.40.186
,80号端口发送数据报,该数据报的源地址为10.0.0.1
,3345号端口,目标地址为128.119.40.186
,80号端口。 -
该数据报到达NAT路由器后,路由器将其源地址修改为此内网公用的IP地址,并选一个没有被占用的端口号来代表该内网主机,此时数据报的源地址为
138.76.29.7
,5001号端口。 -
然后将这种映射关系记录在NAT转换表中。
-
当NAT路由器收到广域网返回的响应数据报时,该数据报的目标地址为
138.76.29.7
,5001号端口。NAT路由器查找表项后发现,5001号端口对应的是内网的10.0.0.1
,3345号端口。 -
于是将数据报中的目标地址修改为
10.0.0.1
,3345号端口后,发送给对应内网主机。
广域网返回的响应经过NAT路由器更改了目的IP和目的端口!!
IPV6
因为IPV4的32位地址即将用完,所以开发了IPV6,IPV6有128位地址。
IPV6没有分片功能,因为这会增加路由器的工作,不符合复杂事情都在网络边缘干的设计思想。
IPV6数据包格式
-
版本:占4比特,用于表示IP版本号,这里毫不意外地将值设置为6。
-
流量类型:占8比特,相当于IPv4的服务类型字段,用于区分优先级。
-
流标签:占20比特。可以理解为同一个IP发出来的属于同一个会话的数据,可以为其打上同样的一个流标签,试图让网络对同一个流的数据做出同样的处理。
-
有效载荷长度:占16比特,该值作为一个无符号整数,给出了IPv6数据报中在定长的40字节数据报首部后面的字节数量。
-
下一个首部:占8比特,标识数据报中的内容需要交付给哪个协议(如TCP或UDP),使用与IPv4首部中协议字段相同的值。
-
跳限制:占8比特,转发数据报的每台路由器将对该字段的内容减1,如果跳限制计数达到了0,则该数据报将被丢弃。
IPV6头部占了40字节(源地址目的地址一共占了32字节)!
对比IPV4头部内容更加简化了。
IPV4到IPV6的迁移
通过隧道实现,实际上还是一种抽象。
假定两个IPV6节点是依靠IPV4路由器互联的,将依靠的IPV4路由器的集合成为隧道。
在上图中,B和E路由器是同时支持IPv4和IPv6的。
流程如下:
- 借助于隧道,在隧道发送端的IPv6节点可将整个IPv6数据报放到一个IPv4数据报的数据字段中,进行运输。(IPv6此时很像传输层协议)。
- 隧道接收端的IPv6节点最后收到该IPv4数据报,并确定其包含一个完整的IPv6数据报(通过观察IPv4数据报中的协议号字段是41)后,从中取出IPv6数据报,继续为其进行路由。
SDN
这里我就简单的描述概念。
主要思想是因为传统的路由选择算法是只依靠目的IP这个单一的信息进行计算,并且是每个路由器自己独立、分布式计算的,而我们想利用更多的信息(例如源IP和传输层源端口和目的端口)来进行路由,并且希望是由一个远程控制器来计算路由,路由器只负责转发。
-
更多的信息也被称为流。
-
实现了控制平面和数据平面的分离,传统的方法路由器需要计算转发表(路由)和进行转发。
第五章 网络层(控制平面)
本章的目标是学习路由器中的转发表和流表是如何计算的。
完成这个工作有两种实现方法:
-
每路由器控制:
在每台路由器中运行一种路由选择算法,每台路由器都包含转发和路由选择功能(即数据平面和控制平面没有独立)。
路由器之间会进行通信。
-
逻辑集中式控制:
控制器计算并分发转发表给每一台路由器,每一台路由器都只负责转发功能(实现数据平面和控制平面的独立)。
路由器之间不会进行通信。
路由选择算法
目的是从发送方到接收方的过程中找到一条具有最低开销的路径。
路由选择算法可以根据输入分为集中式路由选择算法 和 分散式路由选择算法。
- 集中式路由选择算法:所有的路由都拥有完整的全局拓扑信息,这样的算法被称作链路状态算法。
- 分散式路由选择算法:路由器只知道与它有物理连接关系的邻居路由器,和到相应邻居路由器的代价,通过迭代计算过程以及与相邻节点的信息交换,一个节点逐渐计算出到达某目的节点或一组目的节点的最低开销路径,这样的算法被称为距离向量算法。
路由选择算法也可以根据算法是静态的还是动态的进行分类:
- 静态路由选择算法: 路由随时间的变化非常缓慢,通常是人工进行调整;
- 动态路由选择算法 :会随着网络流量负载或拓扑发生变化而改变路由选择路径。
链路状态路由选择算法 LS
因为输入就是全局拓扑(代价),每个路由器使用 Dijkstra 算法来计算自己到每个节点的最小代价,计算自己的路由表。
对上图的 u 节点进行 Dijkstra 算法如下,详细这里就不写了。
路由选择的振荡
每次执行一次LS算法,最短路都会发生改变。(这个有点太细了)

距离向量路由选择算法 DV
每个节点维护一张路由表,跟邻居交换路由表,根据交换后的信息,计算最低代价并且更新自己的路由表。
计算最低代价与 Bellman-Ford 方程相关:
下图有一个书本的例子:

DV算法流程:
- 一开始每个路由器的路由表只有自己到自己邻居的代价。
- 跟邻居互相交换信息(传送自己的距离向量给邻居),并将邻居的信息加入路由表并计算自己的距离向量。
- 如果自己的距离向量因为邻居的信息而变小,将更新后的距离向量发给邻居。只有在自己的最低开销改变,才会发送距离向量给邻居!!
- 直到无更新为止。
链路开销改变

情况 a:
- t0时刻:y发现链路状态更新,更新其距离向量,并发送给邻居。
- t1时刻:z发现到x的最小代价减少,更新其距离向量,并发送给邻居。
- t2时刻:y收到z的更新,但y自己的最低代价没有改变,所以算法停止。
情况 b:
- t0时刻:y发现链路状态更新,更新其距离向量到x的距离有6(因为它知道z可以以代价5到达x),发送给邻居。
- t1时刻:z收到y的更新,并更新其距离向量到达x的距离为7(因为z直连到x需要50,但y到x只需要代价6)。
- t2时刻:y收到z的更新,并将自己的距离向量改为到x的距离为8…
- t3时刻:z收到y的更新,并将自己的距离向量改为到x的距离为9…
- …
- 直到当z经由y到x的距离大于50(一共需要44次迭代!!)
这个问题就是路由选择环路。
解决方法就是增加毒性逆转,即类似z通过y到达x,则z告诉y自己是没有直连到x的。
LS和DV路由选择算法的比较
LS算法是全局性的,DV算法是分布式的、局部的。
- 报文复杂性:LS更复杂,因为要有全局信息。
- 收敛速度:LS收敛更快,DV可能遇到路由选择环路。
- 健壮性:LS健壮性更好。
自治系统内部的路由选择(必考)
自治系统
自治系统通常由一组处在相同管理控制下的路由器组成。
在相同AS中的路由器都运行相同的路由选择算法并且拥有彼此的信息。
在一个自治系统内部运行的路由选择算法叫做自治系统内部路由选择协议。
下面的两个算法都是iBGP。
RIP
其实书本上没有RIP,但我怕考到就RIP了,所以还是简单的写一下。
RIP是一种基于距离向量的路由选择协议,RIP以 跳数 作为代价,每经过一个路由器就加一。RIP允许一条路径最多只能包含15个路由器,距离16相当于不可达,每个DV通告最多可以包含 25 个目标网络。因此RIP只适用于小型互联网。
OSPF(必考)
基于链路状态算法实现的,使用泛洪链路状态信息和 Dijkstra 最低开销路径算法。
使用OSPF时,路由器向整个自治系统内的路由器广播路由选择信息和链路状态信息。
OSPF的优点:
- 安全
- 负载均衡
OSPF 可以分层(一个主干区域和多个非主干区域),并且每个区域运行自己的OSPF链路状态路由选择算法。
但是主干区域一定包含本AS中所有的区域边界路由器。

- 区域边界路由器(area border router)负责连接多个区域,并在不同区域之间传播路由信息。
- 骨干路由器(backbone router)仅在骨干区域内,运行OSPF路由。
- 边界路由器(boundary router)用于连接其他的AS。
AS中的区域间的路由器传输流程如下:
-
分组先到达自己区域的区域边界路由器
-
通过主干区域到达目的区域的区域边界路由器
-
到达目的路由器
在每个区域内的路由器都知道自己去往自己边界路由器的最短路径!
ISP 之间的路由选择:BGP(必考)
刚刚分析的是AS内部的路由选择协议,现在考虑AS之间的路由选择协议。
在因特网中,所有的AS间都运行边界网关协议BGP。
BGP实际上是DV距离向量算法,但是它不只记录了代价和下一跳路由器,还记录了详细路径(AS序号的列表)。

考虑上图:我们可以将AS间的路由器分成网关路由器和内部路由器。
还有一些简单的术语定义:
- 外部BGP(eBGP):跨越两个AS的BCP连接。
- 内部BGP(iBGP):在相同AS中的两台路由器之间的BGP连接。

一个简单流程:
- 网关路由器3a先向网关路由器2c发送一个eBGPb报文“AS3 x”,表示x存在且位于AS3中。
- 网关路由器2c然后向AS2中的所有其他路由器(包括网关路由器2a)发送iBGP报文“AS3 x”。网关路由器2a接下来向网关路由器1c发送一个eBGP报文“AS2 AS3 x”,报文中包括了AS序号形式的到达x的详细路径。
- 最后网关路由器1c使用iBGP向ASI中的所有路由器发送报文“AS2 AS3 x”。
- 在这个过程完成后,AS1和AS2的每个路由器都知道了x的存在并且也都知道了通往x的AS路径。
确定最好的路由
还要介绍一些BGP属性,其中两个最重要的属性是 AS-PATH 和 NEXT-HOP 。
-
AS-PATH 属性包含了该通告已经通过的AS列表,例如下图中,AS1到子网x有两条路,一条使用AS-PATH“AS2 AS3”,而另一条使用AS-PATH“AS3”。
该属性还可以用来检测和防止通告环路,如果一台路由器在路径列表中看到了包含自己的AS,它将拒绝通告。
-
NEXT-HOP 是AS-PATH 起始的路由器接口的IP地址,例如下图中的2a和3d分别是从AS1到x的两条路径的NEXT-HOP。

这里每条BGP路由包含3个组件:NEXT-HOP,ASPATH,目的地前缀。
可以把每个 x 看成一个子网,目的地前缀就是子网的网络部分。
热土豆路由选择
基本思想:尽可能快地将分组送出其AS,就像丢烫手的土豆一样。
选择具备最小内部区域代价的网关作为往X的出口。
以上图中的1b为例,如果想到达子网x,它可选的两条路径的NEXT-HOP分别为2a和3d。因为1b到达2a的最短距离为2,到达3d的最短距离为3,因此选择到达NEXT-HOP开销更小的路径“AS2 AS3”。
但是很明显,送往3d开销会小一些。
路由选择算法
简单的来说,就是路由器被指定一个本地偏好值的属性,使得将分组送往本地偏好值最高的路由。
若几个路由器都有最高的本地偏好值,再利用DV向量算法来选择路由。(这里使用的距离是AS间的跳数)
最后使用热土豆路由选择算法。
SDN 控制平面
前面已经简单介绍了。
路由控制平面实现转发表和流表的计算可以分成每路由器控制和逻辑集中控制。
SDN是逻辑集中控制的。
ICMP(我觉得重点)
ICMP中文名为因特网 控制 消息 协议。
目的是被主机和路由器用来彼此沟通网络层的信息。
因为ICMP报文是作为IP有效载荷承载的,就像TCP与UDP报文段作为IP有效载荷被承载那样,所以ICMP是运输层的(这里有歧义)。
使用UDP作为运输层协议。(所以我说有歧义)

记得ping请求报文的类型是8编码为0。
ping响应报文的类型是0编码为0。
ttl过期报文的类型为11编码为0。
tracert 原理:
- 从源主机向目的主机发出一系列具有不可达UDP端口号的报文,并且TTL从1,2,3…逐渐上升,并且对每个报文开始计时。
- 当路径上的路由收到该报文,并检查TTL值,发现过期,就向源主机发送ICMP(类型11编码0TTL过期)报文。
- 因为ICMP报文会有IP地址,这样源主机就可以得到整条路径上的路由器IP和RTT了。
- 当报文到达目的主机时,因为报文是具有UDP不可达端口号的,所以目的主机会向源主机发送ICMP(类型3编码3)报文,这样源主机就知道哪个是目的主机的IP了。
实际上,tracert是每个TTL值发送3个分组,即10跳有30个分组!!
网络管理 SNMP(了解概念)
简单网络管理协议 SNMP 是一个应用层协议,用于管理服务器和被管设备的网络管理代理之间。
网络管理代理实际上是运行在被管设备的一个应用,用于跟SNMP管理服务器通信。
SNMP 一共有两种模式,一种是请求响应,一种是陷阱报文(中断)。
-
请求响应
SNMP管理服务器定时向网络代理发送请求(类似问你还好吗),代理再响应(类似说我很好)。
-
陷阱报文
聪明的你一定可以想到,管理服务器需要定期向网络代理发送"关怀"报文,这太麻烦了和浪费资源了。所以参考操作系统的中断概念,只有当被管设备自己出现问题的时候,网络代理才会向管理服务器发送陷阱报文,提示管理服务器要管管自己了。
其他
可以刷作业12到15题。
第六章 链路层和局域网
通信链路一般分两种,分别是点对点链路和广播信道。
-
点对点链路
定义: 点对点通信链路指的是两个网络设备之间的直接连接,数据只能在这两个设备之间传输。
适用于长距离通信和企业内部两个办公室之间使用专线连接。
1
设备A <----点对点链路----> 设备B
长距离通信不适合广播信道因为可能会发生很多碰撞。
-
广播信道
定义: 广播信道通信链路指的是多个网络设备共享同一传输介质,数据在该介质上以广播方式传输,所有连接在该信道上的设备都能接收传输的数据。
适用于以太网和无线局域网。
1
2
3
4
5设备A
\
\--- 广播信道 --- 设备B
/ /
设备C 设备D前面有讲到,同一个子网内的分组可以直接传送,这是因为它们使用了广播信道,。
定义一些术语:
- 节点:运行链路层协议的一切设备。例如主机,wifi接入点,路由器,交换机。
- 链路:沿着通信路径连接相邻节点的通信信道。
- 在通过特定的链路时,传输节点将数据报封装在链路层帧中,并将该帧传送到链路中。
为了将一个数据报从源主机传输到目的主机,数据包必须通过沿端到端路径上的各段链路传输。
数据链路层概述
数据链路层提供的服务
链路层是为节点与节点之间提供逻辑通信的;网络层是为源主机和目的主机提供逻辑通信的;运输层是为源主机上的进程与目的主机上的进程提供逻辑通信的。
提供的具体服务如下:
- 封装成帧
- 链路接入
- 可靠交付
- 差错检错和纠正
链路层的主体部分实在网络适配器中实现的,也被称为网络接口卡,就是我们通常说的网卡。网络适配器实现链路层功能和相应的物理层功能。

差错检测和纠正技术(重点)
在发送节点,为了保护比特免受差错,使用差错检测和纠正比特(EDC) 对数据D进行增强,D即为我们需要保护的数据,它不仅包括从网络层传递下来的数据报,还包括链路帧首部中的链路级的寻址信息、序号。
接收方的任务是在只接收到D’和EDC’的情况下,确认D’和D是否相同。

要记得:检测出差错一定错!!未检测出差错不一定对!!
使用三个方法来检测差错:奇偶校验、检验和、CRC。
奇偶校验
使用单个奇偶校验位。
- 偶校验方案:使得整个帧中(原始数据加上奇偶校验位)的"1"比特数量为偶数。
- 奇校验方案:使得整个帧中(原始数据加上奇偶校验位)的"1"比特数量为奇数。
只能检验出现奇数个比特出错。

为了能够查询出错误并且纠正,将 D 中的 d 个比特划分成 i 行 j 列,并且对它的每一行计算奇偶校验值(一共有i+j+1个),这个方案称为二维奇偶校验。

检验和方法
跟运输层的实现方法一样,将数据 D 拆分成 16 个比特的序列处理,将整个序列加起来(记得回滚)并取反码就是检验和。
检验和方法开销比较小(检验和字段只需要16个比特),但是提供的差错保护没有CRC好。
为什么运输层常用Checksum,但是链路层常使用CRC检测差错呢?
因为运输层有一部分是通过系统的软件实现的,所以采用简单而快速的Checksum方法来检测是很重要的。并且链路层的CRC检验在网络适配器中有专门的设计,可以更快的计算CRC。
循环冗余检测(CRC)(必考)
首先,先介绍一下模2运算,所有的CRC计算都采用模2运算:
加法不进位,减法不借位,位与位之间无关。这意味着加法和减法是相同的,这种操作等价于异或(XRO)。

CRC 编码的操作如下:对于一个 d 比特的数据D,在发送前,发送方和接收方先约定一个 r+1 比特模式,称为生成多项式(G),要求 G 的最高有效位为 1。
发送方要选择 r 个附加比特 R,并将他们附加到 D 上,使得得到的 d+r 比特模式用模 2 算术恰好能够被 G 整除。

接收方进行差错检测:用G去除接收到的 d+r 比特,如果余数非零,则说明出现了差错,否则认为数据正确而被接收。而所有的 CRC 计算均采用模2运算来计算。
通常会给定 G,因为 G 是 r+1 位的,所以可以计算出 r。再根据以下公式计算出 R 的值。
下图是一个例子:
给定 G 为 1001,即 r 为 3。

因为要求 R 是 3位 的,所以要在余数前面补上 0。
每个CRC检测都能检测出最多 r 比特的差错!!
多路访问链路和协议(重点)
前面提到网络链路有两种类型:点对点链路和广播链路。
- 点对点链路 由链路一端的单个发送方和链路另一端的单个接收方组成。点对点协议(point-to-point protocol,PPP)和高级数据链路控制(high-level data link control,HDLC)便是为这种网络链路设计的协议。
- 广播链路 能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。这里的广播意味着任何一个节点传输一个帧时,信道都会广播该帧,每个其他节点都会收到一个特定的副本。传统的以太网和无线局域网都是广播链路层技术的例子。
在广播链路中应该如何协调多个发送和接收节点对一个共享广播信道的访问,我们将其称为多路访问问题。
在广播链路中,当多个节点同时传输帧时,传输的帧会在所有的接收方处碰撞。当碰撞发生时,接收节点无法有效地获得任何传输的帧。多路访问协议 便是用来解决这种问题的。
多路访问协议划分为三种:信道划分协议、随机接入协议、轮流协议。
信道划分协议
可以根据时间(时分多用TDM)和频率(频分多用FDM)来划分信道。
假设一共有N个节点以及信道的传输速率为 R bps。
-
时分多用
将时间划分成时间帧,并进一步将每个时间帧划分成N个时隙。
然后平均将每个时隙分配给一个节点。
消除碰撞,并且十分公平。
但问题是假设只有一个节点需要发送帧,可是它的速率被限制成R/N。并且还需要等待到自己的时隙才能发送。
-
频分多用
在信道划分成多个频段(带宽为R/N),并将频段平均分给每个节点。
但问题还是假设只有一个节点需要发送帧,可是它的速率被限制成R/N。
-
码分多址 CDMA
简单来说,就是对每个节点要传输的帧进行不同的编码,然后接收方再解码。
如果精心选择编码的话,可以实现不同的节点同时发送,并且相对应的接收方可以正确接收发送方编码的数据比特。
随机接入协议(重点)
在随机接入协议中,一个传输节点总是以**信道的最大传输速率(R)**来进行发送。
当发生碰撞之后,它在重发该帧之前等待一个随机时延。
时隙ALOHA
在分析之前,需要进行一些假设:
- 所有数据链路帧是等长的。
- 时间被划分成相等的时隙,每个时隙刚好可以发送一帧。
- 每个节点只在时隙开始时发送帧。
- 节点是同步的,每个节点都知道时隙何时开始。
- 如果一个时隙中有两个及以上帧碰撞,则所有的节点在该时隙结束之前都能检测到碰撞。
当碰撞发生后,碰撞的节点不会立即在下一个时隙重传,而是在每个时隙开始时以概率P重传,直到成功。

以上图为例,1、2、3号节点在第一个时隙同时发送数据,产生碰撞。
-
第三个时隙,恰巧1、2号节点同时选择重传,再一次发生碰撞,传送失败。
-
第四个时隙,只有2号节点选择重传,成功传输。
-
第六个时隙,1、3号节点同时选择重传,发送碰撞。
-
第八个时隙,只有1号节点选择重传,成功传输。
-
第九个时隙,三号节点选择重传,没有碰撞,成功传输。
时隙ALOHA特点:
- 当信道中只有一个活跃节点,表现很好。
- 但是当信道中有多个活跃节点,容易发生碰撞,“浪费”掉时隙。
- 并且每个节点需要同步。
时隙ALOHA效率:
我们用成功传输的时隙占比来计算时隙ALOHA协议的效率,一个节点成功传输的概率为:
因为有N个节点,任意一个节点成功的概率(实际上是时隙ALOHA的效率)为:
对上式取最大值,可以计算出时隙ALOHA的最大效率为:1/e = 0.37 。
ALOHA
在ALOHA协议下,节点无需在时间上同步,当有帧需要传输时,可以马上传输,如下图所示:

为了使时刻 t0 开始传输的帧正确的传输,在[t0 -1 , t0]这个时间间隔内不能有其他节点开始传输。
其他节点在[t0 -1 , t0]这个时间间隔内不传输的概率为:
则任意一个节点成功传输的概率(ALOHA的效率)为:
对上式取最大值,ALOHA的最大效率为:1/2e ,是时隙ALOHA的一半,这个就是去除同步之后付出的代价。
载波侦听多路访问CSMA(重点)
跟纯ALOHA有点像,但是一个节点在传输前会先侦听信道,如果信道空闲,则传输整个帧,否则推迟传送,等到信道空闲再尝试传输。
使用这种方式,信道仍然会有碰撞,主要原因是因为广播信道的端到端信道传播时延。

t0时刻,节点B侦听到信道是空闲的,开始沿着广播媒体在两个方向上传播它的比特。
在t1时刻,节点D有一个帧需要发送,虽然此时节点B正在传输,但是B传输的比特还没有到达,导致D误认为信道空闲,选择传输比特,最终发生碰撞,导致两个节点传输失败。
很明显广播信道的端到端传播时延对CSMA影响很大,碰撞概率主要由以下因素影响:
- 节点间距离越大,传播时延越大,碰撞可能越大。
- 节点越多,碰撞可能越大。
CSMA/CD
对比载波侦听多路访问CSMA,增加了碰撞检测,即一发生碰撞就停止传输。

CSMA/CD协议的整体运行流程如下:
-
适配器从网络层获得数据报,准备链路层帧。
-
在发送帧前,侦听信道,若信道空闲则开始传送帧,信道忙则等到信道空闲再发送。
-
在传输过程中仍然检测信道,没有检测到冲突则持续发送,直到成功发送完成;检测到冲突则终止传输。
-
终止传输后,适配器根据二进制指数后退等待一个随机时间量,返回步骤2。
二进制指数后退
假设传输一个给定帧,它一共发生了n次碰撞后,节点随机从{$$0,1,2,…,2^n-1$$}选择一个k值,并且等待 k * 512 字节在数据链路层的传输时间。
- 即k的单位是链路层传输512字节的时间。
举个例子:
- 首次碰撞,节点从{0, 1}中随机选择k值,若抽到0,则立刻监听信道;若抽到1,则等待(链路层传输512字节时间)后进行监听信道。
- 第二次碰撞,节点从{0, 1, 2, 3}中随机选择k值…
- …
二进制指数后退算法是分布式的!即每个节点自己算自己的。
CSMA/CD的效率为:
-
d_{prop}$$是传播的最大时间。
轮流协议(了解)
信道划分协议在高负载下是有效和公平的,但是低负载下由于节点速率被限制在R/N,因此效率较低;
随机访问协议在低负载时效率高,单个节点可以完全利用信道带宽,但在高负荷情况下冲突概率大,效率低。
而轮流协议 集成了两者的优点,在低负载和高负载情况下都能有着较高的效率。
分为轮询协议和令牌传递协议。
轮询协议
设置一个主节点,主节点依次询问每个节点,告诉它能够传输的帧的最多数量。
一个节点传输完成后,主节点就会开始询问下一个节点,轮流执行。
存在单点故障问题,一旦主节点故障,整个信道都会变得不可操作。
令牌传递协议
该协议没有主节点。一个称为令牌的小的特殊帧在节点之间以某种固定的次序进行交换。如果某节点持有令牌并有数据要发送,它将占用令牌并发送数据,当发送完成,节点释放令牌并将其传递给下一个节点。
也是一样存在问题,如果令牌传丢了怎么办。
交换局域网
MAC地址与IP地址
-
IP地址是网络层地址,32位(IPv6为128位),是分层的,能够实现路由聚集。用于完成网络到网络的交付。
分层的意思是IP地址可被分成子网部分和主机部分。
-
MAC地址是链路层地址,48比特。是平面的,仅用来区分一个网络内的不同网卡,任何两个网卡的MAC地址都不相同。用于完成一个物理网络内部节点到节点的数据交付。

可以注意到链路层交换机是没有MAC地址的接口的,只有主机和路由器的接口有。
目前可观察到的三种地址:应用层的主机名,网络层的IP地址,链路层的MAC地址。
ARP协议(地址解析协议)重点
目的在IP地址和MAC地址之间进行转换。
接下来解释ARP在一个子网中的使用流程。

如上的一个局域网中每个接口都有一个IP地址和MAC地址,假设主机C想要向主机A发送IP数据报。发送数据报时,主机C除了需要向它的网络适配器提供IP数据报外,还需要提供目的地的MAC地址,然后适配器将构造一个包含目的地的MAC地址的链路层帧,并把该帧发送进局域网。而目标主机MAC地址的获取就是ARP需要完成的任务。
每个主机或路由器上维护着一个ARP表,而主机C上的ARP表可能如下图所示:

可以发现还存储了时间,可能时间久了,就会将该记录从ARP表中去除。
可以看到ARP表上并不包含该子网内的所有主机和路由器,需要查询的目标地址A的MAC地址并不在表项中,那么主机C会向它的适配器传递一个ARP查询分组(包括源和目的地的IP地址和MAC地址),该分组的目标地址为MAC广播地址(即FF-FF-FF-FF-FF-FF),子网内的所有地址都会收到该查询分组。
当主机A收到该查询分组后(分组里有主机A的IP地址),会把自己的MAC地址放在ARP响应分组里,通过标准帧的形式发送给主机C。然后主机C将得到的映射关系存储更新在自己的ARP表中。
ARP查询是广播帧!响应是一个标准帧!!
一般来说,收到一个帧后,网络适配器检查自己的MAC地址是否与目的MAC地址对应,如果不对应则丢弃,对应则接收并处理;但是如果目的MAC地址是广播帧,则所有的网络适配器都会接收并处理。
DNS和ARP的区别:DNS是整个因特网都可以使用,但是ARP只能在自己的子网内(即同个广播信道)使用。
ARP是即插即用的:ARP表是自动生成的,不需要人工配置。
发送数据报到子网之外
刚刚描述了子网内传报的流程,现在观察如何传输到子网外。
考虑下图是由一台路由器互联两个子网形成的简单网络:

假设IP为111.111.111.111
的主机A准备向另一个子网里IP为222.222.222.222
的主机B发送数据报。
-
主机A将数据报交付给它的适配器时,需要指示一个适当的MAC地址。该地址并不是主机B的MAC地址(因为主机B并不在当前子网内),而是下一跳路由器
111.111.111.110
的MAC地址。 -
通过ARP得到该MAC地址后,封装链路层帧(该帧包含了寻址到主机B的IP数据报),并发送出去。
1
2
3
4IP src : 111.111.111.111
IP dest : 222.222.222.222
MAC src : FF-55
MAC dest : BB-4B -
路由器发现该帧是向自己寻址的,于是进行接收,然后解封装。读取到数据报的目标IP后,结合自己的转发表找到转发端口应该为
222.222.222.220
。 -
该端口再把这个数据报进行封装,MAC地址为目标主机B的MAC地址(因为此时已经和目标主机位于同一子网,且依旧使用ARP获得主机222.222.222.222的MAC地址)。
1
2
3
4IP src : 111.111.111.111
IP dest : 222.222.222.222
MAC src : 06-9B
MAC dest : 56-2A
可能你会想主机111.111.111.111一开始是如何获得网关路由器的IP地址的,这是DHCP分配IP地址给主机的时候给的。
以太网
以太网的拓扑结构分成总线拓扑和星形拓扑,若以太网是总线拓扑则是一种广播信道(链路)。
使用总线拓扑的以太网使用CSMA/CD协议解决碰撞。(所以CSMA/CD很重要)

- 目的地址(6字节):适配器只会处理自己和广播地址为目的地址的帧。
- 源地址(6字节):传输该帧到局域网上的适配器的MAC地址。
- 类型字段(2字节):类型字段允许以太网复用多种网络层协议。即类似向目的适配器告知使用了哪个网络层协议。
- 数据字段(46~1500字节):该字段承载了IP数据报,以太网的最大传输单元MTU是1500字节,超过则需要进行分片。数据字段的最小长度是46字节,不足则需要填充到46字节。
- CRC(4字节):循环冗余校验码。
以太网向网络层提供无连接服务和不可靠服务(就算它包含了CRC)。
- 因为即使通过校验,接收方也不会发送确认帧;没通过校验,接收方也不会发送否定确认帧,只是直接丢弃该帧。所以发送方并不知道它传输的帧是否成功达到并通过校验。
- 这有助于降低以太网的复杂度和成本,但可能导致传递到网络层的数据报流存在间隙。UDP会无视这些间隙(导致应用层会看到数据中的间隙),但TCP不会对有间隙的数据报进行确认,从而执行重传。以太网并不知道自己传输的是一个新的数据报还是被重传的数据报。
链路层的东西都有点无脑,只负责做搬运工。
链路层交换机
转发和过滤
-
过滤:决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。
-
转发:是决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换机功能。
交换机的过滤和转发必须依靠交换机表实现。
交换机表的表项包含:
- MAC地址
- 通向该MAC地址的接口
- 表项放在表内的时间

当一个目的地址为DD-DD-DD-DD-DD-DD
的帧从交换机接口 x 到达,交换机用该MAC地址在它的表里进行索引。有3种可能的情况:
- 表中没有该表项:交换机会将该帧广播到所有端口(除了接收该帧的端口x),即将帧转发到除入口端口以外的所有接口。
- 表中有一个表项将该MAC地址与接口 x(即进来时的接口)联系起来:不会转发,而是直接丢弃该帧(避免环路)。
- 表中有一个表项将该MAC地址与非 x 的的接口联系起来:将帧转发到该MAC地址对应的端口,不会进行广播。
自学习
交换机是自学习 的,即它的表是自动,动态和自治地建立的,不需要来自网络管理员和配置协议的任何干预。实现过程如下:
- 交换机表初始为空。
- 对于在每个接口收到的帧,交换机会在其表中存储:
- 源MAC地址。
- 接口信息:将源MAC地址和对应的接口进行关联并记录,以便在之后需要转发到该地址时知道帧应该从哪个接口发送。
- 时间。
- 如果在老化期内,交换机没有收到以该地址作为源地址的帧,就在表中删除这个地址(以这种方式,如果一台主机更换了网卡,那么旧的MAC地址最终会被从该交换机表中清除掉)。
因为交换机不需要网络管理员或用户的干预,因此交换机是即插即用设备。
ARP虽然也是即插即用的,但并不是自学习的。因为ARP的工作依赖于设备主动发送ARP请求来获得地址映射信息,而交换机是被动地从流经的帧中学习。
交换机和路由器的比较

其实我看网上其他人的复习资料,好像到这里就结束了。
虚拟局域网
之前描述的局域网具有以下几个问题:
- 缺乏流量隔离:可以发现经常有广播流量,例如像ARP和刚刚提到的交换机转发功能。为了安全和性能,要尽量减少广播流量。
- 难管理。
这些问题都可以通过支持虚拟局域网的交换机来处理。
简单来说,就是将一个物理局域网划分成多个虚拟局域网。
在一个基于端口区分的VLAN中,交换机的端口由网络管理员划分为组。每个组形成一个VLAN,来自一个端口的广播流量只能到达该组的其他端口。

上图表示端口2-8被分配给了电气工程系,形成电气工程系的虚拟局域网;端口9-15被分配给了计算机科学与技术系,形成计算机科学与技术系的虚拟局域网。端口1和16未被分配,属于一个默认的VLAN。
现在考虑,如何实现来自电气工程系的流量发送给计算机科学系:

使用**VLAN 干线连接(VLAN trunking)**实现。
每台交换机的一个特殊端口被配置为 trunk 端口(左边的16端口,右边的1端口),以互联这两台交换机。
trunk 端口属于任何一个VLAN,发送到其他VLAN的帧都需要发送到 trunk 端口。
发送到 trunk 端口的帧都需要使用扩展的以太网帧格式 802.1Q,增加了**VLAN 标签(tag)**以区分流量属于哪个VLAN。
VLAN 标签由干线发送侧的交换机加进帧中,由干线接收侧的交换机去除。
假设端口2想传送数据包给端口9(上上图)传输流程如下:
-
设备发送数据包:VLAN 1中的设备生成数据帧,并将数据包发送到交换机。
-
交换机识别VLAN ID:交换机检查数据包的来源端口(端口2),并识别该端口属于VLAN 1。
-
数据帧转发到路由器:由于目标设备在另一个VLAN(VLAN 2),交换机将数据包通过Trunk端口转发到路由器。
-
路由器进行路由:路由器检查数据包的目标IP地址,判断数据应转发到VLAN 2;路由器将数据包发送回交换机,同时标记数据帧属于VLAN 2。
-
交换机转发数据:交换机接收数据帧后,将其转发到VLAN 2的目标端口(如端口9)。
多协议标签交换 MPLS(了解)
IP转发需要使用最长前缀匹配,太慢了!
希望能够用一个定长的标签(而不是IP地址)来决定转发的接口。
在以太网首部和IP首部中间增加MPLS标签(首部),因为这个设计,一个MPLS加强的帧只能在两个均为MPLS使能的路由器间传输。

具体例子如下图:
假设 R1 到 R4 都是支持MPLS的路由器。

实现了不必考虑IP首部来决定转发的端口。
数据中心网络
这个真的会考吗… 但是写了作业哎。

- Border Router(边界路由器)
- Access Router(接入路由器)
- Load Balancer(负载均衡器)
- Tier-1 Switches(第一层交换机)
- Tier-2 Switches(第二层交换机)
- TOR Switches(Top of Rack 交换机)
- Server Racks(服务器机架)
数据中心网络中的数据流动可以分为以下两种情况:
从互联网到数据中心内部的服务器
- 边界路由器(Border Router):
- 接收来自互联网的数据包,判断其目标地址。
- 接入路由器(Access Router):
- 将数据包转发到合适的 Tier-1 交换机。
- Tier-1 交换机:
- 将数据包进一步分发到合适的 Tier-2 交换机。
- Tier-2 交换机:
- 将数据包转发到目标服务器机架(Server Rack)上的 TOR 交换机。
- TOR 交换机:
- 将数据包转发到目标机架中的具体服务器。
从数据中心内部的一台服务器到另一台服务器
- 数据包从源服务器发出,经过其所属机架的 TOR 交换机。
- TOR 交换机将数据包转发到 Tier-2 交换机。
- 如果目标服务器与源服务器属于不同的子网,数据包需要经过 路由器,然后进入目标 Tier-2 子网。
- 最终数据包通过目标机架的 TOR 交换机 到达目标服务器。
可以发现鲁棒性很差,所以:

Web页面请求的历程(非常重要 必考必考!!)

首先先明确一个终端上网需要的四个地址:IP地址、子网掩码、网关IP、DNS服务器IP地址。
整体计划:初始化IP,得到网关MAC,得到网站IP,建立TCP连接,发送HTTP请求报文。
这里我直接复制网上找的别人写的流程了:
- DHCP请求报文:连接到网络时,此时这台机子还没有一个IP地址,因此需要得到一个。将该报文段放入UDP报文段,报文目的端口为DHCP服务器,源端口为客户。
UDP报文段放入IP数据报中,目的地址为广播,IP源地址为0.0.0.0。
IP数据报放入以太网帧中,目的地址为广播,源MAC地址为笔记本MAC地址。
将该以太网帧发送到以太网交换机。交换机广播该帧。
路由器在对应的MAC地址接收到了这个帧。抽取出IP数据报,分析广播得知这不是针对自己的特定通信,而是一个需要传递给更高层协议的信息,可能是为了进一步分发到网络上的所有主机,或者是为了执行某些本地处理(如DHCP服务器响应客户端请求)。因此IP数据报继续被分解,得到UDP报文段,得知这是一个DHCP请求。
假设路由器是DHCP服务器,那么会响应该DHCP请求。数据内容为:分配的IP地址,DNS服务器的IP地址,默认网关路由器的IP地址,子网块。生成一个如此的DHCP ACK报文发送回,目标MAC是笔记本的MAC地址。
交换机收到该帧。由于是自学习的,因此转发给笔记本。
笔记本收到该帧,得知IP,DNS,网关,子网块。初始化完成。 - ARP查询:Web浏览器需要生成一个TCP套接字,向谷歌网址发送HTTP请求。为了生成,需要知道网址的IP地址,这需要DNS服务。
生成一个包含DNS请求报文的数据报、以太网帧,打算发送给网关路由器。但是仍然不知道网关路由器的MAC。这需要ARP协议。
ARP查询报文的IP和源MAC已设置好,目的MAC为广播。
网关路由器在收到后发送ARP回复。笔记本收到网关路由器的MAC地址。 - DNS查询:向网关服务器发送DNS查询,目标MAC为网关MAC。
网关服务器收到,根据转发表发送到Comcast网络中最左侧的服务器。
对应服务器收到,根据转发表确定出口,向DNS转发数据报。而转发表已根据域内协议(如RIP,OSPF)以及因特网域间协议BGP填写。
DNS服务器收到,抽取出DNS查询,查找谷歌网址。如果没找到,则向根服务器发送查询。
总之是得到了,然后生成DNS回答报文,放入UDP报文段中,原路返回。
笔记本收到谷歌网址的IP地址。 - TCP协议:同谷歌三次握手,建立TCP套接字。
生成HTTP GET报文,写入套接字,报文段交给IP数据报,发送给谷歌。
谷歌抽取出报文,生成HTTP响应,发送进TCP套接字中。
计算机收到。终于显示了网页。
突然想起来 ack 不只是应用在运输层的要记得。
第七章 无线网络和移动网络
我觉得整章都不是重点,应该只会出判断或者选择,如果出简答的话就考验我的吹牛逼能力了。
无线网络有以下要素组成:
- 无线主机:例如手机,平板。
- 无线链路:主机通过无线通信链路连接到一个基站或者另一台无线主机。
- 基站:负责协调与之相关联的多个无线主机的传输。例如无线接入点。
与基站关联的主机一般称为基础设施模式运行,因为所有网络服务(地址分配和路由选择)都通过基站向无线主机提供。
在**自组织网络(ad hoc)**模式中无线主机没有这样子的设备(基站)与之相连。
无线链路和网络特征
无线链路有一些问题:
- 递减的信号强度
- 来自其他源的干扰
- 多路径传播
信噪比(SNR)是收到的信号和噪声强度的相对比较,SNR越大使接收方更容易从背景噪声中提取传输的信号。
比特差错率(BER),知道有这个东西就行。通常 SNR 和 BER 成反比。

CDMA 码分多址
这也是多路访问协议的信道划分协议的一种。
通过划分编码空间来划分信道。

发送方和接收方先确定一个CDMA编码(code),发送方CDMA编码器的输出就是code乘以Data bits。
解码的时候就是将编码输出乘以code再除以code的长度即可。
就算有其他发送方的比特混在一起也可以分开:

802.11 无线局域网(WIFI)
使用CSMA/CA协议控制无线链路之间的碰撞。
802.11体系结构的基本模块是基本服务器(BSS)。
BSS 包含无线站点和接入点(中央基站)AP。
每个无线站点都有一个 48 比特的MAC地址。

根据之前的定义可以知道,ad hoc是没有基站的。
接下来我们考虑无线站点(手机)如何跟哪个BSS的接入点AP(wifi)相连呢?
首先要知道,当网络管理员配置BSS的时候,会给AP分配一个服务集标识符(SSID)。
例如用手机联网的时候会显示很多wifi供你选择。
为了获得因特网接入,你的无线站点需要与一个AP相关联。关联的意思是这个无线站点只和这个AP发送数据帧,也只有这个AP能够给无线站点发送数据帧。
802.11要求每个AP周期性的发送信标帧(包含AP的SSID和MAC)。
可以通过被动扫描和主动扫描两种方式来建立关联。
- 被动扫描:
- AP周期的发送信标帧
- 主机向选择的AP发送关联请求帧
- 被选择的AP发送关联响应帧
- 主动扫描:
- 主机广播探测请求帧
- 每个AP向主机发送探测响应帧
- 主机向选择的AP发送关联请求帧
- 被选择的AP发送关联响应帧

CSMA/CA
带有碰撞避免的CSMA(载波侦听多路访问)。
这个是碰撞避免,前面讲的以太网常使用的CSMA/CD是碰撞检测。
因为不使用碰撞检测,所以802.11一旦开始传输,就会传输整个帧了。
802.11有确认重传机制。

CSMA/CA 的核心在于通过一系列机制尽量避免碰撞的发生。以下是其基本工作流程:
- 监听信道:
- 设备在发送数据之前,首先监听通信信道。
- 如果信道忙(正在传输数据),设备会等待信道空闲。
- 随机等待(Backoff):
- 如果信道空闲,设备不会立即发送数据,而是等待一个随机时间(称为“退避时间”)。
- 这一机制可以减少多个设备同时发送数据的概率,从而避免碰撞。
- 为什么不使用CSMA/CD,假设信道空闲从忙到空闲的一个情况:多个终端就会同时传送帧,导致碰撞发生。
- 数据传输:
- 如果设备等待后发现信道仍然空闲,则开始发送数据。
- 发送完毕后,接收设备会向发送设备返回一个 ACK(确认帧),表明数据成功到达。
- 重传机制:
- 如果发送设备在一定时间内未收到 ACK,则认为数据包丢失(可能由于碰撞或信道问题),并重新尝试发送数据。
但是802.11还有一个问题是可能会有隐藏的终端,并且随着信号的衰减,两个终端之间互相检测不到对方。

CSMA/CA可以使用RTS(request to send)控制帧和CTS(clear to send)控制帧来预约信道的使用,避免隐藏终端问题:


所以如果判断题问:ack机制只有在传输层才使用是错误的,链路层也有使用。
802.11 帧结构
一共有四个MAC地址段!以太网帧只有两个(源和目的)!!
802.11帧结构的四个MAC地址段:
-
无线站点的MAC地址(源)
-
AP的MAC地址(目的)
-
与该AP相连的路由器的MAC地址。
因为 BSS 可以想象成是子网的一个部分,这个子网经过路由器和其他子网相连接。
其实就是网关的MAC地址。
-
ad hoc自组织网络使用的MAC地址(这里不作讨论)

802.11帧的类型有:信标帧(SSID、MAC)、关联帧、RTS控制帧(预约信道使用)、CTS控制帧(允许信道使用)、ack、数据帧。
在相同的IP子网中的移动性
若两个BSS之间是交换机相连的,则它们属于同一个子网;若是路由器相连的,则它们不属于一个子网(并且移动之后必须在新的子网内获得新的IP地址)。

现在考虑一台主机从BSS1移动到BSS2,两个BSS子网是相同的。
- 随着主机 H1 从 BSS1 移动到 BSS2 的过程中,来自 AP1 的信号会逐渐减弱,而 AP2 的信号会逐渐增强。
- 主机 H1 决定断开与 AP1 的连接并尝试连接到 AP2。
- H1 与 AP2 关联起来后,IP地址不变并且维持正在进行的TCP对话。即移动过程对网络层和传输层的通信透明。
蓝牙
蓝牙网络必须是自组织网络(ad hoc)。