网络层部分协议快速入门
前言
这两天疯狂复习计网,感觉终于把前后知识融会贯通起来,简单写一篇博客概况一下网络层的协议。此篇主要本着“前人栽树,后人乘凉”的想法讲述自己的理解,可能会有部分错误,敬请指正。
学院的计网教材是《数据通信与网络》 ,实在是有点难懂,所以自己去借了《计算机网络》(谢希仁)、《计算机网络自顶向下方法》,稍微学了一下哈工大的计网MOOC,这里推荐给读到这篇博客的读者。
后续看情况更新传输层或数据链路层或物理层的协议
UPD(2022-7-10):计网考炸了,才81分,可能是我运气不太好吧。
网络层协议
一、逻辑寻址
当前有(或者说我们学过)两个版本的网络层地址,IPv4地址和IPv6地址
IPv4和IPv6是协议,是网际协议IP的两个版本,而不是地址。
IPv4地址
地址一共32位,可以用二进制也可以用点分十进制表示。在有类寻址中,IPv4地址被分为ABCDE五类网络,其对应关系如下表:
类 | 地址格式(开头) | 块的个数 | 块的大小 | 应用 |
---|---|---|---|---|
A | 0 | 128 | 16777216 | 单播 |
B | 10 | 16384 | 65536 | 单播 |
C | 110 | 2097152 | 256 | 单播 |
D | 1110 | 1 | 268435456 | 多播 |
E | 1111 | 1 | 268435456 | 保留 |
有类寻址规定每类字符的前若干位为网络号,后若干位为主机号。地址分配时可能存在大型组织地址不够用,小型组织地址剩余过多的情况,所以就提出了子网化和超网化的概念。
与有类寻址对应的是无类寻址,这个方案不预先规定网络号和主机号,而是通过掩码的概念来区分,掩码一般可以用斜杠表示法来表示。
不知道为什么,感觉分配地址这块很容易考到。
网络地址转化NAT
因为IPv4地址已经短缺,所以提出了专用地址的概念,在局域网内部使用特定的地址(如192.168.*.*),而在局域网外只能使用在此之外的地址。专用地址在局域网内唯一,但在全世界范围内他们并不唯一
这样就需要路由器将局域网内的专用地址转化为全球的地址才能和因特网通信,这就是NAT。然而将来自外部数据报的全球地址转化为专用地址没办法一一映射,就要使用一些其他技术。
IPv6地址
IPv6地址更长,128bit,每4个bit用十六进制数表示,每4个十六进制数再用冒号隔开,这就是十六进制冒号表示法。这个表示法也可以用一定的手法缩短,这里不再赘述。
IPv6地址最高位字节的最低位决定其是单播地址还是多播地址(0表示单播,1表示多播,全1表示全播)
二、网际协议IP(Internet Protocol)
IP这个缩写应该是一个协议名字,而不是我们平常说的IP地址。
IPv4数据报的格式
比较重要的是头部长度、总长度、标识、标记、分段偏移、生存时间TTL、协议、校验和还有两个IP地址。
值得注意的有以下几点:
- 头部长度要乘以4才是按字节计算的头部长度(20~60字节)
- 协议字段是定义高层协议的,包括TCP、UDP、ICMP、IGMP
- 生存时间,虽然叫做时间,但是度量单位是“跳”
- 校验和,头部每16字节取出来用于计算校验和。
IP数据报还有一个比较重要的概念是分段。
分段
收到链路层协议的约束,IP层的数据报长度也受到了限制,这个长度叫做最大传输单元MTU,当数据报长度大于MTU时,就要将IP分段。
其中,数据报的标识用于区别各个数据报(即:同一个数据报切分出来的分段具有同样的标识),标记中的第二个位‘D’(意为Don’t分段)为0时需要分段,反之不需要分段;第三个位‘M’(意为More分段)为1时表示这个分段之后还有分段,反之表示这是最后一个分段。这里可以联系链表,M表示尾指针是否为NULL。
分段偏移表示这个分段在原数据报中的相对位置,以8个字节(不是比特!)为度量单位。
也就是说,数据报被分段时第一个字节的编号都能被8整除。
IPv6数据报格式
这部分搞的有点不是很懂
比较值得注意的就是IPv6数据报在40字节的基本头部的基础上又加了扩展头部,又因为种种原因取消了一部分字段,所以想有更多功能就要添加扩展头部。IPv4头部中的分段就被分到了IPv6的扩展头部中(分段方法有点不一样)。此外校验和也被移除,由高层协议负责。
详细的头部和扩展头部比较可以参考教材。
IPv4到IPv6的过渡
可以采用双栈协议(全能型选手)、隧道技术(掩耳盗铃)、和头部转换(偷天换日)。
三、地址解析协议ARP
ARP(Address Resolution Protocol),是用于将逻辑地址(如IPv4地址)转化硬件地址(如MAC地址)的协议。
硬件地址不止有MAC地址,逻辑地址也不止有IPv4地址。
分组格式如下:
这个分组并不难理解,基本看字面意思就可以猜出来用处。比较特别的是目标硬件地址,因为发送方想要知道的就是目标的硬件地址,所以发送方的分组的这个字段是全0,接收方收到分组后,发送自己的ARP分组,回答相应的请求。
简单的说就是你写了封信问小美的电话号码,然后把她的电话号码那一栏留空,她给你回信的时候再填上(但此时发送方和接收方需要颠倒)。这个例子比较好理解ARP在干什么,但是不太准确,因为ARP请求是广播发送,实际上应该是你给身边所有人写了封信,问小美电话,小美看到就会回你,但是其他人,比如说小明,就不会鸟你,也即ARP回答报文是单播发送。
ARP协议还用到了高速缓存、代理ARP的技术,想了解建议看书。
四、因特网控制报文协议ICMP
由于IP协议只提供不可靠和无连接的服务,没有差错控制机制,也没有办法管理主机,于是ICMP协议就诞生了。ICMP不是高层协议,而是装在IP数据报中的协议。
ICMP报文有两类,一类是差错报告报文,另一类是查询报文。两类下又有更细的分类,这里就不再说了(主要是我也不是很懂),想了解可以看思维导图或者看书。
ping命令和Traceroute程序就是依赖ICMP协议来运行的。
五、因特网组管理协议IGMP
多播需要将相同的报文转发给多个分组,对报文一次一次地复制需要付出很大的带价,所以网络层需要维护若干个组,利用多播路由选择协议对组内的主机进行转发,组的维护就要靠IGMP(Internet Group Management Protocol)。
IGMP协议一个管理组成员的协议,而不是多播路由协议。它帮助多播路由器创建和更新组成员的列表。
IGMP也有多重报文类型,包括查询、成员报告、离开报告。
IGMP的工作可以分为两个阶段:
- 主机想加入一个新的多播组,它向多播组的多播地址发送一个IGMP报文,本地的多播路由器收到IGMP报文后,把这个报文转发给多播组的其他路由器。
- 多播路由器周期性地试探本地局域网上的成员,以便知道这些主机还是不是该组的成员。
IGMP的目标是局域网,所以其IP分组的TTL字段值为1
六、自治系统AS
因为互联网规模过大,互联网规格也有所差异,且互联网上许多组织不希望自己网络的细节被外界了解,所以可以把整个互联网分割为多个自治系统AS。于是在自治系统内外,就需要不同的路由选择协议,分别为内部网关协议和外部网关协议。
内部网关协议IGP
路由信息协议RIP
**RIP(Routing Information Protocol)**是基于距离向量的一种路由选择协议,其最大的优点就是简单,开销小。因为其简单的特性,RIP只适用于小型的局域网,所以IP分组中的TTL通常为16。
RIP交换信息的方法
- RIP仅和相邻路由器交换信息。
- RIP向相邻路由器交换自己所知道的全部信息,即所有的路由表。
- 按固定时间间隔交换信息(如每隔30s)
整个算法是基于Bellman-Ford算法 ,过程还蛮有意思的,感兴趣的可以了解一下。
RIP交换信息有个缺点,就是“好消息传的块,坏消息穿的慢”,在一个网络或路由器出故障时,可能需要花费较多的时间才能让其他网络和路由器知会,且路径收敛慢,所以只使用于小规模局域网。
虽然这篇博客只讨论网络层,但是RIP协议在应用层,为网络层服务,在运输层使用UDP协议,使用端口号是520
开放最短路径优先OSPF
为了克服RIP的缺点,基于Dijkstra算法OSPF(Open Shortest Path First)。其特点有:
- 使用洪泛法向自治系统的所有路由器发送消息。
- 发送的信息是与自己相邻的所有路由器的链路状态,“链路状态”的度量方式比较灵活,可以由网络管理人员自己决定。
- 仅当链路状态发生变化或间隔一定时间后更新链路状态信息。
还有点可能会考到,就是OSPF通过**问候(Hello)**分组来发现和维持邻站相邻的可能性。
OSPF工作在网络层。
外部网关协议BGP
BGP的测量和IGP有所不同,原因如下:
- 互联网规模太大,使得AS之间的路由选择非常困难。
- 自治系统AS之间的选择必须考虑有关策略(比如中国的消息不希望经过美国被转发,不够安全)。
所以BGP并不渴望寻找到一条最佳路由,而是选择出一条比较好的路由。
BGP工作在应用层。
BGP的选择有点复杂,没搞懂,估计考试也不会考。
没了!
三千多字,比我想象中难多了,后续随缘更新,且看其珍惜吧。
写的比较赶,可能问题比较多,欢迎指正。
留个言或者给点反馈会给我更多更下去的动力,Pls!