品读《计算机网络 自顶向下方法》

本人浅读《计算机网络 自顶向下方法》,品读经典,大有裨益,梳理前六章,与君分享,才疏学浅,欢迎指正和补充,不胜感激。

在本书中,我们使用一种特定的计算机网络,即公共因特网,作为讨论计算机网络及其协议的载体。

计算机网络和因特网

什么是因特网?

其一,我们能够描述因特网的具体构成,即因特网的基本硬件和软件组件;其二,我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。

具体构成描述

因特网是一个世界范围是计算机网络,即它是一个互联了遍及全世界数十亿计算设备的网络。这些设备都称为主机(host)或者端系统(end system)。端系统通过通信链路(communication link)和分组交换机(packet switch)连接到一起。通信链路由不同的物理媒体组成(后面会介绍)。链路的传输速率以比特/s(bit/s 或 bps)度量。当一台端系统要向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节。由此形成的信息包用计算机网络的术语称为分组(packet)。这些分组通过网络发送到目的端系统,在那里被装配成初始数据。

分组交换机从它的一条入通信链路接受到达的分组,并从它的一条出通信链路转发该分组。分为路由器(router)和链路层交换机(link-layer switch)。链路层交换机通常用于接入网中,而路由器通常用于网络核心中。从发送端系统到接收端系统,一个分组所经历的一系列通信链路和分组交换机称为通过该网络的路径。

路由器和链路层交换机的区别?

知乎评论:“你想想教材里的路由协议。家用交换机有哪个能跑的?真的路由器至少都要几千块。支持不同的路由协议,能根据当前网络状况自动协调路由。家里用得着么?”。从我们身边观察,家用路由器不如说是低配交换机加集成较弱的路由功能,正儿八经的路由器是要上千的。

外观:从外观上看,链路层交换机通常接口比较多,体积也相对较大,而路由器的接口就少得多,体积也要小很多。事实上,图(b)并不是真正的路由器,它只是集成了路由器的功能,除此之外它还有交换机的功能(LAN口就是作为交换机接口来使用的,WAN是用于连接外网的接口,而四根天线则是无线接入点,也就是我们通常所说的wifi和热点)。

层次:链路层交换机的原理相对简单,一般都是使用硬件电路来实现数据帧的转发,而路由器一般工作在网络层,肩负着网络互联的重任,需要实现更为复杂的协议,具有更加智能的转发决策功能,通常都会在在路由器中跑操作系统,实现复杂的路由算法。因此,与链路层交换机相比,路由器更加偏向于软件实现其功能。

转发对象:交换机是根据MAC地址转发数据帧,而路由器则是根据IP地址来转发IP数据报/分组。数据帧是在IP数据包/分组的基础上封装了帧头(源MAC和目的MAC等)和帧尾(CRC校验码)。实际上,数据帧中的IP地址决定最终数据包要到达的主机,而MAC地址则是决定下一跳将要将数据传送给哪台设备(路由器或目的主机)。IP地址是软件实现的,可以描述主机所在的网络,而MAC地址是硬件实现的,每一个网卡在出厂的时候都会将全世界唯一的MAC地址固化在网卡的ROM中,因此MAC地址是不可修改的,但是IP地址是可以由网络管理人员配置修改的。

分工:链路层交换机用于组件局域网,路由器主要负责连接外网并寻找网络中最合适数据传输的路径。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkLvIRxu-1638518733830)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211202231343136.png)]

端系统通过因特网服务提供商(Internet Service Provider,ISP)接入因特网。

端系统、分组交换机和其他因特网部件都要运行一系列协议(protocol),这些协议控制因特网中信息的接受收和发送。IETF组织的RFC文档往往是技术性很强并相当详细的。它们定义了TCP、IP、HTTP和SMTP等协议。目前已经有将近7000个RFC。

服务描述

运行在一个端系统上的应用程序怎样才能指令因特网向运行在另一个端系统上的软件发送数据呢?

与因特网相连的端系统提供了一个套接字接口(socket interface),该接口规定了运行在一个端系统上的程序请求因特网基础设施向运行在另一个端系统上的特定目的地程序交付数据的方式。因特网套接字接口是一套发送程序必须遵循的规则集合,因此因特网能够将数据交付给目的地。

网络边缘

端系统也称为主机(host),因为它们容纳应用程序。主机有时又被进一步划分为两类:客户(client)和服务器(server)。客户通常是桌面PC、移动PC和智能手机等。服务器通常是更为强大的机器,用于存储和发布web页面、流视频。

接入网

拨号接入:安装简单但速度最慢,所需介质为电话线,通过拨号ISP提供的电话实现上网。拨号连接占用电话线,即固定电话和上网无法同时进行。

DSL:每个用户的调制解调器使用现有的电话线与电话公司的数字用户线接入复用器(DSLAM)交换数据。家庭的调制解调器得到数字数据后将其转换为高频音,以通过电话线传输给本地中心局。来自许多家庭的模拟信号在DSLAM处被转换回数字形式。在用户一侧,一个分配器把到达家庭的数据信号和电话信号分隔开,并将数据信号转发给DSL调制解调器。在电话公司一侧,在本地中心局中,DSLAM将数据和电话信号分隔开,并将数据送往因特网。DSL使用铜制电话双绞线传输。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHJqeINA-1638518733831)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211202231439300.png)]

电缆因特网:电缆因特网接入利用了有线电视公司现有的有线电视基础设施。住宅从提供有线电视的公司获得了电缆因特网接入。电缆将电缆头端接到地区枢纽,从这里使用传统的同轴电缆到达各家各户。经常被称为光纤混合同轴系统(HFC)。电缆因特网需要特殊的调制解调器,这种调制解调器称为电缆调制解调器(数字信号转为模拟信号,是通常所说的猫)。电缆调制解调器通常是一个外部设备通过一个以太网端口连接到家庭PC。在电缆头端,电缆调制解调器端接系统(CMTS)将许多下行家庭中的电缆调制解调器发送的模拟信号转换成数字信号。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myXt6sx9-1638518733832)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211202233559707.png)]

光纤:分为FTTH(Fiber To The Home)和FTTB(Fiber To The Building)。光纤到户和光纤到楼。一般的宽带现在都是光纤到楼,一般所说比较快的光纤就是FTTH。光纤分布体系结构分为AON有源光纤网络和PON无源光纤网络。PON如下图在这里插入图片描述

在公司和大学校园以及越来越多的家庭环境中,使用局域网(LAN)将端系统连接到边缘路由器。以太网用户使用双绞铜线与一台以太网交换机相连(平时购买到的路由器主要功能是体现交换机的功能,能,有薄弱的路由器功能,也算边缘路由器)。以太网交换机或这样相连的交换机网络,则与更大的因特网相连。

另外,在无线LAN中,无线用户从一个接入点发送分组,该接入点与局域网连接,局域网再与有线因特网连接。一个无线LAN用户通常必须位于接入点的几十米范围内。基于IEEE 802.11技术的无线LAN接入,更通俗的称为WIFI,目前几乎无处不在。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KutSsi8u-1638518733833)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211202234447193.png)]

物理媒体

物理媒体的例子包括双绞铜线、同轴电缆、多模光纤缆、陆地无线电频谱和卫星无线电频谱。物理媒体分为两种类型:引导性媒体(guided media)和非引导型媒体(unguided media)。对于引导型媒体,电波沿着固体媒体前行,如光缆、双绞铜线或同轴电缆。对于非引导型媒体,电波在空气或外层空间中传播,例如在无线局域网或数字卫星频道中。

双绞铜线:

双绞线由两根绝缘的铜线组成,每根大约1mm粗,以规则的螺旋状排列着。这两根线被绞合起来,以减少临近类似的双绞线的电气干扰。一般我们购买到的网线就是双绞线。

同轴电缆:

同轴电缆由两个铜导体组成,但是这两个导体是同心的而不是并行的。同轴电缆在电缆电视系统中相当普遍。在电缆电视系统中相当普遍。

光纤:

光纤是一种细而柔软的、能够引导光脉冲的媒体,每个脉冲表示一个比特。一根光纤能够支持极高的比特速率,高达数十甚至数百Gbps。它们不收哦电磁干扰,衰减极低,并且很难窃听。高成本使得LAN或接听接入网中不适用它们。

陆地无线电信道:

分为三类:一类运行在很短距离(1米或两米),如个人设备头戴式耳机、键盘;另一类运行在局域,通常跨越数十到几百米,比如无线LAN技术;第三类运行在广域跨越数万米,比如蜂窝接入技术,即移动网络。

卫星无线电信道:

通信中通常使用两类卫星:同步卫星和近地轨道卫星

同步卫星永久停留在地球上方相同点上。从地面站到卫星再回到地面站的巨大距离引入了可观的280ms信号传播时延。同步卫星最重要的应用之一是传输电视节目。广播信号也被传输。

近地轨道卫星放置的非常靠近地球,为了提供对一个区域的连续覆盖,需要在轨道上放置许多卫星。

网络核心

分组交换

在各种网络应用中,端系统彼此交换报文(message)。为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组(packet)。在源和目的地之间,每个分组都通过通信链路和分组交换机(路由器和链路层交换机)传送。

存储转发传输:在交换机能够开始向输出链路传输该分组的第一个比特之前必须接受到整个分组。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhqDgxp1-1638518733834)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211203112830019.png)]

排队时延和分组丢失:对于每条相连的链路该分组交换机具有一个输出缓存(output buffer),它用于存储路由器准备发往那条链路的分组。该输出缓存在分组交换中起着重要的作用。如果到达的分组需要传输到某条链路,但发现该链路正忙于传输其他分组,该到达分组必须在输出缓存中等待。因此除了存储转发时延外,分组还要承受输出缓存的排队时延。一个到达的分组可能发现该缓存已经被其他等待传输的分组完全充满了,再次情况下,将出现分组丢失(丢包)(packet loss),到达的分组或已经排队的分组之一被丢弃。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gcg2Eurw-1638518733834)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211203114208385.png)]

转发表和路由选择协议:在因特网中,每个端系统具有一个IP地址,当源主机要向目的端系统发送一个分组时,源在该分组的首部包含了目的地的IP地址。每台路由器有一个转发表(forwarding table),用于将目的地址映射成输出链路。当某分组到达一台路由器时,路由器检查该地址,并用这个目的地址搜索其转发表,以发现适当的出链路。路由器将该分组导向该出链路。

因特网具有一些特殊的路由选择协议(routing protocol),用于自动地设置这些转发表。例如,一个路由选择协议可以决定从每台路由器到每个目的地的最短路径,并使用这些最短路径来配置路由器中的转发表。

报文交换

报文交换相比分组交换,报文交换不拆分报文,以完整报文进行存储转发。

电路交换

传统的电话网络是电路交换网络的例子。在发送方能够发送消息之前,该网络必须在发送方和接收方之间建立一条连接。这是一个名副其实的连接,因为此时沿着发送方和接收方之间路径上的交换机都将未该连接维护连接状态。该连接被称为一条电路。它在连接期间在该网络链路上预留额恒定的传输速率。

电路交换中的电路是通过频分复用(FDM)和时分复用(TDM)来实现的。对于FDM,链路的频谱由跨越链路创建的所有连接共享。特别是,在连接期间链路为每条连接专用一个频段。调频无线电台也使用FDM来共享频谱,每个电台被分配特定频段。对于一条TDM,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。网络在每个帧中为该连接指定一个时隙。这些时隙由该连接单独使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qyPDRNJW-1638518733835)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211203120131453.png)]

分组交换允许更多用户同时使用网络!——网络资源充分共享

网络的网络

让端用户和内容提供商连接到接入ISP仅解决了连接难题中很小的一部分,因为因特网是由数以亿计的用户构成的。要解决这个难题,ISP自身必须互联。通过创建网络的网络可以做到这一点,理解这个短语是理解因特网的关键。

书中逐步递进介绍了因特网网络结构,这里直接介绍今天的因特网结构。

如果某个公司建立并运营一个可盈利的全球传输ISP(也称T1,目前中国电信、中国联通已经升级到T1),其他公司建立自己的全球传输ISP并与最初的全球传输ISP是一件自然的事,然而这些全球传输ISP必须是互联的。不然的话,与某个全球传输ISP连接的接入ISP将不能与连接到其他全球传输的ISP的接入ISP进行通信。

区域ISP,在任何给定的区域,可能有一个区域ISP,区域中的接入ISP与之相连。每个区域ISP与第一层ISP相连。第一层ISP是全球传输ISP,尽管它不是在世界上每个城市都存在,但它确实存在。有大约十几个第一层ISP。区域ISP向第一层ISP付费,在某些区域,可能有较大的区域ISP(可能跨越整个国家),该区域中较小是区域ISP与之相连,较大的区域ISP与第一层ISP连接。(例如在中国,有每个城市有接入ISP,它们与省级ISP相连,省级ISP又与国家级ISP连接,国家级ISP最终与第一层ISP连接)。

Pop(Point of Presence)存在于等级结构的所有层次,底层(接入ISP)除外。一个Pop只是提供商网络中的一台或多台路由器群组,其中客户ISP能够与供应商ISP连接。对于要与提供商Pop连接的客户网络,它能将它的路由器直接连接到位于该Pop的一台路由器,任何ISP可以选择多宿,即可以与两个或多个提供商ISP连接。当一个ISP多宿时,即使它的提供商之一出现故障,它仍然能够继续发送和接受分组。

客户ISP向他们的提供商ISP付费以获得全球因特网互联能力。客户ISP支付给提供商ISO的费用数额反映了它通过提供商交换的通信流量。为了减少这些费用,位于相同等级结构层次的临近一堆ISP能够对等,也就是说,能够直接将它们的网络连到一起,使它们之间的所有流量直接连接而不是通过上游的中间ISP传输。当两个ISP对等时,不进行付费。第三方公司创建一个因特网交换点(Internet Exchange Point,IXP),IXP是一个汇合点,多个ISP在这里一起对等。

提供商自给自足:内容提供商网络最典型的比如谷歌,谷歌专用网络仅承载出入谷歌浏览器的流量。谷歌专用网络通过与较低层的ISP对等,尝试绕过因特网的较高层,采用的方式是可以是直接与它们连接,或者在IXP处与它们连接。然而因为许多接入ISP仍然仅能通过第一层网络的传输到达,所以谷歌网络也与第一层ISP连接,并就与这些ISP交换的流量付费。通过创建自己的网络,内容提供商不仅减少了向顶层ISP支付的费用,而且对其服务最终如何交付给端用户有了更多的控制。

时延和吞吐量

时延

时延从一台主机出发,通过一系列路由器传输,在另一台主机中结束它的历程。当分组从一个节点沿着这条路径到后继节点,该分组在沿途的每个节点经受了集中不同类型的时延。这些时延最为重要的是节点处理时延(nodal proccessing delay)、排队时延(queuing delay)、传输时延(transmission delay)和传播时延(propagation delay),这些时延总体累加起来是节点总时延。许多因特网应用,如搜索、web浏览、电子邮件、地图、即时通讯和语音,它们的性能受网络时延的影响很大。为了深入理解分组交换和计算机网络,我们必须理解这些时延的性质和重要性。

处理时延:检查分组首部和决定将该分组和决定将该分组导向何处所需要的时间是处理时延的一部分。处理时延也能够包括其他因素,如检查比特级别的差错所需要的时间,该差错出现在从上游节点向路由器A传输这些分组比特的过程中。在这种节点处理之后,路由器将该分组引向通往路由器B链路之前的队列。

排队时延:在队列中,分组在链路上等待传输时,它经受排队时延

传输时延:是路由器推出分组所需的时间。用L比特表示该分组的长度,用Rbps表示从路由器A到路由器B的链路传输速率,传输时延是L/R。

传播时延:从该链路的起点到路由器B传播所需要的的时间是传播时延。传播时延取决于该链路的物理媒体和链路距离。

吞吐量

考虑主机A到主机B跨越计算机网络传送一个大文件,在任何时间瞬间的瞬时吞吐量是主机B接受到该文件的速率。如果该文件F比特,主机B接受到所有F比特用去T时间,则文件传送的平均吞吐量是F/T bps

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgTYWOGM-1638518733836)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211203150613180.png)]

如图a,服务器不能以快于Rs的速率通过其链路注入比特(服务器拥塞);这台路由器也不能以快于Rc的速率转发比特(路由器拥塞)。如果Rs<Rc,由该服务器注入的比特将顺畅地通过路由器流动,并以Rs到达客户;另一方面,如果Rc<Rs,则该路由器将不能像接受速率那样快地转发比特。在这种情况下,比特以速率Rc离开该路由器,从而得到端到端吞吐量Rc。(如果比特继续以Rs到达路由器,继续以Rc离开路由器,该路由器中等待传输给客户的积压比特将不断增加),对于这种简单的两链路网络,吞吐量是min{Rc,Rs}

图b显示了一个在服务器和客户之间具有N条链路的网络,这N条链路的传输速率分别是R1,R2,…RN。传输吞吐量为min{R1,R2,…RN},这同样仍是沿着服务器和客户之间路径的瓶颈链路的速率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYsc87Do-1638518733837)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211203153508921.png)]

如图a中显示了一个服务器和一个客户,因特网的核心中的所有链路都有非常高的传输速率,即该速率比Rs和Rc要高得多。因为因特网的核心就像一个粗大的管子,所以吞吐量=min{Rs,Rc}。

图b,其中有10台服务器和10个客户与某计算机网络核心相连。同时发生10个下载,涉及10个客户-服务器对,在核心中有一条所有10个下载通过的链路。将这条链路R的传输速率表示为R,假定所有服务器接入链路有相同的速率Rs,所有客户接入链路有相同的速率Rc,并且核心除了速率为R的一条共同链路之外的所有链路,它们的传输速率比Rc,Rs,R大得多。如果R很大吞吐量依然是min{Rs,Rc}。如果相同量级瓶颈就可能是R了。

协议层次

分层体系结构每层以一下方式提供服务:

1.在这层中执行了某些动作

2.使用直接下层的服务

这种简化本身由于提供模块化具有很高价值,这使某层所提供的服务实现易于改变,只要该层对上面的层提供相同的服务,并且使用来自下面层次的相同服务,当某层的实现变化时,该系统的其余部分保持不变。

网络设计者以分层的方式组织协议以及实现这些协议的网络硬件和软件,一个协议层能够用软件和硬件或两者的结合来实现。注入HTTP和SMTP这样的应用层协议总是在端系统中用软件实现,运输层协议也是如此。因为物理层和数据链路层负责处理跨越特定链路的通信,它们通常在与给定链路相关联的网络接口卡中实现。网络层通常是硬件和软件实现的混合体。

各层的所有协议被称为协议栈。因特网的协议由5个层次组成(OSI 7层模型去掉了会话层和表示层):物理层、链路层、网络层、运输层和应用层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnQ92eoc-1638518733838)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211203160325270.png)]

应用层

应用层包括许多协议,例如HTTP(提供web文档的请求和传送)、SMTP(提供电子邮件报文的传输)和FTP(提供两个端系统之间的文件传输)。web域名到IP的转换也是借助与特定的应用层协议DNS完成的。应用层协议分布在多个端系统上,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换信息分组。应用层的信息分组称为报文。

运输层

因特网的运输层在应用程序端点之间传送应用层报文。在英特网中,有两种运输协议,即TCP和UDP,利用其中任何一个都能运输应用层报文。TCP(向上)向他的应用程序提供了面向连接的服务。这种服务包括了应用层报文向目的地 的 确保传递和流量控制(即发送方、接收方速率匹配)。TCP也将长报文划分为短报文,并提供拥塞控制机制,因此当网络拥塞时,源抑制其传输速率。UDP协议向它的应用程序提供无连接服务。这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制。运输层的分组称为报文段。

网络层

因特网的网络层负责将称为数据报的网络层分组从一台主机移动到另一台主机。在一台源主机中的因特网运输层协议(TCP或UDP)向网络层递交运输层报文段和目的地址
因特网的网络层包括著名的网际协议IP,该协议定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。IP仅有一个,所有具有网络层的因特网组件必须运行IP。因特网的网络层也包括决定路由的路由选择协议,它根据该路由将数据报从源传输到目的地。因特网有许多路由选择协议。

链路层

因特网的网络层通过源和目的地之间的一系列路由器路由数据报。为了将分组从一个节点移动到路径上的下一个节点,网络层必须依靠链路层的服务,特别是在每个节点,网络层将数据报下传给链路层,链路层沿着路径将数据报传递给下一个节点。在该下一个节点。链路层将数据报上传给网络层。
由链路层提供的服务取决于应用于该链路的特定链路层协议。例如,某些协议基于链路提供可靠传递,从传输节点跨越一条链路到接收节点。这种可靠的传递服务不同于TCP的可靠传递服务,TCP提供从一个端系统到另一个端系统的可靠交付。链路层的例子包括以太网、WIFI和电缆接入网的DOCSIS协议。因为数据报从源到目的地传送通常需要经过几条链路,一个数据报可能被沿途不同链路上的不同链路层协议处理。链路层分组称为帧。

物理层

链路层的任务是将整个帧从一个网络元素移动到临近的网络元素,而物理层的任务是将该帧中的一个个比特从一个节点移动到下一个及诶单。在这层中的协议仍然是链路相关的,并且进一步与该链路的实际传输媒体相关。例如,以太网有许多物理层协议,一个是关于双绞铜线的,另一个是关于同轴电缆的,还有一个是关于光纤的,等等。

封装

在这里插入图片描述

数据从发送端系统的协议栈向下,沿着中间的链路层交换机和路由器的协议栈上上下下,然后向上到达接收端系统的协议栈。链路层交换机实现了第一层和第二层;路由器实现了第一层到第三层。这意味着因特网路由器能够实现IP协议,而链路交换机不能。

封装:在发送主机端,一个应用报文被传送给运输层。运输层收取到报文并附上附加信息(运输层首部信息),该首部将被接收端的运输层使用。应用层报文和运输层首部信息一道构成了运输层报文段。首部信息也许包括了:允许接收端运输层向上向适当的应用程序交付报文的信息;差错检测位信息,该信息判断报文中的比特是否在图中已被改变。运输层向网络层传递该报文段,网络层增加了如源和目的端系统地址等网络层首部信息,生成网络层数据报。该数据报接下来被传递给链路层,链路层增加它自己的链路层首部信息并生成链路层帧。所以我们看到,在每一层,一个分组具有两种类型的字段:首部字段和有效载荷字段。有效载荷通常是来自上一层的分组。

封装的过程可以比前面描述的更负载一个报文可能被划分为多个报文段。报文段可能被划分为多个网络层数据报,一个数据报有可能划分为多个帧。在接收端,则必须重构它们。

面对攻击的网络

坏家伙如何攻击计算机网络?

恶意软件

恶意软件一旦感染我们的设备,就能够做各种不正当的事情,包括删除我们的文件,安装间谍软件来收集我们的隐私信息并发送给坏家伙。我们的受害主机也可能称为数以千计的类似受害设备网络中的一员,坏家伙能够使用僵尸网络展开分布式拒绝服务攻击。

目前为止的多数恶意软件都是自我复制的:一旦感染一台主机,就会从那台主机寻求进入因特网中的其他主机,从而感染新的主机。病毒需要用户交互来感染用户设备。蠕虫无需任何明显用户交互就能进入设备。比较脆弱的应用程序从因特网接收了恶意软件并运行它,生成了蠕虫。感染设备能扫描因特网,搜索其他运行相同网络应用程序的易受感染的主机,向他们发送一个蠕虫副本。

攻击服务器和网络基础设施

拒绝服务攻击(DOs)使得网络、主机或其他基础设施部分不能由合法用户使用。Web服务器、电子邮件服务器、DNS服务器都能够称为Dos攻击的目标。
1.弱点攻击 向一台目标主机上运行的易受攻击的应用工程或操作系统发送制作精细的报文。(这需要比较了解被攻击的目标)
2.带宽洪泛 攻击者向目标主机发送大量的分组,分组数量之多使得目标的接入链路变得拥塞,使得合法的分组无法到达服务器。单一的攻击源可能无法产生足够大的流量来伤害该服务器。此外,如果从单一源发出所有流量的话,某上游路由器就能够检测出该攻击并阻挡下来。相比于来自单一主机的DoS攻击,DDoS攻击更难检测和防范
3.连接洪泛:攻击者在目标主机中创建大量的半开或全开TCP连接,导致主机停止接受合法的连接。

嗅探

嗅探WIFI或蜂窝网络:在无线传输设备的附近放置一台分组嗅探器,就能得到传输的每个分组的副本。
嗅探有线环境:LAN中,分组嗅探器能够获得经该LAN发送的所有分组。

伪装信任的人

生成具有任意源地址、分组内容和目的地址的分组,然后将这个伪装的分组传入因特网,因特网将忠实的将该分组转发到目的地,这一切都极为容易。接收方将该虚假地址作为真实的地址,进而执行该分组中的命令。这种方式称为IP哄骗,值是冒充另一个用户许多方式中的一种。

应用层

我们考察集中网络应用程序,包括Web、电子邮件、DNS、对等文件分发、和视频流。然后将涉及开发运行在TCP和UDP上的网络应用程序。

应用层协议原理

网络应用程序体系结构

两种主流体系结构:客户-服务器体系结构 和 对等体系结构

在CS体系结构中,有一个总是打开的主机称为服务器,它服务于来自浏览器的请求。CS体系结构,客户相互之间不进行直接通信。CS体系结构著名的应用程序包括Web、FTP、Telnet和电子邮件。在CS中常常配备大量主机的数据中心被用于创建服务器。如百度、谷歌都有它们的数据中心。

在一个P2P体系结构中,对位于数据中心的专用服务器有最小的依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机被称为对等方。许多现在流行的、流量密集型应用都是P2P的。这些应用包括迅雷、网络电话、视频会议。P2P体系最引人入胜的特性之一是它的自扩展性。例如尽管每个对等方都由于请求文件产生工作负载,但每个对等方通过向其他对等方分发文件为系统增加服务能力。

QQ聊天工具是p2p和cs混合使用的。p2p(NAT打洞成功):你的消息直接发给你的聊天对象,同时也发一份到服务器做备份。cs(NAT打洞不成功):你的消息发给服务器转发

进程通信

在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。发送进程生成并向网络中发送报文,接收进程接收这些报文并可能通过回送报文进行响应。>

发起通信的进程被标识为客户,在会话开始时等待联系的进程是服务器。

进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文(可以将套接字类比成应用层和运输层之间的门)。套接字是一台主机内应用层和运输层之间的接口。应用程序开发者对运输层的控制仅限于:选择运输层协议、也许能设置几个运输层参数。

使用套接字编程需要标识接收进程,主机地址(IP地址)和目的主机接收进程标识符(端口号)。比如Web服务器默认端口80,FTP为21、SMTP为25.

运输服务

一个运输层协议能够为调用它的应用程序提供什么服务?

可靠数据传输

分组在计算机网络中可能丢失。当一个运输协议提供可靠数据传输,发送进程只要将其数据传递进套接字,就可以完全相信该数据将能无差错的到达接收进程。当一个运输层协议不提供可靠数据传输时,由发送进程发送的有些数据可能到达不了接收进程。这可能被容忍丢失的应用所接收,比如交谈式音频、视频。

吞吐量

运输层协议能够以某种特定的速率提供确保的可用吞吐量。使用这种服务,该应用程序能够请求r比特/秒的确保吞吐量,并且该运输协议能确保可用吞吐量至少为r。具有吞吐量要求的应用被称为带宽敏感的应用。许多当前多媒体应用是这样 的。弹性应用 比如电子邮件、文件传输。

定时

这种服务将对交互式实时应用程序有吸引力,为了有效性而要求数据交付有严格的时间限制。

安全性

运输协议能够加密由发送进程传输的所有数据,在接收主机中,运输层协议能够将数据交付给接收进程之前解密这些数据。

因特网的运输服务

TCP

TCP模型包括面向连接服务和可靠数据传输服务。

面向连接:TCP让客户和服务器互相交换运输层控制信息。这个所谓的握手过程提醒客户和服务器,让它们为大量分组的到来做好准备。在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了。这条连接是全双工的,即连接双方的进程可在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。(运输层章讨论具体实现)

可靠数据传输:通信进程能够依靠TCP无差错、按适当顺序交付所有发送的数据。

TCP协议还有拥塞控制机制,这种服务不一定能为通信进程带来好处,但能为因特网整体带来好处。当发送方和接收方之间的网络拥塞时,TCP的拥塞控制机制会一直发送进程,也视图限制每个TCP连接,使它们达到公平共享网络带宽的目的。

TCP安全:安全套接字层(SSL)是加强后的TCP,在TCP基础上提供进程到进程的安全性服务,包括加密、数据完整性和端点鉴别,这种强化是在应用层实现的。SSL有它自己的套接字,发送端先通过SSL套接字加密,然后传送给TCP套接字。接收端TCP套接字传送给SSL套接字解密。

UDP

UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。UDP是无连接的,没有握手过程。UDP是一种不可靠数据传送服务。不保证报文到达接收进程,到达的报文也可能是乱序的。

因特网提供和不能提供的服务

TCP提供了可靠数据传输,SSL提供安全服务。因特网运输协议没有提供吞吐量和定时保证服务。

在这里插入图片描述

应用层协议

应用层协议定义了:

交换的报文类型,例如请求报文和响应报文。

各种报文类型的语法,如报文中的各个字段以及这些字段是如何描述的。

字段的语义,即这些字段中的信息的含义

确定一个进程何时以及如何发送报文,对报文进行响应的规则。

Web的应用层协议HTTP,电子邮件应用层协议SMTP。文件传输FTP、目录服务DNS

Web和HTTP

HTTP概述

Web的应用层协议是超文本传输协议(HyperText Transfer Protocol ,HTTP)。

HTTP使用TCP作为它的支撑运输协议。HTTP客户首先发起一个与服务器的TCP连接。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。客户向他的套接字接口发送HTTP请求报文并从他的套接字接口接收HTTP响应报文。一旦客户向他的套接字接口发送一个请求报文,TCP为HTTP提供可靠数据传输,一个客户进程发出的每个HTTP请求都能完整的到达服务器。

HTTP是一个无状态协议,即不保存关于客户的任何信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgzKIQ7N-1638626497231)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211204101748111.png)]

非持续连接和持续连接

客户发出一系列请求。(比如打开一个web页面请求多个图片)

每个请求是经一个单独的TCP发送是非持续连接

所有的请求机响应经相同的TCP连接发送是持续连接

HTTP在默认情况下使用持续连接,客户和服务器也能配置成非持续连接

浏览器和服务器之间建立TCP连接,三次握手过程:客户向服务器发送一个小的TCP报文段(一次),服务器用一个小的TCP报文段做出确认和响应(两次),最后,客户向服务器返回确认(三次)。客户结合第三次握手向该TCP连接发送HTTP请求报文。一旦该请求到达服务器,服务器在该连接上发送HTML文件。该请求响应用去另一个RTT。所以响应时间是两个RTT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BI3BOCmq-1638626497232)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211204105931038.png)]

非持续连接:

在浏览器输入URL,向服务器请求一个有一个HTML基本文件和10个JPEG图片的Web页面。

1.HTTP客户进程在端口号80发起一个到服务器的TCP连接

2.HTTP客户经它的套接字向服务器发送一个HTTP请求报文。

3.HTTP服务器进程经它的套接字接收该请求报文,找出该web页面,在一个HTTP响应报文中封装对象,并通过其套接字向客户发送响应报文。

4.HTTP服务器进程通知TCP断开连接(客户完整接收报文后实际断开)

5.HTTP客户接收响应报文,TCP连接关闭。客户得到HTML文件,和10个对JPRG文件的引用。

6。对10个JPEG文件重复前面步骤。

在非持续连接中,产生了11个TCP连接。用户能够配置浏览器连接的并行度(10个JPEG并行连接)。

往返时间RTT(Round-Trip Time,RTT):指一个短分组从客户到服务器然后再返回客户所花费的时间。RTT包括分组传播时延、分组在中间路由器和交换机上的排队时延和分组处理时延(这些时延之前讨论过,可能传输时延忽略了)

持续连接

非持续连接缺点:必须为每个请求维护一个连接,给web服务器带来严重负担。第二,每个连接都有两个RTT时延

一般来说,如果一条连接经过一段时间间隔仍未被使用,断开连接。

HTTP报文格式

request

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTJNItY5-1638626497233)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211204111849225.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pma7r6yk-1638626497235)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211204124512286.png)]

HTTP请求报文的第一行叫做请求行(request line,或叫请求头):方法字段、URL字段、HTTP版本字段

方法字段包括GET/POST/HEAD/PUT/DELETE(比较常用的就get 和 post)。

当用户提交表单时,HTTP客户常常使用POST方法。如果使用get方法表单,将表单信息添加到请求头URL后面。HEAD方法类似GET方法,当服务器收到一个使用HEAD方法的请求时,将会用一个HTTP报文响应,但不返回请求对象。PUT方法允许用户上传对象到指定的Web服务器上指定的路径。DELETE允许用户或者引用程序删除Web服务器上的对象。

首部行(或叫消息头):下面仅仅是众多首部上中的几个

Host:指明对象所在的主机,这个信息是Web代理高速缓存所要求的(后面将会介绍)

Connection:keep-alive 高速浏览器使用持续连接。如果是close,就是不要使用持续连接,在发送完被请求对象后就关闭连接。

User-agent:向服务器发送请求的浏览器的类型,服务器可以对不同类型的浏览器发送相同对象的不同版本

Accept:表示浏览器希望(能够)接收的数据类型,对应content-type。浏览器响应过来的数据类型。

Accept-language:zh-CN得到该对象中文版本

Accept-Encoding:浏览器支持的内容编码格式(压缩格式)列表,服务器在接收请求时,挑选一种用来对响应信息进行编码,并通过Content-Encoding来告诉浏览器服务器选定的编码格式。

首部行最后有一个空行,表示首部行结束。

实体体,使用get请求时该实体体为空,使用post方法时才使用该实体体。

Response

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TawHUaZ5-1638626497239)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211204125302940.png)]

状态行(status line):

协议版本字段、状态码、相应状态信息

常见的状态码:

1××:告知请求的处理进度和情况。

200 OK:请求成功,信息在返回的响应报文中

301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文中的Location首部行中。客户端软件将自动获取新的URL

400 Bad Request:一般是客户端错误,比如提交数据字段类型和后台的实体类不一致

404 NOT FOUND:被请求的文档不在服务器上

505 HTTP Version NOT Supported:服务器不支持请求报文使用的HTTP协议版本

首部行(header line,又称响应头)

Connection:keep-alive 表示持续连接,close表示发送报文后就断开连接。

Date:服务器产生并发送该响应报文的日期和时间。

Server:指示发送报文服务器类型

Last-Modified:对象创建或最后修改的日期和时间。对既可能在本地客户也可能在网络缓存服务器上的对象缓存来说非常重要(随后讨论缓存服务器)

Content-Encoding:对应请求的Accept-Encoding,一般有gzip和deflate,浏览器再拿到响应正文后,根据编码格式进行解压,服务器也可以返回未压缩的正文,但这种情况不允许返回Content-Encoding

Content-Type:指示实体体对象中的对象类型

ser-cookie与cookie有关(马上提到)

实体体(entity body)

使用telnet查看真实的报文!(需要在控制面板、启动或关闭windows功能中开启telnet功能,telnet)

telnet www.baidu.com 80

然后在telnet框中输入(我测试的时候不显示输入)

GET / HTTP/1.1

Host:www.baidu.com (然后回车两次)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrCrj8oB-1638626497244)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211204164717065.png)]

cookie & session

cookie技术有四个组件:

1.在HTTP响应报文中的cookie首部行

2.在HTTP请求报文中的cookie首部行

3.用户端系统cookie文件

4.位于web站点的后端数据库

Cookie的主要构成如下:(可以对照上面telnet 百度真实报文)

name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。

value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码

domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).

path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。

expires:失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。

max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。

HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。

secure: 安全标志,指定后,只有在使用SSL连接(即HTTPS=SSL+HTTP)时候才能发送到服务器,如果是http连接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie。服务器端设置该属性。

会话:可以理解为用户打开浏览器,访问该web服务器的多个资源,然后关闭浏览器,这中间的一系列过程称之为一个会话。

Cookie机制:cookie机制采用的是在客户端保持 HTTP 状态信息的方案。当浏览器访问WEB服务器的某个资源时,WEB服务器会在HTTP响应头中添加一个键值对传送给浏览器,再由浏览器将该cookie放到客户端磁盘的一个文件中,该文件可理解为cookie域(键值对的集合),往后每次访问某个网站时,都会在请求头中带着这个网站的所有cookie值。(至于怎么区分不同网站的cookie的,很简单,每个网站都给他一个唯一标识比如网址等,每次打开某网址时,就查询该网站下的所有cookie值即可。)每一个cookie都有一个name和一个value,且name是唯一的。相同名字时,后者会覆盖掉前者(类似哈希表的key的效果)。一个WEB浏览器也可以存储多个WEB站点提供的Cookie。浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。

若希望浏览器将该cookie存储在磁盘上,则需要设置该cookie的生命周期setMaxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

作用域:cookie的domain和path属性定义了cookie的作用范围,即访问哪些网站或url时,会自动的带着该cookie。domain即域名,path默认是(*所有路径),即域名后面的的路径。大部分情况下我们都是使用默认的设置即可。

原理:当一个浏览器访问某web服务器时,web服务器会调用HttpServletResponse的addCookie()方法,在响应头中添加一个名叫Set-Cookie的响应字段用于将Cookie返回给浏览器,当浏览器第二次访问该web服务器时会自动的将该cookie回传给服务器,来实现用户状态跟踪。

常用API:

javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。

1)public Cookie(String name,String value)

2)setMaxAge(int longTime)与getMaxAge方法:设置和获取cookie的最大有效时长。setMaxAge(0)
表示删除磁盘上的某个cookie。

注意:

cookie没有提供修改方法,当name一样时,覆盖原来的就算是更新了。

删除也是,setMaxAge(0),当name一样时,原来的会被覆盖掉,新建的没有生命周期,也会被立马删除。

3)setPath与getPath方法 :设置或读取Cookie的作用范围。

4)HttpServletResponse接口中定义了一个addCookie(Cookie
cookie)方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。

5)HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。

6)getName方法 :获取到cookie的name。

7)setValue(String value)与getValue方法:设置和获取cookie的value。

Cookie应用:①判断用户是否登录过网站; ②用来记录购物车或者记录用户使用偏好来制定推送;

Cookie中存储中文问题: cookie中存储中文会出现中文乱码,需要对value进行额外的编码

1、base64编码

存储:Base64.getEncoder().encodeToString(content.getBytes(“utf-8”));

读取:new String(Base64.getDecoder().decode(cookie.getValue()),“utf-8”)

2、URLEncoder类

存储:Cookie cookie = new Cookie(“userName”, URLEncoder.encode(“你好世界”,
“UTF-8”));

读取:URLDecoder.decode(cookie.getValue(), “UTF-8”)

Session机制:session机制采用的是在服务器端保持 HTTP 状态信息的方案。为了加速session的读取和存储,web服务器中会开辟一块内存用来保存服务器端所有的session,每个session都会有一个唯一标识sessionid,根据客户端传过来的jsessionid(cookie中),找到对应的服务器端的session。为了防止服务器端的session过多导致内存溢出,web服务器默认会给每个session设置一个有效期, (30分钟)若有效期内客户端没有访问过该session,服务器就认为该客户端已离线并删除该session。

1)cookie中

通过一个特殊的cookie,name为JSESSIONID,value为服务器端某个
session的ID,默认的方式。但是当浏览器禁用cookie后session就会失效。

2)url重写

当浏览器Cookie被禁时用。

就是把session的id附加在URL路径的后面。附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。

做法:

1、response.encodeURL(String url)用于对表单action和超链接的url地址进行重写

2、response.encodeRedirectURL(String url) 用于对sendRedirect方法后的url地址进行重写。

我们可以对网页中的链接稍作修改,解决以上问题: 修改前:
<a href=“maillogin.jsp”> 修改后:
<a href=“<%=response.encodeURL(“maillogin.jsp“)%>“>

这两个方法很智能,若浏览器禁用了cookie,就默认会进行url重写(url中带上sessionid),当用户浏览器没有禁用cookie时,就不在URL后附加sessionid。

原理:

当用户发送一个请求到服务器端时,服务器会先检查请求中是否含有sessionid(存在cookie中或者在url中),

》》如果不存在sessionid(说明是第一次请求),就会为该请求用户创建一个session对象,并将该session对象的sessionid(放到响应头的set-cookie中,格式set-cookie:sessionid,下次再请求时cookie中就会有一个name为jsessionid的cookie,value就是sessionid)响应给客户端。
》》如果存在sessionid,就会在服务器端查找是否有该sessionid对应的session,如果有就使用,没有就创建一个。

所以说,服务器端的session和客户端的cookie是息息相关的,若是没有了cookie,又不做其他处理的话,服务器端的session也没了。

session应用场景:①登录验证信息

常用API:

1.getId()方法:得到sessionid。

2.invalidate()方法:让session立刻失效。

3.getAttribute(String key):根据key获取该session中的value。

4.setAttribute(String key,Object value):往session中存放key-value。

5.removeAttribute(Stringkey):根据key删除session中的key-value。

6.getServletContext():得到ServletContext。

7.setMaxInactiveInterval(long timeout)/getMaxInactiveInterval:设置/获取session的最大有效时间。

8.getCreationTime方法:获取session的创建的时间。

9.getLastAccessedTime方法:获取session最后一次访问的时间。

10.getSession():从HttpServletRequest中获取session。

session.setMaxInactiveInterval(2*3600);//session 保存俩小时
 
Cookie cookie=new Cookie("JSESSIONID",session.getId());//sessionid放到cookie中
 
cookie.setMaxAge(2*3600);//客户端的cookie也保存俩小时
 
cookie.setPath("/");//cookie作用范围设为整个项目
 
response.addCookie(cookie);//给浏览器返回该Cookie

常见问题

1、关闭浏览器后cookie会消失吗?

cookie默认是存在于浏览器内存中的,若此时cookie没有持久化,浏览关闭后cookie会消失;若此时cookie进行了持久化,浏览器关闭后cookie不会消失。

2、关闭浏览器后session会消失吗?

1)从服务器端考虑

我们知道session是存在于服务器端内存中的,和浏览器没有关系,所以浏览器关闭后,服务器端的session不会消失。(除非服务器重启或session达到了过期时间)

2)从浏览器端考虑

我们知道浏览器是根据cookie中的jesessionid值来唯一找到服务器端的session的,此时若cookie没有持久化,浏览器关闭后cookie也跟着消失。所以当用户再次打开浏览器后,由于没有了cookie中的jesessionid,自然也无法唯一找到服务器端的session,对用户来说,确实是浏览器关闭后再次打开就无法找到上次的会话了,误以为是关闭浏览器后服务器端的session也跟着消失,其实还在。

web缓存

web缓存器又叫代理服务器(proxy server),它是能够代表初始web服务器来满足HTTP请求的网络实体。web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。可以配置用户的浏览器,使得用户的所有HTTP请求首先指向代理服务器。

浏览器创建一个到代理服务器的TCP连接,并向代理服务器中的对象发送一个HTTP请求。

代理服务器进行检查,看看本地是否存储了该对象副本。如果有,代理服务器就向客户浏览器用HTTP响应报文返回该对象。

如果代理服务器中没有该对象,它就打开一个与该对象的初始服务器的TCP连接。代理服务器则在到初始服务器的TCP连接上发送一个对该对象的HTTP请求。在收到该请求后,初始服务器向该代理服务器发送具有该对象的HTTP响应。

当web缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用HTTP响应报文发送该副本(通过现有的客户浏览器和代理服务器之间的TCP连接)

正向代理和反向代理

正向代理:目标服务器不知道客户端信息
在这里插入图片描述

保证客户端信息安全
缓存
访问某些访问不到的资源

反向代理:客户端不知道目的服务器信息(一般架设在服务器端)
在这里插入图片描述

在这里插入图片描述

  1. 保护内网安全
  2. 负载均衡
  3. 缓存,减少服务器的压力

Nginx作为反向代理服务器,安装在目的主机端,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后台的服务器,决定哪台目标主机来处理当前请求。

条件GET方法

首先,一个代理服务器代表一个请求浏览器,向web服务器发送一个请求报文
在这里插入图片描述
其次该web服务器向代理服务器发送具有被请求对象的响应报文。该代理服务器在将对象转发到请求的浏览器的同时,也在本地缓存了该对象。在这里插入图片描述
一个星期后,浏览器再次请求该对象,代理服务器向web服务器发送一个条件GET执行最新检查。
在这里插入图片描述
假设对象内容并未发生变化。web服务器向代理服务器发送304 NOT modified表示内容没有改变,直接返回之前缓存的对象给浏览器。
在这里插入图片描述

电子邮件

在这里插入图片描述

电子邮件系统的3个组成部分:用户代理,邮件服务器,简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)

邮件服务器形成了电子邮件体系结构的核心。每个接收方在其中的某个邮件服务器上有一个邮箱(mailbox),邮箱管理和维护着这些发送给他的报文。一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。当接收方要在它的邮箱中读取该报文时,包含它邮箱的邮件服务器通过用户名和口令鉴别它。发送方服务器以电子邮件的形式通知发送方发送的结果。
SMTP是一个推的协议,所以从发件人用户代理到发送方邮件服务器和发送方邮件服务器到接收方邮件服务器都是SMTP协议完成,但是接收方要运行用户代理,拉取他的邮箱邮件!需要能进行拉操作的协议!目前流行的就是第三版的邮局协议(POP3)、因特网邮件访问协议(IMAP)

在这里插入图片描述
telnet 163给qq邮箱发送邮件!(SMTP)

163需要获取授权码
在这里插入图片描述
这里两个都开启
在这里插入图片描述
cmd 中

telnet smtp.163.com 25  //建立与发送方服务器TCP连接
220 163.com Anti-spam GT for Coremail System (163com[20141201])
HELO 163.com
250 OK
AUTH LOGIN
334 dXNlcm5hbWU6
eXVleWFuNDMzMDE1QDE2My5jb20= //账户base64加密
334 UGFzc3dvcmQ6
S01LV0ZQSVNBT05GTEdDTA==  //授权码base64加密
235 Authentication successful
//如果是qq邮箱发送需要开启tls加密    starttls
mail from: <yueyan433015@163.com>
250 Mail OK
cpt to:<1165273203@qq.com> //可以有多个地址
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
from:<yueyan433015@163.com>
to:<1165273203@qq.com>  
SUBJECT:hello liuxuan  //标题
//这里要空一行,下面是正文!
hello liuxuan!  
best wishes
from yanyue
.
250 Mail OK queued as smtp7,C8CowAAnM8Q5o6xhvpY4Iw--.38039S2 1638704179 

SMTP要求每个报文采取7比特ASCII格式。如果某报文包含非7比特ASCII字符或二进制数据,则该报文必须按照7比特ASCII码进行编码。

上面telnet中,以下部分为完整报文。

from:<yueyan433015@163.com>
to:<1165273203@qq.com>  
SUBJECT:hello liuxuan  //标题
//这里要空一行,下面是正文!
hello liuxuan!  
best wishes
from yanyue

POP3

接收方当用户代理打开了一个到邮件服务器端口110上的TCP连接后,POP3就开始工作。随着建立TCP连接,POP按照三个阶段工作:
1.特许:用户代理发送用户名和口令鉴别用户
2.事务处理:用户代理取报文,此阶段可以对报文做删除标记,取消报文删除标记。
3.更新:quit命令后,结束会话,服务器删除哪些被标记为删除的报文。
用户代理发出一些命令,回答可能有两种:
+OK:被服务器用来只是前面的命令是正常的
-ERR:被服务器用来指示前面的命令出现了某些差错

cmd

telnet pop.163.com 110     
+OK Welcome to coremail Mail Pop3 Server (163coms[10774b260cc7a37d26d71b52404dcf5cs])       //telnet登录110端口
user yueyan433015@163.com          // 不需要base64编码
+OK core mail
pass KGWDXXXXQAFJK         // 授权码!不是密码  不需要base64编码(我的测试好像一次之后就登不上了)
+OK 1 message(s) [71211 byte(s)] 
STAT                        //查看邮箱状态 
+OK 1 71211
LIST                  // 邮件列表                                 
+OK 1 71211
1 71211
.
TOP 1 0  // 查看指定邮件的邮件头,0表示查看整个邮件头,其它正整数表示限制返回多少行。
+OK 71211 octets
From: Postmaster@163.com  
To: yueyan433015@163.com
Subject: =?gb2312?B?z7XNs83L0MU=?=    // 邮件主题
//省略一些信息
.

RETR 1             // 获取指定邮件
+OK 71211 octets 
From: Postmaster@163.com 
To: yueyan433015@163.com 
Subject: =?gb2312?B?z7XNs83L0MU=?=
//忽略一些信息
.


DELE 1                         // 删除第1封邮件
+OK core mail
STAT                             // 查看邮箱状态
+OK 0 0
QUIT                             // 退出

客户端实现了删除该邮件
在这里插入图片描述

IMAP

IMAP与POP3有什么不同?

POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。


而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

IMAP还有允许用户代理获取报文某些部分的命令。
收件人能够把邮件移到一个新的、用户创建的文件夹中,阅读邮件,删除邮件等。
与POP3不同的是,IMAP服务器维护了IMAP会话的用户状态信息

MIME:基于web的电子邮件

前面测试的telnet实际上都是本地客户端的邮件!对于常见的163和qq邮箱而言,我们需要开启授权才能收发邮件。但我们平常使用的使用一般都是基于web的(客户端软件也类似)!
使用这种服务,用户代理就是普通的浏览器,用户和其他远程邮箱之间的通信使用HTTP进行。当一个收件人向从邮箱中访问报文时,该电子邮件报文从该收件人的邮件服务器发送到它的浏览器(或客户端!)使用的是HTTP而不是POP3或者IMAP协议。当发送电子邮件时,该电子邮件使用HTTP发送到它的邮件服务器。然而,从它的邮件服务器发送到接收方的邮件服务器仍然使用的是SMTP。

DNS 域名系统

域名与IP的关系类似名字和身份证号的关系

DNS提供的服务

人们喜欢便于记忆的主机名标识方式,而路由器喜欢定长的、有着层次结构的IP地址。为了折中这些不同的偏好,我们需要的是一种能进行主机名到IP地址转换的目录服务。这就是域名系统(Domain Name System,DNS)的主要任务。
DNS:
1.是一个由分层的DNS服务器实现的分布式数据库,DNS服务器通常是运行BIND软件的UNIX机器
2.一个使得主机能够查询数据库的应用层协议,DNS协议运行在UDP上,使用53号端口

DNS是应用层协议原因在于裕兴在通信的端系统之间,通过下面的运输层协议来传送DNS报文,但它不直接和用户打交道,通常是由其他应用层协议使用的。

我们仍然考虑向浏览器中访问www.baidu.com会发生什么现象
1)同一台用户主机上运行这DNS应用的客户端
2)浏览器从上述URL中抽取主机名www.baidu.com,并将这台主机名传给DNS应用客户端。
3)DNS客户端向DNS服务器发送一个包含主机名的请求
4)DNS客户最终会受到一份回答报文,其中有对应该主机名的IP
5)浏览器接收到来自DNS的IP,向位于该IP的80端口发起TCP连接。

、、

DNS为因特网带来了额外的时延,不过DNS还提供了一些重要的服务(需要在万网对你的网站进行设置):

主机别名:有着复杂主机名的主机能拥有一个或多个别名。这一特点可以实现多域名指向同一个IP,将一个域名为规范主机名A,其他域名为A的别名。当IP地址更改时,就只需更改规范主机名对应的IP。无论是哪个别名,被访问时首先指向主机名,然后对主机名进行解析,解析结果按原路返回。


负载分配:DNS也用于在冗余的服务器之间进行负载均衡。繁忙的站点被冗余分布在多台服务器上,每台服务器都有不同IP,一个IP地址集合与同一个规范主机名相联系。DNS数据库中存储这这些IP地址集合。当客户对映射到某地址集合的名字发出一个DNS请求时,该服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址次序(IP轮询)所以DNS就在所有这些web服务器之间分配了负载。

DNS原理

应用程序为了将域名转换为IP调用操作系统函数,用户主机上的DNS接收到后,向网络中发送一个DNS查询报文。所有的DNS请求和回答报文使用UDP数据报经端口53发送。然后,用户主机上的DNS接收到一个提供所希望映射的DNS回答报文。这个映射结果被传递到调用的应用程序

简单设计是因特网中只有一个DNS服务器,所有的映射都在这台服务器上完成,但是面临单点故障、通信容量过大、距离过远、维护困难的问题

DNS使用了大量的DNS服务器,它们以层次方式组织分布在全世界范围内。没有一台DNS服务器拥有因特网上所有主机的映射。
有三种类型的DNS服务器:
1.根DNS服务器:有400多个根名字服务器遍及全世界,这些根名字服务器由不同的组织管理,根名字服务器提供TLD服务器的IP地址。
2.顶级域(Top-Level Domain,TLD)DNS服务器:TLD服务器提供权威服务器的IP地址
3.权威DNS服务器:web服务器和邮件服务器的每个组织机构必须提供公共可访问的DNS记录(或者放在提供商提供的权威DNS服务器中),这些记录将主机名字映射为IP地址。
在这里插入图片描述

本地DNS服务器:严格说来,本地DNS服务器不属于DNS的层次结构,每个ISP都有一台本地DNS服务器。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址。当主机发出DNS请求时,该请求发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中

家庭路由内置了一个DNS转发器。此时由于路由器本身也接管了下挂电脑的DHCP服务,所以它分配给下面电脑的DNS地址就是它路由的DNS,所以你能看到电脑的DNS分配到的可能是192.168.1.1。而路由器的DNS转发器将请求转发到上层ISP的DNS。

DNS过程:假设主机192.168.1.108想知道www.baidu.com的IP地址。同时本地DNS IP地址为192.168.1.1(即路由的DNS),主机向它的本地DNS服务器发送一个DNS查询报文。该查询报文含有www.baidu.com。本地DNS服务器将该报文转发到根DNS服务器(全世界仅有13个根DNS IP)。该根DNS服务器注意到com前缀,并向本地DNS服务器返回负责com的TLD。该本地DNS服务器向这个TLD服务器发送查询报文。该TLD服务器注意到baidu.com前缀,用该权威服务器的IP地址进行响应,最后向该权威DNS服务器(可能就是百度自己的)重发报文,该权威DNS服务器用www.baidu.com的IP进行响应。

在实践中,请求主机与本地DNS服务器之间查询是递归的,其他查询是迭代的

在这里插入图片描述
DNS缓存

为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。

DNS缓存原理:在一个请求链中,当本地DNS服务器从某个DNS服务器收到回答,它能够缓存包含在该回答中的任何信息。如果在DNS服务器中缓存了一台主机名/IP地址对,另一个对相同主机名的查询到达该DNS服务器时,该DNS服务器能直接提供IP。或者有该主机名的TLD DNS服务器(或者权威服务器)的IP,那么就发送到TLD DNS服务器(或者权威服务器),而不发送到根DNS。

DNS记录和报文

所有DNS服务器存储了资源记录(Resource Record,RR),RR提供主机名到IP映射。
RR(Name,Value,Type,TTL)
Type=A,Name=主机名,Value=主机IP,A类型提供标准的主机名到IP地址的映射,比如记录权威服务器拥有特定主机名的映射(www.baidu.com IP)
Type=NS,Name=域,Value=下级DNS服务器主机名,比如 根DNS或者TLD DNS拥有权威DNS服务器主机名 (com baidu.com),对于该权威DNS服务器主机名有A记录映射IP
Type=CNAME,Name=别名,Value=规范主机名
Type=MX,Name=别名,Valu规范主机名(邮件服务器)

DNS有查询和回答报文,两种报文格式相同。
在这里插入图片描述

前12个字节是首部区域:
标识符:标识符用于标识该查询,这个标识符被复制到对查询的回答报文中,用于客户端匹配发送请求和接受到的回答
标志:有若干标志
问题:包含正在进行的查询信息,1.名字字段,包含正在被查询的主机名字。2.类型字段,该名字正在被询问的问题Type。
回答:包含对最初请求名字的资源记录,可以有多条RR。
权威区域:其他权威服务器的记录
附加区域:例如一个CNAME记录了规范主机名,附加信息中包含A记录,记录该规范主机名的IP地址。

nslookup测试!
在这里插入图片描述
当一个人在网上冲浪时,有比满足眼球更多的事情进行!

P2P文件分发

在客户端-服务器文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分。
最流行的P2P文件分发协议是BitTorrent。
迅雷是典型的P2P,去中心化,一人下载,多人提供,只不过迅雷在P2P的基础上加了一些业务,改变了纯粹P2P的排队机制。

BitTorrent协议:

参与一个特定文件分发的所有对等方的集合被称为一个洪流(比如迅雷一个文件下载者集合)。当一个对等方首次加入洪流时,它没有块,随着时间的流逝,它积累了越来越多的块。当它下载时,也为其他对等方上载了多个块。一旦对等方取得整个文件,它也许离开洪流,也许留在洪流中为其他对等方上载块。
每个洪流有一个追踪器,当一个对等方加入洪流时,它向该追踪器注册自己,并周期性的告诉追踪器自己还在该洪流中。
当一个新的对等方(张三)加入洪流时,追踪器随机选择子集,将自己的IP地址发送给张三,张三与该自己并行建立TCP连接。张三周期性询问子集中的对等方它们拥有的块列表。张三根据这些列表对它没有的块发出请求。张三应当请求她的邻居中副本最少的块(最稀缺优先),这样稀缺块得到更为迅速的分发。其他邻居请求张三的块,张三应当决定响应能够以最高速率(之前向上载给它数据的速率)向她提供数据的邻居。这种效果是对等方能够以趋向于找到彼此的协调的速率上载。

套接字编程

书中以Python为例,这里以Java为例,之前博客有写过聊天室的案例,这里仅分析基本的套接字编程流程,TCP和UDP是运输层协议,结合运输层一起看。

UDP套接字编程

使用UDP时,必须将目的端口和源端口附在分组上。在该分组传过发送方的套接字之后,因特网将使用该目的地址(IP+端口)为该分组选路到接收进程的套接字。当分组到达接收套接字时,接收进程通过该套接字取回分组,然后检查分组内容并采取适当的动作。
发送方的源地址也是由主机IP和套接字端口组成,源IP是由操作系统附上的。当然源IP和目的IP其实是属于网络层的一部分,UDP和TCP中报文都没有IP信息。属于是网络层的软件部分
在这里插入图片描述

public class UDPClient {
	public static void main(String[] args) throws IOException {
		DatagramSocket client = new DatagramSocket(8888);  //套接字绑定本机端口
		
		String data = "hello";
		byte[]datas = data.getBytes();//数据转换为字节流
		
		DatagramPacket packet = new DatagramPacket(datas,0,datas.length,
				new InetSocketAddress("localhost",9999)); //InetSocketAddress  目的地套接字对象
		client.send(packet);
		client.close();
	}
}
public class UDPServer {
	public static void main(String[] args) throws IOException {
		DatagramSocket server = new DatagramSocket(9999);
		
		byte[]container = new byte[1024*6];
		DatagramPacket packet = new DatagramPacket(container,0,container.length);
		
		server.receive(packet); //一直等待接收往下进行
		
		byte[]datas = packet.getData();//接收套接字包中数据
		int len = packet.getLength();
		System.out.println(new String(datas,0,len));
	}
}

TCP套接字编程

在这里插入图片描述

当创建TCP连接时,将客户套接字地址(IP+端口)与服务器套接字地址(IP+端口)关联。
当然,这里是IP仍然是属于网络层的软件部分,TCP报文中没有IP信息

客户进程向服务器发起一个TCP连接,这是由客户程序创建一个TCP套接字实现的。当该客户生成其套接字时,指定服务器中的欢迎套接字的地址(IP+端口),生成其套接字后,该客户发起一个三次握手并与服务器的一个TCP连接。发生在运输层的三次握手,对于客户和服务器是完全透明的过程。当服务器听到敲门声时,将生成一个新套接字,它专门对客户进行连接生成的套接字,称为连接套接字(connectionSocket)

在这里插入图片描述

public class TCPClient {
	public static void main(String[] args) throws IOException{
		Socket client = new Socket("localhost",6666);//自动绑定本地端口
		String data = "hello,xuan";
		OutputStream ins = client.getOutputStream();
		ins.write(data.getBytes());
		ins.flush();
		
		byte[] datas = new byte[1024*6];
		client.getInputStream().read(datas);
		System.out.println(new String(datas,0,datas.length));
		
		
		ins.close();
	}
}
public class TCPServer {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(6666);  //欢迎套接字
		Socket server = serverSocket.accept();  //连接套接字   connectionSocket
		byte[] datas = new byte[1024*6];
		server.getInputStream().read(datas);
		System.out.println(new String(datas,0,datas.length));
		
		OutputStream os = server.getOutputStream();
		os.write(new String("hello,yan").getBytes());
		server.close();
	}
}

UDP在目的主机是通过目的IP和目的端口标识套接字的,TCP是通过源IP、源端口、目的IP、目的端口来标识套接字的(因为TCP一个连接就有一个连接套接字,一个连接是由这四个信息唯一确定的)。

web与TCP

当今的高性能web服务器通常只使用一个进程,但是为每个新的客户连接创建一个具有新连接套接字的新线程。对于这样一台服务器,在任意给定的时间内都可能有许多连接套接字连接到相同的进程。

如果客户与服务器使用持续HTTP(之前F12百度就是持续连接的),则在整条连接持续期间,客户和服务器之间经由同一个服务器套接字交换HTTP报文。然而,如果客户与服务器使用非持续HTTP,则每一对请求响应都创建一个新的TCP连接并随后关闭。

运输层

概述

运输层与应用层:

运输层协议为应用层提供了逻辑通信功能。应用进程使用运输层提供的逻辑通信功能彼此发送报文,而无需考虑承载这些报文的物理基础设施的细节。客户进程通过套接字传递数据流,数据一旦通过套接字,就由UDP或TCP控制了。在发送端,运输层从发送应用程序进程接收到的报文转换成运输层分组,即报文段。实现的方法可能是将应用报文分成较小的块,并为每块加上一个运输层首部生成报文段。

运输层与网络层:

运输层协议是在端系统中而不是在路由器中实现的。在发送端系统中,运输层将报文段传递给网络层,网络层将其封装成数据报并向目的地发送。路由器仅作用于数据报的网络层字段,不检查封装在数据报汇总的报文段。在接收端,网络层从数据报中提取报文段,将该报文段给运输层,运输层将报文段中的数据给接收应用程序。


将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务。将主机交付扩展到进程间交付被称为运输层的多路复用(transport-layer multiplexing)与多路分解(demultiplexing)。将在后面进一步讨论。

UDP和TCP提供的服务:


UDP和TCP可以通过在报文段首部中包括差错检查字段而提供完整性检查。进程到进程的数据交付差错检查是两种最低限度的运输层服务(也是UDP仅能提供的两种服务)


TCP为应用程序提供了集中附加服务:
可靠数据传输(reliable data transfer):通过使用流量控制、序号、确认、计时器(后面展开这些技术),TCP确保正确的、按序的将数据从发送进程交付给接收进程。TCP将两个端系统间不可靠IP服务转换成进程间的可靠数据传输服务。

拥塞控制:是一种提供给整个互联网的服务,是一种带来通用好处的服务。防止任何一条TCP连接用过多流量来淹没通信主机之间的链路和交换设备。TCP力求为每个通过一条拥塞网络链路的连接平等共享网络连接带宽。这可以通过TCP链接发送端发送速率做到

多路复用和多路分解

在源主机从不同的套接字中收集数据块,并为每个数据块封装上首部信息(用于分解)从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用。

每个报文段中有几个字段。在接收端,运输层检查这些字段,标识出接收套接字,进而将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解

详细的分析已经在第二章尾部套接字编程中写过,不再赘述。

注:这里介绍一下端口,端口号是一个16比特的数,其大小在0-65535之间。0-1023范围的端口号称为周知端口号,是受限制的,它们被保留给注入HTTP(80)、SMTP(25)之类的应用层协议使用。

UDP

UDP提供的服务

除了复用/分解功能以及少量的差错检测外,UDP几乎没有对IP增加别的东西。

UDP从应用进程得到数据,附加上用于多路复用/分解服务的源和目的端口字段,以及长度和检验和。然后将形成的报文段交给网络层。网络层将该运输层报文段封装到一个IP数据报中,然后尽力而为尝试将此报文段交付给接收主机。如果该报文段到达接收主机,UDP使用的端口号将报文段中的数据交付给正确的应用进程。

因特网流行应用使用的协议参见第一章中的图

UDP优势

为什么有些应用宁愿使用UDP,不使用有更多保障的TCP?

只要应用进程把数据给UDP,UDP就立即打包报文段发送给网络层。另一方面,TCP的拥塞控制机制遏制TCP发送方,不管可靠交付需要多长时间。因为实时应用要求最小的发送速率,且能容忍数据丢失,这些应用可以使用UDP。比如流式多媒体、因特网电话、DNS

无需连接建立导致的时延,这可能是使用UDP的主要原因。

无连接状态。TCP需要在端系统维护连接状态,此连接状态包括接收和发送各种可靠数据服务和拥塞控制所需参数。

分组首部开销小。UDP8字节,TCP20字节。

UDP报文段结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0vK6sla-1638793979674)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211206201248134.png)]

UDP首部4个字段,一般8个字节(2+2+2+2),源端口和目的端口不用说了。长度字段只是了UDP报文段中的字节数(首部+数据)。接收方用检验和来检查在该报文中是否出现了差错。(实际上计算检验和还需要IP数据报首部的信息,这里忽略这些细节)

UDP检验和

UDP检验和提供了差错检测功能(但对差错检测无能为力,UDP丢弃受损报文段或交给应用程序)。检验和用于确定当UDP报文段从源到目的地移动时,其中的比特是否发生了改变。

发送方的UDP对报文的所有16比特字的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文中检验和字段

在这里插入图片描述
在接收方全部的4个16比特字(包括检验和)加在一起。如果没有引入差错,那么该和将是111111111111111.

可靠数据传输原理

概述

可靠数据传输不仅在运输层出现,虽然这些协议都是划分在运输层的,但是这些技术也可以用在链路层和应用层中(至于怎样应用的先不考虑),只不过其他层没有提供完全可靠的保证。而运输层提供了这样的保证,必须要使用这些协议来实现这样的保证。就我们的目的而言,可以直接将运输层的底层看做不可靠点到点信道

可靠数据传输为上层提供服务的抽象是:数据可以通过一条可靠的信道进行传输。借助于可靠信道,传输数据比特就不会收到损坏(由0变1,或者相反)或丢失。而且所有数据都是按照其发送顺序进行交付。这恰好就是TCP向调用它的因特网应用提供的服务模型。实现这种服务抽象是通过可靠数据传输协议(rdt)的责任

我们对底层信道的假设是:分组将以它们发送的次序进行交付,某些分组可能会丢失,也就是说,底层信道不会对分组重排序。

我们应当考虑的是:当底层信道能够损坏比特或者丢失整个分组时,需要什么样的协议机制。

\

对于下图b,做一个简单的解释:这里仅仅表示了单向传输!(这里不用套接字编程对应)

rdt_send:代表可靠传输

udt_send:代表低层信道不可靠传输

deliver_data:将数据给较高层

rdt_rcv:可靠接收

rdt_send和rdt_rev合起来代表了可靠传输协议的两端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DyIlxVAb-1638931721712)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211206222302305.png)]

rdt

rdt1.0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-USYZM7x4-1638931721714)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207092422662.png)]

在1.0中,发送端发送分组到信号中。在接收端接收分组并将数据上传给较高层

在这个简单的协议中,假定信道是完全可靠的,接收端就不需要提供任何反馈信息给发送方,因为不必担心出错。

rdt2.0

底层信道更为实际的模型是分组中比特受损的模型!

使用肯定确认ACK(positive acknowledgment)和否定确认NAK(negative acknowledgment)。ACK告诉发送方内容被正确接收。NAK让发送方重新发送。基于这样重传机制的可靠数据传输协议称为自动重传请求协议(ARQ)。用1比特0表示NAK,1比特1表示ACK。

ARQ三种机制:差错检测、接收方反馈、重传

分析下面该图:

发送端发送分组,带有检验和(就像UDP中使用的检验和),进入到右边等待ACK或NAK状态,如果收到一个ACK,说明正确接收,回到左边状态。如果收到NAK,重传上一个分组并等待ACK和NAK。

当发送方处于等待ACK或NAK时,不能发送新数据,这种行为称为停等协议(stop-and-wait)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2VNADU3z-1638931721715)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207105515705.png)]

2.0存在致命的缺陷是,没有考虑ACK和NAK受损!

2.1处理方式是当发送方接收到含糊不清的ACK或NAK,只需重传当前分组。这种方法引入了冗余分组,但接收方不知道这个重传的分组是新分组还是重传分组!

解决这个新问题的简单方法是(几乎现有的数据传输协议都使用这种方法)是在数据分组中添加序号(sequence number)。接收方只需要检查序号即可确定收到的分组。

序号1比特即可:对发送方,0表示当前发送的数据,1表示 0发送并接收成功后 下一个发送的数据。对接收方,0表示正在接收的数据,0接收成功,下一个等待接收的数据。

如果发送方发送数据包0,接收方成功接收并返回ACK并等待数据包1,但ACK翻转(变NAK)。发送方收到NAK重传数据包0。接收方不接收该分组,避免重复

如果发送方发送数据包0,该数据翻转,返回NAK,接收方继续等待0号数据包,NAK翻转成ACK,发送方发送1号数据包,接收方拒绝接受,避免错序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ylOdxt3-1638931721716)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207105557013.png)]

rdt2.2是在rdt2.1的基础之上做了小小的改善,摒弃了NAK,只需采用ACK。我们在ACK的信息上加上了数据报的顺序号,现在假设情景发送方向接收方发送0号数据包,如果接收方接收到0号数据包,返回(ACK,0),发送方接着发送1号数据包。如果接收方接收到0号数据包出现错误,返回(ACK,1),发送方重传0号数据包。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJIu4mtg-1638931721717)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207105617680.png)]

2.2之前都没有考虑丢包问题,试想如果发送的分组丢包,接收方一直等待接收分组,会死等导致网络拥塞。rdt3.0解决丢包问题

发送方传输一个数据分组该分组或对该分组的ACK丢失。使用基于时间的重传机制,需要一个倒计数计时器(countdown timer)。发送方每次发送一个分组,启动定时器,定时器时间结束,重传该分组(不管分组是否丢失)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NfkQriil-1638931721718)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207105643310.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iRNe2yEw-1638931721719)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207104509869.png)]

至此,我们使用检验和、序号、定时器、ACK,得到了一个可靠数据传输协议! (虽然它是低性能的)

流水线可靠数据传输协议

rdt3.0是一个功能正确的协议,但并非人人都对它的性能满意,特别是在今天的高速网络中更是如此。rdt3.0性能问题的核心在于它是一个停等协议。

这种特殊的性能问题的一个简单解决方法是:不以停等方式运行,允许发送方发送多个分组而无需等待确认。两种流水线协议实现解决,一种是GBN(回退N步),一种是SR(选择重传)

不以停等方式运行,相比于rdt3.0所需的改进有:

  • 必须增加序号范围,正在输送的分组必须有唯一序号
  • 协议发送方和接收方必须缓存多个分组,发送方最低应当缓存哪些已发送但没有确认的分组(用于重传)。
  • 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组。

关于GBN和SR,本书中太过啰嗦,掌握其原理即可

GBN

GBN协议也常被称为滑动窗口协议(sliding-window protocol),滑动窗口长度为N,窗口内包括已经发送但还未被确认的分组和可以发送还未发送的分组,窗口长度可根据接收方接收和缓存报文的能力(流量控制)、网络中的拥塞程度(拥塞控制)或两者情况来设置,设置窗口也是因为这两个因素。

在GBN协议中,对序号为n的分组的确认采取累计确认,表明接收方已经正确接收到序号为n以前且包括n在内的所有分组。如果出现超时,发送方重传所有已发送但还未被确认过的分组。接收方的动作很简单,如果一个序号为n的分组被正确接收到,并且按序,则接收方为分组n发送一个ACK。在其他所有 情况下,丢弃分组。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1M0KpStr-1638931721719)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207150907710.png)]

单个分组的差错会引起GBN重传大量分组,许多分组根本没有必要重传。随着信道差错率的增加,流水线可能被这些不必要的重传分组所充斥。

SR

SR协议接收方确认一个正确接收的分组而不管其是否按序。失序的分组缓存到接收方直到序号更小的所有分组都被收到。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knvKiLBD-1638931721720)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207150940959.png)]

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvIUnmIr-1638931721721)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207211527605.png)]

拥塞控制原理

在实践中,丢包一般是当网络变得拥塞时由于路由器缓存溢出引起的。为了处理网络拥塞原因,需要一些机制以在面临网络拥塞时遏制发送方。

就像可靠数据传输一样,拥塞控制在组网技术中的前10个基础性重要问题清单中位居前列。

拥塞原因与代价

我们先不关注如何对拥塞控制方法,讨论三种情况,随着主机增加其发送速率并使网络变得拥塞时发送的情况。根据资源未被充分利用以及端系统得到的低劣服务性能来评价。

情况1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqGVyr3i-1638951852616)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208125611629.png)]

假设主机A中的应用程序以in字节/秒的平均速率发送到连接中(应用程序到套接字),假设路由器缓存无限。来自主机A和主机B的分组通过一台路由器,在一段容量(瓶颈链路决定)为R的共享式输出链路上传输。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5Z7AxJf-1638951852619)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208125634583.png)]

当发送速率在0-R/2之间时,接收方的吞吐量等于发送方的发送速率。发送速率超过R/2时,它的吞吐量只能达R/2。这个吞吐量上限是由两条连接之间的共享链路容量(瓶颈链路决定)造成的。当发送速率接近R/2时,平均时延越来越大。我们发现了拥塞网络的一种代价,分组到达速率接近链路容量,分组经历巨大的排队时延。

情况2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXqYpovq-1638951852620)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208152324188.png)]

假设路由器缓存是有限的。

我们以in字节/秒表示以你用程序将初始数据发送到套接字中的速率。以in’表示运输层向网络中发送报文段的速率(包括了初始数据和重传数据,有时候被称为网络的供给载荷

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7xnP4If-1638951852621)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208154210118.png)]

考虑以下三种情况:

1.主机能以某种方式确定路由器中的缓存是否空闲(虽然这是不现实的),仅当缓存空闲时才发送一个分组。在这种情况下,不会丢包in=in’,并且吞吐量等于in,从吞吐量角度看,性能是理想的

2.考虑更为真实的情况,发送方快速重传,考虑供给载荷in’=R/2,在这一供给载荷值时,数据被交付给接收方应用程序的速率是R/3。因此在发送的0.5R单位数据中,0.333R字节/秒是初始数据,而0.166R字节/秒是重传数据。再次看到了另一种网络拥塞的代价,即发送方必须执行重传以补偿因为缓存溢出而丢弃的分组。

3.发送方也许提前发生超时并重传在还未丢失的分组,初始数据分组和重传分组都可能到达接收方。重传的初始分组副本是在做无用功,因为接收方已经接收到了分组的初始版本。再次看到了网络拥塞的另一种代价,即发送方进行的不必要重传会引起路由器利用其链路带宽来转发不必要的分组副本。

情况3:

再次假设每台主机都有相同的in值,所有路由器的链路容量都是R字节/秒。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5WbRma7d-1638951852622)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208160942635.png)]

对于很小的in值,路由器缓存溢出很少见,吞吐量大致接近供给载荷。

对于很大的in值,考虑主机A到主机C,主机B到主机C都经过路由器R2,B-D的供给载荷趋近于无穷大时,R2的空闲缓存会立即被B-D连接的分组占满,因而A-C连接在R2上的吞吐量趋近于0。在此,我们看到由于拥塞而丢弃分组的另一种代价,即当一个分组沿一条路径被丢弃时,每个上游路由器用于转发该分组到丢弃该分组的传输容量最终被浪费了。

拥塞控制方法

在实践中采用的两种主要拥塞控制方法。

1.端到端拥塞控制,IP层不会向端系统提供有关网络拥塞的反馈信息。

2.网络辅助的拥塞控制,路由器向发送方提供关于网络中拥塞状态的显示反馈信息。这种反馈可以简单的用一个比特来指示链路中的拥塞情况。例如,在ATM可用比特率(ABR)拥塞控制中,路由器显示地通知发送方它能在输出链路上支持的最大主机发送速率。对于辅助控制的反馈方式有两种,直接反馈信息可以由网络路由器发送给发送方(阻塞分组)。更为通用的第二种形式是路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生。

TCP

TCP连接

TCP连接是一条逻辑连接,其共同状态仅保留在两个通信端系统的TCP程序中。中间的网络元素不会维持TCP连接状态。事实上,中间路由器(最高网络层)和交换机(最高链路层)对TCP连接完全视而不见。


三次握手简述:客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段响应,最后客户再用第三个特殊报文段作为响应。前两个报文段不承载应用层数据,第三个报文段带上应用层数据。


数据一旦从应用层通过套接字,就由TCP控制了,TCP将这些数据引导到该连接的发送缓存里,接下来TCP不时从缓存取出数据,将数据取出加上首部封装成TCP报文段传递到网络层。当TCP另一端收到TCP报文后,报文段中数据被放到接收缓存中。

这个取出值得讨论,取出多少数据?

受限于最大报文段长度MSS(其实是指报文段中数据最大长度,只不过这个名字已经根深蒂固了),MSS通常通过最大链路帧长度即最大传输单元(MTU)来设置。由于IP首部20,TCP首部20,以太网和PPP链路层协议都有1500字节的MTU,所以MSS典型值为1460.

TCP报文段结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuCaXRS0-1638931721721)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207201833506.png)]

与UDP的报文段结构一样,首部包括源端口号32、目的端口号32、检验和16。

TCP报文段首部还包含下列字段:
1.32比特的序号字段和32比特的确认号字段,用于可靠数据传输。序号是该报文段首字节的字节流编号。主机A已经接收了0525序号的分组和9001000的分组(失序到达,滑动窗口缓存),主机A填充进报文段的确认号为主机A期望从主机B收到的下一字节的序号,526,即累计确认的方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQA6Z0Pi-1638931721722)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211207203157323.png)]

2.16比特的接收窗口字段,用于流量控制。

3.4比特的首部长度字段,指示了以32比特的字为单位的TCP首部长度

4.TCP选项字段大小可变,通常为空,用于发送方与接收方协商MSS时使用

5.6比特的标志字段,ACK表示该报文段对一个以被成功接收报文段的确认。RST、SYN、FIN比特用于连接建立和拆除。CWR和ECE用于拥塞。还有PSH、URG和紧急数据指针在实践中并没有使用。

TCP可靠数据传输

TCP依赖于前一节讨论的许多基本原理,包括检验和、定时器、序号、确认、重传。

书中递进描述TCP的可靠数据描述,这里只描述最终版本

检验和:即差错检测,和上一节讨论一致。

定时器:之前讨论可靠数据传输我们对每个分组的发送都采用定时器,开销太大,TCP采用单一定时器,该定时器从窗口中最先发出且未确认的分组时间开始算。超时重传该报文段。每次超时之后将下一次的超时时间设置为先前值的两倍。(这是一种形式受限的拥塞控制)

序号和确认和重传:TCP确认机制是GBN和SR的混合体,和GBN一样使用冗余ACK,不对失序报文段确认。和SR一样,缓存失序报文段,只重传未确认序号最小的报文段。使用快速重传方式,三次冗余确认重传。

TCP流量控制

一条TCP连接的每一侧主机都为该连接设置了接收缓存,当该TCP接收到正确的字节后,就将数据放入接收缓存,相关联的应用进程从缓存中读取数据。如果某应用程序读取数据太过缓慢,而发送方发送的太多、太快,发送的数据就会很容易使该连接的接收缓存溢出。

流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的速率匹配。

TCP通过让发送方维护一个称为接收窗口(receive window),即可靠数据传输中的滑动窗口 的变量来提供流量控制。通俗的说,接收窗口用于给发送方一个指示,该接收方还有多少可用的缓存空间,使得发送方动态改变其窗口大小。发送方发送到连接中但未被确认的数据量<=rwnd

TCP连接

三次握手:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sS7DEwM-1638931721723)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208101408385.png)]

第一步:客户端TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据。在报文段首部SYN=1。客户随机选择一个初始序号seq=client_isn,并将此编号放置于序号字段中。改报文段称为SYN报文段

第二步:服务器主机接收该TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。这个允许连接的报文段也不包含应用层数据。SYN=1,ack=client_isn+1。服务器选择初始序号seq=server_isn,将其放置到序号字段中。该报文段被称为SYNACK报文段。

第三步:在收到SYNACK报文段后,客户也要给该连接分配缓存和变量。客户向服务器发送另一个报文段,这最后一个报文段对服务器的允许连接报文段进行了确认,ack=server_isn+1.因为连接已经建立,SYN=0,seq=client_isn+1。该第三阶段可以在报文段中携带应用层数据。

一旦完成这三个步骤,以后的报文段中,SYN都被置为0。

天下没有不散的宴席,四次挥手:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wU1mcv6g-1638931721723)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208103756648.png)]

客户应用进程发出一个关闭连接命令。这会引起客户TCP向服务器进程发送一个特殊的TCP报文段,其首部FIN=1。当服务器接收到该报文段后就向发送方回送一个确认报文段。服务器发送它自己的终止报文段,FIN=1。最后客户对该终止报文段确认,至此连接关闭。

客户和服务器连接释放过程状态图

在这里插入图片描述

TCP拥塞控制

TCP必须使用端到端拥塞控制而不是使用网络辅助的拥塞控制,因为IP层不向端系统提供显示的网络拥塞反馈。
TCP采用的方法是根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果一个TCP发送方感知从它到目的地之间的路径上没什么拥塞,增加发送速率;如果发送方感知沿着该路径有拥塞,则降低发送速率。

序号考虑以下三个问题:
1.如何限制发送速率:运行在发送方的TCP拥塞控制机制跟踪 拥塞窗口(congestion window)和 接收窗口(receive window) 变量,在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值。这里cwnd指的是一个RTT内,允许发送方向向该连接发送cwnd个字节的数据。
2.如何感知拥塞:感知丢包事件(超时或者收到接收方的三个冗余ACK)
3.如何确认发送速率:当确认到达,扩大拥塞窗口;当感知到拥塞,缩小拥塞窗口。TCP调节的策略是接收ACK增加速率,直到出现丢包才减小传输速率,接收ACK继续扩张。

慢启动:

cwnd的值以1个MSS(报文段中数据最大长度)开始,每次一个ACK就增加1个MSS。1个RTT发送1个MSS,收到ACK。发送两个MSS,收到两个MSS的ACK。发送4个MSS,收到4个 ACK。一直这样下去,以指数增长。

结束:
1.当cwnd>ssthresh,结束慢启动并且TCP转移到拥塞避免模式
2.超时事件,TCP将cwnd设置为1并重新开始慢启动。状态变量ssthresh设置为拥塞窗口值的一半。
3.检测到3个冗余ACK,执行快速重传进入快速恢复状态

拥塞避免:

一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的一半,即距离拥塞可能并不遥远。一种通用的方法是对于TCP发送方无论何时到达一个新的确认,就将cwnd增加一个MSS字节。

结束:
1.超时事件发生,TCP将cwnd设置为1并重新开始慢启动。状态变量ssthresh设置为拥塞窗口值的一半。
2.检测到三个冗余ACK,执行快速重传进入快速恢复状态

快重传和快速恢复:

快重传冗余ACK对应的分组,快恢复cwnd减半,ssthresh的值记录为cwnd一半。快恢复后进入拥塞避免状态。

我们可以看到,在慢启动和拥塞避免状态,如果发生超时,代表网络比较拥堵,ssthresh置为cwnd一半,将cwnd置为1并慢启动。
在这里插入图片描述如果检测到拥堵,即三个冗余ACK,说明网络轻微拥堵,ssthresh置为cwnd一半,cwnd减半,我们进行快重传和快恢复。快速恢复后进入拥塞避免状态。
在这里插入图片描述
注:这里本书中快恢复是cwnd减半后加了三个冗余ACK的MSS,在其他大部分国内教科书中以及上图是直接减半的。24/2=12

网络层:数据平面

概述

H1向H2发送消息,H1中的网络层取得来自H1运输层的报文段,将每个报文段封装成一个数据报,然后向相邻路由器R1发送该数据报。在接收方主机H2,接收来自相邻路由器R2的数据报,提取出运输层报文段,并将其向上交付给H2的运输层。

网络层实现了主机到主机的通信服务,运输层依赖网络层的主机到主机的通信服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BCnCTue3-1639192835088)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209143711129.png)]

因特网的网络层提供了单一的服务,称为尽力而为服务(best-effort service)。使用尽力而为服务,传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽,尽力而为服务看起来是根本无服务的一种委婉说法,但这种服务与适当带宽供给相结合已经足够好。

数据平面与控制平面

网络层能够被分为两个相互作用的部分,即数据平面控制平面。数据平面决定到达路由器输入链路之一的数据报如何转发到路由器的输出链路之一(转发),一般是由硬件实现。本章我们详细学习数据平面的转发,涉及传统的IP转发和通用转发。控制平面的功能是协调这些本地的路由器转发动作,使得数据报沿着源和目的主机之间的路由器路径最终进行端到端传送(路由选择)一般由软件实现,通常是一种传统CPU。我们下一章学习控制平面。

在因特网中这些控制平面路由选择协议和数据平面转发功能已经被实现为一个整体,位于一台路由器中。

每台路由器中有转发表(forwarding table),路由器检查分组首部值,进而使用首部值在转发表中索引,索引指出将被转发的路由器的输出链路接口。路由选择算法决定了插入该路由器转发表的内容,在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,以计算出它的转发表的值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wos357cy-1639192835090)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209144310186.png)]

软件定义网络(Software- Defined Networking,SDN)通过将控制平面功能作为一种单独服务,分离数据平面和控制平面,控制平面功能通常置于一台远程控制器中。

注:查阅一些资料发现,SDN并未代替传统网络,目前还处于发展阶段,不过它的设计无疑是先进的,可以将SDN这部分内容独立出来理解。、

在这里插入图片描述

由于SDN还未广泛应用,本文中不引入SDN及通用转发内容

路由器工作原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RknQH4pR-1639192835091)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209152815049.png)]

注:图中虚线箭头表示处理器中转发表复制到每个输入端口,避免集中式处理的瓶颈。

输入端口(这里的端口,指物理接口)执行几项重要功能,物理链路的物理层功能(最左侧方框),与数据链路层交互来执行数据链路层功能(中间方框)。执行查找功能(最右侧方框),正是在此,通过查询表决定路由器的输出端口,到达的普通分组通过路由器的交换结构转发到输出端口,控制分组从输入端口转发到路由选择处理器。

输出端口存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。

交换结构将路由器的输入端口连接到它的输出端口。

路由选择处理器执行控制平面功能,使用路由器选择协议与其他网络路由器中的路由选择处理器进行交互,维护路由选择表与关联链路状态信息,并为该路由器计算转发表。(在SDN中,路由选择处理器与远程控制器通信,接收由远程控制器计算的转发表项,并在该路由器的输入端口安装这些表项)

输入端口处理和基于目的地转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxDLFPo5-1639192835092)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209162457013.png)]

路由器用用分组目的地址的前缀与该表中的表项进行匹配;如果存在一个匹配项,则路由器向与该匹配项相关联的链路转发分组。如果一个前缀不匹配前3项中的任何一项,则路由器向接口3转发该分组。

目的地址可能与多个表项匹配,路由器使用最长前缀匹配原则,向最长前缀匹配相关联的链路接口转发分组。

交换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vUKIqqg9-1639192835093)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209162936100.png)]

经内存交换: 一个分组到达输入端口,该端口会先通过中断方式向路由器处理器发出信号。于是,该分组从输入端口被复制到处理器中。路由选择处理器根据其首部找出对应输出端口,将分组复制到输出端口的缓存中。经过共享系统总线一次只能执行一个内存读/写。

经总线交换: 不需要选择处理器的干预,(猜测是根据复制到输入端口的转发表)预先计划一个交换机内存标签(首部)指示输出端口,该分组传送给所有输出端口,只有与标签匹配的端口保存该分组。一次只有一个分组能够跨越总线。

经互联网络交换: 由2N条总线组成的互联网络,因为有多条总线,所以可以并行转发多个分组(A-Y,B-X)。

输出端口处理

输出端口处理已经存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。

排队

输入排队:线路前部阻塞(Head-Of-the-Line,HOL)。如果链路当前正忙于传输另一个分组,到达链路输出队列的分组要排队等待传输。

输出排队:多个分组到达同一个输出队列。需要从输出队列中调度分组发送到输出链路

如果没有足够的缓存空间容纳到达的分组,队列的分组丢弃策略(主动队列管理算法(ARQ))确定丢弃该分组或者队列其他分组。

调度

1.先进先出(FIFO,FIrst-In-First-Out)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYN2MmpU-1639192835094)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209183253559.png)]

2.优先权排队

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YGDVd7A4-1639192835094)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209183338249.png)]

分优先级类,先调度优先级高的类,同一优先权类的分组使用FIFO完成。在非抢占式优先权排队中,即使在将较低优先级分组传输出链路时,高优先级分组到来也不能打断传输。(下图中1,3,4位高优先级。2,5低优先级)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QD4qdQWQ-1639192835095)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209183609219.png)]

3.循环和加权公平排队

循环排队规则: 分类但不分优先级,循环各个类(1,2,4一类,3,5一类)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbtPOHaG-1639192835096)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209183945660.png)]

加权公平排队(Weighted Fair Queuing,WFQ): 按照优先级顺序循环各个优先级类,这种方式广泛的实现在路由器中。

IP协议

数据报格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dvirat3j-1639192835096)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209222659144.png)]

数据报分片

每个IP数据报封装在链路层帧中从一台路由器中传输到下一台路由器,故链路层协议的MTU严格限制着IP数据报的长度(以太网帧1500)。对IP数据报长度具有严格限制并不是主要问题。问题在于在于发送方与目的路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU,问题是如何将较大的数据报挤进较小的MTU

解决该问题的方法是将IP数据报中的数据分片成多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报,然后通过输出链路发送这些帧。这些较小的数据报都称为片。

对于TCP/UDP而言,都希望收到完整的IP数据报,IPv4的设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络路由器中。

IPv4的设计者用标识、标志、偏移字段进行分片和组装。

标识:拥有相同标识的来自于同一数据报

标志:最后一个片标志位0,其他为1

偏移字段:片在初始数据报中的位置

IPv4编址

每台主机与路由器都能发送和接受IP数据报,从技术上讲,一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。一个接口的IP地址的一部分需要根据其子网来决定。

一台路由器(三个接口)用于互联七台主机,在左侧的三台主机,它们的IP是223.1.1.X。它们的前24位是相同的,这三个主机接口与1个路由器接口的网络形成一个子网(sub-net)。该网络可能由一个以太网LAN互联,或者通过无线接入点互联。IP编址为子网分配一个地址223.1.1.0/24(由223.1.1.1、223.1.1.2、223.1.1.3、223.1.1.4组成,任何其他要连到该子网的主机都要求IP为223.1.1.X) ,其中24有时被称为子网掩码。(分开路由器和主机的接口,产生的网络岛的数量即子网数量)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TtK9hQu-1639192835097)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211210231112350.png)]

在CIDR被采用之前,IP地址的网络部分被限制为长度8(C类网络 /24 254)、16(B类网络/16 65534)、24比特(A类网络 /8),这种不灵活性导致了空间的损耗以及所分配的地址空间利用率低下。这里为什么是254和65534是因为0和最大值(255/65535)用于特殊用途

因特网的地址分配策略被称为无类别域间路由选择 (CIDR),形式为a.b.c.d/x的x最高比特形成了IP地址的网络部分,称为该地址的前缀。我们将会在下一章看到,当组织外部的一台路由器转发一个数据报,仅需要考虑该地址的前面x比特。这相当大减少了再这些路由器中转发表的长度。一个地址剩余的32-x比特可认为是用于区分该组织内部设备的,其中的所有设备具有相同的网络前缀。当该组织内部的路由器转发分组时,才会考虑这些比特。这些较低比特可能具有另外的子网结构,比如a.b.c.d/21前21比特定义该网络前缀,该组织内部可以采用右边的11比特再划分,比如a.b.c.d/24表示更低层次的子网。

一个组织为其设备得到一个地址块,该组织从地址块中给设备分配到一个地址的过程:

1.获取一块地址

ISP从已分给它的更大地址块中提供一些地址。比如ISP自己分到200.23.16.0/20。该ISP可以分为8个长度相等的连续地址块。为本ISP支持的最多达八个组织中的一个分配一块(/20 到 /23 2^3=8)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdE4muln-1639192835098)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211210235207882.png)]

还有一种方法是直接通过ICANN组织分配一块IP地址。

2.获取主机地址:DHCP

某组织一旦获得了一块地址,它就可为本组织内的主机与路由器接口逐个分配IP地址。这项任务目前由动态主机配置协议 (Dynamic Host Configuration ,DHCP) 完成。DHCP允许主机自动获取IP地址,能够通过配置DHCP使得给定主机每次分配的是相同的IP或临时的IP,DHCP还允许主机得知它的子网掩码、它的第一跳路由器地址(默认网关)与它的本地DNS地址。

在最简单的场合下,每个子网有一个DHCP服务器,如果没有,则需要DHCP中继代理(通常是路由器),这个代理知道用于该网络DHCP的地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaBYvlpg-1639192835099)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211211000024433.png)]

在上图中,对于一台新到达主机,DHCP过程如下:

( IP广播地址255.255.255.255,当一台主机发出一个目的地址为255.255.255.255数据报时,该报文交付给同一网络中的所有主机。路由器有时向临近的子网有选择的转发该报文)

DHCP服务器发现:一台新到达主机的首要任务是发现一个要与其交互的DHCP服务器。这可通过使用DHCP发现报文完成。客户使用UDP分组向端口67发送该发现报文。该UDP分组封装在一个IP数据报中。使用广播目的地址255.255.255.255并使用源IP为0.0.0.0。将IP数据报传递给链路层,链路层将该帧广播到所有与该子网连接的节点。

DHCP服务器提供:收到发现报文时,用DHCP提供报文做出响应,仍然使用广播(可能有多个DHCP,多个响应)。服务器提供了报文有收到的发现报文的事务ID,DHCP的IP地址、网络掩码以及IP地址租用期(该IP地址有效时长)。

DHCP请求:从一个或多个服务器响应中选择一个,用DHCP请求报文进行响应。

DHCP ACK:服务器用DHCP ACK报文对DHCP请求报文进行响应。

一旦客户接收到ACK,交互完成,客户再租用期内可以使用该IP地址,DHCP只提供了固定地点分配IP

我们的手机平时用到的是移动IP,移动IP技术是移动节点以固定的网络IP地址,实现跨越不同网段的漫游功能,并保证基于网络IP的网络权限在漫游过程中不发生任何改变。

网络地址转换NAT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mz3ZPEWw-1639192835100)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211211095824648.png)]

以下列出留用的内部私有地址
A类 10.0.0.0–10.255.255.255
B类 172.16.0.0–172.31.255.255
C类 192.168.0.0–192.168.255.255

内部私有地址在世界各地主机有很多重复,私有地址只有在给定的子网中才有意义。从本质上讲,NAT隐藏了家庭网络的细节。所有离开家庭NAT路由器流向因特网的报文都有同一个公有IP,所有进入家庭的报文都拥有同一个目的IP地址。这个公有IP是从ISP的DHCP服务器得到的,主机又从NAT路由器中的NAT-DHCP中获取私有IP地址。

广域网到达NAT路由器的所有数据报都有相同的目的IP地址,路由器怎样知道应该将分组给哪个主机?


NAT路由器上有一张NAT路由表(NAT translation table),在表项中包含了端口号和IP地址。下图中,主机10.0.0.1请求IP地址为128.119.40.86的某台web服务器(80端口)。主机10.0.0.1为其指定了任意端口3345,发送到LAN中,NAT路由器收到该数据报,参照NAT表,更改其源IP地址和源端口号改为138.76.29.7,5001,web服务器发送响应报文,其目的地址是NAT路由器,响应报文到达路由器时,路由器使用目的地址和目的端口从NAT转换表检索出私有IP和端口,重写数据报的目的IP和目的端口,并向家庭网络转发该数据报。

(当生成一个新的LAN源端口号时,NAT路由器可任意选择一个当前未在NAT转换表中的WAN端口号。路由器中的NAT也在转换表转给你增加表项。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drrzMRel-1639192835101)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211211100804264.png)]

IPv6

由于新的子网和IP节点以惊人的增长率连接到因特网上(并被分配唯一的IP地址),32比特的IP地址空间即将用尽。为了应对这种对大IP地址空间的需求,开发了一种新的IP协议,即IPv6(其实IPv4离耗尽还有可观的时间)。IPv6的设计者还再IPv4积累的运行经验基础上加进和强化了IPv4的其他方面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnUkILem-1639192835102)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211211105305811.png)]

从IPv4到IPv6的迁移

在实践中已经得到广泛采用的IPv4到IPv6迁移的方法包括建隧道。建隧道依据的基本思想是:假定两个IPv6(图中BE)要使用IPv6数据报进行交互,但它们是经由中间IPv4路由器互联的。我们将两台IPv6路由器之间的中间IPv4路由器的集合称为一个隧道(tunnel),借助隧道在隧道发送端的IPv6节点(B)将整个IPv6数据报放到IPv4数据报的数据字段中。于是,该IPv4数据报的目的地址设为隧道接收端的IPv6节点(E)。隧道接收端的IPv6节点最终收到该IPv4数据报(它是通过观察IPv4中协议字段为41,指示有效载荷是IPv6),从中取出IPv6数据报,然后再为该IPv6数据报提供路由,好像它是从一个直接相连的IPv6邻居那里接收到该IPv6一样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7pM7wXNA-1639192835103)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211211110212571.png)]

网络层:控制平面

概述

注:和数据平面一样,省略了SDN及逻辑集中式控制(通用转发)

在数据平面中,我们看到转发表是链接网络层的数据平面和控制平面的首要元素,转发表定义了路由器数据平面转发行为,控制平面中,我们学习这些转发表是如何计算、维护和安装的。

控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何进行配置和管理。在下一节中,我们将介绍两种路由选择算法,这些算法是因特网路由选择协议OSPF和BGP的基础。

OSPF是一种运行在单一节点ISP网络中的路由选择算法。BGP是一种在因特网中用于互联所有网络的路由选择算法。因此常被称为因特网的粘合剂。传统上,控制平面功能与数据平面的转发功能在一起实现,在路由器中作为统一的整体。

最后,我们将涉及管理IP网络的某些具体细节:ICMP(互联网控制报文协议)SNMP(简单网络管理协议)

路由选择算法

问题建模

可以用图来形式化描述路由选择问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-osw1Fr7m-1639390181951)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211212102023722.png)]

图G=(N,E)是一个N个节点和E条边的集合。节点表示路由器,边表示路由器之间的物理链路,一条边还有一个值c(x,y)表示它的开销(代表链路速度、金钱开销等)。如果节点对(x,y)不属于E,置c(x,y)=∞。最低开销路径就是求图G中的一条路径(x1,x2,x3,…,xp)。

路由算法分类

根据该算法是集中式还是分散式来分:

  • 集中式路由选择算法,具有关于连通性和链路开销方面的完整信息。链路状态(Link State,LS)算法基于该算法实现协议有OSPF
  • 分散式路由选择算法,以迭代、分布式方式计算出最低开销路径。每个节点仅有与其直接相连链路的开销,通过迭代计算以及与相邻节点信息交换,逐渐计算出最低开销路径,更天然适合路由器直接交互的控制平面。距离向量(Distance-Vector,DV)算法基于这类算法实现的协议有RIP、BGP

根据算法是静态还是动态来分:

  • 静态路由选择算法,路由随时间变化非常缓慢,通常人工进行调整。广泛用于军事网络和较小的商业网络
  • 动态路由选择算法,随着网络流量负载或拓扑发生变化(开销变化)而改变路由选择路径,容易受到路由选择循环、路由震荡的影响。LS和DV都是动态路由选择算法。

根据它是负载敏感的还是负载迟钝的来分:

  • 负载敏感算法,链路开销动态变化反应底层链路的当前拥塞水平
  • 负载迟钝算法,当前因特网路由选择算法(RIP、OSPF、BGP)都是负载迟钝的,某条链路的开销不明确的反应当前的拥塞水平。

LS算法

实践中通过让每个节点向网络中的所有其他节点广播链路状态分组来完成,其中每个链路状态分组包含它所连接的链路的标识和开销。节点广播的结果是所有节点都具有该网络的统一、完整的视图。每个节点都能运行LS算法并计算出相同的最短路径集合。这个过程可以通过Dijkstra算法完成。当LS算法终止时,每个节点的转发表中,对每个目的节点存放最低开销路径的下一跳节点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nl6ocrAJ-1639390181953)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211212221917357.png)]

源节点为u,

D(v):到算法的本次迭代,从源节点到目的节点的最低开销路径的开销

p(v):从源到v沿着当前最低开销路径的前一节点

N’ :如果从源到v的最低开销路径已经确定,v在N’中

在第0次迭代中,与u直接相连的有v,x,w,已知最低开销为2、1、5。y和z没有直接连接,用无穷表示。

在第一次迭代中,选择与u连接的开销路径最小的假如N’,即x加入N’。与x直接相连的有v、w、y,分别为2、3、1。min uv(2,ux+xv=1+2=3)=2 ; min uw(5,ux+xw=1+3=4)=4 ; min uy(无穷,ux+xy=1+1=2)=2 ; min uz(无穷,ux+xz=1+无穷=无穷)=无穷 ;

如此等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1ceV0DD-1639390181953)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211212221323865.png)]

当LS算法终止时,对于每个节点,我们都得到从源节点沿着它的最低开销路径的前一节点。对于每个前一节点,我们又有它的前一节点,以此方式我们可以构建从源节点到所有目的节点的完整路径。通过对每个目的节点存放从u到目的地的最低开销路径上的下一跳节点,在一个节点中的转发表能够根据此信息构建。(比如u节点到w节点,在u节点转发表中,目的地为w的表项,使用Dijkstra算法计算最短路径的下一跳为x,而在x节点使用Dijkstra算法计算的x到w节点最短路径的下一跳为v,当然这里这条最短路径也是u节点中计算uw路径的一部分,v节点使用Dijkstra算法计算的v到w节点最短路径下一跳为w)

package suanfa;

import java.util.Arrays;

public class Dijkstra {
	public boolean[] already_arr; //节点是否被访问过
	public int[] pre_visited;//路径前一节点
	public int[] dis; //出发顶点到其他顶点的距离
	private int[][] edges; //存储图对应的邻接矩阵
	int start;
	int length;
	
	public Dijkstra(int start,int[][] edges){
		this.length = edges.length;
		this.already_arr = new boolean[length];
		this.pre_visited = new int[length];
		this.edges = edges;
		this.start = start;
		this.dis = new int[length];
		already_arr[start] = true;
		pre_visited[start] = 65535;
		Arrays.fill(dis, 65535);
		dis[start] = 0;
	}
	
	public void dsj(){
		int index = start;
		update(index);
		for(int j = 1;j < length; j++){
			index = updateArr();
			update(index);
		}
		//到此算法完成
		
	}

	private int updateArr() {
		int index = 0;
		int min = 65535;
		for(int i = 0;i < length;i++){
			if(!already_arr[i] && dis[i]<min){
				index = i;
				min = dis[i];
			}
		}
		already_arr[index] = true;
		return index;
	}

	private void update(int index) {
		int len = 0;
		for(int  j = 0;j < length;j++){   //找出index所有相邻节点,进行一个更新
			len = dis[index] + edges[index][j];
			if(len < dis[j]){
				pre_visited[j] = index;
				dis[j] = len;
			}
		}
	}
	
}

DV算法

距离向量算法是一种迭代的、异步的、分布式的算法,说它是分布式的,是因为每个节点都要从一个或多个直接相连的邻居接收某些信息,执行计算,然后将其计算结果发给邻居。说它是迭代的,因为此过程一直要持续到邻居之间无更多信息要交换为止。说它是异步的,是因为它不要求所有节点相互之间步伐一致的操作。RIP、BGP采用DV算法。

Bellman-Ford方程:dx(y)= minv{ c(x,v) + dv(y) }

dx(y)是从节点x到节点y的最低开销路径的开销

minv{ c(x,v) + dv(y) } min(x到邻居的开销+该邻居到y的最低开销)

下图举例说明了DV算法的运行:

第一列中显示了三个节点格子的初始路由选择表,初始时是预估的路径开销(这里初始预估为直接连接的长度)。每个节点只有自己和其相邻节点的信息。

第二列中节点x收到y和z的信息,更新2、3两行,根据这个信息,计算:minv( c(x,y) + dy(z) ,c(x,x) + c(x,z) ) = minv(3,7)=3 minv( c(x,z) + dz(y) ,c(x,x) + c(x,y)) = minv(8,2)=2 ,y、z同理

第三列中x将更新的信息发到y、z,首先更新yz中第一行,然后根据该信息进行更新,计算得没有可以更新的。y、z发送更新信息同理。同样没有可以更新的。所以迭代结束。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eStdhG9G-1639390181954)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211213112238673.png)]

LS与DV比较

  • 报文复杂性:LS要求每个节点都知道网络中每条链路的开销。这就要求发送O(NE)个报文。而且无论何时一条链路的开销改变时,必须向所有节点发送新的链路开销。DV要求在每次迭代时,有两个直接相连的邻居之间交换报文。当链路开销改变时,DV算法仅当新的链路开销导致与该链路相连节点的最低开销路径发生改变时,才传播已改变的链路开销(比如上例中xz链路开销变为6,对于x和z均不改变其最低开销,所以不传播)。
  • 收敛速度:我们已经看到LS的实现是一个要求O(NE)个报文的O(N^2)算法。DV算法收敛较慢,且在收敛时会遇到路由选择环路和无穷计数的问题。

OSPF、RIP、BGP

在我们至今为止的算法研究中,我们将网络只看做一个互联路由器的集合。从所有路由器执行相同的路由选择算法以计算穿越整个网络的路由选择路径的意义上来说,一台路由器很难同另一台路由器区别开来。在实践中,这种一组执行同样路由算法的同质路由器集合的观点有一点简单化。

该简单化有一下两个重要原因:

1.规模:在所有路由器之间广播连通性和链路开销更新所要求的负担将是巨大的,在如此大量的路由器中迭代的DV算法肯定永远无法收敛。

2.管理自治,ISP希望按自己的意愿运行和管理器网络,将其网络与其他外部网络连接起来。

这两个问题可以通过将路由器组织进自治系统(Autonomous System,AS)来解决,通常在一个ISP中的路由器以及互联它们的链路构成一个AS(和ISP一样分级)。一个AS由唯一的AS号标识。在相同AS中的路由器运行相同的路由选择算法,叫做自治系统内部路由选择协议(RIP基于DV、OSPF基于LS,目前OSPF是主流的)。当分组跨越多个AS进行路由,需要一个自治系统间路由选择协议(BGP,基于DV),在因特网中,所有的AS运行相同的AS间路由选择协议,即BGP。

自治系统内部路由选择协议:OSPF

OSPF是一种链路状态协议,它使用洪泛链路状态信息和Dijkstra最低开销路径算法。每台路由器都在本地运行Dijkstra最低开销路径算法,以确定一个以自身为根节点到所有子网的最短路径树。链路开销是由网络管理员配置的。使用OSPF时,路由器向自治系统内所有其他路由器广播路由选择信息,每当一条链路发生变化时,路由器就会广播链路状态信息。即使未发生变化,它也要周期性广播。链路状态通告的这种周期性更新增加了DV算法的健壮性。OSPF通告包含在OSPF报文中,该报文由IP报文承载,IP上层协议字段为89(OSPF被认为是运输层协议,RIP基于UDP,被认为是应用层协议),因此OSPF协议必须自己实现诸如可靠报文传输、链路状态广播等功能

自治系统间路由选择协议(BGP)

BGP中,分组并不是路由到一个特定的目的地址,相反路由到CIDR化的前缀,其中每个前缀表示一个子网或一个子网的集合。在BGP的世界中,一个目的地可以采用138.16.68/22的形式,对于这个例子来说包括1024个IP地址。因此一台路由器的转发表将具有形式为(x,I)的表项,x表示目的IP前缀,I表示路由器输出链路的接口号。

1.BGP从邻居AS获得前缀的可达性信息。如果没有BGP,每个子网都不能知道其他AS中子网的可达性信息。对于每个AS,与其他AS中路由器有连接的叫做网关路由器,没有连接的叫做内部路由器。BGP通过使用179端口的TCP连接交换路由选择信息(BGP被认为是应用层协议),跨越AS的BGP连接称为 外部BGP连接,相同AS内的链接称为内部BGP连接。

在下图中,AS3向AS1和AS2中的所有路由器通告AS3子网前缀x的可达性信息。在这个过程中,网关路由器3a先向网关路由器2c发送一个eBGP报文“AS3 x”。网关路由器2c然后向AS2中的所有路由器发送iBGP报文“AS3 x”。网关路由器2a接下来向网关路由器1c发送一个eBGP报文“AS2 AS3 x”。在这个过程完成后,在AS1和AS2中的每个路由器都知道了x的存在并且也都知道了通往x的AS路径。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6aXmeFg-1639390181954)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211213151917064.png)]

2.一台路由器可能根据可达性信息知道多条到特定前缀的路由(BGP属性+目的前缀,BGP属性有NEXT-HOP、AS-PATH、等,比如AS1中路由器到目的前缀x的路由为 路由器2a最左侧接口的IP地址:AS2 AS3;x),路由器基于策略选择较好的路由并配置转发表。

在实践中,对于任何给定的目的地前缀,进入BGP路由选择算法的输入是到某前缀的所有路由的集合。如果仅有一条这样的路由,直接选择该条路由;否则按照下列顺序消除直到只剩下一条路由。

1)路由被指派本地偏好值作为其BGP属性之一,该值是一种策略决定,不做讨论。选择最高本地偏好值的路由。

2)在余下的路由中,选择有最短AS-PATH的路由。如果该规则是路由选择的唯一规则,则BGP将使用DV算法决定路径(余下的是开销跳数相同的路径,前面DV中对于开销相同的路径情况中是忽略),其中距离测度是AS的跳数而不是路由器的跳数。

3)从余下的路由中,使用热土豆路由选择(使用OSPF协议尽可能将分组送出本AS),即选择具有最靠近NEXT-HOP路由器的路由。

4)如果仍留下多条路由,该路由器使用BGP标识符来选择路由。

单播、组播、广播、任播

  • 单播:在IPv4网络中,0.0.0.0到223.255.255.255属于单播地址。 现在所有的网络浏览都是单播。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。
  • 组播(多播):使用一个组播地址将数据在同一时间以高效的方式发往多个接受者,网络视频会议适合使用组播方式。组播报文的目的地址使用D类IP地址。消息在每条网络上传递一次,链路分叉时,网络中的路由器有选择复制并传输数据,传输到那些加入组中的主机。
  • 广播:通常广播都限制在局域网中,路由器对每一台主机发出的广播无条件复制转发到其他主机。DHCP中使用了广播。IPv4用全1的地址表示广播,即255.255.255.255
  • 任播:除了作为因特网的AS间路由选择协议外,BGP常被用于实现IP任播。其实BGP AnyCast是不同服务器使用了相同的ip地址(比如DNS根服务器!),多台拥有相同IP的服务器向网络发送可达性信息即IP前缀。当发送方发送报文给共享单播地址时,报文会根据BGP协议 从多个目的前缀相同的主机中选择离发送方最近的一台。

ICMP:因特网控制报文协议

ICMP通常被认为是IP的一部分,它是承载在IP报文中的,当一台主机收到一个指明上层协议为ICMP的IP数据报时(上层协议字段为1),它分解出该数据报的内容给ICMP。

ICMP报文有一个类型字段和一个编码字段指示差错类型,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节以便发送方能确定引发该差错的数据报。当然,ICMP最典型的用途是差错报告,但不仅仅用于此(比如还有用于ping程序的回显请求报文和回显回答报文)。

注:这里差错报告报文分类使用国内课本说法,本书中说法也许更贴近实践和详细但略显杂乱

ICMP 差错报告报文:

1.终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文

2.源点抑制:实践中很少使用,当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文。

3.时间超过:当路由器收到生存时间TTL=0的数据报,丢弃该数据报,向源点发送时间超过报文,终点在预先规定的时间内不能收到一个数据报的全部数据报片,把已收到的报文片全部丢弃向源点发送时间超过报文。

4.参数问题:路由器或目的主机收到的数据报的首部中有的字段的值不正确,丢弃该数据报,并向源点发送参数问题报文。

5.改变路由:路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器

链路层和局域网

概述

术语

节点:运行链路层协议的任何设备都称为节点。

链路:我们把沿着通信路径连接相邻节点的通信信道称为链路

链路层帧:在通过特定的链路时,传输节点将数据报封装在链路层帧中,并将该帧传送到链路中。

链路层与网络层

网络层的路由选择协议负责决定数据报传输的路径,链路层协议决定在链路上的运输方式。

提供的服务

尽管任一链路层的基本服务都是将数据报通过单一通信链路从一个节点移动到相邻节点,但所提供的服务细节能够随着链路层协议的不同而变化。链路层能够提供的可能服务包括:

成帧:网络层数据报在经链路传送之前,几乎所有的链路层协议都要将数据报用帧封装起来。一个帧由一个数据字段和若干首部字段组成,网络层数据报就插在数据字段中。

链路接入:媒体访问控制**(Medium Access Control,MAC)**协议规定了帧在链路上传输的规则。多个节点共享单个广播链路时,即多路访问问题。MAC协议用于协调多个节点的帧传输。

可靠交付:当链路层协议提供可靠交付服务时,它保证无差错经链路层移动每个网络层数据报。前面某些运输层(TCP)也提供可靠交付服务。与运输层可靠交付服务类似,链路层的可靠交付服务是通过确认和重传取得的。通常用于易于产生高差错率的链路,例如无线链路,其目的是在两个节点间进行可靠传输,而不是通过运输层或应用层协议迫使进行端到端的数据重传。然而,对于低比特差错的链路,包括光纤、同轴电缆和许多双绞铜线链路,链路层可靠交付可能被认为是一种不必要的开销,由于这个原因,许多有线的链路层协议不提供可靠交付服务。(这里本人认为差错)

差错检测和纠正:(相比可靠传输,差错纠正不能解决丢失、重复、失序差错,只能检测和纠正比特级差错)当帧中传输出现比特差错时。这种比特差错是由信号衰减和电磁噪声导致的。许多链路层协议提供一种机制来检测这样的比特差错。通过让发送节点在帧中包括差错检测比特,接收方进行差错检查,来完成这项工作。运输层和网络层也都提供了优先形式的差错检测,即因特网检验和。区别在于链路层的差错检测更复杂,并且用硬件实现,接收方不仅能检测帧中出现的比特差错,而且能够准确确定帧中出现差错的位置并纠正差错。

何处实现

链路层是实现在路由器的线路卡中的。

主机中的链路层是在网络适配器(有时被称为网络接口卡,可以看做I/O设备)中实现的。位于适配器核心的是链路层控制器,该控制器是一个实现了许多链路层服务的专用芯片。

在发送端(主机或路由器),控制器取得由协议栈较高层生成并存储在主机内存中的数据报,在链路层帧中封装该数据报,然后遵循链路层协议将该帧传进通信链路中。在接收端(主机或路由器),控制器接收整个帧,取出IP数据报。如果链路层协议提供了差错检测,需要发送控制器在帧首部设置差错检测比特,由接收控制器执行差错检测和纠正。

差错检测和纠正技术

差错检测与纠正的场景,D为数据报+帧首部,EDC Error- Detection and- Correction,检测和纠正比特

在这里插入图片描述

检错编码-奇偶校验码

假设我们发送信息比特为1100101,有4个1,即偶数个1,我们需要在前面加一个1构成奇数个1(11100101)。当接收方接收到该比特,如果1的个数为偶数,说明出现奇数个差比特错(11100100),不能检测出偶数个比特差错(11100000)。

奇偶校验码用来描述差错检测和纠正背后的思想。

检验和

数据的字节作为16比特的整数对待并求和,这个和的反码形成了携带在报文段首部的因特网检验和(检验时用新计算的和+检验和=全1)。这种方法已经在运输层讨论过,并且也主要是应用在运输层。运输层使用较简单的检验和是因为使用软件,简单而快速的差错检测是必须的,链路层使用硬件可以使用CRC这种更复杂的操作。

循环冗余检测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryiLbBoN-1639798434788)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211214091440840.png)]

(要发送的数据)% 生成多项式 = 冗余码FCS

最终发送的数据=要发送的数据 + FCS

假设要发送数据为1101011011生产多项式为10011 则阶为4(5-1),在要发送数据后面加上4个0,即11010110110000,该数对生成多项式做模2运算(XOR),获得余数1110(校验比特)。

在接收端用11010111011 1110除以多项式,如果余数为0,则无差错,否则有差错直接丢弃。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LW85dv7h-1639798434789)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211214090956495.png)]

向前纠错(Forward Error Correction,FEC)

常见的FEC技术有汉明码(能纠正单比特差错)等。

多路访问链路协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HYo7zbqc-1639798434792)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211214140501789.png)]

信道划分协议

FDM和TDM在前面介绍过。

CDMA(Code Division Multiple Access)对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码。不同的节点能够同时传输,并且它们各自相应的接收方仍能正确接收发送方编码的数据比特。目前广泛的用于蜂窝电话中。

信道划分协议在网络负载重时共享信道效率高且公平。网络负载轻时,共享信道效率低。

随机接入协议

信道空闲:半双工,本节点没有其他比特到达,表示信道空闲。

纯ALOHA:不监听信道,发送方在一定时间收不到确认随机重发。

时隙ALOHA:把时间分成若干时间片,所有用户在时间片开始时刻同步接入网络信道,若发生冲突(发送方在一定时间收不到确认),则必须等到下一个时间片开始时刻再发送。

CSMA(carrier sense multiple access): 载波侦听,一个节点在传输前先听信道。如果来自另一个节点的帧正向信道上发送,节点则等待直到检测到一小段时间没有传输,然后开始传输。CSMA没有碰撞检测,即使已经出现碰撞,仍然继续完整传输它们的帧。如果有发送方在一定时间收不到确认,等待一个随机时间后再侦听信道,空闲时重传。

关于CSMA可能你会问,如果所有的节点都进行载波监听了,为什么还会发生碰撞?

时刻t0,B节点侦听到信道空闲,传输它的比特,比特沿着媒体传输所需的时间并不是0。在t1时刻,D节点有一个帧要发送,尽管B在时刻t1正在传输,但B传输的比特还没有到达D,因此D在t1侦听到信道空闲,D传输它的帧,B的传输在D干扰D的传输。在这个过程中,广播信道的端到端信道传播时延是关键的影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0EsGD2ef-1639798434793)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211214124932109.png)]

CSMA/CD(carrier sense multiple access with Collisiono Dection):在载波侦听的基础上,添加碰撞检测!碰撞检测,当一个传输节点在传输时一直侦听信道,如果它检测到另一个节点在传输干扰帧,它就停止传输。在重复侦听-当空闲时传输 循环之前等待一段随机时间。在CSMA和CSMA/CD中这个等待的随机时间可以用二进制指数后退算法来实现。以太网使用CSMA/CD技术。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2tb1bNCV-1639798434794)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211214130929891.png)]

CSMA/CA(carrier sense multiple access with Collisiono avoidance):一般在无线局域网中使用,因为在无线网中使用CD很困难。所以没办法做检测碰撞只能做碰撞避免。在发送每个数据之前都检测信道是否空闲,空闲则发出RTS(request to send);信道忙则等待。接收端收到RTS,响应CTS(clear to send)。接收端收到CTS,开始发送数据帧,同时告知其他站点自己要传多久数据,保证其他站点不会干扰自己。接收端收到数据帧,CRC检验数据是否正确,正确则响应ACK帧,发送方收到ACK就可以进行写一个数据帧的发送。如果没有一直重传到规定重发次数为止(使用二进制指数后退算法来确定随机的推迟重发时间)。

注:省略了书中DOCSIS协议

轮流协议

轮询协议: 节点之一被指定为主节点,主节点轮询邀请从属节点发送数据,当一个从属节点接收邀请发送数据,其他从属节点不能发送数据,邀请完所有从属节点循环从头再开始邀请。缺点是轮询时延和单点故障。

令牌传递协议: 一个称为令牌的帧在节点之间以某种固定的次序进行交换。当一个节点收到该令牌时,仅当它有一些帧要发送时,它才持有这个令牌,否则把令牌给下一个节点。令牌传递是分散的,并有很高的效率。

交换局域网

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AURAk3du-1639798434795)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211218110922931.png)]

MAC与ARP

主机和路由器的适配器具有链路层地址,即MAC地址。世界上不存在MAC地址相同的适配器。

当某适配器要向目的适配器发送一个帧,发送适配器将目的适配器的MAC地址插入该帧中,并将该帧发送到局域网上,一台交换机将一个入帧广播到它的所有接口。因此适配器可以接收一个并非向它寻址的帧,这样当适配器接收到一个帧时,将检查该帧中的目的MAC地址是否与它自己的MAC地址匹配。如果匹配,该适配器提取出封装的数据报,并将该数据报沿协议栈向上传递。如果不匹配,该适配器丢弃该帧,而不会向上传递该网络数据报。

以一个例子来说明发送数据到 子网内、外的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kiof3qUw-1639798434797)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211218092152846.png)]

现在假设主机220向主机222发送数据,为了发送数据报,该源必须向它的适配器不仅提供IP数据报,而且要提供目的主机222的MAC地址。然后发送适配器将构造一个包含目的MAC地址的链路层帧,并把帧发送进局域网。ARP为同一个子网上的主机和路由器接口解析IP地址,每台主机或路由器在内存中有一个ARP表,这张表包含IP地址到MAC地址的映射关系,每个表项都有寿命TTL。如果ARP中当前没有目的主机表项,比如220向222发送,发送方构造一个ARP分组,ARP查询分组和响应分组有相同的格式,ARP查询分组的目的是询问子网上所有其他主机和路由器(使用MAC广播地址FF-FF-FF-FF-FF-FF),包含该ARP查询的帧能被子网上的所有其他适配器接收到,并且每个适配器都把该帧中的ARP分组向上传递给ARP模块。这些ARP模块中的每个都检查它的IP地址是否与ARP分组中的目的IP地址相匹配,与之匹配的一个给查询主机发送回一个带有所希望映射的响应ARP分组(响应分组是标准帧,而非广播帧),然后查询主机220能够更新它的ARP表,并发送它的IP数据报,该数据报封装在一个链路层帧中,并且该帧的目的MAC就是对先前ARP请求进行响应的主机或路由器的MAC地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yJCcOYn-1639798434798)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211218093955949.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GztYECsv-1639798434799)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211218100253550.png)]

当子网中的某主机要向子网之外的主机发送网络层数据报,一台路由器每个接口有一个IP和一个MAC。假设主机111向主机222发送一个数据报,该数据报必须首先发送给路由器接口110,发送主机可以用ARP得到110的MAC地址,得到MAC地址后就可以将该帧发送给路由器的110接口,路由器将这个帧给路由器的网络层,查询转发表将该数据报传递给接口220,然后该接口将数据报传递给它的适配器,适配器将数据报封装到一个新的帧中,此时目的MAC地址是目的主机的MAC地址(同样使用ARP)。

以太网

今天,以太网是到目前为止最流行的有限局域网技术,而且到可能预见的未来他可能仍保持这一位置。以太网对本地区域联网的重要性就像因特网对全球联网所具有的地位那样。

拓扑结构

  • 总线拓扑:70年代,一种广播局域网,所有传输的帧传送到与该总线连接的所有适配器并被其处理。
  • 集线器星型拓扑:90年代,基于集线器,集线器(hub)是一种物理层设备,当比特到达一个接口时,集线器重新生成这个比特,并将该比特向其他所有接口传输出去,因此,采用基于集线器的星型拓扑的以太网也是一个广播局域网
  • 交换机星型拓扑:21世纪初,以太网继续使用星型拓扑,但中心的集线器变为交换机(switch)。交换机是无碰撞的,交换机运行在第二层。(网桥,交换机是多个bridge)

多年来以太网经历了一系列的演化步骤,今天的以太网非常不同于使用同轴电缆的初始总线拓扑的设计,在今天大多数的安装中节点经点对点的由双绞铜线或光纤线缆构成的线段与一台交换机相连(比如上面ARP中的图)。在总线拓扑和集线器星型拓扑时代,以太网显然是一种广播链路,多个节点会出现帧碰撞,为了处理这些碰撞,使用CSMA/CD协议。交换机在任何时候绝不会向相同的接口转发超过一个帧,此外现代交换机是全双工的,这使得一台交换机和一个节点能够在同时向对方发送帧而没有干扰,即不会发生碰撞,因此没有必要使用MAC协议了!

以太网帧结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQxCzw6y-1639798434800)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211218104016041.png)]

链路层交换机

交换机自身对子网中的主机和路由器是透明的(理论意义上的路由器已经被三层交换机取代,高端路由器和高端三层交换机其实是差不多一个东西,路由功能用于算,交换功能用于发),这就是说,某主机向另一个主机发送帧,将该帧发送进局域网,并不知道某交换机会接受该帧并将它转发到另一个节点。这些帧到达该交换机的任何输出接口之一的速率可能暂时会超过该接口的链路容量。为了解决这个问题,交换机输出接口设有缓存。

过滤是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。转发是决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换机功能。两个功能都借助交换机表完成,交换机表是自学习的,即一个帧过来,该源MAC地址不再表中,存储该帧源MAC地址以及进入交换机的接口、到达时间。

假定目的地址DD-DD-DD-DD-DD-DD的帧从交换机接口x到达,交换机用该MAC索引表。表中没有该表项,交换机广播该帧。如果有该表项,只向表项对应的接口转发。

web页面请求的历程

在这里插入图片描述

我们假定启动电脑,然后将其用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连,学校的这台路由器与一个ISP相连。该ISP为学校提供了DNS服务。DHCP服务器运行在路由器中(常见情况也是如此)

当电脑与网络连接时,没有IP地址他就不能做任何事情。电脑运行DHCP协议,电脑上的操作系统生成一个目的端口67(DHCP服务器)源端口68(DHCP客户)的DHCP请求报文,将这个报文放入UDP报文段。该UDP报文段被放置在一个具有广播IP目的地址(255.255.255.255)和源IP地址(0.0.0.0)的IP数据报中。包含DHCP发现报文的IP数据报被放置在以太网帧中,该以太网帧由目的地址FF:FF:FF:FF:FF:FF,使该帧广播到与交换机连接的所有设备包括DHCP服务器。该帧的源MAC地址是电脑的MAC地址。包含DHCP发现报文的广播以太网帧是第一个由电脑发送到以太网交换机的帧。该交换机在所有的出端口广播,包括连接到路由器的端口。路由器在它的具有MAC地址00:22:6B:45:1F:1B的接口接收到(前面提到DHCP服务器在路由器中),数据报的广播IP目的地址指示了这个IP数据报应当由在该节点的较高层协议处理。因此该数据报的载荷被分解向上到达UDP,DHCP发现报文从UDP报文段中抽取出来,此时DHCP服务器收到该请求报文。

我们假设运行在路由器中的DHCP服务器能够以CIDR块68.85.2.0/24分配IP地址。我们假设DHCP服务器分配地址68.85.2.101给电脑。DHCP服务器生成包含这个IP地址以及DNS服务器的IP地址(68.87.71.226)、默认网关路由器的IP地址(68.85.2.1)和子网块(68.85.2.0/24)的一个DHCP ACK报文。该DHCP报文被放入一个UDP报文段中,UDP报文段被放入一个IP数据报中,IP数据报再被放入一个以太网帧中。这个以太网帧的源MAC地址是路由器连到归属网络时接口的MAC地址(00:22:6B:45:1F:1B),目的MAC地址是电脑的MAC地址。

包含DHCP ACK的以太网帧由路由器发送给交换机,因为交换机是自学习的,先前从电脑收到以太网帧,所以该交换机知道寻址到00:16:D3:23:68:8A的帧仅从通向电脑的输出端口转发。

电脑接受到包含DHCP ACK帧,从该以太网帧中抽取IP数据报,从IP数据报中抽取UDP报文段,从UDP报文段中抽取DHCP ACK报文。电脑记录下IP地址和DNS服务器的IP地址,还在其IP转发表中安装默认网关的地址。电脑将 向默认网关发送目的地址为其子网68.85.2.0/24以外的所有数据报。

现在我们已经初始化完毕网络组件了。当在电脑浏览器中键入www.baidu.com时,电脑需要知道baidu的IP地址,生成一个DNS查询报文,将字符串www.baidu.com放入DNS报文段中,该DNS报文放置在目的端口为53的UDP报文段中。该UDP报文段被放入目的IP地址为68.87.71.226(之前DHCP返回的),和源IP地址68.85.2.101的IP数据报中。将DNS请求数据报放入一个以太网帧中,电脑需要使用ARP协议来获得网关路由器的MAC地址,生成一个目的地址68.85.2.1(网关)的ARP查询报文,将该报文放置在一个具有广播目的地址的以太网帧中,并向交换机发送该帧,交换机广播该帧,网关路由器接收该帧,发现在ARP报文中目标IP匹配自己接口IP,网关路由器发送一个ARP回答,指示它的MAC地址00:22:6B:45:1F:1B,目的地址是00:16:D3:23:68:8A,向交换机发送该帧,交换机仅将该帧交付给电脑。电脑收到包含ARP回答报文的帧,并从中抽取网关路由器的MAC地址。现在能够使包含DNS查询的以太网帧寻址到网关路由器的MAC地址。电脑向交换机发送DNS查询帧,交换机将该帧给网关路由器。

网关路由器接收DNS查询的以太网帧抽取IP数据报,路由器查找该数据报目的地址,并根据转发表决定该数据报应当发送到哪个路由器,IP数据报放置在链路层帧中发送。ISP网络中路由器接收到该帧,抽取数据报,检查该数据报的目的地址,根据转发表决定出接口,经过该接口朝着DNS服务器转发数据报,转发表根据OSPF、BGP填写。最后中包含DNS查询的IP数据报到了DNS服务器,DNS服务器抽取DNS查询报文,在它的数据库中查找名字为www.baidu.com的记录。DNS服务器形成一个包含该主机名到IP地址映射的DNS回答报文,将该DNS回答报文放入UDP报文段中,该报文段放入寻址到电脑的IP数据报中,该数据反向到达电脑。

电脑从DNS报文抽取出服务器www.baidu.com的IP地址,终于拿到服务器IP了!。有了IP地址,就能够生成TCP套接字,该套接字将用于向www.baidu.com发送HTTP GET报文,生成TCP套接字时,必须首先进行三次握手,首先生成一个具有目的端口80的TCP SYN报文段,将该报文段放置在具有目的IP地址64.233.169.105(假设是百度的IP)的IP数据报中,将该数据报放置在MAC地址为网关路由器MAC地址的帧中,向交换机发送该帧。

最终,包含TCP SYN的数据报到达www.baidu.com,从数据报抽取TCP SYN报文并分解到与端口80相联系的欢迎套接字(该套接字是专门用于此电脑和此服务器的一个连接套接字),产生一个TCP SYNACK报文段,放入向电脑寻址的数据包中,放入帧中,最终到达电脑。现在终于可以发送真实数据了,浏览器生成HTTP GET报文,成为一个TCP报文段的载荷,该TCP报文daunt放置进一个数据报中,交付到www.baidu.com。在百度的HTTP服务器从TCP套接字读取HTTP GET报文,生成一个HTTP响应报文,将请求的web网页内容放入HTTP响应体中,并将报文发送仅TCP套接字中。包含HTTP回答报文的数据经过转发到达电脑,终于显示了web网页。

以上过程忽略了DNS层次体系、NAT、web缓存等等,使得表述流程更加清晰,如果这个过程能全部囊括的话,那前面也不用学习那么多的细节了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值