四. 网络层1. SDN基本概念1.1 数据平面1.2 控制平面2. 路由算法及相关协议2.1 RIP协议与距离向量算法2.2 OSPF协议及链路状态算法2.3 BGP协议3. IP数据报3.1 IP数据报格式3.2 IP数据报分片3.3 IPv4地址3.4 网络地址转换NAT3.5 子网划分与子网掩码3.6 无分类地址CIDR构成超网最长前缀匹配4. 协议4.1 ARP协议4.2 DHCP协议4.3 ICMP协议差错报文询问报文5. IPv65.1 IPv6数据报格式5.2 IPv6基本地址类型6. IP组播6.1 硬件组播6.2 IGMP协议与组播路由选择协议7. 移动IP8. 网络层设备五. 传输层1. UDP协议2. TCP协议2.1 TCP连接管理TCP连接的建立TCP可靠传输TCP流量控制TCP拥塞控制六. 应用层1. 网络应用模型1.1 客户
根据网络层一些相关协议,和网络层设备路由器及一些算法等,实现主机与主机之间的通信。
网络层知识总览:
网络层主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层单位是数据报。
网络层功能:
路由选择与转发
通过路由选择算法确定一条最佳路由。然后将这个分组按照路由顺序发送出去。即选择最佳路径。
异构网互联
无论是手机还是联网的电脑,或者是学校的校园网,通过这些不同的网络可以实现彼此之间的通信,这就是一个异构网络。这些异构网络互连起来就形成一个更大的网络。互连依靠路由器使得这些网络可以相互连接在一起。
拥塞控制
若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于拥塞状态。因此要采取一定措施,缓解这种拥塞。
解决方法有两种:开环控制(在网络开始工作之前就将所有因素考虑到,是静态控制)和闭环控制(网络运行起来时候自动调制拥塞控制,是动态控制)。
路由器功能:转发与路由选择。
转发:达到路由器输入链路之一的数据报如何转发到该路由器的输出链路之一,即在路由器内部寻找端口输出过程。时间较短,通常用硬件解决。
路由选择:控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。即路由选择与转发相比是一个更加宏观概念。指当有很多路由器时候如何选择一条最合适的路由。时间较长,常常采用软件解决。
这句上面概念可以引申出数据平面与控制平面概念:
数据平面
数据平面对于数据处理过程中各种具体处理转发过程。即一个分组如何从一个端口转发出去到另外一个端口之中,这是数据平面最主要的功能。对应的是转发过程。
控制平面
控制平面用于控制和管理网络协议的运行,比如OSPF协议、RIP协议、BGP协议。对应的是路由选择一些功能。
数据平面执行的主要功能是根据转发表进行转发,这是路由器的本地动作。转发表基于路由表生成。
可以看到转发表由两部分构成,首部和输出。首部指的是分组当中首部的
有两种实现方法:传统方法或者叫每路由器法,及SDN方法。
传统方法
路由选择算法运行在每台路由器中,并且在每台路由器中都包含转发和路由选择两种功能。因此传统方法是路由转发
具体方法:在一台路由器中的路由选择算法与其他路由器中的路由选择算法通信(通过交换路由选择报文),计算出路由表和转发表。另外由路由选择处理器执行控制平面功能。在传统的路由器中,它执行路由选择协议,维护路由选择表于关联链路状态信息,并为该路由器计算转发表。
SDN方法
转发过程与传统方法一样。但控制平面从路由器物理上分离。路由器仅实现转发,远程控制器计算和分发转发表以供每台路由器所使用。
远程控制器可能在具有高可靠性的远程数据中心中,并可能由ISP或某些第三方管理。
具体方法:路由器通过交换包含转发表和其他路由选择信息的报文与远程控制器通信。因为计算转发并与路由器交互的控制器是用软件实现的,所以网络是"软件定义的"。另外在SDN路由器中,路由选择处理器负责与远程控制器通信,目的是接收远程控制器计算的转发表项。
远程控制器通过软件(可编程)计算出转发表,以及和路由器进行交互。
SDN控制平面层次:
可以看到主要有两个组件:
另外上图的北向API和南向API指的是接口,北向是向上提供服务,南向是向下提供服务。
可以将上图再展开,即在SDN控制器中又细分为三个层次:
例1:假定你要在SDN控制平面中实现一个新型路由选择协议)你将在哪个层次中实现该协议?
网络范围状态管理层。因为在这一层能获得有关网络的主机,链路,交换机和其他SDN控制设备的最新状态信息,可以根据这些信息的基础上实现新型路由选择协议,并通知给控制器落地执行。
例2:谁是从控制器跨越南向接口发送的这些报文的接收者?谁是跨越北向接口从控制器发送的这些报文的接收者?
受控网络设备(路由器)
网络控制应用程序
网络层两大平面总结:
路由器本身会有一个路由表
只要通过这个表就可以知道这个分组经过这个路由器之后接下来往哪走。其中每一行表项通过路由算法得到。
加入这个路由器连接着很多路由器,那它的下一跳有很多种方向,可以通过路由算法决定下一跳方向。即路由算法会选择一个最佳路由,然后将这个最佳路由添加到表项中。这里的"最佳"是相对于某一种特定要求下得出的较为合理的选择情况。
路由算法分为静态路由算法和动态路由算法。
静态路由算法
非自适应路由算法。由管理员手工配置路由信息(手动配置路由下一跳应该发送到哪个路由上)。
优点:简便、可靠,在负荷稳定、拓扑变化不大的网络中运行效果很好,广泛用于高度安全性的军事网络和较小的商业网络。
缺点:路由更新慢,不适用大型网络。如果有一些主机撤出拓扑网络,拓扑结构会发生变化,而这个变化需要由人工更新。
动态路由算法
自适应路由算法。路由器间彼此交换信息,按照路由算法优化出路由表项。
优点:路由更新快,适用大型网络,及时响应链路费用或网络拓扑变化。
缺点:算法复杂,增加网络负担。
这种算法是实际生活中经常用到的。
对于上面动态路由算法还可以划分为全局性和分散性。
全局性
代表性算法是链路状态路由算法。这种算法典型应用是OSPF。
之所以叫全局性是因为所有路由器掌握完整的网络拓扑和链路费用信息。
分散性
代表新的是距离向量路由算法。典型应用是RIP。
分散性是指路由器只掌握物理相连的邻居及链路费用。
分层次路由协议:主要采用这种分层次的路由协议主要原因有两个:
结合上面两个原因就产生了分层次的路由选择协议。具体来说就是将因特网划分为多个小的团体。这个小的团体可以称之为自治系统AS。自治系统内使用的协议外部是完全不知道的,这样就可以尽量减少每个路由器表项个数,同时还可以使一个自治系统内的这些路由器使用的协议对于外界来说是透明的。
自治系统AS:在单一的技术管理下的一组路由器,而这些路由器使用一种AS内部的路由选择协议和共同的度量以确定分组在该AS内的路由,同时还使用一种AS之间的路由协议以确定在AS之间的路由。一个AS内的所有网络都属于一个行政单位来管辖,一个自治系统的所有路由器在本自治系统内都必须连通。
所以就把路由协议分为:内部网关协议IGP和外部网关协议EGP。这里的网关就是路由器。
IGP
是一个AS内使用的,常用的协议有RIP、OSPF协议。
EGO
是AS之间使用的,常用的协议有BGP协议。
总结:
如上图两个自治系统可以想象成一个单位。每个单位内使用的路由选择协议就叫做内部网关协议。对于外部路由器
内部网关协议IGP中常用两个协议是RIP和OSPF。两个区别是使用的路由选择算法不一样。RIP使用的是距离向量,OSPF使用的是链路状态。并且RIP适用于比较小的网络,OSPF适用于比较大的网络。
RIP协议是一种分布式的基于距离向量的路由选择协议,是因特网的协议标准,最大优点是简单。RIP协议要求网络中每一个路由器都维护从它自己到其他每一个目的网络的唯一最佳距离记录(即一组距离)。即路由表中的每个表项要记录这个路由器到其他网络的距离,且是最佳距离(经过路由器跳数最短)。
上面距离定义:通常为"跳数",即从源端口到目的端口所经过的路由器个数,经过一个路由器跳数
上图有四个网络
上图是R2路由表表项,这个路由表建立,是通过上图每个路由器之间交换信息才能逐渐完善填满这个路由表。
而RIP协议的每一个路由器仅和相邻路由器交换信息。而且路由器交换的信息是自己的路由表,也就是当前路由器所知道的全部信息。这些信息每
之后由于每
这里最短距离或者路由表怎么更新等问题是通过距离向量算法解决:
其实每个路由器在交换信息的时候交换的是RIP报文。那么寻找最短距离实现步骤如下:
修改相邻路由器发来的RIP报文中所有表项
对地址为
Net3,2,R2
,即Net3,3,X
的报文。
对修改后的RIP报文中的每一个项目,进行以下步骤:
R1路由表中若没有Net3,则把该项目填入R1路由表。
R1路由表中若有Net3,则查看下一跳路由器地址:
若下一跳是
若下一跳不是
若
之后每隔
例1:已知路由器R6的路由表,现收到相邻路由器R4发来的路由更新信息,试更新路由器R6的路由表。
R6路由表:
R4发来的路由更新信息:
将R4发来的路由更新信息:
对于Net1由于原本R6中没有到该网络记录,所以直接添加。Net2下一条是R4,而原本R6中已经有了Net2并且下一跳也是R4,所以直接将最新的替换,即R6到Net2距离变为5。最后的Net3下一跳R4距离是2,明显比原本R6中到Net3下一条是R5距离是4的更近,所以替换。最后R6表更新如下:
例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到达所有结点的最短路径是多少
上图B向量表示的是B到A距离是
,B到B距离是 ,B到C的距离是 以此类推 含义一致。主要是看向量 对应的位置,刚好是按照 的顺序。 由于C到B、D和E的延迟为
所以三个对应向量分别 : 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到
到A距离从 中挑选最小的 。C到 到B的距离从 中挑选最小的 。之后依次类推可以得到C到所有结点向量是(11,6,0,3,5,8)
介绍RIP报文格式:
RIP报文特点是首部
RIP报文特点:当网络出现故障时,要经过比较长的时间(例如数分钟)才能将此信息传送到所有的路由器,"慢收敛"。
如上图第一个1
表示从本路由器到网1,第二个1
表示这个距离是1,第三个-
表示直接交付。同理R2的RIP报文格式也是一致。
但如果网1发生故障,R1路由表会更新为1,16,-
。但是很有可能这样一个更新好的报文要经过1,2,R1
发送给R1。此时R1收到R2路由表后会更新为1,3,R2
。之后R1将这个消息发送给R2,R2又会更新消息1,4,R1
。之后将这个消息再发送给R1,R1修改为1,5,R2
,接着再发送给R2。循环往复直到R1和R2到网1距离都变为
RIP协议与距离向量算法总结:
开放最短路径优先OSPF协议:"开放"标明OSPF协议不是受某一家厂商控制,而是公开发表的。"最短路径优先"是因为使用了Djkstra提出的最短路径算法SPF。
OSPF最主要的特征就是使用分布式的链路状态协议。这个链路状态协议(算法)会在之后介绍。
OSPF特点:
使用洪泛法向自治系统内所有路由器发送信息,即路由器通过输出端口向所有相邻的路由器发送信息,而每一个相邻路由器又再次将此信息发往其所有的相邻路由器。
其实就是之前介绍的广播形式。通过广播形式最终整个区域内所有路由器都得到了这个信息的一个副本。
发送的信息就是与本路由器相邻的所有路由器的链路状态(本路由器和哪些路由器相邻,以及该链路的度量
只有当链路状态发生变化时,路由器才向所有路由器洪泛发送此信息。
经过上面过程到最后,所有路由器都能建立一个链路状态数据库,即全网拓扑图。也就说每一个路由器都知道到自己网络内的所有路由器一个经历多少度量。
链路状态路由算法:
每个路由器发现它的邻居结点(这个过程是通过HELLO问候分组实现的),并了解邻居节点的网络地址。
这个过程是任何两个相邻的路由器之间都会发生的过程,任何两个相邻路由器每隔
设置到它的每个邻居的成本度量metric
。
构造一个DD数据库描述分组(其实就是全网的拓扑结构图),向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
如果DD分组中的摘要自己都有,则邻站不做处理。如果有没有的或者是更新的,则发送LSR链路状态请求分组请求自己没有的分组和比自己新的信息。
收到邻站的LSR分组后,发送LSU链路状态更新分组进行更新。
更新完毕后,邻站返回一个LSAck链路状态确认分组进行确认。
综上就介绍OSPF协议中的五个重要类型的分组:HELLO问候分组、DD数据块描述分组、LSR链路状态请求分组、LSU链路状态更新确认分组、LSAck链路状态确认分组。
如果一个路由器的链路状态发生变化:
经过上面过程到最后,所有路由器都能建立一个链路状态数据库,即全网拓扑图。之后使用Djkstra算法根据自己的链路状态数据库构造到其他节点间的最短路径。
为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。每一个区域都有一个
可以看到自治系统AS划分区域后成一个主干区域(0.0.0.0)和其他区域。主干区域作用就是来连接其他区域。同时主干区域中的路由器称为主干路由器包括
采用这种分层次划分区域方法,虽然使得交换信息种类增多,同时也使OSPF协议更加复杂,但可以使得每个区域内部交换路由信息通信量大大减小,因而OSPF协议就能够适用于规模较大的自治系统。
OSPF分组:
构造是OSPF分组首部
OSPF其他特点:
每隔
由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF协议要比距离向量协议RIP好得多。
OSPF不存在坏消息传的慢的问题,它的收敛速度很快。
OSPF会将收来的更新都放到自己的链路状态数据库中,然后根据整个链路状态数据库通过使用Djkstra算法来计算出一个最短路径。所以它的收敛速度快。
外部网关协议EGP,常用的协议有BGP协议。
BGP当中是与其他AS的邻站BGP发言人交换信息。
结合上图,有
BGP协议交换的网络可达性的信息,即要到达某个网络所要经过的一系列AS。并且发生变化时才会更新有变化的部分。
BGP协议交换信息的过程:
BGP所交换的网络可达性的信息就是要到达某个网络所要经过的一系列AS。当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各AS的较好路由。这里选择较好路由是因为因特网范围很大,使得自治系统之间路由选择比较困难,所以要找到一条最佳路由相对来说很困难。因此只需要选择一个尽可能好的路由即可。
上图就是BGP发言人所构造出的自治系统连通图,是一个树形结构,只有是树形结构才能保证不会兜圈子。
所以这里的交换信息指的是交换路径的向量,也就是交换一组路径的信息。比如说到子网
当然作为主干网也可以交换信息,因为只要是相邻的邻站都是可以交换自己的完整路由表的。所以主干网还可发出通知:"要到达网络N5、N6 和N7可沿路径(AS1, AS3)"。
BGP协议报文格式:
如上图,会将BGP报文放入一个TCP报文中作为TCP报文的数据段。然后再放入IP当中进行发送。因此可以看出这个BGP是应用层协议,借助TCP传送。
即一个BGP发言人与其他自治系统中的BGP发言人要交换路由信息,就要先建立TCP 连接,即通过TCP传送, 然后在此连接上交换BGP报文以建立BGP会话(session),利用BGP会话交换路由信息。这里使用TCP不用UDP原因是,TCP能提供更加可靠的服务,同样也可以简化路由选择协议。
BGP协议特点:
BGP-4是现在最常用的BGP版本,这个版本有四种报文:
OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,并认证发送方。
上面讲过BGP报文交换需要建立在TCP连接的基础上,所以OPEN报文就是在实现一个连接的建立。同时还有一个功能就是可以认出发送方,即证实发送方的身份进行身份验证。
UPDATE(更新)报文:通告新路径或撤销原路径。
是最长使用的一种报文。只要有路径更新、撤销原来的路径都需要使用这个报文。
KEEPALIVE(保活)报文:在无UPDATE时,周期性证实邻站的连通性。也作为OPEN的确认。
NOTIFICATION(通知)报文:报告先前报文的差错。也被用于关闭TCP连接。
总结三种协议:
RIP是一种分布式的基于距离向量的内部网关路由选择协议,通过广播UDP报文来交换路由信息。
OSPF是一个内部网关协议,要交换的信息量较大,应使报文的长度尽量短,所以不使用传输层协议(如UDP或TCP),而是直接采用IP。
BGP是一个外部网关协议,在不同的自治系统之间交换路由信息,由于网络环境复杂,需要保证可靠传输,所以采用TCP。
TCP
协议栈自顶向下分别是应用层、传输层、网络层、链路层和物理层。有关于网络层的协议主要有ARP、IP、ICMP、IGMP四个协议。如果ARP协议在最下面自然就要为IP协议服务。IP协议也要为ICMP、IGMP两个协议进行服务。
一个IP可以分为首部
在网络层IP数据报和分组不做区分。首部具体字段如下:
数据部分这里不做讲解,这一部分会在传输层讲到。
可以看到首部分为固定部分和可变部分。固定部分长度是固定的,有
版本字段
有
首部长度
有
注意由于固定部分长度固定为
较为常用的首部长度就是
区分服务
指期望获得哪种类型的服务。如规定优先级。这个字段使用情况很少。
总长度
首部长度
标识、标志、片偏移
之后在IP数据报分片中会详细讲到
生存时间(TTL)
表示的是IP分组的保质期,每经过一个路由器,这个生存时间都会
协议
要和版本字段区分开。占
上面较为重要两个协议是TCP和UDP,这两个协议要牢记字段值。
首部检验和
所占的位数是
源地址和目的地址
长度都是
可选字段
范围是
填充字段
全
先来看最大传输单元(MTU)概念:在链路层上每一个数据帧都有一个可封装的上限,这个上限就叫做最大传输单元MTU。
以太网的MTU是
如上图,数据帧的中间部分即IP分组,这个IP分组MTU不能超过
分片要结合上面的标识、标志、片偏移来分析。
标识
同一数据报的分片使用同一标识。即一个长度过长IP分组分成片,其分片的标识一致。
标志
标志字段有
DF=1
,禁止分片。当DF=0
,允许分片。MF=1
说明后面还有分片。当MF=0
,代表当前分片就是最后一个分片,或者说数据报长度不长没有分片。可以看到只有当DF=0
时,MF
才有意义。
片偏移
指出较长分组分片后,谋片在原分组中的相对位置。以
假如一个分片的片偏移是
同时也可以得知,除了最后一个分片,每个分片长度一定是
例子:假设数据报长度不超过
现在具体分析一下每个数据片的片偏移量是多少。
第一个数据片片偏移量是
第二个分片的数据部分是
第三个分片从
最后将三个分片的片偏移值放入分片的首部即可。
IP数据报单位总结:总长度单位是
以太网中,一台主机要给另一台主机通信,就要直到接收方主机地址是多少。具体来说就是需要直到这个主机在哪个网络、在这个网络下对应的哪台主机。这个寻找主机过程也就是确认IP地址过程。
IP地址其实就是在因特网中给每一台主机接口以及路由器的接口赋予一个全球唯一的标识符。因此这个IP地址就可以很方便寻址,再进行接下来的通信、资源共享等。
IP编址的历史阶段:分类的IP地址(其实就是将一个很大的IP空间进行划分)
IP地址:全世界唯一的
IP地址标识:网络号
显示中网络例子如下:
上图有
如上图所示,外围最左边的是LAN1,其网络号是
上图中间的是三台路由器,每个路由器都有三个端口。所以说路由器总有两个或两个以上的端口。可以看到每个路由器接口处都对应一个唯一的网络号的IP地址。
所以说路由器可以划分广播域,其实就是路由器不同接口可以连接不同网络的。上图中绿色的区域也是一种特殊的网络,称为无编号网络。称为网络原因是这里有IP地址。
将一个很大的地址空间分为几类,这样就可以合理划分IP地址资源。
如上图可以看到总共是将网络分为五类。分发主要是靠前面的第一位(A类),第二位(B类),第三位(C类),第四位(D,E类)。
第一种A类地址网络号是
最后的D、E两类前四位是
A类IP:0.0.0.0
0
B类IP:128.0.0.0
128
C类IP:192.0.0.0
192
D类IP:224.0.0.0
224.0.0.0
E类IP:240.0.0.0
255.255.255.255用于广播地址。
上面子网掩码会在之后讲到,子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
之所以要将网络分类,是因为不同类型的网络连接的主机数差别很大,分类后可以更好满足用户需求。
要注意的是分类后所得到的所有IP地址并不是都可以使用的。如下一些特殊IP地址不能使用:
如上图所示一系列地址是不能用来作为主机或者路由器具体接口IP的。
另外还有一类地址是私有IP地址,这些地址特点就是如果将其中地址放到互联网上,路由器是无法识别这些IP的,只适用于内部网络。
对于这些内部地址如何去跟外部通信,就是之后要讲的NAT技术。上图网段个数相当于能分配的网络号个数。
再来看看三类网络使用范围:
A类网络号使用位数是
另外可以看到主机号位数是
B类网络号可使用位数是
最后网络最大主机数还是要减去全
C类网络号可使用是
最后网络最大主机数还是要减去全
上面介绍的私有IP地址,只能在本地专用网中使用。如果将其中地址放到互联网上,路由器是无法识别这些IP的。
即路由器对目的地址是私有IP地址的数据报一律不进行转发。但仍然可以和互联网上的主机进行通信,需要用到网络地址转换NAT。
网络地址转换NAT ( Network Address Translation):在专用网连接到因特网的路由器上安装NAT软件,安装了NAT软件的路由器叫NAT路由器,它至少有一个有效的外部全球IP地址。
其实只需要在专用网和因特网之间的路由器上安装NAT软件,有了这个软件路由器就称为NAT路由器。它有多个有效的外部全球IP地址。所有使用本地地址的主机在和外界通信的时候,都需要经过NAT路由转换就可以实现和外部主机通信。
如上图,假如专用网中的一台主机
本质是需要通过NAT路由器才能将消息发送给因特网上的主机
网络地址转换实现关键是NAT路由器有一个转换表。这个转换表由WAN端(广域网)和LAN端(局域网)构成:
可以看到每个十进制IP地址后面还有一个端口号,这个端口号可以唯一标识主机当中的某一个具体进程,在传输层会具体讲到。
之前讲过可以将一个很大的地址空间分为几类,这样就可以合理划分IP地址资源。
但是这种分类有缺点:
IP地址空间的利用率有时很低。
假如一个公司申请一个
两级IP地址不够灵活。
比如一个公司需要在一个新的地点,马上开通一个新的网络,但是需要向网络服务提供商(ISP)提出申请一个IP地址。所以不够灵活。
解决上述两个问题就需要用到子网划分。之前学过的IP地址结构是网络号
上面网络号
如上图,是一个B类IP地址,这个路由器连接的网络地址是
子网掩码由一系列连续的
如果一个外部IP分组进入到本单位某一个子网某个主机内,此时就需要路由器实现识别的功能,需要从收到的IP分组中提取出目的IP地址,进而根据这个目的地址判断是应该发给本单位的哪个子网,然后再发送给那个子网,因此就会对这个分组再划分一个三级IP地址形式:
可以看到只有主机号是
例1:已知IP地址是
将
与 进行与运算,其实只用求 与 与运算即可。结果为: 。
快速计算方法需要记住以下常用的二进制转换表:
如果子网掩码是
例2:某主机的IP地址为
由于是广播分组,所以主机位全是
,且子网掩码前两位是 ,故目的主机是 ,即只用求出中间的子网号即可, 对应的二进制是 ,所以子网号有 位,子网掩码与IP地址 的二进制 的前六位与运算,结果是 。由于子网掩码只有六位,剩下十位全是主机号,且是广播分组故全 ,即 ,故目的地址为 。
使用子网时分组如何转发:
对于每个路由器都有一个转发表(路由表),路由表中有目的网络地址、目的网络子网掩码、下一跳地址。转发过程如下:
路由的分组转发总结:
如果一个分组在生存时间
是现在常用地址划分方式。CIDR就是在三级地址子网划分思想下将整个网络号和子网号合并在一起,称之为网络前缀。再次回到二级IP地址形式。
看似回到二级地址形式,但是和之前的网路号
CIDR特点:
CIDR表示法:IP地址后加上/
,然后写上网络前缀(可以任意长度)的位数。如:
CIDR把网络前缀都相同的连续的IP地址组成一个"CIDR地址块"。假如
上面最小地址表示的是本网络,另一个表示的是广播地址,如果分配主机的话是不会把这两个主机号分配给主机的。所以这个网络的CIDR地址块是
同时CIDR中仍然有子网掩码概念,同样
CIDR有两个重要应用:构成超网和最长前缀匹配。
将多个子网聚合成一个较大的子网,叫做构成超网,或路由聚合。方法是将网络前缀缩短(所有网络地址取交集)。
如上图有两个路由器连接在一起,R2路由器有两个端口连接着网络1和网络2。所以R1这个路由器就要维护一个路由表,路由表的主要信息包括目的网络和最佳接口(数据传到网络要走哪个接口)。可以看到网络1和网络2到R1都要走接口
这样的两个信息就在网络中占了两行,如果连接的网络很多,则路由表很难维护。因此CIDR会提供路由聚合方式,具体方法就是将网路前缀缩短,以达到聚合目的。
这个网络
注意:划分子网是从少到多的过程。而构成超网是由多边少的过程,将多个聚合成一个新的地址。
例子:某路由表中有转发接口相同的
可以看到前两字节都是一样,且网络地址主机号全部为
。故第三字节全部转换为二进制:
可以看到前三位一样,后面不一样,所以网络前缀就是
。且剩下主机号都是 所以是 。故网络地址是
使用CIDR时,查找路由表可能得到几个匹配结果(跟网络掩码按位相与),应选择具有最长网络前缀的路由。前缀越长,地址块越小,路由越具体。
例子:路由器
思路:将目的地址和目的网络的子网掩码进行与运算,如果结果是目的网络地址就选择,如果匹配到多个目的网络地址就选择前缀最长
将目的地址
而最后的
发送数据时候需要经过对数据封装和解封装的过程,但是具体封装什么内容是根据不同层次协议规定的。
可以看到上面两个路由器划分了两个网络。假如上面主机
首先对于每一个主机及每一个路由器都会有一个
但是如果ARP高速缓存中如果没有
首先广播ARP分组请求,即
之后
上面例子是目的主机在一个局域网内,如果
这里还是要使用ARP协议,不过这里的ARP就有差别,首先还是要先看一下源主机的ARP高速缓存中有没有主机
如果不是在一个网段内,会将默认网关的MAC地址放入分组内进行封装,这个默认网关其实就是对外路由器网络接口,即上图的MAC6。得到这个MAC6还是通过广播ARP请求分组,其主要部分还是:源地址IP地址
之后分组发送到路由器之后,路由器需要对分组进行解封装,解封装后再进行封装。这里的分组源地址的IP和MAC都变为路由器地址。之后发送给下一个路由器,由于这里是点对点传输,所以这里的目的主机的AMC应该为全
到了下一个路由器之后进行解封装,再使用ARP协议进行封装,这里的源主机IP和MAC地址就是当前路由器地址,发送的广播ARP请求分组会返回一个响应分组,是目的主机的IP和MAC地址。将地址封装进分组后就可以发送到目的主机。
所以总结一下ARP协议:
由于在实际网络的链路上传送数据帧时,最终必须使用MAC地址。要确定这个MAC地址需要用到ARP协议,完成主机或路由器IP地址到MAC地址的映射。即解决下一跳走哪的问题。
ARP协议使用过程:检查ARP高速缓存,有对应表项则写入MAC帧,没有则用目的MAC地址为
ARP协议4种典型情况:
ARP协议是自动进行的。
例子:主机发送IP数据报给主机B,经过了
故使用了
主机在通信的时候一定要有一个IP地址,主机获得IP地址的方法有两种:静态配置和动态配置。
静态配置需要配置IP地址、子网掩码、默认网关。这里的默认网关就是之前的路由器接口的IP地址。只有通过这个IP地址局域网内部的主机才能跟外界通信。
动态配置如下:
可以看到有两台DHCP服务器,还有一台交换机。
上面的动态主机配置协议DHCP是应用层协议,使用客户
之所将应用层协议放在网络层介绍,是因为DHCP为网络层通信提供了一个基础,有了DHCP协议后才可以有IP地址。DHCP提供即插即用联网的机制,主机可以从服务器动态获取IP地址、子网掩码、默认网关、DNS服务器名称与IP地址,允许地址重用,支持移动用户加入网络,支持在用地址续租。即设备进入了DHCP服务器所管辖的一个局域网内,就可以动态分配一个地址给设备。
这里允许地址重用,DHCP服务器都有一个IP地址池,当一个用户离开DHCP所管辖的局域网时,DHCP会将这个这个IP回收留给下一个用户,所以达到地址重用目的。
DHCP协议工作流程:
可以看到这个过程是主机与服务器进行来回交互,这种方式称为客户
回顾一下TCP
可以看到ICMP协议和IGMP协议是位于网络层和传输层之间的协议。所以这两个协议起到一个桥梁作用。为了更有效地转发IP数据报和提高交付成功的机会。
ICMP协议支持主机或路由器可以实现差错(或异常)报告网络探询。因为在实际传输中总会有有一些分组会出错,出错的分组在网络层会直接丢弃,并发送一个差错报文给源主机。也就是说ICMP功能就是要发送特定的ICMP报文。报文结构如下:
ICMP报文装在IP数据报的数据部分。ICMP报文具体字段如下:
ICMP有两种类型:ICMP差错报文、ICMP询问报文。
差错报文有五种:
终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
出现无法交付问题时使用。
源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
出现因为拥塞而丢数据时使用,现在基本上不用,
时间超过:当路由器收到生存时间TTL=0
的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
主要在TTL=0
,或者数据报片因为传输超时出现残缺情况。
参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
首部字段出问题时使用。
改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
一个网络上会有很多路由器,发送数据时没有找到最合适的路由器,这样原来的路由器就会将数据丢弃,并返回一个重定向报文高速主机这条路径不能将数据传输给目的主机。
ICMP差错报告报文中具体的数据字段:
将受到的需要进行差错报告的IP数据报的首部,以及前
不应发送ICMP差错报文的情况:
对ICMP差错报告报文不再发送ICMP差错报告报文。
即不会对ICMP的差错,再进行差错报告。
对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。
对具有组播地址的数据报都不发送ICMP差错报告报文。
组播是一点到多点,而广播是一点到所有结点。组播具有选择性。
对具有特殊地址(如
主要分为四种:
回送请求和回答报文
主机或路由器向特定目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。
主要应用是Ping测试目的站是否可达以及了解其相关状态。
时间戳请求和回答报文
请某个主机或路由器回答当前的日期和时间。用来进行时钟同步和测量时间。
掩码地址请求和回答报文、路由器询问和通告报文
当前已经不再使用。
ICMP具体应用有两方面:
Ping的应用
测试两个主机之间的连通性,使用了ICMP回送请求和回答报文。
Traceroute
跟踪一个分组从源点到终点的路径,使用了ICMP时间超过差错报告报文。
工作原理是假如现在有两台主机进行通信,中间有多台路由器,首先源主机会发送一连串的数据报,这些数据报生存时间TTL不一样。对于第一个数据报设置为TTL=1
。所以到达第一个路由器时TTL-1=0
会丢弃。丢弃后再返回给主机一个ICMP时间超时的差错报文。同理第二个数据报TTL=2
,这样就可以测算出从主机原点到目的主机之间的路径距离。
由于IPv4地址池消耗快,所以就学习了CIDR和NAT延缓IPv4地址的消耗,但仍然治标不治本,所以就提出IPv6这种新的地址池。
IPv6从地址位数和地址长度上扩充地址池,从根本上解决IPv4地址池不够的问题。除了IPv6解决办法同时还可以改进IPv4首部格式,改进首部
QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。如果支持QoS就可以满足实时的以及多媒体通信的需要,所以基于这些动机就产生了IPv6。
IPv6数据报格式:
可以看到数据报格式包括两个部分:基本首部
数据报中的具体字段如下:
上图中有效载荷的扩展首部是可有可无的根据数据报是否需要提供其他服务,如果要就填充到扩展首部。其他字段解释:
版本
指明了协议的版本,IPv6协议这个字段总是
优先级
区分数据报的类别和优先级。是否对数据报进行优先处理就要看这个字段。
流标签
"流"是互联网络上从特定源点到特定终点的一系列数据报。所有属于同一个流的数据报都具有同样的流标签。
A主机要给B主机发送一系列数据报,这一系列数据报都是一组的数据报,所以就可以称为是一个流的。这一个流中所有的数据报的流标签都是相同的值。
有效载荷长度
指的是有效载荷有多少位。即扩展首部
下一个首部
标识下一个扩展首部或上层协议首部。
假如当前有一个数据报,这个数据报除了基本首部,还有三个扩展首部(扩展首部
跳数限制
相当于IPv4中的TTL(生存时间)。达到
源地址和目的地址
位数都是
IPv4和IPv6区别:
IPv6将地址从
IPv6将IPv4的校验和字段彻底移除,以减少每跳的处理时间。
IPv6将IPv4的可选字段移出首部,变成了扩展首部,成为灵活的首部格式,路由器通常不对扩展首部进行检查,大大提高了路由器的处理效率。
IPv6支持即插即用(即自动配置),不需要DHCP协议。
IPv6首部长度必须是8B的整数倍,IPv4首部是4B的整数倍。
IPv6只能在主机处分片,IPv4可以在路由器和主机处分片。
就是说即使IPv6的分组很长,在路由器也是无法分片的,只能在主机处分片。
ICMPv6:附加报文类型"分组过大"
由于IPv6只能在主机分片,如果链路层最大传输单元MTU很小,但是IPv6数据报很大,此时也不能分片,路由器只能丢弃并返回一个差错报告报文。这里的差错报文使用的是ICMPv6协议。
IPv6支持资源的预分配, 支持实时视像等要求,保证一定的带宽和时延的应用。
IPv6取消了协议字段,改成下一个首部字段。
IPv6取消了总长度字段,改用有效载荷长度字段。
IPv6取消了服务类型字段。
即IPv4中的区分服务字段。
IPv6地址表示形式:
一般用冒号十六进制记法表示:
每四个十六进制为一组总共八组。
还有一种压缩形式:如果碰到前面有连续的
同时也可以采用零压缩方式:一连串连续的
地址类型有三种:
单播
一对一通信。可做源地址,也可以做目的地址。
多播
一对多通信。只能作为目的地址,不能作为源地址。也就是一台主机要和这个多播组内的所有主机进行通信,就将多播地址放入IPv6数据报的目的地址中就可以发给这个多播组中的所有主机。IPv6并没有使用IPv4的广播地址,因为多播地址可以表示广播地址。在IPv4中的广播是发给局域网中的所有结点,对应IPv6多播之所以可以取代广播是因为广播可以想象成一组多播组中的所有主机,然后给这些主机全部发送数据报。
任播
一对多中的一个通信。实质还是一对一通信,但只可以作为目的地址。具体表现就是假如一台主机IP数据报中所封装的目的地址是一个任播地址,它就会给任播组内的一台主机发送数据报,通常是离的最近的一台。
如果一台主机使用的是IPv6,另一台主机使用的是IPv4,这两台主机通信过度策略要使用:双栈协议和隧道技术。
双栈协议
双协议栈技术就是指在一台设备上同时启用IPv4协议栈和IPv6协议栈。这样的话,这台设备既能和IPv4网络通信,又能和IPv6网络通信。如果这台设备是一个路由器,那么这台路由器的不同接口上,分别配置了IPv4地址和IPv6地址,并很可能分别连接了IPv4网络和IPv6网络。如果这台设备是一个计算机,那么它将同时拥有IPv4地址和IPv6地址,并具备同时处理这两个协议地址的功能。
隧道技术
通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。
如上图两台主机之间有四台路由器,中间两个路由器是IPv4协议两边式IPv6协议。假如此时发送的是IPv6的数据报,在IPv4路由器上需要进行封装,将IPv6数据报作为IPv4的数据部分。之后进入IPv6又会将IPv4的部分去掉,以IPv6数据报的形式继续往下发送交付给主机。
其中封装部分就是隧道技术。即将IPv6数据报封装到IPv4中。
IPv6总结:
IP数据报三种传输方式:单播、广播、组播(多播)。
单播
用于发送数据包到单个目的地,且每发送一份单播报文都使用一个单播IP地址作为目的地址。是一种点对点传输方式。
这里的IP地址其实就是之前的
如上图有
广播
广播是指发送数据包到同一广播域或子网内的所有设备的一种数据传输方式,是一种点对多点传输方式。
这里的发送端还是一个单播的IP地址,不过目的地址是一个全
单播和广播传输效率相对较低,因此就产生了比较好的传输方式:组播(多播)。
组播
当网络中的某些用户需要特定数据时,组播数据发送者仅发送一次数据,借助组播路由协议为组播数据包建立组播分发树,被传递的数据到达距离用户端尽可能近的节点后才开始复制和分发,是一种点对多点传输方式。
可以看到广播和主播类似,不过广播会不管用户需不需要直接发送。而组播是只给一个组播组内的主机,即给有相同需求的主机。并且也不会在刚开始的发送端就复制,只有在下一个路由器就到局域网时才会在下一个路由器这里对数据报进行复制。
如上图还是那个视频数据报传输的例子,可以看到发送方视频服务器不用事先复制很多份数据报,只要到一个路由器,有多个路径接收数据就会复制多份,但是复制之后实际上在每个链路上都只有一个数据报。下面的局域网当中的主机只要是属于同一个组播组的就可以收到这份数据报,也就是到了最后一步一个数据报才会变为很多数据报分发给这些主机。
组播提高了数据传送效率。减少了主干网出现拥塞的可能性。组播组中的主机可以是在同一个物理网络,也可以来自不同的物理网络(如果有组播路由器的支持)。组播路由器是指可以运行组播协议的路由器,这一类路由器既可以运行组播协议,也可以运行单播协议。
上面例子中数据报到了
在因特网进行通信的时候每一个主机都需要有一个全球唯一的IP地址,如果某个主机现在想要接受特定的多播组的分组,那么如何使这个多播数据报传送到主机中,显然这个组播数据报的目的地址不能是主机自己的IP地址,因为如果写为主机IP地址,就只会发给这个主机,其他同属于一个组播组中的主机都是收不到这个数据报的。因此就需要一个新的地址,用这个产生的新地址来接收组播数据报,当然其他属于这一个组播组中的主机都可以有这样一个IP组播地址,然后接收到发送给这些主机所在的组播组的数据报。
所以IP组播地址让源设备能够将分组发送给一组设备。 属于多播组的设备将被分配一个组播组IP地址(一群共同需求主机的相同标识)。这个组播地址并不是任何一个主机都直接拥有的,而是在主机实现接收数据报时才会生成这个组播地址。
组播地址范围为
需要注意一下几点:
组播数据报也是"尽最大努力交付",不提供可靠交付,应用于UDP。
UDP协议虽然是不可靠交付协议,但是其优点是速度快。
对组播数据报不产生ICMP差错报文。
并非所有D类地址都可以作为组播地址。
组播方式大致如下:
这个图可以分为两个部分,下面的是硬件组播(只能在本局域网内进行的硬件组播),上面路由器叫做因特网范围内组播(没有进入到局域网范围内进行组播)。硬件组播简单但是重要,因为现在大部分主机都是通过连接局域网然后再连入因特网,所以通过因特网范围内组播后还是要进入局域网内的硬件组播。
硬件组播其实就是在局域网范围内对于一个组播的数据报,应该怎么交付给这些主机,或者说应该将数据报给哪些主机。可以结合之前学习的单播情况,假如当前发过来一个单播数据报,进入局域网之后应该交付给哪些主机,就要看这个主机的MAC地址。同样,在硬件组播这里也是要根据MAC地址来找到可以接收主播数据报的主机。
所以同单播地址一样,组播IP地址也需要相应的组播MAC地址在本地网络中实际传送帧。组播MAC地址以十六进制值
可以结合广播情况,如果当前要发送一个广播数据报,在进入局域网后要看MAC地址,如果此时目标地址MAC是全
所以在广播数据报中,全
TCP
结合上图,由于前面的
所以为了解决这个问题在收到多播数据报的主机,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。这样就可以解决D类IP地址中间五位不一样剩下
上面介绍过IP组播两种类型,一个是在本局域网内进行硬件多播,另一个是在因特网范围内进行多播。而IGMP协议与组播路由选择协议就是在因特网范围内要使用到的协议。
IGMP在一个路由器内部所规定的协议。这个协议目的是让连在一个局域网上的组播路由器知道所连的局域网上面是否还有主机参加
而组播路由选择协议是在路由器之间进行路径选择的问题。如果只有IGMP协议是完成不了组播数据传输这样一个过程的。连接在局域网上的组播路由器必须要和其他路由器进行信息交换才能把这个组播数据报用最小的代价来传送给组播组中的全部成员。此时就需要用到组播路由选择协议。
IGMP协议
又叫网际组管理协议IGMP。IGMP协议让路由器知道本局域网上是否有主机(的进程)参加或退出了某个组播组。
所以对于一个主机如果有多个进程,而这多个进程可能都是组播组成员,那每个进程其实就可以有一个组播的IP地址。
如上图,有四个标明IP地址的主机,这四个主机全都加入组播组,它们的组播IP地址就是
IGMP在协议栈中的位置如下:
可以看到ICMP和IGMP都使用IP数据报传递报文。
IGMP工作两个阶段:
某主机要加入组播组时,该主机向组播组的组播地址发送一个IGMP报文,声明自己要成为该组的成员。本地组播路由器收到IGMP报文后,要利用组播路由选择协议把这组成员关系发给因特网上的其他组播路由器。
本地组播路由器周期性探询本地局域网上的主机,以便知道这些主机是否还是组播组的成员。探寻过程还是发送一个IGMP询问报文。结果有两种:
只要有一个主机对某个组响应,那么组播路由器就认为这个组是活跃的。如果经过几次探询后没有一个主机响应,组播路由器就认为本网络,上的没有此组播组的主机,因此就不再把这组的成员关系发给其他的组播路由器。
这里需要注意,路由器在给一个局域网内的主机发送询问报文时可以发送给组播组中的所有主机,但是返回响应的速度以及所到达路由器时间是不一样的。如果组播组中有一台主机先响应路由器,其他主机就会通过监听知道就不需要再发送响应了。这样就可以减少一些不必要的通信量。
这里所说的成员关系指的是:组播路由器知道的成员关系只是所连接的局域网中有无组播组的成员。但是不会反映这个组成员有多少个。
组播路由选择协议
一个组播组中的成员是动态变化的。组播路由选择就是要找出以源主机为根节点的组播转发树。也就是说要使用这个组播路由选择协议才能顺利地将数据报发送给自己地组播组成员。
可以看到这是一个树形结构。这样可以避免在路由器之间兜圈子。特点是对不同的多播组对应于不同的多播转发树。同一个多播组,对不同的源点也会有不同的多播转发树。
组播路由选择协议常使用的三种算法:
基于链路状态的路由选择
基于距离-向量的路由选择
协议无关的组播(稀疏/密集)
可以建立在任何路由器协议之上。有稀疏和密集两种。采用协议无关这个名词主要是说,虽然在建立转发树地时候是使用单播数据报和远程路由器来联系。但是这并不要求使用相同的单播路由选择协议。稀疏和密集主要指的是一个组播组中的主机距离的远近。如果较为分散就是稀疏型,较为密集就是密集的。
IP组播总结:
移动IP技术是移动结点(计算机
五个相关概念:
移动结点
具有永久IP地址的移动设备。
归属代理(本地代理)
一个移动结点的永久"居所"称为归属网络,在归属网络中代表移动节点执行移动管理功能的实体叫做归属代理。可以理解为一个管家,其管理的就是移动结点在没有发生移动的时候归属网络所提供一些功能叫做归属代理
永久地址(归属地址
移动站点在归属网络中的原始地址。
外部代理(外地代理)
在外部网络中帮助移动节点完成移动管理功能的实体称为外部代理。
具体来说就是移动结点移动到了外地,就会进入到一个外部网络,这个网络中的管家就是外部代理,也可以是这个网络中的一个路由器。主要发挥作用是帮助移动结点进行正常通信。
转交地址(辅地址)
可以是外部代理的地址或动态配置的一个地址。
下面以外部代理地址作为转交地址具体讲解移动IP技术:
主机
当
一种是被动获得
外部代理在外部网络内广播一个SMP的报文。这个报文会包含这个转交地址(外部代理的地址)。之后主机
一种是主动获得
主机
在主机
之后归属代理接收请求,并将移动节点的永久地址和转交地址绑定(以后到达该归属代理的数据报且要发往移动节点的数据报将被封装并以隧道方式发给转交地址),并返回注册响应报文。最后外部代理接收注册响应,并转发给移动节点。
假如数据报要到达归属代理并且要发给主机
如果主机
当主机
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。
上图是路由器结构图,可以分为两个部分:路由选择部分和分组转发部分。
路由选择
路由选择部分核心部件和路由选择处理机。根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
因此路由选择部分就是为构建一个完整的路由表而服务的。
分组转发
分组转发又包含多个输入端口、交换结构、多个输出端口。核心部件是交换结构。
交换结构:根据转发表(路由表得来)对分组进行转发。可以将分组从一个固定端口输出到另一个最佳端口。
这里转发要和路由选择区分开,转发是把一个分组从一个输入端口转发到另一个输出端口。而路由选择就比较宏观,指的是在路由之间选择一个合适的路径把信息从源站发送到目的主机。转发是在内部的,路由选择是外部的。
并不是任何一个分组只要进了这个路由器,就会通过交换结构输出去,要分情况:若收到RIP
输入端口详细信息:
首先会从链路上接收分组,交给物理层处理,这个物理层只是单纯进行比特接收。之后到了链路层就会按照链路层协议来接收传送分组的帧,之后会把帧头和帧尾去掉,然后交付给网络层。网络层处理是先要对这个分组进行判断,如果是路由器之间交换路由信息的分组,就会把这个分组交给路由选择处理机来进行处理和计算。如果是数据分组就会放入交换结构当中再选一个合适的端口进行输出。
假如当前有一堆数据分组到了网络层处理时候就需要排队,排队原因是假如第一个分组正在查询转发表,并且选一个合适的端口转发,这会产生一定的延迟,那么如果第一个分组还没有查完,第二个分组就已经到达之后几个分组也会依次到达,此时就会容易产生时延。所以也可以看出输入端口中的查找和转发功能在路由器的交换功能中是最重要的。
输出端口详细信息:
输出端口先回从交换结构接收到一个分组,然后再把这些分组放到网络层处理分组中排队,可以看到网络层处理分组是一个队列。分组过多超过发送速率情况下,分组就需要在网络层缓存中暂存。这个网络层处理会产生时延。所以若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。因此路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因。
三层设备区别:
三层是物理层、链路层、网络层。这三层三个代表设备是路由器、网桥、集线器。
路由表与路由转发:
路申表根据路由选择算法得出的,主要用途是路由选择,总用软件来实现。
路由表结构是:目的网络IP地址
上面的接口可选。下面的默认路由是只要当前发送的分组在路由表中找不到所对应的表项,就应该发送给默认路由。
转发表由路由表得来,可以用软件实现,也可以用特殊的硬件来实现。转发表必须包含完成转发功能所必需的信息,在转发表的每一行必须包含从要到达的目的网络到输出端口和某些MAC地址信息的映射。
所以路由表和转发表区别是:路由表是由路由选择算法得出的。转发表是由路由表得出的,而且还要结合主机具体信息来确定输出的端口。并且路由表主要是选择下一跳应该走哪个路由器(下一跳IP地址)。
主要研究进程之间的通信问题。
知识总览:
传输层只有主机才有的层次,也就是在端系统两个主机才会有一层传输层。传输层为应用层提供服务,同时也可以使用网络层的服务。
传输层功能:
传输层提供进程和进程之间的逻辑通信。
注意网络层提供的是主机之间的逻辑通信。
复用和分用
复用指的是发送方不同的应用进程都可以使用同一个传输层的协议来传送协议。而分用指的是接收方在传输层在去除报文首部之后能够将这些数据送交给正确的进程。
传输层对收到的报文进行差错检测
网络层的首部校验和只是校验首部,不会校验数据部分。这里传输层会对数据进行检错。
传输层有两种协议:UDP和TCP
UDP和TCP
UDP
无连接的用户数据报协议。
传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
特点:不可靠,无连接,时延小,适用于小文件。
TCP
面向连接的传输控制协议。
传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等。
特点:可靠,面向连接,时延大,适用于大文件。
传输层的寻址与端口:传输层功能之一是分用和复用。
复用:应用层所有的应用进程都可以通过传输层再传输到网络层。
分用:传输层从网络层收到数据后交付指明的应用进程。
在传输层也会有网络层IP地址及链路层MAC地址一样都快有唯一标识一个主机。在传输层唯一可以标识一个进程的是端口。即端口是传输层的SAP(服务访问点),标识主机中的应用进程。这个端口是一个逻辑端口
端口号根据数字大小范围可以分为:服务端使用的端口号和客户端使用端口号。其中服务端口号可以具体分为:
熟知端口号
给TCP
登记端口号
为没有熟知端口号的应用程序使用的。
而客户端使用端口号(范围是:
一些熟知端口号需要牢记:
在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。
套接字结构:套接字Socket=(主机IP地址+端口号)
。
UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。
UDP的主要特点:
UDP是无连接的,减少开销和发送数据之前的时延。
UDP使用最大努力交付,即不保证可靠交付。
网络层是不可靠交付,如果传输层使用UDP协议,也不会保证可靠交付,此时可靠交付就由应用层保证。
UDP是面向报文的,适合一次性传输少量数据的网络应用。
面向报文指的是应用层给UDP多长的报文,UDP就照样发送。
即一次发一个完整报文。因此应用程序就需要选择大小合适的报文。提供报文太长在网络层就会分片,因此会影响网络层传输效率。如果报文太小,报文传送到网络层,IP数据报的数据部分就相比IP首部来说小很多,所以网络层效率也会降低。
UDP无拥塞控制,适合很多实时应用(如:视频通话)。
UDP首部开销小,是
UDP首部由首部字段
数据字段可有可无,如果没有,则UDP首部为
源端口号
是可有可无的。如果发送数据报需要收到对方的回复就需要源端口号。
目的端口号
必须要有的。发送目的主机哪个进程。
UDP长度
指的是整个UDP用户数据报的长度。也就是首部
UDP检验和
检测整个UDP数据报是否有错,错就丢弃
分用时,找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP"端口不可达"差错报告报文。下面详细介绍UDP校验过程:
可以看到,首部数据的首部部分中,有一个伪首部字段。伪首部和下面的IP数据报的首部类似。因为伪首部中包含源IP地址及目的IP地址,以及17
这个字段。这个17
代表的是IP数据报首部的协议字段,这个协议字段就是在说明数据部分使用的是什么字段,这里数据部分使用的是UDP协议,即传输层使用UDP协议。所以这里对应的协议字段值是
伪首部只有在计算检验和时才出现,不向下传送也不向上递交。即发送端和接收端在校验数据和首部有没有发生问题时才会出现伪首部。其他传输过程中这个伪首部自始至终不会出现。伪首部几个字段如下:
0
字段固定字段,固定为
17
字段
协议字段,17
指的是封装UDP报文的IP数据报首部协议字段是17
。
UDP长度
UDP首部
UDP伪首部校验过程:
上图是一个UDP用户数据报,数据部分需要是
填上伪首部
全
将首部第四个字段填上全
全
伪首部
把和求反码填入检验和字段,即将上面UDP首部检验和全
去掉伪首部,发送。
在接收端过程:
TCP协议特点:
TCP是面向连接(虚连接)的传输层协议。
面向连接是指,应用程序在使用TCP协议之前必须要先建立好一个连接。在传送数据完毕后再释放这个连接。
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
所以TCP协议不能用于广播及多播形式。
TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。
可靠有序,不丢不重
TCP可以提供全双工通信
发送端和接收端可以同时发送数据也可以同时接收数据。由于这个特点,TCP协议连接的两端都会设置发送缓存和接收缓存。
发送缓存中存放准备发送的数据和已发送但尚未收到确认的数据。接收缓存中存放按序到达但尚未被接受应用程序读取的数据和不按序到达的数据。
TCP面向字节流
流指的是流入到进程或从进程流出的字节序列。面向字节流的含义是虽然应用进程和TCP交互是一次发送一个数据块,这个数据块大小可以是不一样的。但是TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
如上图发送方文件会按照字节进行编号。在发送的时候会把字节放入TCP缓存中,在发送的时候会不定长取走一部分字节组成TCP报文段,在这个报文段上加上TCP头部形成一个完整报文段之后放到链路上进行传输。所以可以看到TCP是面向字节流的。
TCP报文段首部格式:
可以看到主要分为两个部分:首部
源端口与目的端口
占用
序号
在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
结合上图,报文段首部内的序号字段其实就是第一个字段编号值。如上图
确认号
期望收到对方下一个报文段的第一个数据字节的序号。若确认号为
假如当前接收端已经接收发送端送来的前三个数据。之后接收端会向发送端发送一个确认报文段,这个确认报文段中的首部就会有确认号字段。这个确认号字段应该是期待对方下一个要发送报文段的第一个字节。如上图
数据偏移(首部长度)字段
TCP报文段的数据起始处距离TCP报文段的起始处有多远,以
六个重要的控制位
紧急位URG
URG=1
时,表明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
确认位ACK
ACK=1
时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为
推送位PSH
PSH=1
时, 接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
与上面紧急位区别是紧急位在TCP缓存中新进来的报文段中,URG=1
则这个报文段会直接到TCP缓存头部尽快被发送出去,这是在发送端的优先处理。
而PSH主要是在接收方的紧急处理。假如TCP缓存中收到很多报文段,如果其中有一个报文段的PSH=1
,那么这个报文段会首先交给应用层进程。
复位RST
RST=1
时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。同时RST置为
同步位SYN
SYN=1
时,表明是一个连接请求
主机SYN=1
。之后主机SYN=1
。
终止位FIN
FIN=1
时,表明此报文段发送方数据已发完,要求释放连接。
窗口字段
指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
假如
检验和
检验首部
紧急指针
URG=1
时才有意义,指出本报文段中紧急数据的字节数。
紧急指针指的是紧急数据的末尾在报文段当中的位置。假如紧急指针指向的是
选项
是一个长度可变的字段。可以代表:最大报文段长度MSS、窗口扩大、时间戳、选择确认等
TCP是一种面向连接的协议,是一种可靠的协议,且是全双工通信。TCP连接需要经过三个阶段:连接建立、数据传输、连接释放。
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。虽然角色不同但是都可以接收数据和发送数据。
客户服务模式建立TCP连接建立需要三次握手。
假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:
客户与服务器通信过程如下:
首先客户端发送连接请求报文段,无应用层数据(没有数据部分)。
本阶段请求报文中有两个字段很重要:SYN=1,seq=x
。同步位SYN=1
表示这是一个连接请求。序号位seq
是随机产生的。
服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
该阶段请求报文是SYN=1,ACK=1,seq=y(随机),ack=x+1
。同步位SYN=1
这是一个连接确认请求。当确认位ACK=1
,则确认号ack=x+1
,由于第一步的连接请求没有数据部分,因此这个序号位seq
其实就是标识这个请求报文段是x
,因此服务器端想要收到的字节就应该从x+1
开始,因此确认号字段是ack=x+1
。同样对于确认连接报文段也有随机分配的序号字段seq=y(随机)
。
客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。
具体字段是SYN=0,ACK=1,seq=x+1,ack=y+1
。由于已经建立好连接,所以SYN=0
。期望收到下一个字节,即确认号ack=y+1
。这第三个报文段序号就是seq=x+1
,因为发送端之前发送了序号为x
的数据,所以之后应该为x+1
。
可以看到在服务器端和客户端分别为TCP连接过程分配了缓存和变量。这样会产生SYN洪泛攻击现象。
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包, 而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。解决的办法通常是设置SYN cookie。
TCP的连接释放:参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的"资源"(缓存和变量)将被释放。
TCP连接的释放过程如下:
客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
请求报文字段是FIN=1,seq=u
。
因为此时要请求释放连接,所以在结束连接的时候结束位FIN=1
。seq
指的是报文段的第一个字节的序号,由于报文段通常是没有数据的,所以序号u
可以标识这样一个报文段,u=之前发送的数据的最后一个字节的序号+1
。
服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了。进入半关闭状态。
这个状态下,只是客户停止了发送数据,但是服务器还可以照样发送数据。所以是一个半关闭状态。
确认报文字段是ACK=1,seq=v,ack=u+1
。
确认位ACK=1
。确认位seq
取决于之前发送到哪里,假如服务器上一个发送报文段最后一个字节是v-1
,接下来seq
就是v
。确认号ack=u+1
,即返回上一个报文段的确认,并期待下一个报文段u+1
。
服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。
请求数据报字段是FIN=1,ACK=1,seq=w,ack=u+1
。
因为此时要请求释放连接,所以在结束连接的时候结束位FIN=1
。确认位和确认号同上都是ACK=1,ack=u+1
。序号位由于不确认上一步服务器发送确认报文段后还有没有发送其他数据字段,所以这里设为w
,即seq=w
。
客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。
等待2MSL时间是因为如果客户端发送的确认报文段,没有到达服务区端(丢失),服务器就会重传第三个连接释放的报文段。之后客户端会重传确认报文段,并重新启动2MSL计时器。直到最后关闭。
确认报文段字段是ACK=1,seq=u+1,ack=w+1
之前的网络层是提供最大努力交付的不可靠传输。因此传输层的TCP协议就要担负起可靠传输责任。如果传输层使用UDP协议,那应用层就要实现可靠传输。
这里的可靠是指保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。TCP实现可靠传输主要有四种传输机制:校验、序号、确认、重传。
校验
与UDP校验一样,增加伪首部,通过使用二进制反码求和方法判断有没有发生错误。
TCP协议是面向字节流的,因此TCP传输的时候是按照字节编号传输的(第一个字节编号随机,后面按照序号一次编号)。但是在发送的时候会将一些字节放在一起组成一个报文段,然后再把这个报文段发送出去,这里报文段大小不固定。
所以一个字节占用一个序号。TCP报文段中的序号字段指的是报文段的第一个字节序号。有了这个序号就可以保证数据有序提交给应用层。而基于这个序号机制就产生了确认及重传机制。
确认
接收方收到发送方的报文段之后就会返回一个确认报文段,通常使用的是累计确认方式。当然接收方有数据发送给发送方,也可以将这个确认报文段放到发送数据中捎带着进行传输,这种方式称为捎带确认。这两种方式都可以实现对于发送方已经发送的报文段进行确认的功能。
如上图,接收方收到发送方发送的
假如说当前接收端收到了
重传
确认重传不分家,TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。即超时重传。
这个重传时间的设置较为复杂,如果过短就会导致很多报文段不必要的重传,这样会导致网络负荷增大。如果重传时间设置过长就会使网络空闲时间增大,降低传输效率。
TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)。也就是在发送第一个报文段时,RTTs就是取第一个报文的RTT,第一个报文段RTT是从发送开始直到收到确认为止,这样一段往返时间。第二个报文段同样也有一个RTT,所以就会根据第一个和第二个报文段的RTT计算出一个RTTs,作为现在的重返时间。第三个报文段RTTs就是将前三个报文段RTT通过公式计算出第三个报文段RTTs。
上面重传会导致超时等待时间过久,所以可以用冗余ACK(冗余确认)解决。
冗余ACK (冗余确认):每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
假如发送方已发送
可以看到TCP不采用平等协议,采用GBN协议和SR协议,一次性可以发送多个报文段,接收方可以使用累计确认。
流量控制:让发送方慢点,要让接收方来得及接收。TCP利用滑动窗口机制实现流量控制。
具体过程是:在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
所以发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。发送窗口大小可以动态变化。如果接收方发送的报文字段rwnd=0
,此时发送方会动态将发送窗口调整为rwnd
值设置为接收方可以接收的大小。
假如:rwnd=400
(字节)",设每一个报文段
发送过程如上图所示。最后如果rwnd=100
,但是传输过程中这个数据报丢失,那么rwnd
一直为
解决办法是:TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,
拥塞出现条件:对资源需求的总和
拥塞控制目的是防止过多的数据注入到网络中,这是一个全局性问题。
拥塞控制与流量控制区别:
如上图左边是拥塞控制,如果发送方同时给接收方发送数据,如果同时使用网络上的资源,就会使得网络非常繁忙,出现拥塞情况。此时接收方并不知道这种拥塞情况具体是哪一台主机发送速率过快产生的。 拥塞控制主要是因为网络发生堵塞,导致很多发送方发送的数据迟迟到不了接收方。
右边是流量控制,是一种点对点之间的通信量的控制。是一个端到端问题。是发送方发送的速率过快,导致接收方接收缓存不够,接收窗口不够。
拥塞控制有四种算法:慢开始、拥塞避免、快重传、快恢复。
介绍这四种算法之前先假定数据单方向传送,而另一个方向只传送确认,且接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度,之前介绍过发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd}
,这里假设接收窗口是对于发送窗口是没有限制的,因此发送窗口大小只受拥塞窗口大小影响。
接收窗口:接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量。
拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。
四种算法应用过程:
慢开始和拥塞避免算法
纵坐标是拥塞窗口,开始初始值是cwnd=1
代表一个报文段,一个报文段最大长度是MSS。可以看到随着传输轮次增加,拥塞窗口也会发生变化。
横坐标一个传输轮次指的是发送了一批报文段并收到它们的确认的时间。假如一个拥塞窗口是
首先是慢开始阶段
指的是前面
拥塞避免阶段
这个过程是加法增大。每经过一个传输轮次拥塞窗口就
之后的慢开始阶段和之前的拥塞窗口增加方式一致,都是指数增加。直到拥塞窗口值为
这里拥塞窗口值为
快重传和快恢复
快重传指只要受到三个重复的确认就会执行快重传算法。具体是发送方收到三个冗余ACK之后就会马上执行快重传算法。这样就可以在超时计时器结束前完成重传,节省了等待计时器结束时间。
在发生快重传之后会进行快恢复,这里快恢复不用将拥塞窗口降为
应用层知识总览:
作为网络体系结构中的最上层,传输层可以为应用进程提供端到端之间的通信服务。但是不同的网络应用的应用进程之间还需要有不同的通信规则,因此就会在传输层之上再建立一个应用层,并且规定一些协议。
应用层对应用程序的通信提供服务。应用层协议哪些规定:
由应用层协议定义的以上规则,可以看出应用层功能:
应用层的重要协议:FTP、SMTP、POP3、HTTP、DNS。
应用层通常使用的网络应用模型有两种:客户
简称C
这样一个模型将网络上的结点分为两类角色,一类是客户,一类是服务器。服务器就是提供计算服务的设备。而客户就是请求计算服务的。客户网服务器发送一个请求,服务器在接收到这个请求后就会对这个请求进行处理,并且返回给对应的客户机所要请求的服务。
服务器特点:
客户机特点:
C
也叫对等模型。
可以看到没有服务器,只有一些主机进行通信。所以P2P思想是整个网络中的传输内容都不会保存在一个中心的服务器上,而是每个结点都可以提供服务,也可以请求服务。每个结点之间都是平等的。任意的端系统和结点之间都可以直接通讯。
节点间歇性接入网络,节点也可能改变IP地址,且P2P模型的可扩展性好,即当网络中大量的主机涌入,这些主机之间仍然可以非常顺利请求服务,以及提供服务。所以也能体现出P2P的网络健壮性强,一台节点退出连接不会影响其他节点。
通过全球唯一的IP地址就可以找到网站,并且和网站进行信息交换。但是直接通过IP地址去寻找网站很困难,因此就通过域名来替代IP地址。域名与IP地址之间的转换就要通过DNS。
上面是一个域名,对于这个域名每个.
分割的部分称为标号。标号的长度不能超过-
。
域名当中的每个标号级别是不一样的,自左向右由低到高。对于最右边的fun
叫做顶级域名。中间的sybblogs
是二级域名。最前面的www
是三级域名。实际上,上面域名完整写法应该是www.sybblogs.fun.,可以看到顶级域名后面还有一个.
,这个.
代表的是根域名。
顶级域名分为:
国家顶级域名cn,us,uk等
通用顶级域名com(企业),net(网络服务结构),org(非营利组织),gov(政府机构),int(国际组织),aero(航空企业),museum(博物馆),travel(旅游)等。
基础结构域名
二级域名分为:
类别域名ac,com,edu,gov,mil,net,org等
行政区域名用于我国各省、自治区、直辖市。如:bj,js等
自定义二级域名
可以看到顶级域名和二级域名有相同部分,这是因为有的网站在国家顶级域名上再建立二级域名等。如:com.cn
可以用域名树形式表示:
具体实现域名系统要通过域名服务器DNS实现。DNS服务器根据域名结构划分位不同类型解析服务器。主要包括:根域名服务器、顶级域名服务器、权限域名服务器。
处理上面三个之外还有一个本地域名服务器。这个本地域名服务器不属于这个层次结构,但是又对域名系统十分重要。当一个主机发出DNS查询请求时,这个查询请求报文就发给本地域名服务器。本地域名服务器离主机的距离很近,一般不超过几个路由器距离。当一台主机查询另一台主机是和它属于同样一个本地网络服务提供商时,这个本地域名服务器就可以立刻将所查询的主机名转换为IP地址,而不需要再去其他服务器。所以有了本地域名服务器存在就可以使整个DNS查询过程变得简单快速。
根域名服务器
是最高层次域名服务器,也是最重要的DNS服务器。内部包含所有顶级域名服务器的域名和IP地址。
假如现在查询www.sybblogs.fun,主机首先会发给本地域名服务器一个查询请求,如果本地域名服务器中没有解析过这个域名,就会将请求发送给根域名服务器。根域名服务器会首先解析顶级域名,这里顶级域名是fun
,所以会将fun
所对应的域名服务器地址发给本地域名服务器。或者会接着往下查询顶级域名服务器,权限域名服务器直到查询到网站所对应IP地址,再返回给本地域名服务器。这两种查询方式分别是递归和迭代。
因此根域名服务器所掌握信息就是各个顶级域名服务器所对应的IP地址是多少。在因特网上有
顶级域名服务器
管理该项级域名服务器注册的所有二级域名。也就是知道权限域名服务器所对应的IP地址是多少。
即根据二级域名找到权限域名对应的服务器IP地址。
权限域名服务器
负责一个区的域名服务器。这里区是对DNS服务器管辖范围进行一个区分,是DNS服务器所实际管辖的范围。
上面的abc.org
和y.abc.org
就是不同的区。在这里是一个对等关系,分别对应两台权限域名服务器。
如果权限域名服务器还不能查询到域名所对应的完整IP,就会告诉发送查询请求的DNS客户,下一步应该找哪个权限域名服务器。
权限域名服务器主要分为
A代表Address,用来指定域名对应的IP地址,如将item.taobao.com指定到115.238.23.xxx,将switch.taobao.com指定到121.14.24.xxx。A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析到多个IP地址
Mail Exchange,就是可以将某个域名下的邮件服务器指向自己的Mail Server,如taobao.com域名的A记录IP地址是115.238.25.xxx,如果将MX记录设置为115.238.25.xxx,即xxx@taobao.com的邮件路由,DNS会将邮件发送到115.238.25.xxx所在的服务器,而正常通过Web请求的话仍然解析到A记录的IP地址
Canonical Name,即别名解析。所谓别名解析就是可以为一个域名设置一个或者多个别名,如将aaa.com解析到bbb.net、将ccc.com也解析到bbb.net,其中bbb.net分别是aaa.com和ccc.com的别名
为某个域名指定DNS解析服务器,也就是这个域名由指定的IP地址的DNS服务器取解析
TXT记录
为某个主机名或域名设置说明,如可以为ddd.net设置TXT记录为"这是XXX的博客"这样的说明
域名查询方式有两种:递归查询和迭代查询。
递归查询过程是:本地域名服务器
迭代查询方式过程:
本地域名服务器没有域名对应IP地址,本地域名服务器
如果根域名服务器没有域名对应IP,会返回域名对应顶级域名服务器地址,则本地域名服务器
如果顶级域名服务器没有域名对应IP,会返回域名对应权限域名服务器地址,则本地域名服务器
上图m.xyz.com
是主机名,要查找的是y.abc.com
地址。
可以看到这样两种方式查询效率不高,所以就引入高速缓存概念,高速缓存中存放的是最近主机查询过的域名,以及从哪台服务器获得域名映射信息记录。如果一台主机已经访问过一个网站,则第二次访问时本地域名服务器中就会缓存这个网站对应的域名与IP地址映射信息。就不用再进行递归或者迭代查询。并且如果本地域名服务器中没有对应网站的IP地址,但是对应这个网站有对应的顶级域名服务器地址,此时就不需要再经过根域名服务器。
为了保证高速缓存中域名信息正确,所以要不定期进行更新。即为其中每一表项设置计时器,计时器结束就会清除。
实际上不只是本地域名服务器中有缓存,许多主机也有高速缓存。主机开机时就会从本地域名服务器中下载域名和地址对应映射关系的数据库,并放到本机的高速缓存中。所以此时访问一个网站就要先查询本机的高速缓存,没有再去查看本域名服务器。
文件传输协议有很多,比较重要两个是:文件传送协议FTP(File Transfer Protocol)、简单文件传送协议TFTP(Trivial File Transfer Protocol)。TFTP是一个很小,而且易于实践文件协议,其优点是适合UDP环境。
文件传送协议FTP:提供不同种类主机系统(硬、软件体系等都可以不同)之间的文件传输能力。即使用FTP协议可以屏蔽文件传送时不同操作系统的差异性。
FTP本质是拷贝,即从FTP服务器上将文件拷贝到电脑上,或者从本地电脑将文件拷贝到服务器上。对应上传和下载。
FTP是基于客户/服务器(C/S) 的协议。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器。连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。
FTP工作原理:
登录
在地址框中输入FTP地址就可以登陆FTP服务器,并且进行文件传送。具体是输入FTP地址,还要输入用户名和密码。有的时候还可以采用匿名登陆的方式:互连网中有很大一部分FTP服务器被称为"匿名"(Anonymous)FTP服务器。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名"anonymous"登陆FTP服务,就可访问远程主机上公开的文件。
这种匿名方式很普遍且常见。
文件操作
登录之后就可以对文件进行操作。对文件的操作其实就是与服务器进行连接。进行连接的过程通常使用的是TCP连接。通过使用TCP连接可以实现可靠传输。
连接的FTP服务器可以有一个或多个,客户端也是有一个或多个。而且一个FTP进程可以同时为多个客户进程提供服务。FTP进程主要有两大部分:
主进程负责接收新的请求,工作步骤是首先要先打开FTP服务器实现文件传输的端口,这个端口打开后就可以使客户进程成功连接。接下来就等待客户进程连接的请求。连接成功后就可以启动从属进程,每个从属进程都可以处理单个的客户请求。
上图中服务器的控制进程和数据传送进程都属于从属进程,而不是主进程。客户端和服务器的控制连接,在整个会话(文件传送)过程中会一直保持打开,FTP客户发出的传送请求都要通过控制连接来发送给服务器端的控制进程,所以控制连接相当于正式传送文件的准备步骤。而数据连接才是实际中用于传送文件的连接,并且服务器端的控制进程会在接收到FTP客户端发来的文件传输请求之后就创建这样一个数据传送进程,建立数据传送连接。
所以控制连接传送的是请求,数据连接传送的是文件。控制连接在全程都是开启的,只要客户端和服务器建立会话,并且会话还未结束控制连接就始终保持,文件传送之后就会关闭数据连接。
TCP是否使用
主动方式
当客户进程向服务器控制进程发送建立连接请求时,会寻找连接服务器进程的端口,即
之所以主动是因为在建立控制连接后,服务器端会主动告知客户端自己的数据传送端口号是多少(
被动方式
客户端和服务器端建立TCP控制连接后,之后客户端会给服务器发送一个请求,询问服务器端开放下载的端口号,客户端收到这个请求之后就会返回一个大于
主动:服务器
FTP传输模式:
电子邮件格式主要包含信封和内容两个部分。
电子邮件传输程序会根据邮件信封上的信息来传送邮件,所以信封一般是邮件名。内容就是电子邮件的主要部分,包括首部和主体两部分。首部需要填写接收人的邮箱号,信封主题。填写完首部信息后会自动生成发件人和发送日期两个字段。主体部分就是信息内容。
电子邮件系统组成结构如下:
上图组成结构实际上只有三个部分,中间的SMTP协议,发送方和接收方的用户代理,发送方与接收方的邮件服务器。具体解释如下:
用户代理
用户和电子邮件系统的接口,通常情况下是运行在电脑当中的程序。所以用户代理可以称为电子邮件客户端软件。用户代理可以为客户提供友好的接口,即界面,通过这个界面就可以写邮件和发送邮件,及接受软件。
所以用户代理有四个功能:
撰写
显示
处理
包括发送邮件和接收邮件
通信
邮件服务器
作为服务器来讲,一定要长时间工作,并且会有大容量的邮件信箱来容纳大量的信件。
主要功能有两个:
协议
协议包括两类:SMTP协议(发送邮件使用)、POP3与IMAP(接收邮件时使用)。
所以电子邮件系统工作原理如下图:
发送方通过用户代理把写好的邮件发送给发送方的邮件服务器。邮件会被放到邮件服务器缓存中,之后发送时取出邮件发送给接收端的服务器,这两个过程都是发送邮件,使用的是SMTP协议。接着邮件到了接收端的邮件服务器当中,同样会放到邮件服务器缓存中,如果接收方有时间阅读邮件,就会通过用户代理,使用POP3协议将接收端邮件服务器中读取邮件。传输邮件过程都使用TCP可靠连接。
这里的重点是三个协议。
SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息。这两个进程分别是:负责发送邮件的SMTP进程就是SMTP客户、负责接收邮件的进程就是SMTP服务器。
STMP通过
STMP协议具体规定进程之间信息交换方式是通过三个阶段来进行通信:
连接建立
发送方写好邮件220 service ready
,也就是告诉发送方现在可以准备接收邮件了。之后发送方邮件服务器会向接收方邮件服务器发送一个HELLO
命令,并且会附上发送方的主机名。接收方邮件服务器如果有能力接收邮件,就会返回应答信息250 OK
。如果接收方邮件服务器现在没有能力接收邮件会发送421 Service not available
。
邮件传送
发送方邮件服务器会发送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
。
上图
连接释放
邮件发完,SMTP客户发送QUIT命令,SMTP服务器返回"221",表示同意释放TCP连接。
SMTP的缺点:
通用因特网邮件扩充MIME:
为了解决简单邮件传送协议SMTP缺点就有了MIME协议。该协议是对SMTP协议功能上的一个扩展。
MIME协议主要功能是会把一些非ASCII码的内容,如其他国家文字,一些可执行文件,转换为
POP3协议只在客户从接收方邮件服务器读取邮件,将邮件交给用户代理时使用。同样,POP3协议是建立在TCP连接之上,端口号是
POP3工作方式,即当接收方将邮件从服务器中读取出来之后,对于这个邮件的处理方式有两种:下载并且保留在服务器中、用户下载后接收端服务器会删除对应邮件缓存。
由于这种协议功能有限,因此就提出了一种新的网际报文存取协议IMAP。
IMAP协议比POP协议复杂。当用户PC上的IMAP客户程序打开IMAP服务器的邮箱时,用户可以看到邮箱的首部,若用户需要打开某个邮件,该邮件才上传到用户的计算机上。
IMAP可以让用户在不同的地方使用不同的计算机随时上网阅读处理邮件,还允许只读取邮件中的某一个部分(先看正文,有WiFi的时候再下载附件)。
现在通常发送邮件方式是基于万维网的电子邮件。即可以通过浏览器邮箱网站发送邮件。
可以看到客户主机到服务器之间协议从SMTP、POP3变为HTTP协议。
基于万维网电子邮件总结:
万维网www(World Wide Web)是一个大规模的、联机式的信息储藏所
URL一般形式:<协议>://<主机>:<端口>/<路径>
其中协议有HTTP、FTP。主机可以填写域名或者IP地址。后面的端口和路径可以省略。URL不区分大小写。
用户通过点击超链接(URL)获取资源,这些资源通过超文本传输协议(HTTP) 传送给使用者。也就是说HTTP可以规定资源到达使用者中间的具体过程。
万维网以客户
HTTP协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。
简单来说就是HTTP协议规定用户如何上网,以及服务器如何提供请求资源的过程。
首先服务器会运行一个进程监听
用户端浏览页面具体方法:
浏览器端处理请求具体做法:
浏览器分析URL
浏览器向DNS请求解析IP地址,将域名转换为IP地址。
DNS解析出IP地址
浏览器与服务器建立TCP连接
浏览器发出取文件命令
服务器响应
释放TCP连接
浏览器显示
浏览器可以只下载文本部分。
HTTP协议特点:
HTTP协议是无状态的。
比如第一次访问网站和后来几次访问网站的响应时间相同。但是在实际工作中,一些万维网站点常常希望能够识别用户。此时就需要cookie。Cookie是存储在用户主机中的文本文件,记录一段时间内某用户(使用识别码识别,如"123456")的访问记录。通过cookie可以为用户提供个性化服务。
HTTP采用TCP作为运输层协议,但HTTP协议本身是无线连接的(通信双方在交换HTTP报文之前不需要先建立HTTP连接)。
HTTP连接方式有两种:持久连接(Keep-alive)、非持久连接(Close)。其中持久连接又可以分为非流水线和流水线式连接。
连接方式有持久连接和非持久连接两种。
非持久连接
从客户端发出请求,到客户端收到整个请求文档所需时间过程如上。首先要和服务器建立一个TCP连接,当三次握手前两次完成后就经过一个RTT时间(往返时延)。接下来客户端就可以发送请求报文,作为三次握手的第三个部分数据发给万维网服务器,服务器收到这样请求报文之后就会返回给客户端一个响应报文,这个响应报文是有长度的,所以需要经过一定时间才能收到整个完整的报文。所以非持久连接耗时是
如果之后客户端再次发送请求,还是要重新再建立一个TCP连接,即重新进行三次握手再发送自己的请求报文。所以时间消耗长。
持久连接
是对非持久连接的改善。可以分为流水线式和非流水线式。
持久连接情况下也是需要进行三次握手,但是之后客户端再次请求新的元素(新的请求报文)就不需要再建立新的请求连接。可以在之前建立连接的基础上发送请求报文即可。
也就是说持久连接特点是在服务器发送响应建立连接之后在一段时间内仍然保持这条连接,这样就可以使客户端和服务器端可以继续在这条连接之上传输后序的报文。
上面这种方式是非流水线的一种持久连接。可以看到当客户端请求一个报文之后,必须要收到这个请求报文对应的响应报文之后才能继续发送新的请求报文。这种方式与之前第三章中的平等协议类似。
流水线式连接等同于之前的GBN与SR协议,是可以连续发送的。假如当前客户端有好几个请求报文需要发送,采用流水线持久连接就可以将这几个请求报文同时发送出去,服务器收到这些请求后,会依次返回响应报文。可以看到采用这种方式客户访问所有对象只需要花费
HTTP报文有两种,请求报文和响应报文。HTTP报文是面向文本的,因此在报文中的每一个字段都是一些ASCII码串。
请求报文
可以看到请求报文有三个部分:请求行(开始行)、首部行、实体主体。
第一部分开始行用于区分请求报文还是响应报文。具体字段如下:
方法
一些命令,告诉要对所请求的对象进行哪些操作。如:获取、删除等。
URL
请求链接
版本
使用的是哪个版本的HTTP协议。
CRLF
标识首部行的结束,请求行开始。
第二部分是首部行,说明浏览器、服务器和报文主体的一些信息。首部可以有很多行,也可以不用。每一个首部行当中都会有一个首部字段名和值,每一行结束都会有CRLF回车换行符。并且最后也会有一个CRLF来标识首部行结束,实体主体部分开始。
第三部分实体主体在请求报文中通常不用。
例子:浏览器发出的请求报文如下
第一行表示使用的是GET方法,请求的URL是
/index.html
。使用的协议是HTTP/1.1
。第二行Host代表请求URL存放在
www.test.edu.cn
这个域名上。第三行Connection表示的是连接方式,其值
Close
表示使用非持续连接。第四行Cookie字段,值
123456
表示用户识别码是123456
。如果出现Cookie说明这个用户浏览器曾经访问过这个网站。
响应报文
响应报文也是有三个部分:状态行(开始行)、首部行、实体主体。
第一部分开始行,具体字段如下:
版本
指的HTTP版本,通常使用HTTP
状态码
三个数字构成的,一共有五种类型
状态码 | 描述 | 常见的状态码 |
---|---|---|
表示通知信息,如:请求收到或正在处理。 | ||
表示成功,如:接受。 | ||
表示重定向,如要完成请求还必须采取进一步的行动 | ||
表示客户的差错,如请求中有错误的语法或不能完成 | ||
表示服务器的差错,如服务器失效无法完成请求 |
一共有
第二部分是首部行,说明浏览器、服务器和报文主体的一些信息。首部可以有很多行,也可以不用。每一个首部行当中都会有一个首部字段名和值,每一行结束都会有CRLF回车换行符。并且最后也会有一个CRLF来标识首部行结束,实体主体部分开始。
第三部分实体主体在有的响应报文中不用。