四. 网络层

根据网络层一些相关协议,和网络层设备路由器及一些算法等,实现主机与主机之间的通信。

网络层知识总览:

网络层知识总览

网络层主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层单位是数据报。

网络层功能:

  1. 路由选择与转发

    通过路由选择算法确定一条最佳路由。然后将这个分组按照路由顺序发送出去。即选择最佳路径。

  2. 异构网互联

    无论是手机还是联网的电脑,或者是学校的校园网,通过这些不同的网络可以实现彼此之间的通信,这就是一个异构网络。这些异构网络互连起来就形成一个更大的网络。互连依靠路由器使得这些网络可以相互连接在一起。

  3. 拥塞控制

    若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于拥塞状态。因此要采取一定措施,缓解这种拥塞。

    解决方法有两种:开环控制(在网络开始工作之前就将所有因素考虑到,是静态控制)和闭环控制(网络运行起来时候自动调制拥塞控制,是动态控制)。

1. SDN基本概念

路由器功能:转发与路由选择。

转发:达到路由器输入链路之一的数据报如何转发到该路由器的输出链路之一,即在路由器内部寻找端口输出过程。时间较短,通常用硬件解决。

路由选择:控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。即路由选择与转发相比是一个更加宏观概念。指当有很多路由器时候如何选择一条最合适的路由。时间较长,常常采用软件解决。

路由器功能

这句上面概念可以引申出数据平面与控制平面概念:

1.1 数据平面

数据平面执行的主要功能是根据转发表进行转发,这是路由器的本地动作。转发表基于路由表生成。

转发表

可以看到转发表由两部分构成,首部和输出。首部指的是分组当中首部的1个或多个字段。输出指的是这个分组应该走哪个输出端口。

1.2 控制平面

有两种实现方法:传统方法或者叫每路由器法,及SDN方法。

例1:假定你要在SDN控制平面中实现一个新型路由选择协议)你将在哪个层次中实现该协议?

网络范围状态管理层。因为在这一层能获得有关网络的主机,链路,交换机和其他SDN控制设备的最新状态信息,可以根据这些信息的基础上实现新型路由选择协议,并通知给控制器落地执行。

例2:谁是从控制器跨越南向接口发送的这些报文的接收者?谁是跨越北向接口从控制器发送的这些报文的接收者?

受控网络设备(路由器)

网络控制应用程序

网络层两大平面总结:

网络层两大平面总结

2. 路由算法及相关协议

路由器本身会有一个路由表/转发表。

路由转发表

只要通过这个表就可以知道这个分组经过这个路由器之后接下来往哪走。其中每一行表项通过路由算法得到。

加入这个路由器连接着很多路由器,那它的下一跳有很多种方向,可以通过路由算法决定下一跳方向。即路由算法会选择一个最佳路由,然后将这个最佳路由添加到表项中。这里的"最佳"是相对于某一种特定要求下得出的较为合理的选择情况。

路由算法分为静态路由算法和动态路由算法。

对于上面动态路由算法还可以划分为全局性和分散性。

分层次路由协议:主要采用这种分层次的路由协议主要原因有两个:

  1. 因特网规模大。
  2. 许多单位并不想让外界知道自己的路由选择协议,但还想连入因特网。

结合上面两个原因就产生了分层次的路由选择协议。具体来说就是将因特网划分为多个小的团体。这个小的团体可以称之为自治系统AS。自治系统内使用的协议外部是完全不知道的,这样就可以尽量减少每个路由器表项个数,同时还可以使一个自治系统内的这些路由器使用的协议对于外界来说是透明的。

自治系统AS:在单一的技术管理下的一组路由器,而这些路由器使用一种AS内部的路由选择协议和共同的度量以确定分组在该AS内的路由,同时还使用一种AS之间的路由协议以确定在AS之间的路由。一个AS内的所有网络都属于一个行政单位来管辖,一个自治系统的所有路由器在本自治系统内都必须连通。

所以就把路由协议分为:内部网关协议IGP和外部网关协议EGP。这里的网关就是路由器。

总结:

分层次路由选择协议

如上图两个自治系统可以想象成一个单位。每个单位内使用的路由选择协议就叫做内部网关协议。对于外部路由器R1,R2,之间进行分组转发或者是路由选择应该使用外部网关协议,常用的外部网关协议有BGP-4。

2.1 RIP协议与距离向量算法

内部网关协议IGP中常用两个协议是RIP和OSPF。两个区别是使用的路由选择算法不一样。RIP使用的是距离向量,OSPF使用的是链路状态。并且RIP适用于比较小的网络,OSPF适用于比较大的网络。

RIP协议是一种分布式的基于距离向量的路由选择协议,是因特网的协议标准,最大优点是简单。RIP协议要求网络中每一个路由器都维护从它自己到其他每一个目的网络的唯一最佳距离记录(即一组距离)。即路由表中的每个表项要记录这个路由器到其他网络的距离,且是最佳距离(经过路由器跳数最短)。

上面距离定义:通常为"跳数",即从源端口到目的端口所经过的路由器个数,经过一个路由器跳数+1。特别的,从一路由器到直接连接的网络距离为1。RIP允许一条路由最多只能包含15个路由器,因此距离为16表示网络不可达。所以RIP协议只适合小互联网。

R2路由表1

上图有四个网络Net1,Net2,Net3,Net4,即三个路由器R1,R2,R3。现在以R2为研究对象看这些距离及R2的路由表。

R2路由表

上图是R2路由表表项,这个路由表建立,是通过上图每个路由器之间交换信息才能逐渐完善填满这个路由表。

而RIP协议的每一个路由器仅和相邻路由器交换信息。而且路由器交换的信息是自己的路由表,也就是当前路由器所知道的全部信息。这些信息每30秒交换一次路由信息,然后路由器根据新信息更新路由表。若超过180s没收到邻居路由器的通告,则判定邻居没了,并更新自己路由表,将路由表中要通过邻居的那些表项更新掉。这里强调一点是路由器刚开始工作时,只知道直接连接的网络的距离(距离为1),接着每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。

之后由于每30秒相邻路由器会交换一次信息,并更新路由表,经过若干次更新后,所有路由器最终都会知道到达本自治系统任何一个网络的最短距离和下一跳路由器的地址,即"收敛"。

这里最短距离或者路由表怎么更新等问题是通过距离向量算法解决:

其实每个路由器在交换信息的时候交换的是RIP报文。那么寻找最短距离实现步骤如下:

例1:已知路由器R6的路由表,现收到相邻路由器R4发来的路由更新信息,试更新路由器R6的路由表。

R6路由表:

距离向量算法例1

R4发来的路由更新信息:

2距离向量算法例1

将R4发来的路由更新信息:

3距离向量算法例1

对于Net1由于原本R6中没有到该网络记录,所以直接添加。Net2下一条是R4,而原本R6中已经有了Net2并且下一跳也是R4,所以直接将最新的替换,即R6到Net2距离变为5。最后的Net3下一跳R4距离是2,明显比原本R6中到Net3下一条是R5距离是4的更近,所以替换。最后R6表更新如下:

4距离向量算法例1

例2:考虑如图所示的子网,该子网使用了距离向量算法,下面的向量刚刚到达路由器C:来自B的向量为(5,0,8,12,6,2);来自D的向量为(16,12,6,0,9,10);来自E的向量为(7,6,3,9,0,4)。经过测量,C到B、D和E的延迟分别为6,3和5,那么C到达所有结点的最短路径是多少

1距离向量算法例2

上图B向量表示的是B到A距离是5,B到B距离是0,B到C的距离是8以此类推D,E含义一致。主要是看向量0对应的位置,刚好是按照A,B,C,D,E,F的顺序。

由于C到B、D和E的延迟为6,3,5所以三个对应向量分别+6,+3,+5

C到B:(11,6,14,18,12,8)

C到D:(19,15,9,3,12,13)

C到E:(12,11,8,14,5,9)

所以C到B/D/E到A距离从11,19,12中挑选最小的11。C到B/D/E到B的距离从6,15,11中挑选最小的6。之后依次类推可以得到C到所有结点向量是(11,6,0,3,5,8)

介绍RIP报文格式:

RIP协议报文格式

RIP报文特点是首部+路由部分封装到UDP用户数据报中。也就是RIP报文+UDP首部形成一个UDP用户数据报。由于UDP是应用层协议,所以RIP是应用层协议,使用UDP传送数据。且路由信息(20字节/路由)可重复出现最多25个,即一个RIP报文最多可包括25个路由,如超过,必须再用一个RIP报文传送。

RIP报文特点:当网络出现故障时,要经过比较长的时间(例如数分钟)才能将此信息传送到所有的路由器,"慢收敛"。

RIP协议特点

如上图第一个1表示从本路由器到网1,第二个1表示这个距离是1,第三个-表示直接交付。同理R2的RIP报文格式也是一致。

RIP协议特点2

但如果网1发生故障,R1路由表会更新为1,16,-。但是很有可能这样一个更新好的报文要经过30s之后才能发送个R2。如果R2在这30s内已经把自己的报文1,2,R1发送给R1。此时R1收到R2路由表后会更新为1,3,R2。之后R1将这个消息发送给R2,R2又会更新消息1,4,R1。之后将这个消息再发送给R1,R1修改为1,5,R2,接着再发送给R2。循环往复直到R1和R2到网1距离都变为16时,R1和R2才知道不能到达网1。总的来说RIP报文特点是好消息传得快,坏消息传得慢。

RIP协议与距离向量算法总结:

RIP协议与距离向量算法总结

2.2 OSPF协议及链路状态算法

开放最短路径优先OSPF协议:"开放"标明OSPF协议不是受某一家厂商控制,而是公开发表的。"最短路径优先"是因为使用了Djkstra提出的最短路径算法SPF。

OSPF最主要的特征就是使用分布式的链路状态协议。这个链路状态协议(算法)会在之后介绍。

OSPF特点:

  1. 使用洪泛法向自治系统内所有路由器发送信息,即路由器通过输出端口向所有相邻的路由器发送信息,而每一个相邻路由器又再次将此信息发往其所有的相邻路由器。

    其实就是之前介绍的广播形式。通过广播形式最终整个区域内所有路由器都得到了这个信息的一个副本。

  2. 发送的信息就是与本路由器相邻的所有路由器的链路状态(本路由器和哪些路由器相邻,以及该链路的度量/代价(费用、距离、时延、带宽等))。RIP协议中只有最短距离(下一跳距离)。

  3. 只有当链路状态发生变化时,路由器才向所有路由器洪泛发送此信息。

经过上面过程到最后,所有路由器都能建立一个链路状态数据库,即全网拓扑图。也就说每一个路由器都知道到自己网络内的所有路由器一个经历多少度量。

链路状态路由算法:

综上就介绍OSPF协议中的五个重要类型的分组:HELLO问候分组、DD数据块描述分组、LSR链路状态请求分组、LSU链路状态更新确认分组、LSAck链路状态确认分组。

如果一个路由器的链路状态发生变化:

经过上面过程到最后,所有路由器都能建立一个链路状态数据库,即全网拓扑图。之后使用Djkstra算法根据自己的链路状态数据库构造到其他节点间的最短路径。

为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。每一个区域都有一个32位的区域标识符(用点分十进制表示)。区域也不能太大,在一个区域内的路由器最好不超过200个。

OSPF的区域

可以看到自治系统AS划分区域后成一个主干区域(0.0.0.0)和其他区域。主干区域作用就是来连接其他区域。同时主干区域中的路由器称为主干路由器包括R3,R4,R7,同时这两个路由器也可以叫做边界路由器。上面R6由于要连接到其他自治系统中,所以称为自治系统边界路由器。其他普通区域内部的路由器叫做区域内部路由器。

采用这种分层次划分区域方法,虽然使得交换信息种类增多,同时也使OSPF协议更加复杂,但可以使得每个区域内部交换路由信息通信量大大减小,因而OSPF协议就能够适用于规模较大的自治系统。

OSPF分组:

OSPF分组

构造是OSPF分组首部+后面的分组(数据部分),然后形成IP数据报数据部分,封装上IP数据报首部形成一个IP数据报进行发送。所以OSPF直接用IP数据报传送数据。

OSPF其他特点:

  1. 每隔30min,要刷新一次数据库中的链路状态。

  2. 由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF协议要比距离向量协议RIP好得多。

  3. OSPF不存在坏消息传的慢的问题,它的收敛速度很快。

    OSPF会将收来的更新都放到自己的链路状态数据库中,然后根据整个链路状态数据库通过使用Djkstra算法来计算出一个最短路径。所以它的收敛速度快。

2.3 BGP协议

外部网关协议EGP,常用的协议有BGP协议。

BGP当中是与其他AS的邻站BGP发言人交换信息

BGP协议

结合上图,有5个自治系统AS。其中有BGP发言人路由器,在配置BGP时每个系统的管理员都要选择至少一个路由器来作为自治系统的BGP发言人。一般来说BGP发言人都是通过一个网络连接在一起的。而这个BGP发言人往往就是边界路由器。

BGP协议交换的网络可达性的信息,即要到达某个网络所要经过的一系列AS。并且发生变化时才会更新有变化的部分。

BGP协议交换信息的过程:

BGP所交换的网络可达性的信息就是要到达某个网络所要经过的一系列AS。当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各AS的较好路由。这里选择较好路由是因为因特网范围很大,使得自治系统之间路由选择比较困难,所以要找到一条最佳路由相对来说很困难。因此只需要选择一个尽可能好的路由即可。

BGP协议交换信息过程

上图就是BGP发言人所构造出的自治系统连通图,是一个树形结构,只有是树形结构才能保证不会兜圈子。

所以这里的交换信息指的是交换路径的向量,也就是交换一组路径的信息。比如说到子网1应该走哪几个AS才能到达。BGP发言人交换路径向量例子:自治系统AS2的BGP发言人通知主干网AS的BGP发言人:"要到达网络N1、N2、N3和N4可经过AS2"。

BGP协议交换向量过程

当然作为主干网也可以交换信息,因为只要是相邻的邻站都是可以交换自己的完整路由表的。所以主干网还可发出通知:"要到达网络N5、N6 和N7可沿路径(AS1, AS3)"。

BGP协议报文格式:

BGP报文格式

如上图,会将BGP报文放入一个TCP报文中作为TCP报文的数据段。然后再放入IP当中进行发送。因此可以看出这个BGP是应用层协议,借助TCP传送。

即一个BGP发言人与其他自治系统中的BGP发言人要交换路由信息,就要先建立TCP 连接,即通过TCP传送, 然后在此连接上交换BGP报文以建立BGP会话(session),利用BGP会话交换路由信息。这里使用TCP不用UDP原因是,TCP能提供更加可靠的服务,同样也可以简化路由选择协议。

BGP协议特点:

  1. BGP支持CIDR,因此BGP的路由表也就应当包括目的网络前缀、下一跳路由器,以及到达该目的网络所要经过的各个自治系统序列。
  2. 在BGP刚刚运行时,BGP的邻站是交换整个的BGP路由表。但以后只需要在发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销都有好处。

BGP-4是现在最常用的BGP版本,这个版本有四种报文:

总结三种协议:

RIP是一种分布式的基于距离向量的内部网关路由选择协议,通过广播UDP报文来交换路由信息。

OSPF是一个内部网关协议,要交换的信息量较大,应使报文的长度尽量短,所以不使用传输层协议(如UDP或TCP),而是直接采用IP。

BGP是一个外部网关协议,在不同的自治系统之间交换路由信息,由于网络环境复杂,需要保证可靠传输,所以采用TCP。

三种路由协议比较

3. IP数据报

TCP/IP协议栈:

TCPIP协议栈

协议栈自顶向下分别是应用层、传输层、网络层、链路层和物理层。有关于网络层的协议主要有ARP、IP、ICMP、IGMP四个协议。如果ARP协议在最下面自然就要为IP协议服务。IP协议也要为ICMP、IGMP两个协议进行服务。

3.1 IP数据报格式

一个IP可以分为首部+数据部分。这个数据部分也就是运输层传送单元,有TCP段和UDP段。首部可以称之为IP数据报的头部。

IP数据报

在网络层IP数据报和分组不做区分。首部具体字段如下:

IP数据报的格式

数据部分这里不做讲解,这一部分会在传输层讲到。

可以看到首部分为固定部分和可变部分。固定部分长度是固定的,有20B。下面对每一个字段进行详细介绍:

3.2 IP数据报分片

先来看最大传输单元(MTU)概念:在链路层上每一个数据帧都有一个可封装的上限,这个上限就叫做最大传输单元MTU。

以太网的MTU是1500B。

MTU

如上图,数据帧的中间部分即IP分组,这个IP分组MTU不能超过1500B。如果所传送的数据报(IP分组)长度超过某链路的MTU值,则要将其分片。

IP数据报的格式

分片要结合上面的标识、标志、片偏移来分析。

例子:假设数据报长度不超过1420字节。那么有一个数据报的首部20B,数据部分有3800B。可以看到数据部分过长需要进行分片,分割要保证尽可能使分割完的数据越大越好,由于每个分片需要有一个20B的首部,所以数据部分可以分为两个1400B,和一个1000B。

IP分片

现在具体分析一下每个数据片的片偏移量是多少。

第一个数据片片偏移量是0,因为数据第一个数据片,数据部分是从第一个字节开始的。所以第一个数据片的片偏移量是0

第二个分片的数据部分是1400B,由于第一个分片结束位置是1399,所以第二个分片要从1400B位置开始,结束位置是2799B。所以片偏移量是14008=175

第三个分片从28003799B。所以片偏移量是28008=350

最后将三个分片的片偏移值放入分片的首部即可。

IP数据报分片例题

IP数据报单位总结:总长度单位是1B、片偏移单位是8B、首部长度单位是4B。

3.3 IPv4地址

以太网中,一台主机要给另一台主机通信,就要直到接收方主机地址是多少。具体来说就是需要直到这个主机在哪个网络、在这个网络下对应的哪台主机。这个寻找主机过程也就是确认IP地址过程。

IP地址其实就是在因特网中给每一台主机接口以及路由器的接口赋予一个全球唯一的标识符。因此这个IP地址就可以很方便寻址,再进行接下来的通信、资源共享等。

IP编址的历史阶段:分类的IP地址(其实就是将一个很大的IP空间进行划分)子网划分(由于对于IP需求增大产生的)构成超网(是一种新型的无分类编制方法)。

IP地址:全世界唯一的32/4字节标识符,标识路由器主机的接口。并不是一个IP地址就标识一个主机,一个主机有很多接口(无线接口和有线接口)。自然路由器也会连接多个主机,这样路由器每个接口也都会分配一个唯一的IP地址。

IP地址标识:网络号+主机号。网络号就是确定这个主机在哪个区域,主机号就是确认在这个区域内的哪台主机,或者说是哪个接口。

IP地址例子

显示中网络例子如下:

互联网中的IP

上图有6个网络,并且是两种类型的网络。外围三个部分是一个网络,因为它们都是路由器的一个接口所连接的主机。并且网桥不能分割广播域,所以用网桥链路层连接起来的网段仍然是一个局域网,而且只能有一个网络号。

如上图所示,外围最左边的是LAN1,其网络号是222.1.3.0。外围最上边的是LAN2,网络号是222.1.1.0。外围最右边的是LAN3,网络号是222.1.2.0

上图中间的是三台路由器,每个路由器都有三个端口。所以说路由器总有两个或两个以上的端口。可以看到每个路由器接口处都对应一个唯一的网络号的IP地址。

所以说路由器可以划分广播域,其实就是路由器不同接口可以连接不同网络的。上图中绿色的区域也是一种特殊的网络,称为无编号网络。称为网络原因是这里有IP地址。

将一个很大的地址空间分为几类,这样就可以合理划分IP地址资源。

分类IP地址

如上图可以看到总共是将网络分为五类。分发主要是靠前面的第一位(A类),第二位(B类),第三位(C类),第四位(D,E类)。

第一种A类地址网络号是1B,即八位,且第一位是0。B类网络号是2B,即16位,且前两位是1,0。C类网络号是3B,且前三位是1,1,0

最后的D、E两类前四位是11101111,D类地址是多播地址,在一对多通信的时候才会使用。E类地址保留为今后使用。具体解释如下:

上面子网掩码会在之后讲到,子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

之所以要将网络分类,是因为不同类型的网络连接的主机数差别很大,分类后可以更好满足用户需求。

要注意的是分类后所得到的所有IP地址并不是都可以使用的。如下一些特殊IP地址不能使用:

特殊IP地址

如上图所示一系列地址是不能用来作为主机或者路由器具体接口IP的。

另外还有一类地址是私有IP地址,这些地址特点就是如果将其中地址放到互联网上,路由器是无法识别这些IP的,只适用于内部网络。

私有IP地址

对于这些内部地址如何去跟外部通信,就是之后要讲的NAT技术。上图网段个数相当于能分配的网络号个数。

再来看看三类网络使用范围:

分类IP使用范围

3.4 网络地址转换NAT

上面介绍的私有IP地址,只能在本地专用网中使用。如果将其中地址放到互联网上,路由器是无法识别这些IP的。

私有IP地址

即路由器对目的地址是私有IP地址的数据报一律不进行转发。但仍然可以和互联网上的主机进行通信,需要用到网络地址转换NAT。

网络地址转换NAT ( Network Address Translation):在专用网连接到因特网的路由器上安装NAT软件,安装了NAT软件的路由器叫NAT路由器,它至少有一个有效的外部全球IP地址。

网络地址转换NAT

其实只需要在专用网和因特网之间的路由器上安装NAT软件,有了这个软件路由器就称为NAT路由器。它有多个有效的外部全球IP地址。所有使用本地地址的主机在和外界通信的时候,都需要经过NAT路由转换就可以实现和外部主机通信。

网络地址转换NAT2

如上图,假如专用网中的一台主机A要和外部主机B进行通信,A会给B发送一个数据报,在网络层数据报要封装源IP地址和目的IP地址。之后到了传输需要加上端口号(传输层会讲到)。之后这个数据报到了NAT路由器,就需要实现一个网络地址转换功能,其实就是将源IP地址和端口号替换为下图NAT转换表中对应的值。如果A主机源地址和端口号是192.168.0.3:30000,则根据转换表需要替换为172.38.1.5:40001。至此这样一个数据报地址就可以被路由器及主机所识别进行转发。

本质是需要通过NAT路由器才能将消息发送给因特网上的主机B。这个NAT相当于这个专用网络中的代表。同理接收数据原理一致。

网络地址转换实现关键是NAT路由器有一个转换表。这个转换表由WAN端(广域网)和LAN端(局域网)构成:

NAT转换表

可以看到每个十进制IP地址后面还有一个端口号,这个端口号可以唯一标识主机当中的某一个具体进程,在传输层会具体讲到。

3.5 子网划分与子网掩码

之前讲过可以将一个很大的地址空间分为几类,这样就可以合理划分IP地址资源。

分类IP地址

但是这种分类有缺点:

  1. IP地址空间的利用率有时很低。

    假如一个公司申请一个B类网络,但是分配的主机并不会很多,这样会浪费IP地址,同时还会使IP地址的空间资源过早使用完。

  2. 两级IP地址不够灵活。

    比如一个公司需要在一个新的地点,马上开通一个新的网络,但是需要向网络服务提供商(ISP)提出申请一个IP地址。所以不够灵活。

解决上述两个问题就需要用到子网划分。之前学过的IP地址结构是网络号+主机号,而子网划分就是将主机号当中的一部分较高的位数拿出来作为子网号。剩下部分再作为一个主机号。这就是划分子网的一个思想。

子网划分

上面网络号+主机号的就是两级IP地址,下面的网络号+子网号+主机号的是三级IP地址。某单位划分子网后,对外仍表现为一个网络,即本单位外的网络看不见本单位内子网如何划分。要注意子网号最少一位没有,最多情况下要留两位给主机号。

通过子网进行网络划分

如上图,是一个B类IP地址,这个路由器连接的网络地址是145.13.0.0,也就是说所有能够到达这个网络分组都会经过这个路由器再转发给这个单位的各个主机中。可以看到上图将这个网络划分为3个子网,但是这三个子网对外展示的还是一个网络地址,即145.13.0.0。假如有一个数据报的目的地址是这个网络中145.13.3.10主机,但是作为从外部过来的分组只知道应该传给路由器145.13.0.0,之后路由器会通过子网掩码发送给内部IP地址是145.13.3.10的主机。

子网掩码由一系列连续的0/1构成的二进制数,1的个数取决于网络号位数,剩下的主机号对应0。上面145.13.3.10的二级子网掩码如下:

子网掩码

如果一个外部IP分组进入到本单位某一个子网某个主机内,此时就需要路由器实现识别的功能,需要从收到的IP分组中提取出目的IP地址,进而根据这个目的地址判断是应该发给本单位的哪个子网,然后再发送给那个子网,因此就会对这个分组再划分一个三级IP地址形式:

三级子网掩码

可以看到只有主机号是0,网络号和子网掩码都是1。之后子网掩码与IP地址逐位相与,就得到子网网络地址。145.13.3.10与对应的子网掩码255.255.255.0做与运算结果是145.13.3.0

例1:已知IP地址是141.14.72.24,子网掩码是255.255.192.0, 求网络地址。

141.14.72.24255.255.192.0进行与运算,其实只用求72192与运算即可。结果为:141.14.64.0

快速计算方法需要记住以下常用的二进制转换表:

常用网络地址二进制

如果子网掩码是255.255.254.0,网络地址还是141.14.64.0。这个例子就说明同样的IP地址和不同子网掩码可以与运算得出相同的网络地址。但是这两个掩码所达到的效果不一样。第一个子网掩码的子网号是192对应的二进制是11000000,只占了两位,剩下的14位是主机号。第二个子网掩码子网号254对应的二进制是11100000,即子网号占了3位,剩下的13位是主机位。因此这两个子网掩码中可以划分主机个数以及每一个子网中可以使用的最大主机数是不同的。

例2:某主机的IP地址为180.80.77.55,子网掩码为255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是多少

由于是广播分组,所以主机位全是1,且子网掩码前两位是255,故目的主机是180.80.?.255,即只用求出中间的子网号即可,252对应的二进制是11111100,所以子网号有6位,子网掩码与IP地址77的二进制01001101的前六位与运算,结果是76(01001100)。由于子网掩码只有六位,剩下十位全是主机号,且是广播分组故全1,即79(01001111),故目的地址为180,80,79.255

使用子网时分组如何转发:

通过子网进行网络划分

对于每个路由器都有一个转发表(路由表),路由表中有目的网络地址、目的网络子网掩码、下一跳地址。转发过程如下:

  1. 路由器首先会提取出这个分组中的目的IP地址,假如IP地址是145.13.3.10。路由器首先根据IP地址看看是否能直接交付(目的地址是否在路由器的子网中),具体判断方法是用目的地址和三个子网的子网掩码分别进行与操作,如果结果和其中一个子网号对应上就说明应该要转发到这个子网中。注意不同子网可以使用不同的子网掩码,但是这例子中三个子网掩码相同都是255.255.255.0
  2. 如果目的地址在这三个子网中,就会查看这个路由表中是否有这个目的地址的特定路由。如果没有特定主机路由,就会检测路由表中有无合适目的地址路径。具体是用目的地址和路由表项的每一个子网掩码进行与运算。如果仍没有,则进入下一步默认路由,IP是0.0.0.0,分组会发给这个默认路由,即另外一个路由器,默认路由会重复上述过程。

路由的分组转发总结:

如果一个分组在生存时间TTL之内还没有找到目的主机就会将这个分组丢弃。报告分组转发出错。

3.6 无分类地址CIDR

是现在常用地址划分方式。CIDR就是在三级地址子网划分思想下将整个网络号和子网号合并在一起,称之为网络前缀。再次回到二级IP地址形式。

CIDR

看似回到二级地址形式,但是和之前的网路号+主机号形式是不一样。网络前缀位数是可变长的,可以很灵活调整网络号的长度。这种方式被广泛使用。

CIDR特点:

  1. 消除了传统的A类,B类和C类地址以及划分子网的概念。
  2. 融合子网地址与子网掩码,方便子网划分。

CIDR表示法:IP地址后加上/,然后写上网络前缀(可以任意长度)的位数。如:128.14.32.0/20

CIDR把网络前缀都相同的连续的IP地址组成一个"CIDR地址块"。假如128.14.35.7/20是某CIDR地址块中的一个地址,其对应的二进制是10000000000011100010001100000111。即前面20位都是一样的。剩下的12位是主机号。同时也可以得到网络中最小主机号(主机位全0)和最大的主机号(主机位全1):

CIDR最大地址和最小地址

上面最小地址表示的是本网络,另一个表示的是广播地址,如果分配主机的话是不会把这两个主机号分配给主机的。所以这个网络的CIDR地址块是128.14.32.0/20

同时CIDR中仍然有子网掩码概念,同样1表示网络号,0表示主机号。上面例子中子网掩码是:11111111111111111111000000000000,也就是网络前缀有多少位,子网掩码1就有多少位。

CIDR有两个重要应用:构成超网和最长前缀匹配。

构成超网

将多个子网聚合成一个较大的子网,叫做构成超网,或路由聚合。方法是将网络前缀缩短(所有网络地址取交集)。

构成超网

如上图有两个路由器连接在一起,R2路由器有两个端口连接着网络1和网络2。所以R1这个路由器就要维护一个路由表,路由表的主要信息包括目的网络和最佳接口(数据传到网络要走哪个接口)。可以看到网络1和网络2到R1都要走接口a

构成超网2

这样的两个信息就在网络中占了两行,如果连接的网络很多,则路由表很难维护。因此CIDR会提供路由聚合方式,具体方法就是将网路前缀缩短,以达到聚合目的。

构成超网3

这个网络1+2合体就是通过地址取交集求得。如果网络1地址是206.1.0.0/17,网络2地址是206.1.128.0/17。这两个网络前缀都是17位。前面两个字节都相同是206.1,从第三个字节开始不一样,故将第三个字节都转换为二进制,划分到两个不同的位,之后因为是主机位所以全部为0。因此合体后的主机号就是206.1.0.0/16

注意:划分子网是从少到多的过程。而构成超网是由多边少的过程,将多个聚合成一个新的地址。

例子:某路由表中有转发接口相同的4条路由表项,其目的网络地址分别为35.230.32.0/2135.230.40.0/2135.230.48.0/2135.230.56.0/21,将该4条路由聚合后的目的网络地址是多少?

可以看到前两字节都是一样,且网络地址主机号全部为0。故第三字节全部转换为二进制:

构成超网4

可以看到前三位一样,后面不一样,所以网络前缀就是16+3=19。且剩下主机号都是0所以是32(00100000)。故网络地址是35.230.32.0/19

最长前缀匹配

使用CIDR时,查找路由表可能得到几个匹配结果(跟网络掩码按位相与),应选择具有最长网络前缀的路由。前缀越长,地址块越小,路由越具体。

例子:路由器R0的路由表见下表,若进入路由器R0的分组的目的地址为132.19.237.5,请问该分组应该被转发到哪一个下一跳路由器。

最长前缀匹配

思路:将目的地址和目的网络的子网掩码进行与运算,如果结果是目的网络地址就选择,如果匹配到多个目的网络地址就选择前缀最长

132.0.0.0/8的子网掩码是1111111100132.0.0.0/11的子网掩码是111111111110000000

132.19.232.0/22的子网掩码是11111111111111111111110000000000

将目的地址132.19.237.5与上面三个子网掩码进行与运算前两个都可以正确匹配,而132.19.232.0/22子网掩码与运算,其实就是第三个字节为,即237232进行与运算,结果为236(11101100)。所以地址是132.19.236.0/22与匹配的网络地址不一致,所以排除。另外两个能匹配到的里面选择网络前缀最长的132.0.0.0/11,所以下一跳是R2

而最后的0.0.0.0/0是三个网络表项都匹配不上才会选择的地址。

4. 协议

发送数据时候需要经过对数据封装和解封装的过程,但是具体封装什么内容是根据不同层次协议规定的。

发送数据过程

可以看到上面两个路由器划分了两个网络。假如上面主机1给主机3发数据:

  1. 首先在传输层会将文件分段(如果文件较大),形成报文段,也就是传输层传输单元。
  2. 之后在网络层,回将每个分段加上源主机IP地址和目的主机的IP地址。目的主机获取是通过DNS,是传输层要介绍的。可以看到网络层就实现了一个封装,将报文段形成一个IP数据报(分组)。分组通常指的是数据报分片后的结果,要根据链路层的MTU判断是否要分片,假如这里不分片。
  3. 接着到了链路层,也要进行封装,即要加上源主机MAC地址和目的主机的MAC地址。可以看到目的主机当前是不知道在哪个位置的,所以获取目的主机的MAC地址就需要通过ARP协议

4.1 ARP协议

首先对于每一个主机及每一个路由器都会有一个ARP高速缓存,存放的是IP地址与MAC地址的映射。当然这个高速缓存存放的所有表项都是一个局域网内部的主机地址与MAC地址的映射。假如当前查询这个ARP高速缓存发现3号主机对应的MAC地址,就可以很容易将3号目的主机的MAC地址封装到链路层分组中。

发送数据过程2

但是如果ARP高速缓存中如果没有3号主机的映射,就要使用到ARP协议。协议具体过程是:

1号主机收到响应后会将MAC添加到分组中。在头部加上一个帧检验序列FCS。之后就构成一个链路层传输单元。之后就可以放到物理层上进行传输。

发送数据过程4

上面例子是目的主机在一个局域网内,如果1号主机要和5号主机进行通信

发送数据过程5

这里还是要使用ARP协议,不过这里的ARP就有差别,首先还是要先看一下源主机的ARP高速缓存中有没有主机5的IP地址和MAC地址。而ARP只存放一个局域网内部的IP地址和MAC地址,所以这里不可能找到5号主机的。此时1号主机会先用自己的子网掩码和目的主机的IP地址进行与运算,看看是不是在自己的网段内。

如果不是在一个网段内,会将默认网关的MAC地址放入分组内进行封装,这个默认网关其实就是对外路由器网络接口,即上图的MAC6。得到这个MAC6还是通过广播ARP请求分组,其主要部分还是:源地址IP地址+目的主机IP地址+源主机MAC地址+1。之后只有路由器会响应这个请求,返回一个单播ARP响应分组,这个分组还是两个部分:目的地址IP+目的主机MAC地址。这里假设默认网关是IP6:

发送数据过程6

1号主机收到响应后会将MAC添加到分组中。在头部加上一个帧检验序列FCS。之后就构成一个链路层传输单元。之后就可以放到物理层上进行传输。

发送数据过程7

之后分组发送到路由器之后,路由器需要对分组进行解封装,解封装后再进行封装。这里的分组源地址的IP和MAC都变为路由器地址。之后发送给下一个路由器,由于这里是点对点传输,所以这里的目的主机的AMC应该为全1。如果不是点对点就应该填入正常目的主机的MAC地址。

发送数据过程8

到了下一个路由器之后进行解封装,再使用ARP协议进行封装,这里的源主机IP和MAC地址就是当前路由器地址,发送的广播ARP请求分组会返回一个响应分组,是目的主机的IP和MAC地址。将地址封装进分组后就可以发送到目的主机。

发送数据过程9

所以总结一下ARP协议:

由于在实际网络的链路上传送数据帧时,最终必须使用MAC地址。要确定这个MAC地址需要用到ARP协议,完成主机或路由器IP地址到MAC地址的映射。即解决下一跳走哪的问题。

ARP协议使用过程:检查ARP高速缓存,有对应表项则写入MAC帧,没有则用目的MAC地址为FFFFFFFFFF的帧封装并广播ARP请求分组,同一局域网中所有主机都能收到该请求。目的主机收到请求后就会向源主机单播一个ARP响应分组,源主机收到后将此映射写入ARP缓存(1020min更新一次)。

ARP协议4种典型情况:

  1. 主机A发给本网络上的主机B:用ARP找到主机B的MAC地址。
  2. 主机A发给另一网络上的主机B:用ARP找到本网络上一个路由器(网关)的MAC地址。
  3. 路由器发给本网络的主机A:用ARP找到主机A的MAC地址。
  4. 路由器发给另一网络的主机B:用ARP找到本网络上的一个路由器的MAC地址。

ARP协议是自动进行的。

例子:主机发送IP数据报给主机B,经过了5个路由器,请问此过程总共使用了几次ARP协议?

ARP协议

故使用了6次ARP协议。

4.2 DHCP协议

主机在通信的时候一定要有一个IP地址,主机获得IP地址的方法有两种:静态配置和动态配置。

静态配置需要配置IP地址、子网掩码、默认网关。这里的默认网关就是之前的路由器接口的IP地址。只有通过这个IP地址局域网内部的主机才能跟外界通信。

动态配置如下:

DHCP动态配置

可以看到有两台DHCP服务器,还有一台交换机。

上面的动态主机配置协议DHCP是应用层协议,使用客户/服务器方式,客户端和服务端通过广播方式进行交互,基于UDP

之所将应用层协议放在网络层介绍,是因为DHCP为网络层通信提供了一个基础,有了DHCP协议后才可以有IP地址。DHCP提供即插即用联网的机制,主机可以从服务器动态获取IP地址、子网掩码、默认网关、DNS服务器名称与IP地址,允许地址重用,支持移动用户加入网络,支持在用地址续租。即设备进入了DHCP服务器所管辖的一个局域网内,就可以动态分配一个地址给设备。

这里允许地址重用,DHCP服务器都有一个IP地址池,当一个用户离开DHCP所管辖的局域网时,DHCP会将这个这个IP回收留给下一个用户,所以达到地址重用目的。

DHCP协议工作流程:

  1. 主机广播DHCP发现报文
  2. DHCP服务器广播DHCP提供报文
  3. 主机广播DHCP请求报文
  4. DHCP服务器广播DHCP确认报文

可以看到这个过程是主机与服务器进行来回交互,这种方式称为客户/服务器方式。并且这里都采用广播方式。具体过程如下:

4.3 ICMP协议

回顾一下TCP/IP协议栈:

TCPIP协议栈回顾

可以看到ICMP协议和IGMP协议是位于网络层和传输层之间的协议。所以这两个协议起到一个桥梁作用。为了更有效地转发IP数据报和提高交付成功的机会。

ICMP协议支持主机或路由器可以实现差错(或异常)报告网络探询。因为在实际传输中总会有有一些分组会出错,出错的分组在网络层会直接丢弃,并发送一个差错报文给源主机。也就是说ICMP功能就是要发送特定的ICMP报文。报文结构如下:

ICMP报文结构

ICMP报文装在IP数据报的数据部分。ICMP报文具体字段如下:

ICMP报文具体字段

ICMP有两种类型:ICMP差错报文、ICMP询问报文。

差错报文

差错报文有五种:

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

    出现无法交付问题时使用。

  2. 源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。

    出现因为拥塞而丢数据时使用,现在基本上不用,

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

    主要在TTL=0,或者数据报片因为传输超时出现残缺情况。

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

    首部字段出问题时使用。

  5. 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

    一个网络上会有很多路由器,发送数据时没有找到最合适的路由器,这样原来的路由器就会将数据丢弃,并返回一个重定向报文高速主机这条路径不能将数据传输给目的主机。

ICMP差错报告报文中具体的数据字段:

ICMP差错报告报文数据字段

将受到的需要进行差错报告的IP数据报的首部,以及前8个字节取出,作为ICMP报文的数据字段,再加上ICMP报文的前8个字节。就构成一个完整的差错报告报文,接着再加上IP数据报的首部就构成一个完整的数据报。再次强调ICMP差错报告报文是IP数据报也就是网络层传输单元的数据部分。

不应发送ICMP差错报文的情况:

  1. 对ICMP差错报告报文不再发送ICMP差错报告报文。

    即不会对ICMP的差错,再进行差错报告。

  2. 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。

  3. 对具有组播地址的数据报都不发送ICMP差错报告报文。

    组播是一点到多点,而广播是一点到所有结点。组播具有选择性。

  4. 对具有特殊地址(如127.0.0.00.0.0.0)的数据报不发送ICMP差错报告报文。

询问报文

主要分为四种:

  1. 回送请求和回答报文

    主机或路由器向特定目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。

    主要应用是Ping测试目的站是否可达以及了解其相关状态。

  2. 时间戳请求和回答报文

    请某个主机或路由器回答当前的日期和时间。用来进行时钟同步和测量时间。

  3. 掩码地址请求和回答报文、路由器询问和通告报文

    当前已经不再使用。

ICMP具体应用有两方面:

5. IPv6

由于IPv4地址池消耗快,所以就学习了CIDR和NAT延缓IPv4地址的消耗,但仍然治标不治本,所以就提出IPv6这种新的地址池。

IPv6从地址位数和地址长度上扩充地址池,从根本上解决IPv4地址池不够的问题。除了IPv6解决办法同时还可以改进IPv4首部格式,改进首部20B的格式使得字段种类变得少一点,这样就可以加快路由器处理效率,也就是说通过改进首部格式实现快速处理/转发数据报的功能,同时要支持QoS。

QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。如果支持QoS就可以满足实时的以及多媒体通信的需要,所以基于这些动机就产生了IPv6。

5.1 IPv6数据报格式

IPv6数据报格式:

IPv6数据报格式

可以看到数据报格式包括两个部分:基本首部+有效载荷。其中有效载荷又包括选项和数据部分。对比IPv4就相当于将IPv4中的首部的可变部分移动到了IPv6的有效载荷中。基本首部固定40字节,扩展首部是对数据报有一些新的要求,如数据报要增加某些功能就放到这个扩展首部当中。所以原本IPv4的首部中,不必要的部分就可以放到扩展首部当中。可以看到IPv6灵活数据报格式就可以大大加快分组的处理速度。

数据报中的具体字段如下:

IPv6数据报具体部分

上图中有效载荷的扩展首部是可有可无的根据数据报是否需要提供其他服务,如果要就填充到扩展首部。其他字段解释:

IPv4和IPv6区别:

  1. IPv6将地址从32位(4B)扩大到128位(16B),更大的地址空间。

  2. IPv6将IPv4的校验和字段彻底移除,以减少每跳的处理时间。

  3. IPv6将IPv4的可选字段移出首部,变成了扩展首部,成为灵活的首部格式,路由器通常不对扩展首部进行检查,大大提高了路由器的处理效率。

  4. IPv6支持即插即用(即自动配置),不需要DHCP协议。

  5. IPv6首部长度必须是8B的整数倍,IPv4首部是4B的整数倍。

  6. IPv6只能在主机处分片,IPv4可以在路由器和主机处分片。

    就是说即使IPv6的分组很长,在路由器也是无法分片的,只能在主机处分片。

  7. ICMPv6:附加报文类型"分组过大"

    由于IPv6只能在主机分片,如果链路层最大传输单元MTU很小,但是IPv6数据报很大,此时也不能分片,路由器只能丢弃并返回一个差错报告报文。这里的差错报文使用的是ICMPv6协议。

  8. IPv6支持资源的预分配, 支持实时视像等要求,保证一定的带宽和时延的应用。

  9. IPv6取消了协议字段,改成下一个首部字段。

  10. IPv6取消了总长度字段,改用有效载荷长度字段。

  11. IPv6取消了服务类型字段。

    即IPv4中的区分服务字段。

IPv6地址表示形式:

一般用冒号十六进制记法表示:4BF5:AA12:0216:FEBC:BA5F:039A:BE9A:2170

每四个十六进制为一组总共八组。

还有一种压缩形式:如果碰到前面有连续的0,保证每一组至少有一个0即可,前面的0都快可以删去。如:4BF5:0000:0000:0000:BA5F:039A:000A:2176压缩后格式为:4BF5:0:0:0:BA5F:39A:A:2176

同时也可以采用零压缩方式:一连串连续的0可以被一对冒号取代。如:FF05:0:0:0:0:0:0:B3压缩后是FF05::B3。且要注意双冒号这种表示法在一个地址中仅可出现一次。

5.2 IPv6基本地址类型

地址类型有三种:

如果一台主机使用的是IPv6,另一台主机使用的是IPv4,这两台主机通信过度策略要使用:双栈协议和隧道技术。

IPv6总结:

IPv6总结

6. IP组播

IP数据报三种传输方式:单播、广播、组播(多播)。

单播和广播传输效率相对较低,因此就产生了比较好的传输方式:组播(多播)。

上面例子中数据报到了R2,R3,R4路由器再分发给这个组播组当中的成员主机。这些主机是通过IP组播地址来确定为一个组播组的。

在因特网进行通信的时候每一个主机都需要有一个全球唯一的IP地址,如果某个主机现在想要接受特定的多播组的分组,那么如何使这个多播数据报传送到主机中,显然这个组播数据报的目的地址不能是主机自己的IP地址,因为如果写为主机IP地址,就只会发给这个主机,其他同属于一个组播组中的主机都是收不到这个数据报的。因此就需要一个新的地址,用这个产生的新地址来接收组播数据报,当然其他属于这一个组播组中的主机都可以有这样一个IP组播地址,然后接收到发送给这些主机所在的组播组的数据报。

所以IP组播地址让源设备能够将分组发送给一组设备。 属于多播组的设备将被分配一个组播组IP地址(一群共同需求主机的相同标识)。这个组播地址并不是任何一个主机都直接拥有的,而是在主机实现接收数据报时才会生成这个组播地址。

组播地址范围为224.0.0.0239.255.255.255(D类地址),一个D类地址表示一个组播组,只能用作分组的目标地址。源地址总是为单播地址。如:观看直播时,主播是源站主机,将这些视频数据报通过组播方式发给这些正在观看直播的主机。这些主机就同属于一个组播组。所以IP组播地址只能作为目的地址而不能作为源地址。

需要注意一下几点:

  1. 组播数据报也是"尽最大努力交付",不提供可靠交付,应用于UDP。

    UDP协议虽然是不可靠交付协议,但是其优点是速度快。

  2. 对组播数据报不产生ICMP差错报文。

  3. 并非所有D类地址都可以作为组播地址。

组播方式大致如下:

组播例子

这个图可以分为两个部分,下面的是硬件组播(只能在本局域网内进行的硬件组播),上面路由器叫做因特网范围内组播(没有进入到局域网范围内进行组播)。硬件组播简单但是重要,因为现在大部分主机都是通过连接局域网然后再连入因特网,所以通过因特网范围内组播后还是要进入局域网内的硬件组播。

6.1 硬件组播

硬件组播其实就是在局域网范围内对于一个组播的数据报,应该怎么交付给这些主机,或者说应该将数据报给哪些主机。可以结合之前学习的单播情况,假如当前发过来一个单播数据报,进入局域网之后应该交付给哪些主机,就要看这个主机的MAC地址。同样,在硬件组播这里也是要根据MAC地址来找到可以接收主播数据报的主机。

所以同单播地址一样,组播IP地址也需要相应的组播MAC地址在本地网络中实际传送帧。组播MAC地址以十六进制值01005E打头,余下的6个十六进制位是根据IP组播组地址的最后23位转换得到的。

可以结合广播情况,如果当前要发送一个广播数据报,在进入局域网后要看MAC地址,如果此时目标地址MAC是全F,就应该把这个数据报发送给这个局域网中的所有主机,不管有没有交换机。

所以在广播数据报中,全F这种广播MAC地址,其实就相当于一种标识。在组播中也有这种MAC地址标识,也就是只要01005E打头, 就可以知道这一定是一个组播MAC地址,所以就做好准备发送给局域网中的一部分主机,至于要发给哪些主机,就要看剩下的6位。

TCP/IP协议使用的以太网多播地址范围是01005E00000001005E7FFFFF

硬件组播

结合上图,由于前面的01005E都是由16进制表示的。所以一个十六进制位标识二进制4位,所以前面24位固定,另外剩下的24位开头一位是固定的0,故还剩下23位来自D类IP地址。这23位要和IP地址有一个映射关系,来决定是不是同属于一个多播组。因为一个D类IP地址就标识的是一个组播组,那因此就把这个IP地址映射成MAC地址,也就变成了一个MAC地址就可以映射一个组播组,但是要注意的是在D类IP地址中,1110后面的5位是不固定的,所以会导致两个前面9位不一样,后面23位一样的IP地址映射成MAC地址后出现一样情况,如果一样就认为是一个组播组,这样就导致多播转发错误。

所以为了解决这个问题在收到多播数据报的主机,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。这样就可以解决D类IP地址中间五位不一样剩下23位一样导致多播转发错误。

6.2 IGMP协议与组播路由选择协议

上面介绍过IP组播两种类型,一个是在本局域网内进行硬件多播,另一个是在因特网范围内进行多播。而IGMP协议与组播路由选择协议就是在因特网范围内要使用到的协议。

IGMP在一个路由器内部所规定的协议。这个协议目的是让连在一个局域网上的组播路由器知道所连的局域网上面是否还有主机参加/退出了某个组播组。即一个组播路由器通过IGMP协议就可以知道它所连的局域网中,是不是还有可以接收组播数据报的主机。

而组播路由选择协议是在路由器之间进行路径选择的问题。如果只有IGMP协议是完成不了组播数据传输这样一个过程的。连接在局域网上的组播路由器必须要和其他路由器进行信息交换才能把这个组播数据报用最小的代价来传送给组播组中的全部成员。此时就需要用到组播路由选择协议。

IP组播总结:

IP组播总结

7. 移动IP

移动IP技术是移动结点(计算机/服务器等)以固定的网络IP地址,实现跨越不同网段的漫游功能,并保证了基于网络IP的网络权限在漫游过程中不发生任何改变。所以移动IP目的是达到设备移动但是IP不动。

五个相关概念:

  1. 移动结点

    具有永久IP地址的移动设备。

  2. 归属代理(本地代理)

    一个移动结点的永久"居所"称为归属网络,在归属网络中代表移动节点执行移动管理功能的实体叫做归属代理。可以理解为一个管家,其管理的就是移动结点在没有发生移动的时候归属网络所提供一些功能叫做归属代理

  3. 永久地址(归属地址/主地址)

    移动站点在归属网络中的原始地址。

  4. 外部代理(外地代理)

    在外部网络中帮助移动节点完成移动管理功能的实体称为外部代理。

    具体来说就是移动结点移动到了外地,就会进入到一个外部网络,这个网络中的管家就是外部代理,也可以是这个网络中的一个路由器。主要发挥作用是帮助移动结点进行正常通信。

  5. 转交地址(辅地址)

    可以是外部代理的地址或动态配置的一个地址。

下面以外部代理地址作为转交地址具体讲解移动IP技术:

移动IP

主机A就是即将发生移动的结点,加入主机A从当前归属网络进入到其他外部网络。

移动IP2

A刚进入外部网络时候,就会获得外部代理的转交地址(外部代理广播报文)。这个转交地址获得形式有两种:

在主机A获得转交地址之后,就应该在归属代理注册自己的信息,即移动节点通过外部代理发送注册报文给归属代理(包含永久地址和转交地址)。

之后归属代理接收请求,并将移动节点的永久地址和转交地址绑定(以后到达该归属代理的数据报且要发往移动节点的数据报将被封装并以隧道方式发给转交地址),并返回注册响应报文。最后外部代理接收注册响应,并转发给移动节点。

假如数据报要到达归属代理并且要发给主机A的数据报都会被封装并且以隧道的形式发送给转交地址(外部代理),这样外部代理才会根据永久地址发送给具体移动节点,即主机A

如果主机A移动到了下一个网络:

  1. 在新外部代理登记注册一个转交地址。
  2. 新外部代理给本地代理发送新的转交地址(覆盖旧的)
  3. 通信

当主机A回到了归属网络:

  1. A向本地代理注销转交地址。
  2. 按原始方式通信。

8. 网络层设备

路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。

路由器

上图是路由器结构图,可以分为两个部分:路由选择部分和分组转发部分。

这里转发要和路由选择区分开,转发是把一个分组从一个输入端口转发到另一个输出端口。而路由选择就比较宏观,指的是在路由之间选择一个合适的路径把信息从源站发送到目的主机。转发是在内部的,路由选择是外部的。

并不是任何一个分组只要进了这个路由器,就会通过交换结构输出去,要分情况:若收到RIP/OSPF分组等,则把分组送往路由选择处理机。若收到数据分组,则查找转发表并输出。

输入端口详细信息:

输入端口和输出端口

首先会从链路上接收分组,交给物理层处理,这个物理层只是单纯进行比特接收。之后到了链路层就会按照链路层协议来接收传送分组的帧,之后会把帧头和帧尾去掉,然后交付给网络层。网络层处理是先要对这个分组进行判断,如果是路由器之间交换路由信息的分组,就会把这个分组交给路由选择处理机来进行处理和计算。如果是数据分组就会放入交换结构当中再选一个合适的端口进行输出。

假如当前有一堆数据分组到了网络层处理时候就需要排队,排队原因是假如第一个分组正在查询转发表,并且选一个合适的端口转发,这会产生一定的延迟,那么如果第一个分组还没有查完,第二个分组就已经到达之后几个分组也会依次到达,此时就会容易产生时延。所以也可以看出输入端口中的查找和转发功能在路由器的交换功能中是最重要的。

输出端口详细信息:

输出端口详细信息

输出端口先回从交换结构接收到一个分组,然后再把这些分组放到网络层处理分组中排队,可以看到网络层处理分组是一个队列。分组过多超过发送速率情况下,分组就需要在网络层缓存中暂存。这个网络层处理会产生时延。所以若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。因此路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因

三层设备区别:

三层是物理层、链路层、网络层。这三层三个代表设备是路由器、网桥、集线器。

三层设备区别

路由表与路由转发:

路申表根据路由选择算法得出的,主要用途是路由选择,总用软件来实现。

路由表结构是:目的网络IP地址+子网掩码+下一跳IP地址+接口。

路由表

上面的接口可选。下面的默认路由是只要当前发送的分组在路由表中找不到所对应的表项,就应该发送给默认路由。

转发表由路由表得来,可以用软件实现,也可以用特殊的硬件来实现。转发表必须包含完成转发功能所必需的信息,在转发表的每一行必须包含从要到达的目的网络到输出端口和某些MAC地址信息的映射。

所以路由表和转发表区别是:路由表是由路由选择算法得出的。转发表是由路由表得出的,而且还要结合主机具体信息来确定输出的端口。并且路由表主要是选择下一跳应该走哪个路由器(下一跳IP地址)。

五. 传输层

主要研究进程之间的通信问题。

知识总览:

传输层只是总览

传输层只有主机才有的层次,也就是在端系统两个主机才会有一层传输层。传输层为应用层提供服务,同时也可以使用网络层的服务。

传输层功能:

  1. 传输层提供进程和进程之间的逻辑通信。

    注意网络层提供的是主机之间的逻辑通信。

  2. 复用和分用

    复用指的是发送方不同的应用进程都可以使用同一个传输层的协议来传送协议。而分用指的是接收方在传输层在去除报文首部之后能够将这些数据送交给正确的进程。

  3. 传输层对收到的报文进行差错检测

    网络层的首部校验和只是校验首部,不会校验数据部分。这里传输层会对数据进行检错。

  4. 传输层有两种协议:UDP和TCP

UDP和TCP

传输层的寻址与端口:传输层功能之一是分用和复用。

复用:应用层所有的应用进程都可以通过传输层再传输到网络层。

分用:传输层从网络层收到数据后交付指明的应用进程。

在传输层也会有网络层IP地址及链路层MAC地址一样都快有唯一标识一个主机。在传输层唯一可以标识一个进程的是端口。即端口是传输层的SAP(服务访问点),标识主机中的应用进程。这个端口是一个逻辑端口/软件端口。端口用端口号标识,端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的。端口号长度为16bit,能表示65536个不同的端口号。

端口号根据数字大小范围可以分为:服务端使用的端口号和客户端使用端口号。其中服务端口号可以具体分为:

  1. 熟知端口号01023

    给TCP/IP最重要的一些应用程序,让所有用户都知道。

  2. 登记端口号102449151

    为没有熟知端口号的应用程序使用的。

而客户端使用端口号(范围是:4915265535):仅在客户进程运行时才动态选择。客户端使用端口号只有在使用时才会进行分配,而且是操作系统随机分配的。只要进程一结束,端口号会被操作系统收回分配给新的进程。

传输层寻址与端口

一些熟知端口号需要牢记:

一些熟知端口号

在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。

套接字结构:套接字Socket=(主机IP地址+端口号)

1. UDP协议

UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。

UDP的主要特点:

  1. UDP是无连接的,减少开销和发送数据之前的时延。

  2. UDP使用最大努力交付,即不保证可靠交付。

    网络层是不可靠交付,如果传输层使用UDP协议,也不会保证可靠交付,此时可靠交付就由应用层保证。

  3. UDP是面向报文的,适合一次性传输少量数据的网络应用。

    面向报文指的是应用层给UDP多长的报文,UDP就照样发送。

    面向报文

    即一次发一个完整报文。因此应用程序就需要选择大小合适的报文。提供报文太长在网络层就会分片,因此会影响网络层传输效率。如果报文太小,报文传送到网络层,IP数据报的数据部分就相比IP首部来说小很多,所以网络层效率也会降低。

  4. UDP无拥塞控制,适合很多实时应用(如:视频通话)。

  5. UDP首部开销小,是8B,但TCP是20B。

UDP首部由首部字段+数据字段构成。

UDP首部格式

数据字段可有可无,如果没有,则UDP首部为8B。首部字段四个部分介绍如下:

分用时,找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP"端口不可达"差错报告报文。下面详细介绍UDP校验过程:

UDP校验

可以看到,首部数据的首部部分中,有一个伪首部字段。伪首部和下面的IP数据报的首部类似。因为伪首部中包含源IP地址及目的IP地址,以及17这个字段。这个17代表的是IP数据报首部的协议字段,这个协议字段就是在说明数据部分使用的是什么字段,这里数据部分使用的是UDP协议,即传输层使用UDP协议。所以这里对应的协议字段值是17

伪首部只有在计算检验和时才出现,不向下传送也不向上递交。即发送端和接收端在校验数据和首部有没有发生问题时才会出现伪首部。其他传输过程中这个伪首部自始至终不会出现。伪首部几个字段如下:

UDP伪首部校验过程:

UDP校验过程

上图是一个UDP用户数据报,数据部分需要是4B整数倍。在发送端过程:

  1. 填上伪首部

  2. 0填充校验和字段

    将首部第四个字段填上全0

  3. 0填充数据部分(UDP数据报要是4B整数倍)

  4. 伪首部+首部+数据部分采用二进制反码求和

    UDP校验过程求和

  5. 把和求反码填入检验和字段,即将上面UDP首部检验和全0字段替换为求和结果的反码。

  6. 去掉伪首部,发送。

在接收端过程:

  1. 填上伪首部
  2. 伪首部+首部+数据部分采用二进制反码求和
  3. 结果全为1则无差错,否则丢弃数据报/交给应用层附上出差错的警告。

2. TCP协议

TCP协议特点:

  1. TCP是面向连接(虚连接)的传输层协议。

    面向连接是指,应用程序在使用TCP协议之前必须要先建立好一个连接。在传送数据完毕后再释放这个连接。

  2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。

    所以TCP协议不能用于广播及多播形式。

  3. TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。

    可靠有序,不丢不重

  4. TCP可以提供全双工通信

    发送端和接收端可以同时发送数据也可以同时接收数据。由于这个特点,TCP协议连接的两端都会设置发送缓存和接收缓存。

    发送缓存中存放准备发送的数据和已发送但尚未收到确认的数据。接收缓存中存放按序到达但尚未被接受应用程序读取的数据和不按序到达的数据。

  5. TCP面向字节流

    流指的是流入到进程或从进程流出的字节序列。面向字节流的含义是虽然应用进程和TCP交互是一次发送一个数据块,这个数据块大小可以是不一样的。但是TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。

    TCP协议特点

    如上图发送方文件会按照字节进行编号。在发送的时候会把字节放入TCP缓存中,在发送的时候会不定长取走一部分字节组成TCP报文段,在这个报文段上加上TCP头部形成一个完整报文段之后放到链路上进行传输。所以可以看到TCP是面向字节流的。

TCP报文段首部格式

TCP报文段首部格式

可以看到主要分为两个部分:首部+TCP数据部分。首部除了有20B的固定首部外,还有选项(长度可变),以及填充字段(首部是4B整数倍)。具体字段介绍如下:

2.1 TCP连接管理

TCP是一种面向连接的协议,是一种可靠的协议,且是全双工通信。TCP连接需要经过三个阶段:连接建立、数据传输、连接释放。

TCP连接三个阶段

TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。虽然角色不同但是都可以接收数据和发送数据。

TCP连接的建立

客户服务模式建立TCP连接建立需要三次握手。

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:

TCP连接的建立

客户与服务器通信过程如下:

可以看到在服务器端和客户端分别为TCP连接过程分配了缓存和变量。这样会产生SYN洪泛攻击现象。

SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包, 而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。解决的办法通常是设置SYN cookie。

TCP的连接释放:参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的"资源"(缓存和变量)将被释放。

TCP连接的释放过程如下:

  1. 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。

    请求报文字段是FIN=1,seq=u

    因为此时要请求释放连接,所以在结束连接的时候结束位FIN=1seq指的是报文段的第一个字节的序号,由于报文段通常是没有数据的,所以序号u可以标识这样一个报文段,u=之前发送的数据的最后一个字节的序号+1

  2. 服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了。进入半关闭状态。

    这个状态下,只是客户停止了发送数据,但是服务器还可以照样发送数据。所以是一个半关闭状态。

    确认报文字段是ACK=1,seq=v,ack=u+1

    确认位ACK=1。确认位seq取决于之前发送到哪里,假如服务器上一个发送报文段最后一个字节是v-1,接下来seq就是v。确认号ack=u+1,即返回上一个报文段的确认,并期待下一个报文段u+1

  3. 服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。

    请求数据报字段是FIN=1,ACK=1,seq=w,ack=u+1

    因为此时要请求释放连接,所以在结束连接的时候结束位FIN=1。确认位和确认号同上都是ACK=1,ack=u+1。序号位由于不确认上一步服务器发送确认报文段后还有没有发送其他数据字段,所以这里设为w,即seq=w

  4. 客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。

    等待2MSL时间是因为如果客户端发送的确认报文段,没有到达服务区端(丢失),服务器就会重传第三个连接释放的报文段。之后客户端会重传确认报文段,并重新启动2MSL计时器。直到最后关闭。

    确认报文段字段是ACK=1,seq=u+1,ack=w+1

TCP可靠传输

之前的网络层是提供最大努力交付的不可靠传输。因此传输层的TCP协议就要担负起可靠传输责任。如果传输层使用UDP协议,那应用层就要实现可靠传输。

这里的可靠是指保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。TCP实现可靠传输主要有四种传输机制:校验、序号、确认、重传。

TCP协议是面向字节流的,因此TCP传输的时候是按照字节编号传输的(第一个字节编号随机,后面按照序号一次编号)。但是在发送的时候会将一些字节放在一起组成一个报文段,然后再把这个报文段发送出去,这里报文段大小不固定。

序号

所以一个字节占用一个序号。TCP报文段中的序号字段指的是报文段的第一个字节序号。有了这个序号就可以保证数据有序提交给应用层。而基于这个序号机制就产生了确认及重传机制。

TCP流量控制

流量控制:让发送方慢点,要让接收方来得及接收。TCP利用滑动窗口机制实现流量控制。

具体过程是:在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。

所以发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。发送窗口大小可以动态变化。如果接收方发送的报文字段rwnd=0,此时发送方会动态将发送窗口调整为0,即不发送数据,接收方会将接收缓存中的数据报,上交给上层的应用层。直到数据报处理完毕或者处理一部分,接收方会发送报文段给发送方,字段rwnd值设置为接收方可以接收的大小。

假如:AB发送数据,连接建立时,B告诉A:"我的rwnd=400(字节)",设每一个报文段100B,报文段序号初始值为1

TCP流量控制

发送过程如上图所示。最后如果BA发送报文段中rwnd=100,但是传输过程中这个数据报丢失,那么Arwnd一直为0,而B一直等待A发送数据,此时就出现了类似于操作系统中死锁现象。

解决办法是:TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,A就发送一个零窗口探测报文段。接收方B收到探测报文段时给出现在的窗口值。若主机B发送报文窗口仍然是0,那么发送方就重新设置持续计时器。

TCP拥塞控制

拥塞出现条件:对资源需求的总和>可用资源。这里的资源主要指的是网络当中的链路容量(带宽),假如一个链路带宽是50MB,如果有很有数据到这个链路上,就会导致链路上的带宽不够使用,从而出现拥塞。如果在网络当中对于某个资源的需求总和超过了这个资源可以提供的可用部分,网络性能就会变坏,因此会有许多资源同时呈现供应不足,进而使得网络吞吐量将随着输入负荷增大而下降。

拥塞控制目的是防止过多的数据注入到网络中,这是一个全局性问题。

拥塞控制与流量控制区别:

拥塞控制与流量控制

如上图左边是拥塞控制,如果发送方同时给接收方发送数据,如果同时使用网络上的资源,就会使得网络非常繁忙,出现拥塞情况。此时接收方并不知道这种拥塞情况具体是哪一台主机发送速率过快产生的。 拥塞控制主要是因为网络发生堵塞,导致很多发送方发送的数据迟迟到不了接收方。

右边是流量控制,是一种点对点之间的通信量的控制。是一个端到端问题。是发送方发送的速率过快,导致接收方接收缓存不够,接收窗口不够。

拥塞控制有四种算法:慢开始、拥塞避免、快重传、快恢复。

介绍这四种算法之前先假定数据单方向传送,而另一个方向只传送确认,且接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度,之前介绍过发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd},这里假设接收窗口是对于发送窗口是没有限制的,因此发送窗口大小只受拥塞窗口大小影响。

接收窗口:接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量。

拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。

四种算法应用过程:

六. 应用层

应用层知识总览:

应用层知识总览

作为网络体系结构中的最上层,传输层可以为应用进程提供端到端之间的通信服务。但是不同的网络应用的应用进程之间还需要有不同的通信规则,因此就会在传输层之上再建立一个应用层,并且规定一些协议。

应用层对应用程序的通信提供服务。应用层协议哪些规定:

  1. 规定应用进程交换的报文类型,是请求还是响应。
  2. 规定各种报文类型的语法,如报文中的各个字段及其详细描述。
  3. 规定字段的语义,即包含在字段中的信息的含义。
  4. 进程何时、如何发送报文,以及对报文进行响应的规则。

由应用层协议定义的以上规则,可以看出应用层功能:

  1. 文件传输、访问和管理
  2. 电子邮件(使用到应用层协议)
  3. 虚拟终端
  4. 查询服务和远程作业登录

应用层的重要协议:FTP、SMTP、POP3、HTTP、DNS。

1. 网络应用模型

应用层通常使用的网络应用模型有两种:客户/服务器模型(Client/Server)、P2P模型(Peer-to-peer)。

1.1 客户/服务器模型

简称C/S模型:

cs模型

这样一个模型将网络上的结点分为两类角色,一类是客户,一类是服务器。服务器就是提供计算服务的设备。而客户就是请求计算服务的。客户网服务器发送一个请求,服务器在接收到这个请求后就会对这个请求进行处理,并且返回给对应的客户机所要请求的服务。

服务器特点:

  1. 永久提供服务
  2. 永久性访问地址/域名

客户机特点:

  1. 与服务器通信,使用服务器提供的服务
  2. 间歇性接入网络
  3. 可能使用动态IP地址
  4. 不与其他客户机直接通信

C/S模型应用广泛:Web,文件传输FTP,远程登录,电子邮件等。

1.2 P2P模型

也叫对等模型。

P2P模型

可以看到没有服务器,只有一些主机进行通信。所以P2P思想是整个网络中的传输内容都不会保存在一个中心的服务器上,而是每个结点都可以提供服务,也可以请求服务。每个结点之间都是平等的。任意的端系统和结点之间都可以直接通讯。

节点间歇性接入网络,节点也可能改变IP地址,且P2P模型的可扩展性好,即当网络中大量的主机涌入,这些主机之间仍然可以非常顺利请求服务,以及提供服务。所以也能体现出P2P的网络健壮性强,一台节点退出连接不会影响其他节点。

2. 域名解析系统DNS

通过全球唯一的IP地址就可以找到网站,并且和网站进行信息交换。但是直接通过IP地址去寻找网站很困难,因此就通过域名来替代IP地址。域名与IP地址之间的转换就要通过DNS。

www.sybblogs.fun

上面是一个域名,对于这个域名每个.分割的部分称为标号。标号的长度不能超过63个字符,不区分大小写字母,域名中唯一可以使用的特殊符号是-

2.1 域名划分

域名当中的每个标号级别是不一样的,自左向右由低到高。对于最右边的fun叫做顶级域名。中间的sybblogs是二级域名。最前面的www是三级域名。实际上,上面域名完整写法应该是www.sybblogs.fun.,可以看到顶级域名后面还有一个.,这个.代表的是根域名。

可以看到顶级域名和二级域名有相同部分,这是因为有的网站在国家顶级域名上再建立二级域名等。如:com.cn

可以用域名树形式表示:

域名树

具体实现域名系统要通过域名服务器DNS实现。DNS服务器根据域名结构划分位不同类型解析服务器。主要包括:根域名服务器、顶级域名服务器、权限域名服务器。

处理上面三个之外还有一个本地域名服务器。这个本地域名服务器不属于这个层次结构,但是又对域名系统十分重要。当一个主机发出DNS查询请求时,这个查询请求报文就发给本地域名服务器。本地域名服务器离主机的距离很近,一般不超过几个路由器距离。当一台主机查询另一台主机是和它属于同样一个本地网络服务提供商时,这个本地域名服务器就可以立刻将所查询的主机名转换为IP地址,而不需要再去其他服务器。所以有了本地域名服务器存在就可以使整个DNS查询过程变得简单快速。

2.2 域名解析过程

域名查询方式有两种:递归查询和迭代查询。

递归查询过程是:本地域名服务器根域名服务器顶级域名服务器权限域名服务器本地域名服务器。

迭代查询方式过程:

本地域名服务器没有域名对应IP地址,本地域名服务器根域名服务器

如果根域名服务器没有域名对应IP,会返回域名对应顶级域名服务器地址,则本地域名服务器顶级域名服务器

如果顶级域名服务器没有域名对应IP,会返回域名对应权限域名服务器地址,则本地域名服务器权限域名服务器

域名解析过程

上图m.xyz.com是主机名,要查找的是y.abc.com地址。

可以看到这样两种方式查询效率不高,所以就引入高速缓存概念,高速缓存中存放的是最近主机查询过的域名,以及从哪台服务器获得域名映射信息记录。如果一台主机已经访问过一个网站,则第二次访问时本地域名服务器中就会缓存这个网站对应的域名与IP地址映射信息。就不用再进行递归或者迭代查询。并且如果本地域名服务器中没有对应网站的IP地址,但是对应这个网站有对应的顶级域名服务器地址,此时就不需要再经过根域名服务器。

为了保证高速缓存中域名信息正确,所以要不定期进行更新。即为其中每一表项设置计时器,计时器结束就会清除。

实际上不只是本地域名服务器中有缓存,许多主机也有高速缓存。主机开机时就会从本地域名服务器中下载域名和地址对应映射关系的数据库,并放到本机的高速缓存中。所以此时访问一个网站就要先查询本机的高速缓存,没有再去查看本域名服务器。

3. 文件传输协议FTP

文件传输协议有很多,比较重要两个是:文件传送协议FTP(File Transfer Protocol)、简单文件传送协议TFTP(Trivial File Transfer Protocol)。TFTP是一个很小,而且易于实践文件协议,其优点是适合UDP环境。

文件传送协议FTP:提供不同种类主机系统(硬、软件体系等都可以不同)之间的文件传输能力。即使用FTP协议可以屏蔽文件传送时不同操作系统的差异性。

FTP本质是拷贝,即从FTP服务器上将文件拷贝到电脑上,或者从本地电脑将文件拷贝到服务器上。对应上传和下载。

FTP是基于客户/服务器(C/S) 的协议。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器。连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。

FTP工作原理:

  1. 登录

    在地址框中输入FTP地址就可以登陆FTP服务器,并且进行文件传送。具体是输入FTP地址,还要输入用户名和密码。有的时候还可以采用匿名登陆的方式:互连网中有很大一部分FTP服务器被称为"匿名"(Anonymous)FTP服务器。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名"anonymous"登陆FTP服务,就可访问远程主机上公开的文件。

    这种匿名方式很普遍且常见。

  2. 文件操作

    登录之后就可以对文件进行操作。对文件的操作其实就是与服务器进行连接。进行连接的过程通常使用的是TCP连接。通过使用TCP连接可以实现可靠传输。

    连接的FTP服务器可以有一个或多个,客户端也是有一个或多个。而且一个FTP进程可以同时为多个客户进程提供服务。FTP进程主要有两大部分:1个主进程、n个从属进程。

    主进程负责接收新的请求,工作步骤是首先要先打开FTP服务器实现文件传输的端口,这个端口打开后就可以使客户进程成功连接。接下来就等待客户进程连接的请求。连接成功后就可以启动从属进程,每个从属进程都可以处理单个的客户请求。

    FTP工作原理

    上图中服务器的控制进程和数据传送进程都属于从属进程,而不是主进程。客户端和服务器的控制连接,在整个会话(文件传送)过程中会一直保持打开,FTP客户发出的传送请求都要通过控制连接来发送给服务器端的控制进程,所以控制连接相当于正式传送文件的准备步骤。而数据连接才是实际中用于传送文件的连接,并且服务器端的控制进程会在接收到FTP客户端发来的文件传输请求之后就创建这样一个数据传送进程,建立数据传送连接。

    所以控制连接传送的是请求,数据连接传送的是文件。控制连接在全程都是开启的,只要客户端和服务器建立会话,并且会话还未结束控制连接就始终保持,文件传送之后就会关闭数据连接。

TCP是否使用20端口建立数据连接与传输模式有关:主动方式使用TCP 20端口、被动方式由服务器和客户端自行协商决定(端口号通常来说>1024)。

主动:服务器20端口主动和客户端开放的端口相连。被动:服务器的开放端口,客户端请求连接。

FTP传输模式:

  1. 文本模式:ASCII模式,以文本序列传输数据。
  2. 二进制模式:Binary模式, 以二进制序列传输数据。

4. 电子邮件

电子邮件格式主要包含信封和内容两个部分。

电子邮件传输程序会根据邮件信封上的信息来传送邮件,所以信封一般是邮件名。内容就是电子邮件的主要部分,包括首部和主体两部分。首部需要填写接收人的邮箱号,信封主题。填写完首部信息后会自动生成发件人和发送日期两个字段。主体部分就是信息内容。

电子邮件信息格式

电子邮件系统组成结构如下:

电子邮件组成结构

上图组成结构实际上只有三个部分,中间的SMTP协议,发送方和接收方的用户代理,发送方与接收方的邮件服务器。具体解释如下:

所以电子邮件系统工作原理如下图:

电子邮件工作原理

发送方通过用户代理把写好的邮件发送给发送方的邮件服务器。邮件会被放到邮件服务器缓存中,之后发送时取出邮件发送给接收端的服务器,这两个过程都是发送邮件,使用的是SMTP协议。接着邮件到了接收端的邮件服务器当中,同样会放到邮件服务器缓存中,如果接收方有时间阅读邮件,就会通过用户代理,使用POP3协议将接收端邮件服务器中读取邮件。传输邮件过程都使用TCP可靠连接。

这里的重点是三个协议。

4.1 简单邮件传送协议SMTP

SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息。这两个进程分别是:负责发送邮件的SMTP进程就是SMTP客户、负责接收邮件的进程就是SMTP服务器。

STMP通过14条命令(几个字母)和21种应答信息(三位数字代码+简单文字说明)规定进程之间交换信息的方式。同时STMP协议是建立在TCP连接之上,端口号是25,是一种客户/服务器(C/S)方式。

STMP协议具体规定进程之间信息交换方式是通过三个阶段来进行通信:

  1. 连接建立

    发送方写好邮件发送方邮件服务器。发送方邮件服务器每隔一段时间就会对邮件缓存中的邮件进行扫描,如果发现有邮件,就使用SMTP协议,端口号25与接收方邮件服务器建立TCP连接。连接建立后接收方邮件服务器就要发出一个应答信息220 service ready,也就是告诉发送方现在可以准备接收邮件了。之后发送方邮件服务器会向接收方邮件服务器发送一个HELLO命令,并且会附上发送方的主机名。接收方邮件服务器如果有能力接收邮件,就会返回应答信息250 OK。如果接收方邮件服务器现在没有能力接收邮件会发送421 Service not available

    建立协议

  2. 邮件传送

    发送方邮件服务器会发送MALE FROM:<发送方邮件地址>。之后如果接收方服务器准备好接收就会返回一个250 OK,如果没有准备好接收就会返回数字和一些英文说明。这个环节是让SMTP服务器告知发送方邮件服务器是否已经准备好接收邮件。

    之后发送方会发送一个或多个RCPT TO:<接收方邮件地址>。每发送一个命令就会有一个信息从SMTP服务器中返回给发送方邮件服务器并且显示250 OK,或者显示550 No such user here。这个阶段SMTP服务器确定是否有这个用户。

    之后就是正式传输邮件过程。发送方服务器会发送一个DATA命令,标明要开始传输邮件内容。如果接收方服务器返回354 start mail input; end with <CR><LF>.<CR><LF>表明接收方邮件服务器同意传输。之后发送方邮件服务器就正式传输内容,发送方发送完毕后接收方收到<CR><LF>.<CR><LF>则表示传输结束,接收方邮件服务器会返回250 OK

    建立协议STMP

    上图A表示发送方邮件服务器,B表示接收方邮件服务器。

  3. 连接释放

    邮件发完,SMTP客户发送QUIT命令,SMTP服务器返回"221",表示同意释放TCP连接。

SMTP的缺点:

  1. SMTP不能传送可执行文件或者其他二进制对象。
  2. SMTP仅限于传送7位ASI码,不能传送其他非英语国家的文字。
  3. SMTP服务器会拒绝超过一定长度的邮件。

通用因特网邮件扩充MIME:

为了解决简单邮件传送协议SMTP缺点就有了MIME协议。该协议是对SMTP协议功能上的一个扩展。

MIME协议主要功能是会把一些非ASCII码的内容,如其他国家文字,一些可执行文件,转换为7位的ASCII码。再通过SMTP协议来进行邮件的发送和接收。所以MIME能使电子邮件系统可以支持声音、图像、视频、多种国家语言等等。这个协议现在已经应用到路由器上。

MIME协议

4.2 邮局协议POP3

POP3协议只在客户从接收方邮件服务器读取邮件,将邮件交给用户代理时使用。同样,POP3协议是建立在TCP连接之上,端口号是110,是一种客户/服务器(C/S)方式。

POP3工作方式,即当接收方将邮件从服务器中读取出来之后,对于这个邮件的处理方式有两种:下载并且保留在服务器中、用户下载后接收端服务器会删除对应邮件缓存。

由于这种协议功能有限,因此就提出了一种新的网际报文存取协议IMAP。

IMAP协议比POP协议复杂。当用户PC上的IMAP客户程序打开IMAP服务器的邮箱时,用户可以看到邮箱的首部,若用户需要打开某个邮件,该邮件才上传到用户的计算机上。

IMAP可以让用户在不同的地方使用不同的计算机随时上网阅读处理邮件,还允许只读取邮件中的某一个部分(先看正文,有WiFi的时候再下载附件)。

现在通常发送邮件方式是基于万维网的电子邮件。即可以通过浏览器邮箱网站发送邮件。

基于万维网电子邮件2

可以看到客户主机到服务器之间协议从SMTP、POP3变为HTTP协议。

基于万维网电子邮件总结:

基于万维网电子邮件总结

5. 万维网和HTTP

万维网www(World Wide Web)是一个大规模的、联机式的信息储藏所/资料空间(文字、视频、音频等),是无数个网络站点和网页的集合。这些资源都需要设置统一的资源定位符URL,这样就可以访问这些资源。

URL一般形式:<协议>://<主机>:<端口>/<路径>

其中协议有HTTP、FTP。主机可以填写域名或者IP地址。后面的端口和路径可以省略。URL不区分大小写。

用户通过点击超链接(URL)获取资源,这些资源通过超文本传输协议(HTTP) 传送给使用者。也就是说HTTP可以规定资源到达使用者中间的具体过程。

万维网以客户/服务器方式工作,用户使用的浏览器就是万维网客户程序,万维网文档所驻留的主机运行服务器程序。并且万维网使用超文本标记语言HTML。使得万维网页面设计者可以很方便地从一个界面的链接转到另一个界面,并能够在自己的屏幕上显示出来。

5.1 超文本传输协议HTTP

HTTP协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。

简单来说就是HTTP协议规定用户如何上网,以及服务器如何提供请求资源的过程。

HTTP执行过程

首先服务器会运行一个进程监听80端口,以便发现是否有客户请求访问服务。一旦服务器监听到了连接建立请求并且和客户之间建立好了TCP连接之后,浏览器就可以开始向万维网服务器发出浏览界面请求,即发送一个HTTP请求报文来请求相关文档。服务器收到请求报文之后就会将请求的资源以文档的形式放入HTTP响应报文中,返回给客户端,最后就可以释放TCP连接,并且在客户机界面上显示。

用户端浏览页面具体方法:

  1. 首先输入URL
  2. 点击超链接就可以请求服务。

浏览器端处理请求具体做法:

  1. 浏览器分析URL

  2. 浏览器向DNS请求解析IP地址,将域名转换为IP地址。

  3. DNS解析出IP地址

  4. 浏览器与服务器建立TCP连接

  5. 浏览器发出取文件命令

  6. 服务器响应

  7. 释放TCP连接

  8. 浏览器显示

    浏览器可以只下载文本部分。

HTTP协议特点:

5.2 HTTP连接方式

连接方式有持久连接和非持久连接两种。

5.3 HTTP协议报文结构

HTTP报文有两种,请求报文和响应报文。HTTP报文是面向文本的,因此在报文中的每一个字段都是一些ASCII码串。