本节对应中文书第四章

为什么网络物理上的传输是用的MAC地址,而还需要IP地址?

因为MAC理论作用于局域网内,局域网上理论上是通过广播的形式在寻找通信的对象。而IP地址是可以进行路由的,只有第一次时,需要广播寻找它在哪,后续的通信便可以记住。这样才能实现局域网“来去自由”。

而且,有一些设备的硬件地址格式不一样,为了使得异构网络能够统一地联通,需要使用IP地址。

IP地址

IP地址会给互联网上的每一个主机,路由器的每一个接口,都分配一个IP地址。

IP地址的分类

image-20240605164819310

IP地址被划分为了ABCDE五类,其中ABC三类为单播地址(一对一通信),是最常用的。在ABC三类中,前8 16 24位是网络号。网络号的前三位是类别号,用于区别其是哪一类。D类地址一般用于多播(一对多通信)。

在最初的时候,网络号的目的就是区分各个局域网。但是后面IP地址不够用了,因此产生了虚拟网(后面会讲,这里只需要知道网络号现在不完全是用来区分局域网的)。同一局域网上的主机或者路由IP地址中,网络号号段必须一样。

主机号由局域网内自己分配。

子网掩码(subnet masking)

由于两级IP地址不够灵活,在主机号的基础上,还可以再从主机号内借用若干比特来划分一段子网号(subnet-id),来更精细化地分配局域网内的资源(三级编址)。在划分和子网后,在使用网络号进入网络后,会先使用子网号进入子网,再在子网内寻找主机。

子网掩码:子网掩码就是用来区隔主机号和子网号的,它将主机号全部用0表示。这样路由在寻找子网的时候,将子网掩码与ip地址进行与运算,即可抹去主机号,定位子网。例如255.255.255.0,就只保留最后8位作为主机号,前面的作为子网号。

image-20240607141510368

无分类IP地址 CIDR

在2011年2月3日,IANA宣布IPv4地址已经全部耗尽。为了解决这个问题,IETF专门成立了IPv6研究工作组。

B类IP地址在1992年就已经分配了一半,眼看就要快分完了。同时,互联网主干网上路由表的项目数正在急剧增长。为了解决这个问题,IETF研究处了无分类编址,正式名称是无分类域间路由选择(Classless Inter-Domain Routing, CIDR)。

如何工作

CIDR消除了传统的ABC类地址划分和子网的概念。CIDR把32位的IP地址划分为前后两个部分。前面部分是“网络前缀”(network-prefix),用来指明网络,后面部分则用来指明主机。因此CIDR使IP地址从三级编址(使用子网掩码)又回到了两级编址(只不过现在没有分类来指定网络号长度了)。下图是CIDR下的IP结构。

image-20240607142055089

CIDR使用斜线记法来划分前后两段:IP地址后面的斜线,例如192.168.1.1/24, 表示前24位是网络号,后8位是主机号。类似于子网掩码,CIDR使用地址掩码(address mask)来方便与运算提取地址,例如/24的地址掩码就是255.255.255.0;由于部分网络还在使用子网掩码,因此CIDR的地址掩码在一些地方也被称为子网掩码。

如果用户想要,还可以在CIDR区隔开的主机号内,分出来几位,用来标记网络号。例如192.168.1.1/20, 主机号有8位,可以分隔出3位来作为网络号。

三个特殊的CIDR长度:

网路前缀长度 地址掩码 说明
/32 255.255.255.225 就是一个IP地址。用于主机路由
/31 255.255.255.254 只有两个IP地址,主机号为0和1,用于点对点通信
/0 0.0.0.0 默认路由

路由聚合(route aggregation)

在CIDR工作模式下,

网际控制报文协议ICMP(网络层)

网际控制报文协议(Internet Control Message Protocol, ICMP):这是一个差错报告机制,属于网络层协议,被封装在IP packet内。主要用于在IP主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等。这些控制消息虽然并不传输业务数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有至关重要的作用。

下图是ICMP报文,可以看到,ICMP报文是作为IP包的Payload存在的。因此ICMP并不属于TCP或者UDP中的任意一种,是网络层里面的控制信令一般的存在。

image-20240607143457986

(上图的格式不要求背,大概了解就行)

  • Type字段表示ICMP消息的类型
  • Code字段表示ICMP消息类型细分的子类型;

下图是ICMP支持的报文(了解即可)

image-20240607144255971

一个典型的例子就是ping指令。ping通过使用ICMP报文来检查对象ip地址是否可达。例如

1
ping 192.168.1.1

IP数据报的格式

在了解格式之间,首先需要了解MTU:

最大传输单元MTU

在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度,这称为最大传送单元 MTU(Maximum Transfer Unit)。当一个 IP 数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过数据链路层所规定的 MTU值。例如,最常用的以太网就规定其MTU值是1500字节。若所传送的数据报长度超过数据链路层的 MTU 值,就必须把过长的数据报进行分片处理。

IP包头内有几个字段都和MTU有关系。

IP数据报的格式

在TCP/IP标准中,各种数据格式以4字节(32bit)为单位描述。下图是IP数据报的完整格式

image-20240607150020957

  • 版本:占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。
  • 首部长度:占4位。首部长度字段所表示数的单位是32bit(即,首部长度为1表示长32位,4字节)。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5(即二进制表示的首部长度是0101)。设置更长的首部长度会扩充可选字段部分。当想要添加的首部长度不是4字节的整数倍时,必须用填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用.但这样做是希望用户尽量减少开销.最常用的首部长度是20字节。
  • 区分服务:占8位,这是一种保证QoS的字段。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年年IETF把这个字段改名为区分服务DS(Differentiated Services)。

  • 总长度:总长度指首部和数据之和的长度,单位为字节。单一IP包最多传输$2^{16}=65536$字节

  • 标识(identification):当数据报由于长度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

  • 标志(flag):占3位,仅前两位有意义。标志字段中的最低位记为MF(More Fragment),MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个;标志字段中间的一位记为 DF(Don’t Fragment),意思是“不能分片”,只有当 DF=0时才允许分片。

  • 片偏移:占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。下图是一个切片例子:

    image-20240607153618274

  • 生存时间(TTL):占8位,生存时间字段常用的英文缩写是TTL(Time To Live),表明这是数据报在网络中的寿命.由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器$R_1$,转发到$R_2$,再转发到$R_1$;,然后又转发到$R_2$,因而白白消耗网络资源。最初的设计是以秒作为TTL值的单位;后面随着技术发展,路由转发时间大大缩短,因而改为跳数限制:若数据报在路由器消耗的时间小于1秒,就把TTL值减1,这也就相当于是跳数限制当TTL值减为零时,就丢弃这个数据报。

  • 协议:占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。常见协议如下图

image-20240607153337199

  • 首部检验和:占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。

互联网的路由协议

五星级,这部分中路由算法不在这门课的要求,但路由协议是重点。

内部网关协议RIP(重点!)

如何工作

RIP(Routing Information Protocol):是内部网关协议 IGP 中最先得到广泛使用的协议,它的中文名称叫做路由信息协议,但很少被使用。RIP是一种分布式的基于距离向量的路由选择协议,是互联网的标准协议,其最大优点就是简单,但不适用于大规模应用,因此只是内部网关协议。

RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。

  • 若左手是一个网络,右手是一个网络,中间使用路由器连接;即,使用路由器直连两个网络,距离定义为1
  • 若网络间由多个路由器连接,距离为路由器数量+1;例如 NetworkA—路由1—路由2—路由3—NetworkB 距离是4.

RIP定义的这个距离,也称为跳数(hop count)。RIP认为跳数越少,路由路径越好;尽管有路由转发速度更快效率更高的路由,RIP也不会选择。RIP最大允许通过15跳,若跳数为16,则理解为不可达。因此RIP仅适用于小型网络。

在有的教材中,也称直连网络的距离为0为不可达。这个和定义为1的差异不大。

RIP的特点:

  • 仅和相邻路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。
  • 路由器交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表+需要几跳。也就是说,交换的信息是:“我到本自治系统中所有网络的(最短)距离,以及到每个网络应经过的下一跳路由器”
  • 按固定时间交换刷新路由信息,时间可自定义。

路由器在刚开始工作的时候,路由表是空的;第一时间它会得出直连网络的信息(距离为1的网络);然后它会收到来自其他路由的RIP信息,也记录在自己的路由表上。下一次它对外同步自己的路由表时,就可以携带别人告诉它的RIP信息。经过若干次的更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。

下面是一个详细的例子:

  • 现在你CQUPT,上新街告诉你:你到解放碑可以经过我,我这里1跳后到达。此时CQUPT知道,去解放碑需要2跳(你就坐吧,坐上了346到黄角垭下车这辈子都完了)
  • 此时,如果CQUPT发现自己的路由表没有解放碑,那就把解放碑添加到自己路由表;
  • 如果CQUPT发现自己校门口打个车就可以去解放碑(即,只需要1跳),那么什么也不做(也就是距离更大了,不予更新);
  • 如果CQUPT记录的是四公里路由-2跳到解放碑,则把去往解放碑的路由表拿路由上新街的信息覆盖掉。
  • 如果CQUPT发现之前上新街发过一次RIP信息给自己,现在又发了一次,则不管这次跳数变多还是变少,都直接覆盖上次的信息(同一路由发过来了新的数据,更新信息)。
  • 如果3分钟还没有收到相邻路由器更新路由表,则将该路由器标记为不可达,即16跳。

RIP报文使用UDP封包,因为TCP的三次握手消耗资源太大。下图是其包格式。

image-20240612173559766

RIP存在的特殊问题

RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。我们可以用下图简单例子来说明。设三个网络通过两个路由器互连起来,并且都已建立了各自的路由表。图中路由器交换的信息只给出了我们感兴趣的一行内容。路由器R1中的“1,1,直接”表示“到网1的距离是 1,直接交付”。路由器R2中的“1,2,R1,”表示“到网1的距离是 2,下一跳经过 R1”。
现在假定路由器R1,到网1的链路出了故障,R1无法到达网1。于是路由器R把到网1的距离改为16(表示到网1不可达),因而在R1的路由表中的相应项目变为“1,16,直接”。但是,很可能要经过 30 秒钟后 R1才把更新信息发送给R2。然而 R2,可能已经先把己的路由表发送给了R1,其中有“1,2,R1,”。

  • R1收到 R2的更新报文后,误认为可经过 R2到达网 1,于是把路由信息修改为:“1,3,R2”,表明“我到网1的距离是 3,下一跳经过R2”,并把更新后的信息发送给 R2。
  • 同理,R2接着又更新自己的路由表为“1,4,R1,”,以为“我到网1距离是 4,下一跳经过 R1”。

image-20240612174351774

这种现象我们称之为错误消息洪泛,这是RIP收敛性不好的原因。

开放最短路优先OSDF

OSPF(Open Shortest Path First):这个协议的名字是开放最短路径优先。它是为克服 RIP的缺点在 1989年开发出来的。OSPF的原理很简单,但实现起来却较复杂。“开放”表明OSPF 协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。

OSPF使用分布式链路状态协议(link state protocol),即不像RIP那样用距离来衡量路由选择,而是一整个链路状态。

  • OSPF在同步链路状态信息时,使用洪泛法(flooding)。路由器通过所有输出端口向所有相邻的路由器发送信息,每一个相邻路由器又再将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个信息的一个副本。而RIP 协议是仅仅向自己相邻的几个路由器发送信息。
  • 这个发送的链路状态信息,可能包含费用,距离,时延,带宽等等(包含什么可自定义)。这些被称为“度量(metric)”,有时也把它称为“代价”。
  • 只有当链路状态发生变化时,路由器才向所有路由器用洪泛法发送此信息。而不像RIP那样,不管网络拓扑有无发生变化,路由器之间都要定期交换路由表的信息。
  • 由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库(链接状态数据库),这个数据库实际上就是全网的拓扑结构图.这个拓扑结(构图在全网范围内是一致的(这称为链路状态数据库的同步)

边界网关协议BGP(了解)

由于互联网的规模太大,使得自治系统之间(不同网络之间)的路由选择非常困难。连接在互联网主干网上的路由器,必须对任何有效的IP地址都能在路由表中找到匹配的目的网络。然而,目前互联网的主干网路由器中,一个路由表的项目数早已超过了5万个网络前缀。如果使用链路状态协议,则每一个路由器必须维持一个很大的链路状态数据库。

对应《计算机网络》谢希仁 (第7版) 4.8章

网络地址转换NAT

引入

由于IP地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数。而且考虑到互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网。

假定在一个机构内部的计算机通信也是采用TCP/IP协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其IP地址.这就是说,让这些计算机使用仅在本机构有效的IP地址(这种地址称为本地地址),而不需要向互联网的管理机构申请全球唯一的IP地址(这种地址称为全球地址)。这样就可以大大节约宝贵的全球IP地址资源。

但是,如果任意选择一些IP地址作为本机构内部使用的本地地址,那么在某种情况下可能会引起一些麻烦。例如,有时机构内部的某台主机需要和互联网连接,那么这种仅在内部使用的本地地址就有可能和互联网中某个IP地址重合,这样就会出现地址的二义性问题。

为了解决这一问题,RFC 1918指明了一些专用地址(private address)。这些地址只能用于一个机构的内部通信,而不能用于和互联网上的主机通信。换言之,专用地址只能用做本地地址而不能用作全球地址。在互联网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发。

  • 10.0.0.0~10.255.255.255 (或记为10.0.0.0/8,它又称为24位块)
  • 172.16.0.0~172.31.255.255 (或记为172.16.0.0/12,它又称为20位块)
  • 192.168.0.0~192.168.255.255 (或记为192.168.0.0/16,它又称为16位块)

采用这样的专用地址的互连网络称为专用互联网或本地互联网,或更简单些,就叫做专用网。显然,全世界可能有很多的专用互连网络具有相同的专用IP地址,但这并不会引起麻烦,因为这些专用地址仅在本机构内部使用.专用IP地址也叫做可重用地址(可重复使用的地址)。

NAT技术

网络地址转换 NAT (Network Address Translation):NAT规定路由器至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址。这种方法需要在专用网连接到互联网的路由器上安装NAT软件 (被称为NAT路由)。

举个例子:专用网内部的主机A发往互联网上主机B的IP数据报:源IP地址是192.168.0.3,而目的IP地址是213.18.2.4。NAT路由器把IP数据报的源IP地址 192.168.0.3,转换为公网IP地址172.38.1.5,然后转发出去。因此,主机B收到这个IP数据报时,以为A的IP地址是 172.38.1.5。当B给A发送应答时,IP数据报的目的IP地址是NAT路由器的IP地址 172.38.1.5

image-20240614144432765

此时,如果内网只有一个用户,那所有通信都来源于这个用户,没有问题。但是,如果内容有多个用户,那应该如何区分返回到172.38.1.5IP的数据报是要发给内网哪个机器的?这是用TCP层内的port number (这是TCP运输层的地址)来区分的。在出去时,把IP换成公网IP,并映射一个对应的端口号给这个包。在返回回来时,使用端口号来区分用户。

这要求NAT路由器也要维护一张表,表内包含 内网IP,Port ID; 外网IP,Port ID

1718348775401

这样使用端口的NTA也叫做NAPT (Network Address and Port Translation)。不使用端口的NAT被称为传统NAT。