计算机网络(下)

217 阅读1小时+

网络层

网络层的主要任务是实现网络互联,实现数据包在各网络之间的传输,其主要解决网络层向运输层提供什么服务、网路寻址问题和路由选择问题这个三大问题

image-20230725150901032

因特网是目前全世界用户最多的互联网,其使用TCP/IP协议栈,由于TCP/IP协议栈的网络层使用网际协议IP,因此TCP/IP协议栈中的网络层常称为网际层,我们本节通过学习其网际层来学习网络层的理论知识

image-20230725150957620

网络层提供面向连接的虚电路服务和无连接的数据报服务,前者是可靠通信,其由网络来保证,其使用前必须建立网络层的连接,也就是虚电路VC,收发双方沿着已经建立的虚电路来收发分组,目的主机的地址只在建立虚电路时使用,之后每个分组的首部都只需要携带一条虚电路的编号即可,注意虚电路时逻辑上的电路,不是说像电话交换那种实际建立的连接,通信结束之后还需要释放之前所建立的虚电路

image-20230725151348535

而因特网采用的好似无连接的数据报服务,其不需要网络层连接且提供不可靠的传输服务,因特网的核心就是这个服务功能,而处理数据的功能则一般在因特网的边缘,也就是在用户主机和其内部的运输层中

image-20230725151538378

最后我们来看看总结,值得一提的是TCP/IP体系结构的因特网就是提供上面所说的无连接的数据报服务,因此本章我们主要围绕网际层如何传输IP数据报这个主题进行讨论

image-20230725151601363

IPv4

在IPv4就是因特网给每一台主机或每一个接口分配的一个唯一的32比特的标识符,其经过了分类编址、划分子网、无分类编址这三个阶段,我们后续将一个个讲这三个阶段

image-20230725155224832

IPv4是32位比特地址不方便阅读记录和输入,因此采用点分十进制表示方法来表示IPv4地址,将32位比特的分为四组,每四组的数写成十进制形式,中间用.隔开

image-20230725155532199

无符号二进制数转十进制数的方法有很多,比如说可以直接记住每一个符号的数量接着直接拿二进制数对乘,或者直接求差,总是方法很多,自己看吧

image-20230725155754724

十进制转二进制直接一直除于求余数,最后将余数从下到上组合起来就是二进制表达的数

image-20230725160041100

分类编址

先来讲IPv4中的分类编址,A类地址的网络号不用区分,而B类则必定最前位的值为10,C类则是110,D类是1110,E类是1111,只有A、B、C这三类的地址可以分配给网络中的主机或路由器,主机号为全0的地址为网络地址,全1则为广播地址,都不可以分配给主机或接口

image-20230725212947742

A类地址最小的可指派的网络号为1,最大的则为126,当然这是可以指派的,A类地址中可以指派的网络地址为126,可分配的IP地址数量为16777214,A类地址网络地址位数有8位,主机号有24位

image-20230725213939138

B类地址网络号和主机号位数均为16位,其中B类网络号开头必为10,也就是说其可以指派的最小网络为128.0最大网络号191.255,同时其可以指派的网络数量为16384,可以分配的IP地址数量为65534

image-20230725214331289

C类地址的网络号有24位,主机号为8位,最小可以指派的网络号为192.0.0,最大的为223.255.255,其可以指派的网络舒朗为2097152,IP地址数量为254

image-20230725214822993

注意第一个是网络地址,小于127的为A类,128191的为B类,192226的为C类,主机号全为1的为广播地址,A类地址中的127为回环测试地址

image-20230725215306318

0.0.0.0这个地址才存在可以作为源IP地址又不能作为目的IP地址的特性,其他地址的特性下面有表格说明

image-20230725220022605

下题中要注意的是路由器的端口也算一个接口,也是要分配地址的,比如下面的65534正好符合B类地址的IP地址数量,按说肯定是分配B类地址了,但偏偏就还有一个路由器端口需要分配,所以总共就需要分配65535个IP地址,那么就只能分配A类地址给他们了

image-20230725220427578

划分子网

如果说一个网络已经分配一系列的IP地址的前提下,后续又要继续分为几个子网,此时如果继续申请不同的网络地址,即使我们按照尽可能不浪费IP的方法来分配,仍然会造成很多浪费,因此我们可以使用划分子网的方法,将一个网络继续划分为几个子网,这样就不用申请新的网络号,同时还能满足我们的需求

image-20230725225107436

32比特的子网掩码可以用于表明分类IP地址的主机号被借用了几位比特作为子网号,其中用连续的1来对于网络号和子网好,用连续的0对于主机号,对子网掩码进行逻辑运算就可以得知有借用了几位主机号来划分子网

image-20230725225520718

比如下面的例子,我们的子网掩码是255.255.255.128,255在比特位上表示1,说明其对于网络地址的位都是网络号,最后的128转变为二进制形式就是10000000,这说明借用了一位比特作为子网号,此时能划分出的子网数为2^1=2,每个子网可以分配的地址数量为126,幂减1是减去子网号占用的比特位,结果减2是减去网络地址和广播地址

image-20230725225657687

下面的例子也是一样的,从子网掩码就可以得知适合上面一样的情况

image-20230725225806727

那么最终划分为两个网络就有如下所示的数量和表示,可以看到子网号是排在主机号前的,这里我们可以看到原因就是排在前面比较好划分子网,划分次数越少每一个子网越多

image-20230725225939182

下面这题依葫芦画瓢就完了,值得一提的是由于子网掩码借用了两位比特位,所以幂要减去2

image-20230726021308947

下面这题子网掩码计算出的结果是76.0,不过由于广播地址是所有值都要为1,所以子网掩码的值夜应该一同变化为最高表示也就是79

image-20230726021923323

下面是A、B、C三类地址的默认分配子网掩码,可以看主机位默认都是0,也就是不借用,网络号都是1,这个好理解,因为本来子网掩码表示网络位的就是全为1

image-20230726022208294

无分类编址

划分子网在一定程度上的确缓解了因特网发展中遇到的IP地址利用率低的困难,但是仍然不足够,其无法对数量巨大的C类网实现进一步的利用,因此在1993年,提出了无分类域间路由选择CIDR,简称塞得

image-20230726024435596

其摒弃了传统的ABC类地址和划分子网的概念,采用斜线记法(简称CIDR记法),在IPv4后面地址加上/,在/后面写入网络前缀所占的比特数量,其他的便是主机号所占的比特数量

image-20230726024550234

比如在下面的例子中,我们知道前20位表示网络位,那么直接将第三位及其之后的数据转化为二进制,就能知道哪些位数表示网络位,哪些表示主机位,同时表示IP地址时,位数的值还是要正常按照值来写的,同时表示的值取决于该位数比特位最终的值,无论是网络位还是比特位的设置导致里面的比特发生了什么变化,反正表示的时候肯定是会正常用十进制表示法将其转换并好好表示的

下面这题中,地址数量就是32个比特减去被网络位占据的位数,就是可以分配的地址数

聚合C类往的数量就是可以分配的地址数量除于C类网可以分配的地址数量

地址掩码就是将所有网络位的值设置为1,主机位设置为0然后使用十进制表示法进行展示

image-20230726024809186

下面这题也是依葫芦画瓢了,我就不多谈了

image-20230726025258557

在无分类编址中有路由聚合,也称构造超网这一概念,可以看到如果说一个主机连接了很多IP,同时和另一个主机相连,此时其要将其连接情况告知R2,如果全部数据都给一个,显然是会影响效率,因此出现了路由聚合这一方法

路由聚合指的是将所有的网络的共同部分提取出来化为一条发送给另一个主机,具体就是将所有比特位相同的位数保留,后面不同的就取0来提取出一个共同的IP地址,同时最后/的位数要是共同提取之后出来的位数,比如下面本来是25的,提取出来之后就只有22了,事实上其位数也的确是22

最后值得一提的是,网络前缀越长地址块就越小,路由就越具体,路由器查表时如果发现有多条路由可选择,会选择网络前缀最长的那条,这成为最长前缀匹配,因为这样的路由更加具体

image-20230726025523985

下面这题中最值得注意的是主机号全为0时表示网络地址,所以要出去这个IP地址分配的主机,还有就是全为1时表示广播地址,其发送帧时所有主机都会接收

image-20230726030147927

最后这题也是一个找共同前缀的题,没什么特别值得说的,自己看吧

image-20230726030719955

应用规划

给主机中的一个大网络划分子网时,有两种划分方法,一种是定长的子网掩码FLSM,另一种是变长的子网掩码VLSM,前者使用同一个子网掩码来划分子网,每个子网所分配的IP地址数量是相同的,容易造成IP地址的浪费,而后者使用不同的子网掩码来划分子网,每个子网所分配的IP地址数量可以不同,能尽可能减少IP地址的浪费

image-20230726033718035

我们先来讲FLSM的方式,我们看到下面的例子中,我们对每个网络都进行主机地址,路由器接口地址、网络地址、广播地址的分析,就可以知道每一个网络需要几个IP地址,注意两个路由器之间也可以理解为是一个网络,我们这里称为N5,对N5我们进行同样的分析也能得到其需要的IP地址数量

image-20230726033859135

然后我们可以知道最大需要的地址数量也就是28个,那么C类IP地址就很非常适合,同时我们借用3个比特作为子网号,那么每个子网最大的地址数量就为32个,这样就能在尽可能减少浪费的前提下满足要求,那么最终的子网掩码借的三位比特用1表示,其他主机位用0表示,最后子网掩码就是255.255.255.224

image-20230726034303170

然后我们可以得到如下的所有可以分配的网络地址

image-20230726034316506

然后从子网1~8中任选五个分配给左边的网络即可

image-20230726034401978

使用上面的这种方式会造成IP地址的浪费,因为这里分配的主机数都只能是2的倍数且都是一样的,也就是说,N5只需要4个IP地址,但是实际还是给他分配了32个,那这样显然就浪费了

接着我们来试试使用变长的子网掩码VLSM,我们这里同样对每个主机进行相同的分析,但是我们这里提前写入其需要的主机号位数,32-主机号位数就是网络前缀位数,地址块数就是网络前缀位数,地址数量就是2的主机号位数幂的结果

image-20230726034528704

然后找出218.75.230.0/24地址块所包含的全部地址,最高就到255,也就是有256个可用地址,我们将这些地址块分配给网络中的N1~N5,分配原则是只能先去整数倍的地址作为起点,同时我们建议先分配网络地址给打的网络块

image-20230726034747750

那么接着我们就可以进行如下的分配,可以看出来还是很简单的,没什么难度

image-20230726035050964

最后我们来看看下面这题,由于答案不唯一,所以就自己看自己做吧

image-20230726035108181

IP数据报的发送和转发

IP数据报的发送包含主机发送和路由器转发两部分,注意我们这里忽略ARP协议和交换机自学习和转发帧过程

image-20230726140655327

注意,在一个网络里两个主机发送数据成为直接交付,在不同网路中两个主机发送数据则称为间接交付

image-20230726140754204

假设C要发送数据给F,首先要判断他们是不是在同一个网络里,那么首先通过将C的IP地址和子网掩码进行相与运算,得到的结果就是其网络地址,然后拿F的地址和C的子网掩码进行相与运算,得到目的网络地址发现并不相等,那么就说明并不是在一个网络里,我们这合理可以看到C的网络地址里最后一位全0,而F的网络地址最后一位的第一个比特位是1,那么就是说明并不在一个网段里,所以要用间接交付

image-20230726140926717

那么间接交付要使用路由器,主机C又如何知道路由器R的存在呢?其实每个主机都有默认主机,这样做是为了方便主机能通过路由器进行数据的转发,所以我们这里左边网络的路由器地址就是路由器R的左端口的网络地址,反之则是右端口的网络地址

image-20230726141043042

路由器收到IP数据报后对检查器是否出错,出错就丢弃,然后根据IP数据报的目的地址查找路由表中是否有匹配的条目,有则转发,无则丢弃

image-20230726141136653

这里我们也是将目的地址和路由器中数据的地址掩码进行相与运算,得到结果如果和目的网络相同则说明就是要往此处转发,就将数据转发到该端口上

image-20230726141958840

如果是要发送广播数据,那么目的地址就直接填写本网络的广播地址即可,那么该数据报会转发到同一个网络的所有主机上,但是到了路由器上就不转发了,这是因为路由器有屏蔽广播的作用,可以将一个广播域分为两个广播域,因此路由器不转发那么广播数据就仅限在一个路由器中

image-20230726142213310

如果说一个广播域中的主机想发送广播帧到另一个广播上,那这个是不可能的,因为会直接给路由器拦截,路由器不会转发来自于一个广播域的广播帧到另一个广播域上

image-20230726142505880

中继器和集线器跟冲突域和广播域都没关系,而网桥和交换机只能隔离冲突域而不能隔离广播域,只有路由器能同时隔离冲突域和广播域

image-20230726142551808

IP路由器工作在TCP/IP体系结构中的网际层,而网际层不负责可靠运输,不确保传输的IP分组不丢失

image-20230726142715379

下面这题我们先把提出给出的信息标注在主机1附近,我们可以看到主机1的WWW服务器是在同一个网络里的,所以可以进行通信,但是其不可以访问Interner,因为其错误将默认网关配置成了DHCP服务器,该服务器不具备路由器功能,因此无法将IP分组转发到Interner中,如果要想要转发,应该要将路由器地址设置为111.123.15.1

image-20230726142923093

最后是本章总结

image-20230726142940649

静态路由配置

静态路由配置指的是用户或网络管理员使用路由器的相关命令给路由器人工配置路由表,这种方式开销小,但是不能及时适应网络状态的变化,还可能会因为配置错误、聚合不存在网络、网络故障等问题导致产生路由环路

image-20230726151039481

在下面的情况中,每个路由器会自动将附近的接口自行添加到路由表中,填入目的网络和发送的接口,这些路由数据称为直连路由数据,而人工添加的路由数据则是静态类型的路由数据,填入的内容则是目的网络地址和下一套的端口IP地址

比如我们下面中的例子中,如果没人工添加路由数据,那R2肯定是转发不了数据给R1的,但是我们添加了之后其就可以根据自己的路由表进行转发了,可以转发到指定的接口中

image-20230726151211185

默认路由指的是当数据报找不到要发送的接口地址时,默认会转发的地址,其目的网络用0.0.0.0/0来表示,其他就自己设置了,比如我们这里假设所有找不到目标具体地址的数据都转发到因特网上,那么我们就配置默认路由的下一跳为10.0.0.2即可,同时这也是一种避免填写多个路由到路由表上的一种策略

image-20230726151534770

同时我们还可以设置特定的主机路由,这个这种路由用于网络管理员的测试,比如下面的例子里我们往R1路由表中设置特定路由,令其可以直接路由到192.168.2.1的主机上,下一跳直接跳到R2主机上,当有罗哥路由可选时,会按照最长前缀匹配选择特定主机路由,因为其网络前缀最长,路由最具体

image-20230726152154721

静态路由配置错误可能会产生路由环路问题,先看下面的路由配置

image-20230726152428939

加入这里错误地将R2的路由表的下一跳设定到R3中,那么R2如果往R1中发送数据,就会直接发送到R3中,然后R3又会根据路由表发送到R2中,R2又发送到R3中,于是产生路由环路问题

为了防止IP数据报在路由环路中死循环,在IP数据报首部都设有生存时间TTL,每进入一次路由器器字段值就-1,不为0就会被路由器转发,反之则丢弃

image-20230726152540584

聚合不存在的我哪里过也可能会导致路由环路,比如下面R2中聚合了一个环路

image-20230726152839554

如果说要转发数据到环路中存在的网络,那自然是可以正常转发的

image-20230726152921105

但是如果说要传输数据都到聚合网络中不存在的网络,那么就会导致R1找不到目标网络而走默认路由,最后回到R2,然后两个路由器搁那套娃

image-20230726153040936

为了解决该问题,我们可以将不存在的网路也记录到路由表中,下一跳用null0表示,称为黑洞网络,简单来说就是数据如果选择了此条转发路径进行转发,那么路由器就会直接抛弃该数据包

image-20230726153129360

网络故障有时也会导致路由环路,比如R1中的某一个链路出现了故障,导致其路由表中删去了该记录,那么当R2想要传送数据到R1到故障IP地址时,其就会因为找不到而走默认路由重新把数据转发给R2,那这样就又套娃了

image-20230726153249492

为了解决这个问题,可以让出故障的IP地址所绑定的路由中的路由表上也加入一个对于地址的黑洞路由,这样谁发送数据到这个IP地址上就可以直接丢弃该数据了

image-20230726153346871

路由选择协议

路由选择方式有静态路由选择和动态路由选择两种方式,前者属于人工配置,其有方式简单,开销小的有点,但是其不能适应网络状态的变化,一般只在小规模网络中采用,而后者是路由器通过路由选择协自动获取路由信息,缺点是实现复杂且开销大,但是能较好适应网络状态的变化,一般用于大型网络

image-20230726163355746

因特网中采用的路由协议的特点有自适应、分布式、分层次这三个特点

image-20230726163634206

分层次的路由协议可以让网络进一步划分为一个个自治系统,自治系统AS内部的协议称为内部网关协议IGP,比如说像是RIP协议,而两个自治系统连接时用到的协议称为外部网关协议EGP,比如像是BGP协议

image-20230726164001298

场景的路由选择协议分为IGP和EGP,EGP下只有一个BGP协议,而IGP下有RIP、IGRP、EIGRP、OSPF、IS-IS这些协议

image-20230726164105636

路由器结构分为分组转发部分和路由选择部分,分组转发部分内有转发表,且左右两侧都分别有不同层次的输入端口和输出端口

image-20230726164542200

数据发送到路由器中通过输入端口进入到路由器,拆分到网络层时进行对于处理之后交由给输出端口继续封装之后发送,如果这个包是另一个路由器发送的路由包文,那么其会将路由报文先进行路由选择处理机之后更新路由表,然后路由表会定期更新转发表,之所以会更新是因为转发表是通过路由表得出的

注意转发表的结构应当使得查找路由的过程最优化

image-20230726164838687

同时路由器中往往会有输入缓冲区和输出缓冲区,输入缓冲区用于存放接受了之后还来不及进行处理的数据报,输出缓冲区用于存放处理之后来不及发送的数据报

image-20230726165006796

注意,其实在路由器中无论是输入端口还是输入端口都是可以实现输入输出的,我们这里将其分开主要还是为了方便理解,不要真以为就是一边只能输入一边只能输出了

路由信息协议RIP

路由信息协议RIP内部网关协议中最先得到广泛应用的协议,其要求每个自制系统AS中的每个路由器都要维护其自身到AS其他每一个网络的距离,一组距离称为距离向量D-V,其使用跳数作为到达目的网络的距离,与直连网络的距离为1,经过非直连网络的距离为所经过的路由器+1,同时当距离不小于16时标记为不可达,因此,RIP只适用于小型互联网

image-20230728023617822

RIP认为好的路由就是距离短,不会管带宽大小一类的问题,入股有 两条路由距离相等,那么会进行等价的负载均衡,RIP协议中路由器周期性地和相邻路由器交换自己的路由表信息,比如说30s交换一次

image-20230728024036275

下面是RIP的基本工作过程,最开始其可以知道所有直连的网络的距离,刚开始的距离都为1,后续进行了若干次更新之后每个路由器就知道到达自己所处的网络内所有可到达的网络的路由了,这个过程称为收敛

image-20230728024141534

接着我们来讲其具体的更新规则,比如说路由表D原先拥有如下的路由表,此时C的路由表也有自己的内容,这里我们这里的下一跳都写?是因为D根本就无需关心其他路由表下一跳的数据,之后C将其自身路由表发送到D之后,D将所有的下一跳都改为C,然后距离都+1,因为C能到达,那么作为相邻路由器的D必然能到达,所以就给距离+1,下一跳直接都是C,如果走C的路由的话

image-20230728024427081

这时D就根据C的路由表进行更新,如果目的网络和下一跳都相同,说明此路由的拓扑发生了改变,此时进行更新,如果发现了新的目的网络,直接更新,发现到达目的网络的距离不大于自己的网络,那么都进行更新

image-20230728024445497

然后我们根据上面的案例再来做下面这一题

image-20230728024736491

下面是解答,自己看吧,没啥值得说的

image-20230728024750603

下面这题也是非常简单,距离大于15了,那当然是不可达了

image-20230728025023876

RIP存在坏消息传播慢的问题,这个问题会造成路由环路,这个问题是距离向量算法的固有问题,我们可以采取限制最大路径、采用触发更新或水平分割的方式来减少出现该问题的概率或者减少其危害,但是无论怎样都只能尽可能减少这个问题而无法解决这个问题

image-20230728025309443

开放最短路径优先协议OSPF

开放最短路径有限OSPF是公开发表的为了克服RIP缺点而诞生的协议,其使用Dijkstra的最短路径算法SPF作为基础开发而成,其基于链路状态进行路由状态的记录,采用SPF算法保证不会产生路由环路,不限制网络规模的同时还有具有极高的收敛速度

image-20230728031813074

其链路状态包括相邻的路由器和链路的代价,其计算方式是100Mbps/链路带宽,如果值小于1,则记为1,大于1且有小数的就舍去小数,其他不变

image-20230728031924424

OSPF协议下的相邻路由器之间要发送问候(Hello)分组用于建立和维护邻居关系,Hello分组封装在IP数据报中,发往主播地址224.0.0.5,其周期为40s,同时如果40s内没有收到邻居发送的问候分组,则认为该邻居路由器已经因为各种原因“死亡”了

image-20230728032052143

在OSPF协议下,每个路由器都会产生链路状态通告LAS,其包括直连网络的链路状态信息和邻居路由器的链路状态信息,LAS被封装到链路状态更新分组LSU中,采用洪泛法发送,洪泛和泛洪还有广播都是一个意思,轮着用而已

image-20230728032253862

在OSPF协议下每个路由器都有链路状态数据库LSDB用于存储LSA,同时各路由器会通过泛洪发送自己的LSU分组,最终各路由器的LSDB会达到一致

image-20230728032426212

使用OSPF的各尤其可以基于LSDB使用SPF算法计算出到达其他各路由器的最短路径

image-20230728032728082

OSPF有五种分组类型,分别是问候分组、数据库描述分组、链路状态请求分组、链路状态更新分组和链路状态确认分组

image-20230728032807862

比如在下面的两个路由器中,其首先发送分后分组来进行邻居路由器的维护,后续发送数据库描述分组向邻居分组描述自己所有状态项目的摘要信息,而R1发现有些R2的链路状态对于他而言并不是很明确,因此其发送链路状态请求分组用于向R2请求一些特定链路的信息,R2收到后发送链路状态更新分组给R1,也就是将当前的分组信息通过洪泛法再一次发送到R1中,R1收到后发送链路状态确认分组给R2告知其已经收到其发送的更新分组

同时每30分钟或者是链路状态发生变化时,路由器都会通过泛洪发送链路状态更新分组给其他邻居路由器

image-20230728033019281

OSPF为了减少发送的路由数据,会采取选举方式在一个网络中选举出一个指定路由器DR和备用的指定路由器BDR,所有的非DR/BDR路由器只能与这个两个选举出来的路由器建立邻居关系,这样就可以减少邻居的数量,实现减少发送数据的目的

image-20230728033148129

为了使得OSPF能过适用于规模巨大的网络,OSPF会把一个自治系统再划分为多个更小范围的区域,用32位比特位表示区域地址,其分为主干区域和非主干区域,主干区域用0.0.0.0表示,其他区域随意表示,只要符合表示区域的规则即可

主干区域的路由器称为主干路由器BBR,其他区域的路由器称为区域内路由器ABR,两个自治区域之间需要路由器连接,那个路由器称为区域边界路由器ABR,主干路由器下有一个用于收发其他区域的路由器,这个路由器称为自治系统边界路由器ASBR

区域的存在可以有效降低邻居路由器的数量,使得泛洪时不会占用太多网络资源,一般区域之间是通过ABR和ASBR之间发送数据来进行区域之间数据的通信的

image-20230728033509380

边界网关协议BGP

因特网之间多个自治系统之间的连通使用边界网关协议BGP

image-20230728041017675

在不同的自治系统内,度量路由的代价可能不同,因此在自治系统之间通过代价来寻找最佳路由是不可行的

image-20230728041229066

而且不同的自治系统之间也可能因为各种原因不让一些自治系统的数据通过,因此BGP只是力求找到一个能到底目的网络且较好的路由(最起码不发生路由环路),而不是说一定会找出一条最佳路由

image-20230728041326524

在配置BGP时每个自治系统管理员需要选择至少一个路由器作为该自治系统的BGP发言人,不同自治系统的BGP发言人要交换路由信息首先要建立端口号为179的TCP连接,利用该连接交换BGP报文来建立BGP会话并交换路由信息,利用TCP连接交换路由信息的两个BGP发言人称为邻站或对等站

image-20230728041526947

BGP发言人会交换网络可达性的信息,交换之后各BGP发言人根据所采用的策略和更新的路由信息找出到达各自治系统较好的路由,较好其实指的就是不存在回路的自治连通图

image-20230728041654234

其适用于多级结构的因特网

image-20230728041733689

BGP协议有四种报文,分别是OPEN打开报文,UPDATE更新报文、KEEPALIVE保活报文、NOTIFICATION通知报文

image-20230728041812474

下面这题就非常简单,两个自治系统之间用BGP协议交换路由信息,BGP协议用TCP协议实现分组传输

image-20230728042014525

下面这题知道BGP用的是TCP协议传输就知道答案了,当然最好还是要记住RIP使用UDP,OSPF使用IP协议来传输数据

image-20230728042123925

IP数据报首部格式

我们这里直接将IPv4数据报称为IP数据报了,方便起见,图中每一行都有32位比特,也就是4字节,每个小格称为字段或域

IP数据报格式中有固定部分和可变部分两个内容,前者占据20个字节,后者占据1~40字节不等,不过一般来说可变部分都基本不用的,我们优先来讲固定部分

首部长度占据斯比特,用于表示IP数据报的首部长度,其单位为4字节,其最小值为5,表示IP数据报首部只有45=20个字节的固定部分,最大取值为15,表示IP数据报首部包含415=60个字节的固定部分和可选部分

填充字段是为了确保首部长度为4字节的整数倍,当数据报大小不为4字节的整数倍时其会使用全0填充至是为止

image-20230728044031035

版本字段占4比特,用于表示IP协议的版本,通信双方所使用的IP协议版本必须一致才可通信,目前广泛使用的IP协议的版本号为4,也就是IPv4

image-20230728044121986

区分服务字段占8比特,用于获得更好的服务,只有在使用区分服务时该字段才其作用,一般情况下该字段不使用

image-20230728044114316

总长度占16比特,用于表示IP数据报的总长度,这里的IP数据报包括了首部和数据载荷

接着我们来讲下总长度和首部长度这两个字段的不同,下图中假设了首部长度和总长度的值,那么我们可以得到首部长度和总长度的字节大小,然后数据载荷长度=总长度-首部长度,我们这里的结果是1000

image-20230728044335538

标识、标志、片位移这三个字段共同用于IP数据报分片,当IP数据报长度超过了最大传输单元MTU时,就需要将数据进行分片分多次传输到目的网络中

image-20230728044430047

标识占16比特,一般来说每个分片数据报都有相同值的标识,而标志占3比特,其中DF位表示是否允许分片(0表示允许,1表示不允许),MF位表示是否是最后一个分片数据,1表示不是,0表示是,片位移占有13个比特,用于支出分配数据报的数据载荷便宜其源数据有几个位置,以8个字节为单位,简单来说就是分片之后的起始位置的比特位除于8就是这个数据的结果了

image-20230728044538371

比如说我们要对下面的数据报进行分片,那么每次就分1400的字节出来,注意分的时候其实我们之分数据载荷这一部分啊,固定首部是不会变的,每一个数据报都会有的,20B的大小,所以我们可以看到总长度总是+20,同时分片分三次我们采用1400来分,分了两次最后分1000,得到的片偏移的结果是整数,说明这样分没有问题

标识则是已知都不变的,MF指的是该数据是否是最后一个分片数据,我们这里当然也是只是最后一个才写0表示这事最后一个分片数据,同时任何数据都是允许继续分配的,所以我们这里所有的数据报的DF位都是0

image-20230728044909037

下面是对一个数据的再分片的练习,都是一样的就自己看吧

image-20230728044943511

生存时间TTL占8比特,最初以秒为单位,最大生存周期225秒,数据报在路由器中存活的时间超过该时间就被抛弃,现在都是用跳数为单位了,每次路由器转发IP数据报时,就会将IP数据报中首部的该字段值减1,若不为0则转发,反之则丢弃

image-20230728045023616

生存时间TTL字段可以减少路由环路带来的危害,防止IP数据报在网络中永久兜圈

image-20230728045140358

协议字段占8比特,用于指定IP数据报的数据部分使用何种协议数据单元,下图中有对于的协议与字段值的对应表

image-20230728045303021

首部检验和用于检验首部在传输过程中出现差错,采用因特网校验和,比CRC校验码简单,不过由于IP层本身不提供可靠传输的服务且由于IP数据报首部和特性导致数据每次进过路由器都需要重新计算取值比较影响传输速率,因此在IPv6中路由器已经不再同计算首部和的功能了

image-20230728045356349

源IP地址和目的IP地址各占32比特,代表什么内容就不用我提了,懂的都懂

image-20230728045419044

下面这题要注意我们算的时候要算到首部有20B,我们分片其实只分1480B的数据载荷,很容易想到的分配当时当然是一次发送800B,但是采用这种方式会发现计算出来的片偏移量并不是整数,因此该分片方案是不可行的

image-20230728050443904

为此我们需要更换分片方案,一种可行的办法是让分配的最大长度可取小于780且可以整除于8的整数,就这样一个个试,试到成功为止

image-20230728050506652

下题我们只要分析出其发送的IP数据报必然要将数据封装成以太网帧就好办了,我们根据图C的以太网帧结构分析出IP分组藏在以太网帧的数据部分,也就是在14B之后的内容就是我们所需要的内容,而图B中一行代表4个字节,所以在目的IP地址前一共有16个字节,所以在以太网帧中一共经过30个字节之后就是我们所需要的内容,那么我们就很容易在图B中分析出前30个字节的内容,后面的四个字节就代表IP地址,就是我们所需要的答案

image-20230728050906076

从图中可知,主机的默认网关就是路由器R,这是当然的,这因为路由器R是距离主机最近的路由器,那么主机会将Web请求发送给默认网关,所以以太网帧头的目的MAC字段就是我们所需要的答案

image-20230728051011090

最后一题也很简单,IP分组经过路由器R时,生存时间肯定会变化、首部校验和会被重新计算,同时我们知道IP分组总长度大于MTU,进行分配会导致总长度、标志和片偏移字段都会发生变化

image-20230728051059975

网际控制报文协议ICPM

为了更有效的转发IP数据报和提供成功交付的机会,网际层使用网际控制报文协议ICMP,用于在主机或路由器上发送差错报告报文和询问报文,这些报文都被封装在IP数据报中发送

image-20230728073327267

ICMP的差错报告报文有五种,分别是终点不可达、源点抑制、时间超过、参数问题和改变路由(重定向)

终点不可达指的是当路由器或主机出于各种原因无法交付IP数据报时,就向发送方发送终点不可达报文,具体还可以细分为各种不同类型的不可达,这里就不详细提了

image-20230728073423670

源点抑制指的是当路由器或主机由于拥塞而丢弃数据报时,向发送方发送源点抑制报文,使得发送方知道路由器整拥塞,应当将发送数据报的速率放慢

image-20230728073518676

当路由器收到一个目的IP地址不是自己的IP数据报会使得TTL字段值减一,当其值为0时无论在哪个主机都会直接放该IP数据报丢弃并向发送方发送时间超过报文,同时当终点在预先规定的时间内无法收到一个数据报的所有数据分片时,会将所有已收到的数据分片丢弃同时往发送方发送时间超过报文

image-20230728073712304

当路游记接收到IP数据报后发现其在传输数据中出现了误码则会丢弃该数据报并向发送方发送参数问题报文

image-20230728073804759

当路由器发现到达目的主机有某一条更好的路径时,会发送改变路由数据包给源主机,指的源主机知道下次使用更好路径来传输到达该目的网络地址

注意,源点源主机和发送方都是同一个意思

image-20230728073849154

对于以下情况不应再次发送ICMP差错报告报文,分别是对ICMP差错报文不发送,对数据分配的后续分配不发送,对具有多播地址的数据报不发送,对具有特殊地址,回环测试地址或网络地址的数据报不发送

image-20230728073920922

常见的ICMP询问报文主要有两种,分别是回送请求和回答,其次是时间戳请求和回答,前者一般用于测试目的站是否可达,后者用于进行时钟同步和测量时间

image-20230728074039085

ICMP的应用有分组间探测PING,这个很简单,直接CMD上调用PING命令就完了,一般用于测试主机或路由器的连通性,其应用层直接使用网际层的ICMP协议使用ICMP回送请求和回答报文

image-20230728074119950

还有跟踪路由traceroute,其可以跟踪从源主机到目的主机要经过哪些路由器并展示其IP地址

image-20230728074317356

其原理是不断发送TTL递增的具有回送请求的数据报到目的主机上,比如说当TTL为1时,那么到达第一个主机时其肯定会因为TTL为0时丢弃该数据报并发送时间超过ICMP报文给源点,然后继续发送,知道到达目的主机时,其会因为收到数据报而向源点发送ICMP回送请求的回答报文,此时源点就知道已经到达了目的主机,直接展示之前得到的所有IP地址即可

image-20230728074445118

VPN与NAT

如果两个不同的网络想要进行通信那么一个最简单方法就是直接租用电信公司的通信线路将这两个网络连接起来,这个方法简单方便,但是成本太高

image-20230728153408609

因此为了解决该问题,虚拟专用网VPN就应运而生,其利用公用的因特网作为专用网之间的通信载体,这种专用网称为虚拟专用网,同时一个机构能申请到的IP地址数量远小于本机构所用于的主机数量,因此虚拟专用网中的各主机所分配的地址应该是本结构可自由分配的专用地址,这个地址是不需要申请的,可以自由使用

image-20230728153448263

专用地址也称私有地址,一般其只在一个网络内部中分配给主机使用,对于公用的因特网,如果接收到IP地址为专用地址的数据报,会直接丢弃,也就是说这种IP地址是无法在因特网中传输的

下面的例子中我们可以看到部门AB都已经分配好了对于的IP地址,同时两个网络都有一个路由器联系因特网,此时如果说部门A中的主机想要访问部门B中的主机,那么首先其将内部的数据封装为一个IP数据报,然后发送到R1中,R1对其数据进行加密之后添加首部信息发送到R2中,然后R2解密之后获得目的私有地址发送到自己的主机上

image-20230728153803640

这种方式虽然利用了VPN技术,但是用户用起来的效果就跟电信直连两个网络的通信一样,因此其又被称为是IP隧道技术

同一机构内的不同部分的内联网构成的虚拟专用网VPN称为内联网VPN,而一个机构的VPN需要某些外部结构参加进来时称为外联网VPN,有时外地工作的员工需要访问公司内部的专用网络,就可以运行VPN软件,这种VPN称为远程接入VPN,我估计平时我用的翻墙软件应该就是远程接入VPN

image-20230728154015251

虽然说因特网已经采取了各种措施来减缓IP地址的耗尽速度,但是仍然不够,因此其除了NAT来缓解该问题,其可以令使用内部的专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源

image-20230728154226207

比如说在下面的情况中,已经分配好了私有地址和路由器中的IP地址,当专用网中的主机想要和因特网上的主机进行通信时,首先将数据封装成IP数据报并发送到NAT路由器中,路由器会修改IP数据报的源地址为其暂时分配的全球IP地址

image-20230728154412998

然后其将内网地址和暂时分配的外网地址记录在路由表中,接着封装为以太网帧之后发送到因特网中,注意以太网帧的源地址和目的地址就肯定是全球IP地址了,要不然路由器看见你数据报含有私有IP地址直接给你扔了,最终就可以通过因特网成功将数据传到目的主机中,而目的主机向源点发送数据时,到达NAT上时,NAT只需要查找路由表的记录就可以知道该公用IP地址对于的私有IP地址是哪个主机,然后就可以将数据正确转发到主机中了

image-20230728154813616

如果同时有两个内网主机想要发送数据到一个IP地址中,那么NAT的路由表就会增添两条记录,所以NAT中只有N个全球IP地址,那么最多只能有N个内网主机可以同时和因特网中的主机通信

image-20230728154911992

由于绝大部分的通络应用都是使用运输层协议TCP或UDP来传输数据,因此可以将运输层的端口号和IP地址一起进行转换,这样用一个全球IP地址就可以令多个拥有私有地址的主机同时和因特网上的主机进行通信,这种转换方式称为网络地址与端口号转换NAPT

目前我们基本都是使用这种技术的,由于我们还没学运输层,因此NAPT我们就不具体讲述了

image-20230728155006247

注意,外网主机是不可以首先向专用网的主机发起通信的,因为其先发起通信的话,NAPT路由器收到外网的IP数据报后在NAPT转换表中找不到记录,所以专用网内的主机不可以充当因特网服务器,因为用户甚至无法访问你,那玩个勾八

对于一些P2P的网络应用需要外网主机主动和内网主机进行通信的,就需要自己使用一些特殊的NAT穿越技术来解决该问题

image-20230728155223234

同时由于NAT对外网屏蔽了内网主机的网络地址,因此也能给内网的主机提供一定的安全保护,比如说想我们使用跟踪IP地址的命令,我们会发现有一些IP地址总是一样的,这种情况就很可能目的主机是内网主机同时使用了NAT,图例的情况很可能内网中还有一个使用时私有IP地址的

image-20230728155307440

运输层

物理层、数据链路层和网络层共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信,但是实际计算机网络的通信的真正实体是位于通信两端主机中的进程,让他运输层就位不同主机上的应用进程提供直接的通信服务,运输层协议又被称为是端到端协议

image-20230729160743524

运输层直接为应用层提供服务,其主要协议有面向连接的TCP协议和无连接的UDP协议,当一个主机的进程需要和另一个主机的进程进行通信时,会通过运输层的端口来对于不同的应用进程,然后通过网络层传输对于的报文,接收时也是一样的,不赘述了

值得一提的是这里的端口并不是指物理端口,而是指用于区分进程的标识,我们称之为端口

image-20230729161347559

端口号、复用与分用

运行在计算机上的进程用进程标识符PID来进行区分,在TCP/IP体系中使用端口号区分不同应用进程,有16个比特,取值范围为065535,端口号分熟知端口号、登记端口号和短暂端口号,其范围分别为01023、102449151,4915165535,熟知端口号一般指派给TCP/IP中最重要的一些应用协议,登记端口号一般为没有熟知端口号的应用程序使用,而短暂端口号留给客户进程暂时使用,一般发请求时就经常用,通信结束后还可以给其他客户进程使用

最后值得一提的是,端口号只具有本地意义,只能用于表示计算机本机应用层中的各进程

image-20230729162617688

接着我们来介绍复用和分用的概念,将应用进程的应用报文封装的过程就称为复用,随着使用协议的不同还有UDP复用和TCP复用,无论是什么数据报最后都要封装为IP数据报,这里称为IP复用,IP复用中有协议字段,当其为6时表示使用TCP协议,为17时表示使用UDP协议,而对于接收方而言,对于的拆包过程就是分用,无非是IP分用,UDP分用,TCP分用这样的情况而已

image-20230729163034789

下面是TCP/IP体系的应用层常用协议下熟知的端口号

image-20230729163230743

最后是一个例子,我们这里要实现用户PC访问Web服务器,那么首先输入域名访问之后先向DNS服务器请求,向DNS请求时使用UDP协议,添加UDP首部内容,源端口从49152~65535中随便选一个往DNS中请求对于网址的IP地址,DNS的端口号为53所以第一次发送时的目的端口为53,UDP收到之后就往把源端口作为目的端口,把需要的数据发送过去,用户主机知道了Web服务器的IP地址之后向Web服务器发送请求,TCP使用的端口是80,所以发送时面对端口填入80,当然这时加入的是TCP首部,因为主机和Web服务器的请求用的是TCP协议

image-20230729164251205

UDP与TCP对比

UDP和TCP是TCP/IP体系结构下运输层中的两个重要协议

image-20230729170925841

UDP是无连接的,全称为用户数据报协议,两个都是用UDP的主机可以随时发送数据,而传输控制协议TCP是面向连接的,两个主机要发送数据前要经过三报文握手之后才可以进行数据传输,传输完毕后还要经过四报文挥手释放连接

image-20230729171118020

UDP支持单播多播和广播,但是TCP则仅支持单播

image-20230729171235300

UDP传输在传输报文时和发送报文时都不会对报文做什么合并和拆分,其是面向报文的传输方式,而TCP则是将应用层传输的内容看做一块块字节流,其会保证收方会得到和发方一样的字节流,但是中间怎么传输就不保证了,其可以能会发送时用得块多,收时用的少,或者对上层发送过来的字节流进程再一次的分片然后再发送

image-20230729171719971

众所周知,网际层的IP协议向上提供无连接不可靠的传输服务,而UDP也是如此,如果说在传输过程中出现了误码或拥塞,那么其会直接丢弃该包,然后什么也不做,而TCP向上提供面向连接的可靠传输服务,其不会出现传输差错,前者适合用于电话、视频会议一类的实时应用,而后者适用于要求可靠传输的应用,如文件传输

image-20230729171927876

UDP的数据报首部就8个字节,因为这个协议没啥需要实现的功能,所以没啥特别要传输的,而TCP报文段最小20字节,最大60字节,因为其要实现很多功能,所以首部很长

image-20230729172019902

最后我们来看看总结

image-20230729172033270

TCP流量控制

TCP中存在流量控制,其指的是让发送方的速率不要太快,这样接收方来得及接收,TCP中使用滑动窗口来实现流量控制

image-20230729174111371

比如在下面的情况中,假设每一个TCP数据报文段每次最多能发送100字节的数据,一共有1000字节的数据,所以可以分为十块TCP段,其建立连接时收方会告诉发方其接收窗口的大小,假设为400,那么接收方会将滑动窗口设定为400,同时一个个发送滑动窗口内的数据

收方在接收时可以发送累计确认数据报给发方,其中的ACK代表其实一个累计确认报文段,ack表示在其值前面的数据都已经正确收到,rwnd的值代表重新设定滑动窗口的值,我们这里收方会知道201前的数据都已经正确接受到了,所以其会将滑动窗口移动到201之后然后在缓存中删除已经发送的数据,接着调整自己的滑动窗口值为300

每个TCP数据报文段都有一个计时器,其发送之后触发,当时间到达之后还没有收到收方累计确认的报文,那么就会触发超时重传,会重新发送该数据,直到收到包括该数据的确认报文段为止

image-20230729174619445

当发送窗口被调整为0时会出触发持续计时器,如果当计时器到达前都还没收到新的滑动窗口的确认报文,那么发方就会发送零窗口探测报文,其携带1字节数据,发方必须对该数据进行接收,然后发送自己的滑动窗口数据给发方,如果还是0,则继续触发

image-20230729174848071

image-20230729175142319

TCP拥塞控制

在某短时间内对网络中某一个资源的需求超过了该需求所能提供的可用部分,网络性能就会下降,该情况称为拥塞,理想的拥塞控制是随着输入负载的增加,也就是对某个资源的请求的增加,吞吐量,也就是传输该数据的速率会先增加后面高最高点停止,但是这是理想情况下,现实情况是随着输入负载的增加,吞吐量会到达最高点之后不断下降直到为0,吞吐量上升速率较缓慢的负载区间下的网络是轻度拥塞的,当吞吐量已经在下降时的负载区间下的网络称为拥塞,到达0点后称为死锁

image-20230729212834882

介绍拥塞控制算法之前我们先假定一些条件,分别是数据直往单方向传输,接收方总是有足够大的缓存空间和最大报文段以字节为单位

image-20230729212914572

TCP协议中用于拥塞控制的方法有四个,分别是慢开始、拥塞避、快重传和快恢复

在发送之前,首先发送方维护一个拥塞窗口cwnd的状态变量,其根据网络的拥塞程度动态变化,当网络没出现拥塞时其会增加窗口,当拥塞时会减少窗口,判断是否出现网络拥塞的根据是有无发生超时重传。发送方最开始将发送窗口swnd的大小设定为拥塞窗口的大小,维护拥塞窗口cwnd的同时会维护一个慢开始门限ssthresh状态变量,当前者小于后者时使用慢开始算法,反之则使用拥塞避免算法,相等时都可以用

image-20230729213009032

首先,最开始的拥塞窗口cwnd的值为1,滑动窗口恒有swnd==cwnd,ssthresh的值设定为16,当cwnd小于ssthresh时拥塞窗口时,每一个传输轮次起都会将cwnd扩大一倍(一个传输轮次就是指的是发送方将cwnd内的所有数据发动到接收方中并接收到确认数据报的时间),当cwnd的大小==ssthresh时,其使用拥塞避免方法,每个传输轮次只让拥塞窗口增加一个,当其到24的大小时发生了重传计时器超时,也就是接收方没有按时收到确认报文,此时就判断网络出现了拥塞,会将ssthresh的值更新为发生拥塞时的一般,在这里是12,然后将cwnd的值减少为1之后重新执行对于算法

值得一提的是慢开始算法是因为一开始向网络注入的报文段较少所以才叫慢开始算法的,而拥塞避免算法只能够尽可能减少出现拥塞的情况,不能完全避免

image-20230729213803159

为了进一步改进TCP的性能,后续提出了新的算法,分别是快重传和快回复,采用前者可以让发送方尽早知道发生了隔壁报文段的丢失尽快进行重传,而不是等待发生超时重传计时器之后再重传,其可以解决TCP传输时有时候出现了超时重传但是实际网络并没有拥塞而TCP误认为已经拥塞而导致的cwnd缩小造成的传输效率降低的问题

image-20230729214128985

在快重传算法中接收方不可以使用捎带确认算法,必须使用理解发送确认,当接收方要求收到的报文段必须是有序的,当收到失序的报文段时,每收到一次就会向源点发送针对失序报文段的重复确认数据报,当源点收到三次重复确认的数据报时,其会立即重传数据报指向的失序报文段,避免发生超时重传

image-20230729214459671

而快恢复算法就非常简单了,就是当发送方执行了快重传算法之后就执行的算法,该算法会将ssthresh调整为当前cwnd的一般并执行拥塞避免算法,当然有的快恢复实现是让cwnd调整为ssthresh+3,这是因为既然已经收到了三个重复的确认,那么肯定有三个数据报文段离开了发送方,那么就可以将拥塞窗口再提升三位

image-20230729214720388

下面这个图就自己看了,其实就是展示一下TCP中使用协议之后的对于变化情况

image-20230729214825232

下面这题也是非常简单,当超时时就ssthresh就为其cwnd的一半,那么就是8,之后从1开始,升三次到8,再升一次到9,轻松拿下我只能说

image-20230729215134334

TCP超时重传时间选择

TCP的超时重传时间如果设定太低,那么就会导致不必要的重传使得网络负荷增大,反之则会使得网络空闲时间增大,降低传输效率

image-20230730012614070

由于数据在网络中的传输收到各种因素的影响,因此我们不能做直接使用某次测量得到的往返时间RTT来作为样本计算重传超时时间RTO,我们一般使用公式来计算,这个公式中RTTs=RTT1,而新的RTTs=(1-α)旧的RTTs+α新的RTT样本,阿尔法的推荐选择值是0.125,同时超时重传时间RTO应略大于计算出的加权平均往返时间RTTs

image-20230730012838012

一般来说,RTO的计算公式为RTO = RTTs + 4*RTTd,RTTs我们上面讲过了,RTTd的公式则为,当第一次接收计算RTT时,RTTd = RTT/2,之后新的RTTd=(1-β)旧的RTTd+β|RTTs-新的RTT样本|

image-20230730013749253

接着要解决的问题就是往返时间RTT的测量,但是这个测量比较麻烦,因为只要发生重传,那么源点就根本不知道发方传输的TCP确认报文段是针对哪个数据报的

image-20230730014017443

为了解决这个问题,一般是报文段每重传一次,那么就将RTO的值增大一些,一般是讲新的RTO值取为旧的RTO值的两倍

image-20230730014141633

下面就是具体的一个计算案例了,可以看到首先知道RTT1之后,因为RTTs1==RTT1,所以能求出RTTs1,然后求出RTTD1==RTT1/2,接着计算出RTO=RTTs+4*RTTd得到结果,可以看到我们目标就是求出RTTs和RTTd,之后通过这两个就可以求出RTO

得到第二个结果之后就要使用新的公式来计算了,这里我就不赘述了,我们实际写的时候,把一个个值写到旁边来,这样计算比较好做

image-20230730014320334

TCP可靠传输的实现

TCP以字节为单位的滑动窗口实现可靠传输,发送方有一个发送窗口,假设数据是从左往右排的,发送方从左边往右开始发送,那么此时发送窗口左边表示后沿,右边表示前沿,后沿可能不同或者前移,而前沿可能向前移动或者不动,前沿移动的可能情况有三种,分别是没有收到新通知或者是新通知的窗口大小不变,收到新通知,但是通知窗口正好缩小,由于窗口发送完数据后需要往前移动,刚好就令其前沿达成不动的状态,最后一种情况是窗口反而缩小向后搜索了,但是这种做法在TCP协议中是极其不推荐的

image-20230730020700134

TCP中源点用三个指针来表示以字节为单位的滑动窗口,通过该三个指针可以知道当前滑动窗口所需要的所有信息,滑动窗口前面的数据已经发送完了,可以将其从缓存中删除,而且滑动窗口内的数据就要保存到缓存中以用于超时重发,而窗口后的内容是还不能发送的内容

image-20230730021449024

而在收方,如果收到了不连续的报文段,那么其返回的确认报文段只能是前面连续的报文段的需求的那一位,比如下图中,收到了32和33,但是31没收到,31前面的收到的内容才是序号连续的,所以发送的确认报文段中ack的值就是31,代表31前才是连续的而且请求31位置的数据

image-20230730021825381

源点中的发送的数据有重传计时器,一定时间内如果没有收到接收方的确认报文,则会重发数据

image-20230730021842507

注意发送方的发送窗口并不总是和接收方的接收窗口一样大,因为网络传输窗口值需要时间而且还可能会发送一个减少窗口尺寸的确定报文来,对于不按序到达的数据,TCP一般将其先临时存放到接收窗口中,等到字节流所缺少的字节收到后再按序交付给上层的应用进程,TCP要求接收方必须有累计确认和捎带确认机制,同时要求接收方不应该过分推迟发送确认数据报,一般来说,推迟的时间不应该超过0.5s,最后TCP的通信是全双工的,也就是说接收方和输入方其实都是可以进行接收和发送的,只是我们学习时候为了容易理解所以还是分接收方和输出方,让数据单方向流动

image-20230730022224098

下面这题就非常简单了,200的位置,加上300和500字节,就是1000

image-20230730022444393

本题就是反过来知道第三段序号求第一段序号而已,不多提

image-20230730022749031

TCP连接建立

TCP的运输连接有三个过程,分别是建立TCP连接,数据传输,释放TCP连接

image-20230730050555356

TCP连接建立要解决三个问题,分别是使得TCP双方可以明确感知到对方的存在,使得TCP能过协商一些参数以及双方可以对运输的实体资源进行分配

image-20230730050815621

TCP的连接建立是经过三报文握手的过程,简单可以说是三次握手,首先TCP的客户端和服务端都处于关闭状态,服务器首先要进入监听连接状态,其会创建一个传输控制块,内部存储一些重要信息,然后进入监听状态,这个过程称为被动打开,接着TCP客户也要经历这个过程,只不过TCP客户称为主动打开,然后向TCP服务器发送TCP连接请求报文段(之后进入同步已发送状态),该请求中的首部同步位SYN的值为1,表明其是TCP连接请求报文段,seq是序号字段,值由客户端任意选取,其作为客户端进程的初始序号,注意TCP规定SYN为1的报文段不能携带数据,但是会消耗一个序号,因此seq这个序号,在客户端里就只能用一次

服务器接收到之后如果同意建立连接就向源点发送针对TCP连接请求的确认报文段(之后进入同步已接收状态),报文段中SYN设置为1,SYN表明其是TCP连接请求报文段,而ACK为1表明其是一个TCP连接请求确认报文段,seq的初始值y是服务器任意选取的初始序号,是服务器进程的初始序号,确认信号ack为x+1,这其是是对前面客户端选择seq为x的确认,同样这个报文也不能携带数据同时会消耗seq

TCP客户端收到发送过来的TCP连接请求确认报文段后,会发送一个普通报文段给服务器,其中ACK为1,表明其是一个普通的TCP确认报文段,seq被设置为x+1,这是因为第一次发送TCP连接请求数据报时已经消耗了seq的x的值了,那么下次传输就只能用x+1,确认号字段ack被设置为y+1(注意普通报文段如果不携带数据,那么是不会消耗seq的,比如我们这一次的发送就不携带数据,那么下次传输时还可以使用x+1的值作为发送数据的seq,但是如果携带了数据,那就只能用x+2了),这是对服务器选择的初始序号y的确认

客户端在发送了普通报文段之后进入连接已建立状态,而服务端在收到之后也进入连接已建立状态,之后他们就可以通过建立的信道进行数据传输了

image-20230730051339436

注意第三次发送的针对TCP的连接请求的确认的确认并不是多余的,这是为了防止已经失效的连接请求报文段突然又传送到TCP服务器中从而造成网络资源的浪费

像下面的例子中,就是假设使用两次握手建立连接,那么第一个TCP连接发了之后还在路由呢,第二个重发连接请求发过去了获得正确响应之后成功建立了连接之后又释放连接,等释放完了TCP又收到了最开始没传过来的TCP连接请求,那就会造成服务端错误进入连接已建立状态并等待数据传输,但实际上客户端都特么的关闭了,根本不会传输,甚至不会释放连接

image-20230730051805392

最后我们来做一题,这题也是非常简单,首先作为一个连接请求报文段,SYN必定是1,同时接收连接请求,那么ACK必定是1,然后发送的数据要比seq大1表示接收其选择的初始序列号,所以ack是11221,最后自己挑选的序列号随便选,所以seq什么值都是可以的

image-20230730052001678

TCP连接释放

TCP通过四报文挥手来释放连接,可以简称为四次挥手

建立连接的双方随时可以断开连接,我们这里假设是客户端主动关闭连接,那么首先就会发送一个TCP连接释放报文段,然后进入终止等待1状态,该报文段的FIN和ACK均为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认,seq的值是TCP客户进程之前已发送过的字节的序号+1,另外值得一提的是TCP规定FIN等于1的终止报文即使不携带数据也会消耗序列号,ack的值等于TCP客户进程之前已经接收过的数据的最后一个字节的序号+1,这个数据报被服务器接收到之后,会发送一个普通的TCP确认报文段并进入关闭等待状态,该报文段中ACK位1,代表其是TCP确认报文,seq的值是TCP服务器进程之前已传输过的数据的最后一个字节的序号+1,这个值和之前客户端中ack的值相等,这是必然的,因为只有两个主机在收发,那么收了多少当然就相当于是发了多少

而ack的值u+1代表同意之前客户端选定的序列号,TCP服务进程此时会通知高层应用进程客户进程要断开自己的连接,此时TCP客户进程到服务器进程这个方向的连接就释放了,这时TCP连接处于半关闭状态,简单理解为客户端已经没啥要发送了,但是服务器如果还有数据要发送,那么客户端仍然要照单全收

当客户端收到服务器发送的确认报文段之后就会进入终止等待2状态,等待服务器的数据传输,如果服务器有数据要传输,那就传,没有则应用层会通知TCP服务器释放连接,由于是被通知之后关闭的连接,所以称为被动关闭,同样也是一样的过程,服务器先发送TCP连接释放报文段(然后进入最后确定状态),FIN和ACK为1,表明其是TCP连接释放报文段的同时还对之前的数据做了确认,此时假定seq的值为w,因为服务器可能释放连接前服务器还传输了数据,所以seq的值有所不同,同时ack的值为u+1,这是对之前收到来自客户端的TCP连接报文段的重复确认,TCP客户端收到该报文段后,必须针对该报文段发送一个普通的TCP确认报文段,ACK为1表明报文段类型为普通确认报文段,seq为u+1是因为经之前发送的TCP连接释放报文不携带数据,但是仍然会消耗序列号,因此u是没得用了,所以要用u+1,ack为w+1是对服务器选定端口号的确认,客户端发送完这个数据报之后进入时间等待状态,服务器接收到这个数据报之后就进入关闭状态

客户端经过时间等待状态之后才能进入关闭状态,时间等待状态一般会等待2MSL时长,1MSL==2Min,当然这个是推荐这么长的时间,实际是可以根据不同网络自己设定MSL和时间的对应关系的

image-20230730054930114

如果说客户端不进入时间等待状态,发送完数据报之后就进入关闭状态,那么如果说正好这个数据报丢失了,那就完了,服务器会不断超时重发而客户端因为已经关闭那就根本没影响,那服务器的连接是根本关闭不了了,因此为了避免这种情况,所以会有客户端会有时间等待状态

image-20230730055119697

当然,两个主机之间的TCP传输是可能突然终止的,为了处理这种情况的相关问题,所以有保活计时器

保活计时器是两小时倒计时,服务器每收到一次客户端的数据就会重新刷新保活计时器的时间,如果说两小时后都还没收到客户端发送的数据,那么就会向客户端发送一个探测报文段,每隔75s会发送一次,如果连续发送了十次仍然没有响应,则认为服务器与该客户端的连接中,客户端出现了故障,就会关闭该连接

image-20230730055219984

TCP报文段首部格式

TCP采用面向字节流的方式实现可靠传输,其发送时数据时会从发送缓存中取出一部分并给其添加首部之后使其成为TCP报文段之后进行发送,一个TCP报文段由首部和数据载荷两部分组成,TCP的全部功能就体现在首部的各个字段作用中,因此我们本节着重讲TCP首部内容

image-20230730195242035

首先TCP首部由固定首部和扩展首部,前者占20字节,后者占最大可以40字节,最小可以没有

源端口和目的端口都占16比特,前者用于表示发送该TCP报文段的应用进程,后者用于表示接收该TCP报文段的应用进程

image-20230730195421806

序号占32位比特,用于指出本TCP报文段数据载荷的第一个字节的序号,注意是序号不是内容,当序号增加到最后一个之后会回到0重新开始

image-20230730195624528

确认号也占32位比特,同样也是增加到最后一位后重置,其指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,也是对之前收到的所有数据的确认,简单来说就是谁发送谁就希望另一个主机发送给他这个序号之后的数据

image-20230730202322403

注意只有当确认标志位为1时确认号字段才有效,反之无效,同时TCP规定在连接建立后所有的TCP报文段都必须将ACK置1

image-20230730200107237

比如说下面的例子里,客户端发送的TCP报文段序号为201,说明其数据载荷中的第一个数据的序号为201,ACK为1说明其是一个TCP确认报,确认号800意味着其已经接收到了服务器发送过来的800位之前的所有数据

从服务器发送到客户端的TCP报文段,序号为800说明该报文段的数据载荷的数据的第一个字节的序号为800,确认号为301说明其已经接收到了来自客户端发送的301序号钱的数据,ACK为1说明其是确认报

image-20230730200243200

数据偏移字段占据斯比特,以4字节为单位,简单来说就是指出首部有多长,首部最低20字节,最大为60字节,因此数据便宜字段最小值为0101,也就是5,最大为1111,也就是15

image-20230730200352756

比如下面的例子里,20字节的首部数据偏移字段为0101,而60字节的首部数据偏移字段则为1111

image-20230730200526473

保留字段占6比特,用于未来使用,目前置0即可

image-20230730201031764

窗口字段占16比特,以字节为单位,指出发送本报文段一方的接收窗口,这个字段可以通过接收方来控制发送方的发送能力,称为流量控制,发送窗口一般是从发送窗口和拥塞窗口中取得最小值

image-20230730201105645

校验和占16比特,用于检查TCP报文段有无出现误差,计算时要在报文段前加上12字节的伪首部

image-20230730201134618

SYN是同步标志位,同于在TCP建立时用于同步序号,反正SYN为1就说明发送的是一个TCP连接数据报,如果同时ACK也为1,说明是TCP连接请求确认数据报

image-20230730201219103

FIN是终止标志位,用于释放TCP连接,当其为1时说明发送的是TCP释放数据报

image-20230730201256591

RST是复位标志位,用于复位TCP连接,当其为1时,表示TCP连接出现了异常,必须释放连接并重新建立连接,其置1还可以用来拒绝一个非法的报文段或拒绝打开一个TCP连接

image-20230730201327085

PSH是推送标志位,当其为1时,接收方会将该报文段尽快交付给应用进程,而不是等待接收缓存都填满后再交付

image-20230730201428738

URG是紧急标志位,其取1时紧急指针才有效,紧急指针占16比特,以字节为单位,用于指明紧急数据的长度,

image-20230730201517198

最后是扩展首部的选项字段,这里有很多选项,选得越多TCP的功能就越多

image-20230730201600022

填充字段则是用于确保报文段首部能被4整除而存在的字段,不满足就补

image-20230730201627414

应用层

应用层一般解决通过应用进程的交互来实现特定网络应用的问题

image-20230730205029810

其实网络体系结构的最底层,是设计和建立计网的最终目的,其早期时有电子邮件、远程登录、文件传输等基于文本的应用,现在则是有各种内容了

image-20230730205112949

比方说像是万维网WWW、域名系统DNS等网络应用,都是应用层的经典应用

image-20230730205308439

C/S和P2P

开发一个网络应用首先要解决的问题是网络应用程序在各种端系统上组织方式和它们之间的关系,目前流行的网络应用主要有两种,分别是客户服务端方式,又称C/S方式以及对等方式,也称P2P方式

image-20230730211205293

C/S方式中客户是服务请求方,服务器是服务提供方,服务器总是处于运行状态并等待客户的服务请求,服务器具有固定的端口号,而运行服务器的主机也有固定的IP地址,一般来说这种方式对服务器的性能要求非常高,所以一般在C/S应用中常会构建计算机集群来形成一个强大的虚拟服务器给海量客户端提供服务

image-20230730211350231

在P2P方式中,每个主机都可以是服务器的提供者和请求者,还可以同时提供和请求,其应用是服务分散型的

P2P方式具有高可扩展性,系统性能不会因为规模的增大而降低,而且具有成本优势

image-20230730211514989

当然我这里提的都是应用层的内容,注意是一定要有这个应用才能调用对应的服务的,比如P2P方式就要求所有主机都必须自己启动P2P应用才能进行请求和传输

动态主机配置协议DHCP

一个网络中的各个主机都需要分配IP地址、子网掩码一类的内容,之前我们都是手动分配,但是如果说这个主机数量很多,那手动分配效率就太低了,还容易出错,因此出现了动态主机配置协议DHCP

image-20230730213127475

DHCP可为局域网中的各个主机自动配置IP地址、子网掩码、默认网关和DNS服务器

image-20230730213204364

下面我们来讲解一下这个配置的过程,首先DHCP协议使用UDP协议进行数据的传输,客户端的端口号是68,服务器则是67,首先客户会发送DHCP发现报文(该保存存有事务ID和DHCP客户端的MAC地址),源IP地址为0.0.0.0,因为此时客户还没有分配IP地址,所以就用该IP地址代替,由于其也不知道哪里有DHCP服务器,所以采用广播发送(当然发送前是要将数据封装为IP数据报的),DHCP服务端收到之后会通过其封装的MAC地址来查询自己的数据库,看是否有针对该MAC地址的配置信息,若有则使用该配置信息,反之使用默认配置信息

之后服务器封装该配置信息发送DHCP提供报文,提供报文里有事务ID和配置信息,源IP地址是该DHCP服务器的地址,仍然是采用广播发送,值得一提的是这里的IP地址是会采用ARP来确保IP地址没有被其他网络中的其他主机所占用的

image-20230730221636186

DHCP客户收到服务器发送的DHCP提供报之后会将旗下的事务ID和自己发送的事务ID进行比较,若相等则说明是给自己的数据报,然后其会发送一个DHCP请求报文到DHCP服务器上,里面包含了事务ID,DHCP客户端的MAC地址和其接受租约中的IP地址同时要求DHCP服务器提供其自身的IP地址,该报文的源IP地址仍是0.0.0.0,采用广播发送

image-20230730221828167

服务器也是通过比对事务ID的方式来得知客户发送的DHCP请求报是不是给自己的,收到该请求包之后,发送DHCP确认报,该报文的源点地址是DHCP的服务器地址,采用广播发送,客户端收到该确认包之后会使用ARP地址检测打算分配的IP地址是否已经被网络中的其他主机占用,若是,则发送DHCP DECLINE报文才撤销之前约定的IP地址租约并重新发送DHCP发现报,若没占用则

image-20230730221928154

按我们例子里的客户端来说,会收到两个DHCP发送的确认报,其一般来说,谁先到就使用谁的,我们这里就假设左边的先到,那么客户单就正式使用事先约定好的配置信息

当使用配置信息的时间到达0.5倍的租用期时,会发送DHCP请求报文要求DHCP服务器续租,如果DHCP服务器同意续约,那么就发送DHCP确认包,之后客户端会得到新的租用期,如果说不同意续约,那么客户端会立即停止使用租用的IP地址并重新发送DHCP发现报文,如果没响应那就继续等,等时间到达0.875倍租用期时,再进行一次上面的动作等待响应,如果还是没响应,那就继续等,等到租用期到达之后立刻停止使用租用的IP地址并重新发送DHCP发现报文

DHCP客户端可以随时解除IP地址租约,只要向服务器发送DHCP释放报文即可,当然是采用广播发送的

最后值得一提的是,其实在服务器收到DHCP请求包之后,也会使用ARP再次检测该IP地址是否已经被使用并做对于处理

image-20230730222124227

DHCP存在统计代理,比如在下面的图中,如果要给主机自动分配IP地址是不行的,因为其一开始没有IP地址,采用广播发送一定会经过路由器然后被路由器拒绝,为了解决该问题可以往路由器中添加DHCP服务器的IP地址并令其称为DHCP的中继代理,这样其下所有需要申请IP地址的需求传给路由器之后,路由器转发给DHCP服务器就完了,这样做除了能让主机成功申请到IP地址外的另一个好处是可以减少DHCP服务器的数量

image-20230730224324636

域名系统DNS

域名系统DNS的作用就是可以通过域名解析出IP地址,域名便于人类记忆,我们使用域名来访问网站,但是在计算机内部则需要IP地址,那么就需要从域名转换出IP地址,DNS就承担这个作用

image-20230731010342805

理论上来说,因特可以只用一个DNS服务器来处理所有请求,但是这个显然是不现实的,因特网采用层次结构的命名树作为域名,并使用分布的域名系统DNS,DNS使得大多数域名都在粉底解析,只有少量需要再因特网上请求解析,因此效率很高,同时DNS是分布式系统,因此即使有一台挂了也不影响整体功能

image-20230731010456812

域名的结构由若干个分量组成,各分量之间用.隔开,分别代表不同的域名,一个域名从左到右域名来看其各分量的层级逐渐升高

image-20230731010559093

顶级域名TLD一共有三类,分别是国家顶级域名nTLD,通用顶级域名gTLD,反向域arpa,在国家顶级域名下自注册的二级域名由该国家自行制定,我国将二级域名划分为以下两类,分别是类别域名和行政区域名

值得一提的是,有些分量是一样的,但是不意味着他们的层级和意义是一样的,比如类别域名和通用顶级域名中都有com,但是其代表的意义是不同的

image-20230731010732901

因特网的域名空间是倒着的树形结构,越往树根前进其域名层级越高,这种等级管理的命名方法便于维护每个域名的唯一性,同时也容易设计出一个高效的域名查询机制,值得一提的是域名只是逻辑概念,并不代表计算机所在的物理地点

image-20230731010937835

域名的IP地址的映射关系保存在域名服务器中,显然不能全部存在一个服务器里,DNS将分布在各地的域名服务器组成的集群来实现从域名到IP地址的转换

域名服务器可以划分为四类,分布式根域名服务器、顶级域名服务器、权限域名服务器和本地域名服务器

根域名服务器是最高层次的域名服务器,因特网上总共有13个根域名服务器,组成了一个集群,通常其收到请求之后并不直接对域名进行解析,而是返回该域名所属顶级域名的顶级域名服务器的IP地址

顶级域名服务器管理在顶级域名服务器注册的所有二级域名,当收到DNS查询请求时就会做出回答,可能是最终结果,也可能是下一级权限域名服务器的IP地址

权限域名服务器负责管理某个区的域名,每个主机的域名都必须在某个权限域名服务器处注册登记,因此权限域名知道其管辖的域名和IP地址的映射关系,同时其还知道其下级域名服务器的地址

本地域名服务器不属于上述域名服务器的等级结构,其起着代理的作用,会将请求报文转发到其上述的域名服务器的等级结构中,也称为默认域名服务器

image-20230731011255672

域名解析有两种方法,分别是递归查询和迭代查询,前者的查询方式是不断向上请求然后得到结果之后层层下发,后者则是向上请求之后立刻得到结果然后拿着结果继续请求上一级直到得到目标内容为止,值得一提的是前者的任何一个主机都只会发送一次请求,而后者的本地域名服务器会发送和其层级相等数量的请求

递归查询域名服务器的负担太大,一般来说,我们主机到本地域名服务器的查询是递归查询,其他的查询则是迭代查询

image-20230731011424642

为了提高DNS和查询效率和减轻服务器负担,在域名服务器中广泛使用了高速缓存,比如在本地域名服务器,如果已经有前天用户请求过一个域名,那么其会在获得域名域与IP的映射结果之后将其记录在自己的高速缓存中,这样其他主机查询时直接返回结果就行了,就不用向上请求了

image-20230731011625880

不过由于域名到IP地址的映射关系并不是议程不变的,所以一般域名服务器会给映射记录设置生存时间,同时在用户主机也存在高速缓存

image-20230731011705344

这里要注意的是其已经说过了这里使用递归方式查询,那么就全部都用递归方式查询

image-20230731011802259

最少的情况就是用户主机中已经有对于域名的记录,根本不用查询,最多的情况是必须向根服域名服务器请求,由于使用迭代查询方式进行查询,所以最多要发四次

image-20230731012000615

文件传输协议FTP

文件传送协议FTP是因特网上使用最广泛的文件传输协议,其提供交互式的访问,允许客户执行文件的类型和格式且文件用于存取权限,其屏蔽了各个计算机系统的内部细节,适合用于在异构网络中的任意计算机间传输协议

image-20230731015358135

可以看到多个FTP客户通过路由器和FTP服务器进行通信,可以实现上传或下载,FTP服务器根据需求的不同可以用牛逼的,也可以用垃圾的

image-20230731015642819

可以看到使用FTP服务进行传输,连网址前缀就变成ftp而不是https了都,可以通过网页进行简单访问

image-20230731015708609

当然,也可以通过CMD进行访问

image-20230731015752353

不过上面的方式都不太友好,一般来说都用提供好的软件来连接,舒服不少

image-20230731015810638

FTP的常见用途是在计算机之间传输文件,尤其是在批量传输文件的时候,另一个常见用途是绕那个网站设计者将构成网站的大龄文件批量上传到其Web服务器

image-20230731015822934

FTP工作时,首先FTP服务器监听熟知端口号21,FTP客户要使用FTP进行通信时,会随机选择一个临时端口号与其21端口号建立TCP连接,该连接用于传输控制命令,会在整个会话期间一直打开,而当需要传输数据时,在主动模式下,FTP客户通过传输控制命令的TCP连接发送命令给FTP服务器告知其有传输数据的需求,则其会主动使用端口号20与FTP客户建立一个用于传输数据的TCP连接,该数据连接在每次文件传输时才会建立,传输结束就会关闭

image-20230731015959204

在被动模式下,FTP客户会发起TCP连接给FTP服务器,两者都会使用约定好的临时端口,其他内容就和上面的没变化了

image-20230731020116386

下面这题非常简单,FTP中传输命令使用的连接是建立在TCP之上的控制连接

image-20230731020305459

下面这题C之所以错了,是TCP20的端口,不是客户端的,如果是服务端的那就对了

image-20230731020459081

电子邮件

电子邮件是因特网最早流行的一种应用,现在仍然是因特网上最重要也使用的应用之一

image-20230731021823267

电子邮件系统采取C/S方式,由三部分组成,分别是用户代理、邮件服务器、电子邮件所需的协议,用户代理其实就是发送邮箱的软件,邮件服务器则是处理邮件的服务器,具有发送和接收邮件和维护用户邮箱的功能,协议则包括发送协议和读取协议

image-20230731022127225

发送方的用户代理和发送邮件服务器先建立TCP连接,然后使用SMTP发送邮件,两个邮件服务器之间也是一样的,但是邮件服务器和接收方用户代理则是使用POP3读取邮件

image-20230731022227217

SMTP协议在服务器中会周期性对邮件缓存进行扫描,如发现有有邮件则会接收方的邮件服务器建立端口号为25的TCP连接,发送方会使用14条SMTP命令,接收方则会使用21种应答来实现数据的传输

当腰发送数据时,首先客户端会告知服务器自己的身份,以及自己SMTP服务器的域名,服务器同意则返回220,接着客户端告知服务器邮件来自哪里,服务器同意则返回250,然后告诉服务器邮件去往何地,同意返回250,接着告诉自己准备发送邮件内容了,同意返回354,发送完邮件内容后还要发送结束符,服务器收件成功则返回250,最后请求断开连接,同意返回221

值得一提的是,我们这里为了简单起见省略了认证过程,同时应答代码后面一般有简单的描述信息而且不同的SMTP服务器给出的应答代码也可能不同,不过这里都省略掉了

image-20230731022513556

电子邮件的最新信息格式由RFC 5322定义,其规定一个电子邮件有信封和内容两部分,而内容又由首部和主题两部分构成,首部中发往那里和标题字段是必须的,其他的都是可选内容或是自动添加的内容,主体则是邮件的内容本体

image-20230731022739601

SMTP协议只能传送阿斯克码文本数据,如果需要传输其他数据,则需要使用多用途因特网邮件扩展MINE协议将非ASCll将这些数据转换为阿斯克码,同样要将这些数据恢复也是使用MINE协议

为了MINE能正常运行,还在邮件中新增加了一些内容,MINE同时也能用于面向阿斯克码字符的HTTP

image-20230731022959623

下面是示意图

image-20230731023010496

常用的邮件读取协议有POP和IMAP协议,POP3是前者的第三个版本,是因特网的正式标准,其可以实现读取邮件,但是功能比较有限,而IMAP4是后者的第四个版本,目前还只是因特网建议标准,其功能比POP3强大得多,不过这是一个联机协议

值得一提的是他们都是使用基于TCP连接的C/S方式,POP3使用端口110,IMAP4使用端口143

image-20230731023246697

不过现在都什么年代了,还再用传统电子邮件,现在都用基于万维网的电子邮件了,通过浏览器登录的邮件服务器万维网网站可以实现各种功能和邮件的收发

在其工作模式中,用户和网易邮件服务器之间使用HTTP协议进行传输,而邮件服务器之间则使用SMTP协议进行传输

image-20230731023423648

下面的题都非常简单,不多提

image-20230731023532313

image-20230731023751112

image-20230731023730528

万维网WWW

万维网并是运行在因特网上的一个分布式应用,其利用网页之间的超链接将不同网站的网页链接成一张逻辑上的信息网

image-20230731030101724

浏览器最重要的部分是渲染引擎,也就是浏览器内核,同一网页在不同内核的浏览器里的显示效果可能不同

image-20230731030141096

万维网使用统一资源定位符URL来指明因特网上任何种类资源的位置,URL的一般形式由<协议>://<主机>:<端口>/<路径>,具体可以看下图的例子

image-20230731030301596

万维网的文档由HTML、JS和Css构成,整体还是一个html文件

image-20230731030417922

一个html文件由HTML、CSS、JS构成

image-20230731030443639

HTML使用多个标签来描述网页的结构和内容

image-20230731030536923

超文本传输协议HTTP,是万维网中最常见的协议,其和服务器建立TCP连接之后,通过发送请求报文来获得所需要的响应报文,没了,这个协议就这么简单

image-20230731030833093

HTTP/1.0采用非持续连接方式,在该方式下,浏览器每请求一个文件都要与服务器建立TCP连接,收到响应后就立刻关闭连接,这样每请求一个文档就有两倍的RTT开销,效率并不理想,为了减小发送实验,浏览器通常会建立多个并行的TCP连接同时请求多个对象,但这样的话又会加重万维网的负担

后续为了提升传输效率,HTTP/1.1采用持续连接方式,在该方式下,即使服务器发送了响应之后客户端和服务器仍然保持这条连接,使得其可以继续发送HTTP请求报文和响应报文,而且不局限于同一个页面上的对象,只要这些文档都在一个服务器就行,为了进一步提升效率甚至还可以使用流水线的方式工作,就是在浏览器收到HTTP响应报文之前就先发送连续的多个请求报文,这样就能节省下多个RTT时间

image-20230731031041694

下面是每请求一个文档就有两倍的RTT开销的图示

image-20230731031226029

HTTP由于是面向文本的协议,所以其报文格式中的每一个字段都是阿斯克码串而且长度都还不确定(这个以前学多了我就不提了)

image-20230731031239734

HTTP有可以发送多种请求,不过最常用的还是GET、PUT、DELETE、POST这四种请求

image-20230731031308310

HTTP响应的报文状态码也有多种意思

image-20230731031513356

下面是HTTP中常见的状态行表达的意思

image-20230731031556960

当然实际响应给用户就不能发送这种玩意了,一般都会发送更友好的页面,不过其时间表达的意思和我们状态行里表达的意思是一致的

image-20230731031618025

由于HTTP被设计为一种无状态的协议,为了令其有状态,所以Cookie技术应运而生,其可以使得无状态的HTTP状态化,简单来说就是可以记住用户信息

image-20230731031734778

当用户端网服务器中建立了TCP连接并发送请求之后,服务器就位该客户生成一个唯一的Cookie识别码并以此为索引在服务器后端数据库创建一个项目用于记录用户访问该网站的各种信息,返回的响应报文里会有对于的Cookie编码的字段

当用户再次发送请求时,只要带上这个Cookie字段,服务器就可以根据Cookie识别出用户

image-20230731031849663

万维网中存在缓存机制,服务器和主机中都有,这个缓存机制称为Web缓存,而位于中间系统上(比如路由器)的Web又被称为代理服务器,用户请求往该代理服务器中请求所需要的数据, 如果其有,那么就直接返回,没有就往原始服务器中请求并返回,同时还会将数据设置到自己的缓存中,以便于下次响应给用户

当然缓存都是有过期时间的,当缓存过期之后,用户再次请求该代理服务器,其就会向原始服务器发送请求

image-20230731032149258

下题要注意的是,这里的连接状态是Close,那就已经可以释放连接,是非持续连接而且也说明了是曾经请求,毕竟之前请求的刚刚结束了都

image-20230731032313913

下面这题就比较难,但是画图之后还是好说的,主要是有建立连接有三次挥手,有两个RTT,后续有两个图像需要传输,那么又是两个RTT

注意这里说了用非流水线方式工作,也就是说,客户端必须收到上一个请求的响应结果才能继续发送下一个请求,这个约定让我们可以计算出RTT个数

image-20230731032535622