网络层

路由的转发和选择

上图中的 router 具有截断的协议栈,即不会有网络层以上的东西。意思就是,网络层只处理网络层的东西,不会管上面例如运输层的任何东西。

转发(forwarding):将一个 packet 从一个输入链路转发到另外一个输出链路。

路由选择(routing):就是转发的时候选择哪一条线路,里面涉及到 routing algorithm。

路由器通过 forwarding table 进行转发。如下图:

通过查询转发表来确定选择哪一个 output 出去。

但是转发表是如何配置的?可以是人工,也可以通过程序自动。(当然肯定是程序自动,不然每次新加或删除设备,都要自己人工修改转发表,不累死。)

网络服务模型

尽力而为服务,best-effort service。

  • 不保证端到端的时延
  • 不保证最小宽带
  • 不保证 packet 的顺序
  • 不保证 packet 一定能够到达

路由器的工作原理

输入端口:Input port,在输入端口最右侧的方框中,通过查询转发表确定路由器的输出端口。

交换结构:Switch fabric,将路由器的输入端口和输出端口连到一起。

输出端口:Output port,就是输出。

路由选择器:Routing processor,就是控制转发表,控制 packet 发送优先级,等等。

input port,switch fabric,output port 通常使用硬件设计,这样更快。

输入端口

关于转发表,不可能转发表包含着每一个地址。这样的话,不仅查询慢,还耗费空间。(毕竟光IPV4就有上亿种地址)。所以一般采用范围的方法,也就是前缀匹配的方法。

但是可能出现一种可能,一个地址同时匹配了多个前缀,这时候采用最长前缀匹配规则,即在该表中寻找最长的匹配项。

输入端口有队列,当packet 来不及处理的时候,就会排队。

输入队列的排队会遇到一种叫 HOL 阻塞(Head-Of-the-Line):

如上图:第一行的packet先发出,然后第三行的第一个packet也发往同一个输出端口(然后就要排队了,因为第一行占用着)。此时第三行的第二个packet及时发送到不同的输出端口,也要等着,这就叫 HOL。

Switch fabric

基于内存的交换:

基于总线的交换:

如果总线宽度为 1,那一次只有一个 packet 流通了。

基于 crossbar 的交换:

这种方法是非阻塞的,只要不存在相同的输入端口到相同的输出端口,packet 是不会被阻塞的,大家都走各自的车道。

输出端口

输出端口也有队列,是一个缓存。如果队列越来越长,缓存耗尽了,那就根据路由器的设计,随机丢包。也就产生了我们熟知的(packet loss)。这样其实也能变相的告诉发送方,网络已经拥塞。

packet scheduler

FIFO(FCFS)

没啥好说的,先来先服务。

优先权排队

假设1、3、4高优先权。2,5低优先权。

注意是非抢占式的,例如上面的 packet 2 虽然是低优先的,但是他一旦开始发送,即使 4 高优先的到了,也先把 2 处理完。

循环公平排队

例如分类 2 类,然后1、2、4属于第一类。3、5属于第二类。然后调度器先执行1类,在执行2类,在执行1类,如此循环。

IPv4

IPv4 数据报文格式

  • 首部长度:header length,因为 IPV4 具有可选项,所以 header 长度不一,通常为 20 字节。
  • 服务类型:区分数据类型,比如有一些音频的,对时间延迟要求低的等等。
  • 数据报长度:没啥好说的。
  • 标识、标志、偏移量用于处理 IP 分片。注意,IPv6 不再支持路由器对 ip 报文进行分片,因为这会增大路由器的负担。
  • 寿命:TTL,就是没过一个路由器减一,为 0 的时候直接抛弃。
  • 协议:标明此报文是什么协议,这样才能将数据转换为对应协议。不然运输层怎么知道这个数据是干啥的。协议相当于连通网络层和运输层的桥梁。
  • 首部校验和:每过一次路由器就要进过一次计算,因为 TTL 减一了。同样 IPv6 删除了这玩意,太麻烦了,毕竟运输层很多的协议已经考虑到了数据校验,网络层没必要提前做一次。
  • 源 IP 和 目标 IP ,没啥好说的。
  • 选项:相当于扩展选项,IPv6 已删除。

IPv4 分片

通常 MTU 为 1500,但是有些设备的最大 MTU 可能只有 500 呢,那该怎么办?

比如数据从 A 到路由器B 再到 C。A 和 C 的MTU为1500,而B为500,这时候需要 IP数据分片。

上面讲到,IPv4 提供了标识,标志、偏移量。

  • 标识:Identifier,计算机每次生成一个 IP 报文时,系统会随机生成一个 identifier。
  • 标志:flag,标明该报文是否有分片
  • 偏移量:如果有分片的话,该分片在整体的偏移量是多少。

分片后的多个报文的 identifier 是相同的。

IPv4 编码

总共 32 为,分为 4 段,每段 8 个 bit,每段最大范围:$2^8=256$。从0开始,所以是255。

233.1.1.0/24 其中 /24 的记法为子网掩码(network mask)。意味着在该子网中,前 24 位比特是相同的。

把上面这种方法通用化,就叫 CIDR,可以讲网络分为两部分,计数法为 a.b.c.d/x。

255.255.255.255 为广播地址,向该地址发送的报文会广播到整个子网中。

DHCP

主机自动获得 ip 地址的方法叫 DHCP。

客户端首先主机向广播地址发送 DHCPDISCOVER,整个子网中可能有多个 dhcp 服务器响应,回应 DHCPOFFER。然后客户端选择一个 DHCP 服务器,发送 DHCPREQUEST 命令,然后 DHCP 服务器回应 DHCPACK,并分配给客户端 IP(会租期,当然可以续约)。

客户机申请IP之前确实没有IP,DHCP_DISCOVER报文都是以广播形式发送的,IP头里的目的地址是255.255.255.255,源地址是0.0.0.0。链路层目的地址是FF-FF-FF-FF-FF-FF,源地址是自己的mac地址。这样服务器收到客户端发来的DISCOVER报文之后,会根据源mac地址向客户机发送单播的DHCP_OFFER报文。

NAT

Network Address Translation

NAT 内部有一个 NAT 转换表,维护外部端口对应哪一个内部主机。

如上图,按照序号来:

  1. 10.0.0.1 从本地端口 3345 发送到 目标IP 128.119.40.186,80端口。
  2. 经过 NAT,NAT将源地址和端口换成自己的IP,138.76.29.7, 5001 ,并且同时在转换表中添加一条对应的 5001 端口对应 10.0.0.1,3345 的主机。
  1. 然后远程服务器回应到 NAT。
  2. NAT 根据表,将 IP 报文中对应的字段改回去就行了。用完后就删除 NAT 表中的记录。

缺点:如果外部的主机想要主动访问内网中的一台机器,那就不行了,因为 NAT 表里面没有对应的记录。(比如 BT 就不行了)

UPnP 是允许主机发现和配置邻居 NAT 的协议。

IPv6

源地址有 128 bit 够大了。

  • 流标签:如上面讨论过的那样,该20比特的字段用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权,或者它能够用来对来自某些应用(例如IP 话音)的数据报给岀更高的优先权,以优于来自其他应用(例如SMTP电子邮件) 的数据报。
  • 下一个首部:Next header. This field identifies the protocol to which the contents (data field) of this datagram will be delivered (for example, to TCP or UDP). The field uses the same values as the protocol field in the IPv4 header.

IPv6 没有分片,首部校验和,选项,所以固定长度为 40。

其实选项没有消失:

选项字段不再是标准IP首部的一部分了。但它并没有消失,而是可能出现 在IPv6首部中由“下一个首部”指出的位置上。这就是说,就像TCP或UDP协 议首部能够是IP分组中的“下一个首部” 一样,选项字段也能是“下一个首部”。 删除选项字段使得1P首部成为定长的40字节。

通用转发

就是就是更加细致的区分流量进行操作。以往,在网络层你是不能管运输层的东西,但是通用转发这玩意跨层了。

这时候我可以做出更加细致的操作,比如把源 mac 地址等于xxx的 TCP 协议过滤掉或转发到某个地方等等。

路由选择算法

  • 集中式路由选择算法:就是知道路由的全局情况,然后迪杰斯特拉寻找最短路径
  • 分散式路由选择算法:每台路由器只知道和自己连接的情况,用距离向量算法
  • 负载敏感算法:考虑进去负载。

BGP

主要用于解决不同AS之间的连接,每个AS由国际组织分配。比如CN2,163 骨干网线路。

ICMP

路由追踪原理

  1. 主机不断发送 IP 数据报(包含一个不可到达的 UDP 端口号),其中 TTL 从1开始递增。
  2. 当第 n 台路由器发现 ttl 正好过期,发送一个 ICMP 告警报文给源主机。
  3. 然后当数据报正好到达目标主机时,目标主机会发送一个 端口不可到达的 ICMP 报文回去,这样源主机就知道到头了,不再发送探测数据报(不再发送增加 TTL 的包)。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇