首页 > 代码库 > 读书笔记:计算机网络4章:网络层

读书笔记:计算机网络4章:网络层

这是我在Coursera上的学习笔记。课程名称为《Computer Networks》,出自University of Washington。

由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了。这门课程在2013年左右录制,知识相对还是比较新的。覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细。学完这门课程之后对计算机网络会有比较深刻的了解。

本章详细讲解了网络层的一些概念。通常网络层是通过IP协议实现的,网络层是所有协议的核心。本章介绍了IP地址、协议、IPv6、ARP、DHCP等重要概念。


  • ?概述

    • 课程位置

      • 已经到达网络层了。网络层基于链路层,路由器可以通过多个网络发送数据包

    • 为什么要网络层

      • 我们已经建立链路层了,所有的主机之间可以发送数据,为什么要需要网络层呢?

    • 交换机的缺点

      • 无法大规模应用:向后学习的时候要向整个网络广播,每个交换机要记录所有机器的地址

      • 不同的链路技术之间,比如无线和有线之间无法通信

      • 没有流量控制机制

    • 网络层方案

      • 大规模:层级结构

      • 非均匀:IP

      • 带宽控制:路由成本极低,QOS流量控制

    • 话题

      • 网络服务模型

      • IP 互联网协议

      • IPv6

      • NAT(中间代理)

      • 路由算法

    • 路由和转发的比较

      • 路由的成本很大,因为涉及到广播

      • 转发的成本稍微小一点

    • 课程计划

      • 先讲转发,后讲路由




  • 网络服务模型

    • 话题

      • 网络层为传输层提供哪些服务呢

    • 两种网络服务模型

      • 数据报模型(无链接)

      • 虚拟电路模型(面向连接)

      • IP使用的是数据报模型

    • “保存并转发”分组交换

      • 这两种模型都实现了分组交换

    • 数据报模型

      • 包中包含了目标地址

      • 每个路由器中包含了转发表

    • IP 互联网协议

      • 使用数据报模型

      • 地址占了32位

      • 每个包通常1.5KB

    • 虚拟电路模型

      • 三个阶段:连接,传输,断开链接

    • MPLS(多协议标签交换)

      • 类似于虚拟电路的技术,被ISP广泛使用

    • 数据报模型和虚拟电路模型比较

      • 数据报模型  虚拟电路模型

      • 配置:不需要  需要

      • 路由:每个目标   每次连接

      • 地址:每个包包含了全部地址  每个包包含了短标签

      • 路由:每个包  每个电路

      • 故障:容易排除 不容易排除

      • QOS:不易增加  容易增加


  • Internetworking

    • 话题

      • 我们如何连接两个不同的网络?

    • 网络有哪些差异

      • 网络模型(数据包或虚拟电路)

      • 地址类型

      • QOS

      • 包大小

      • 安全性(是否加密)

    • 可以连接数据报网络、虚拟电路网络、无线网络等

    • Internetworking - Cerf & Kahn

      • 互联网之父

      • 解决网络之间连接的问题

    • 互联网参考模型

      • IP是所有网络层中最窄的一层

    • IP提取了上层协议中最基本的共同特性

      • 假设只有一部分网络使用QOS或安全性

    • IPv4格式

      • 版本 IHL头部 总长度 协议 校验和

      • IP协议是互联网的网络层,包含了源地址目标地址

      • 总长度,标识,帧位置,分段控制位

      • 其他字段满足了其他需求:不同的服务,TTL




  • IP前缀

    • 话题

      • IP地址应该长什么样呢?

    • IP地址

      • IP地址使用了32位的地址,IPv6是128位

      • 使用"."来分隔数字

    • IP前缀 - 现代

      • 表示被分配的IP段

      • 例如:10.21.0.0/16  表示以10.21开头的65536个地址,192.168.1.0/24 表示256个地址

      • 前缀越大,地址越具体,反之亦成

    • IP地址分类 - 曾经的方法

      • 将地址分成4类: A类 B类 C类

      • A类相当于/8 B类相当于/16  C类相当于/24

    • 外网IP,内网IP

      • 外网IP在全球都有效

      • 内网IP只在某个地区使用:10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

      • 需要通过NAT将内网IP转换成外网IP

    • 分配外网IP

      • 分配IP是一个分层的过程

      • 最初是通过IANA进行分配,下一级就是ARIN  APNIC RIPE  LACNIC  AFRNIC,再下一级就是ISP或企业,再下一级就是通过DHCP分配给具体的用户


  • IP转发

    • 话题

      • 路由器如何转发一个包呢

    • 复习

      • 网络层的功能:能支持大规模的网络,支持不同的链路协议,充分使用链路带宽

    • IP转发

      • 同一个网络中的计算机IP地址都有相同的网络前缀

      • 路由器使用路由表来连接下一跳地址

    • 最长匹配前缀

      • 在路由表中的前缀可能会重叠

      • 为了解决这个问题,我们使用了最长匹配前缀来选择路由规则。也就是路由的时候选择最具体的地址作为下一条

      • 举例

      • 路由表:

      • 192.24.0.0/18   下一跳A

      • 192.24.12.0/22   下一跳B

      • 当IP地址为192.24.12.32需要路由时,会选择B作为下一条,因为这条路由规则有更长的前缀

    • 主机/路由器的区别

      • 路由器负责路由,将包送达目标地址

      • 主机负责向远端发送数据,通过最近的路由器送达目标

    • 主机转发表

      • 使用0.0.0.0/0作为默认路由

    • 最长匹配前缀的灵活性

      • 可以提供更短的前缀来给某些网段设置默认的行为

      • 可以给某个具体的地址设置特例

      • 所以这种方案的灵活性是很高的

    • 最长匹配前缀的性能

      • 使用层级结构来匹配更具体的路由规则

      • 查表更加复杂

    • 转发的其他方面

      • 转发并非仅仅改变地址

      • 减少TTL

      • 检测头部校验和

      • 给大包分段

      • 发送阻塞信号

      • 生成错误消息

      • 处理多种不同的选项



  • IP辅助协议 ARP  DHCP

    • 话题

      • 解决实际应用中的IP转发问题

        • 获取IP地址

        • 将IP地址映射到链路地址

    • 获取IP地址

      • 问题:第一次连接路由器的时候不知道自己的IP是多少

      • 方法:手动配置,通过DHCP获取

    • DHCP

      • 动态主机配置协议 Dynamic Host Configuration Protocol

      • 给内网计算机提供IP,并提供其他信息:网络前缀,路由器地址,DNS服务器,时间服务器等

    • DHCP协议栈

      • Ethernet IP UDP DHCP

      • 运行于UDP之上,使用67,68端口

    • DHCP分配地址

      • 问题:在没有地址的时候,如何向DHCP服务器发送消息?

      • 答案:通过广播消息,将消息穿戴到所有的节点

      • 广播地址是 255.255.255.255,以太网ff:ff:ff:ff:ff:ff,IPv6是ffff:ffff:...:ffff

    • DHCP消息

      • 第一步:DISCOVER。客户端通过广播向服务端发送消息

      • 第二步:OFFER。服务端应答

      • 第三步:REQUEST。客户端通过广播请求服务端

      • 第四步:ACK。服务端返回确认消息

      • 刷新DHCP契约的时候,可以在ACK之后直接向服务器发送REQUEST

      • DHCP协议支持多个镜像服务器来提高可靠性

    • 发送一个IP包

      • 问题:一个节点需要下一跳的链路地址来传递消息。如何将IP转换成链路地址呢?

    • ARP  Address Resolution Protocol  地址解析协议

      • 节点可以通过该协议将IP地址转换为链路地址

      • IP头:SourceMac | DestMac(通过ARP协议获取) | SourceIP | DestIP | Payload

    • ARP协议栈

      • Ethernet | ARP

      • 直接基于链路层,不需要服务器

      • 通过广播发送消息

    • ARP消息步骤

      • 第一步:REQUEST。谁有 IP 1.2.3.4?

      • 第二步:REPLY。我有,链路地址是 xx:xx:xx:xx:xx:xx

    • 发现协议

      • 帮助节点发现其他节点

      • 通常使用广播消息


  • 数据包分段

    • 话题

      • 我们如何将数据报大小不同的两个网络连接在一起

    • 数据报大小问题

      • MTU:最大传输单元

      • 数据报越大,传输效率越高

      • 解决方案:分段、发现(找出最适合的数据包大小)

    • IPv4分段

      • 路由器将数据包进行分段,而目标计算机会将数据包重新组合在一起

    • 分段字段

      • 在IPv4头部中和分段有关的字段有:Total Length | Identification | Fragment Offset | MF/DF control bits

      • MD表示More Fragment,DF表示Don‘t Fragment

    • IPv4分段过程

      • 发送方:路由器将太大的数据包进行分段,将IP头复制到片段中,调整片段的长度,设置片段的位置,除了最后一包都设置MF标志位

      • 接收方:利用Identification字段将片段连接在一起,利用DF标志位判断分段结束

      • 这种方式能够工作,并且即使链路层有重复帧,IP层也不会出错(因为有Offset字段)。但是分段会增加路由器的负担、增加丢包率、安全性差等,所以分段不是最好的办法

    • Path MTU Discovery

      • 自主去发现最合适的MTU,来避免分段。这是如今经常使用的方法

      • 当主机试图将太大的数据包进行传递时,路由器不会将数据报进行转发,而是通知主机,告诉它最合适的数据包大小

      • 这种方法看起来很复杂,但是能找到合适大小最快的方法了

      • 路径MTU可能会在传输的过程中发生变化

      • 通过ICMP实现

      • For IPv4 packets, Path MTU Discovery works by setting the Don‘t Fragment (DF) option bit in the IP headers of outgoing packets. Then, any device along the path whose MTU is smaller than the packet will drop it, and send back an Internet Control Message Protocol (ICMP) Fragmentation Needed (Type 3, Code 4) message containing its MTU, allowing the source host to reduce its Path MTU appropriately. The process is repeated until the MTU is small enough to traverse the entire path without fragmentation.

      • IPv4中,Path MTU Discovery的实现方式是这样的。首先主机在发送数据包的时候,在IP头中设置DF标志(Don‘t Fragment 不要分段)。数据包会经过一系列路由器,当某个路由器检测到MTU小于数据包大小时,这个路由器会将数据包丢掉,然后通过ICMP协议将Fragmentation Needed消息发送会主机,这条消息中就包含了路由器的MTU信息。这样,主机才能重新调整MTU来减少数据包的大小。这个过程一直会重复,直到数据包刚好能通过整条线路。




  • ICMP错误处理

    • 话题

      • 数据传输的时候如果发生了错误该怎么办呢?

      • 要能够找出错误

    • 互联网控制协议

      • 基于IP协议,协议号为1

      • 提供错误报告和测试机制。经常用于连通性测试

    • 当数据包发生错误的时候,路由器会丢包,并通过ICMP协议将错误报告返回给主机

    • ICMP数据包格式

      • 每个ICMP消息都有类型、代码、校验和

      • 通常将错误数据包的头部作为ICMP数据部分

      • 通过IP协议进行封装

      • 图示:[ IP头 [ ICMP [ 有问题的IP包头部 ] ] ]

    • ICMP消息种类

      • 目标无法到达

      • 超时

      • ping应答

    • Traceroute

      • IP头中包含了TTL,每一跳都会减1,防止死循环

      • traceroute利用了TTL的特性

      • 第一步:设置TTL为1,第一个路由器返回错误信息

      • 第二步:设置TTL为2,第二个路由器返回错误信息

      • 。。。

      • traceroute默认发送UDP包,根据返回的ICMP错误消息来判定跳点

      • 在linux中可以用traceroute -I来使用ICMP包进行路由跟踪



  • IPv6

    • 话题

      • IPv6是IPv4的将来,目前仍然在部署

    • 互联网增长

      • 至少有10亿的互联网主机

      • 但是我们现在在用32位的地址空间,最多只有40多亿的地址

    • IPv4地址用尽,IPv6可以拯救

      • 由IETF 1994开始,提供更大的地址空间

      • 1998年成为IETF标准

    • IPv6部署情况

      • 实时图表: https://www.google.com/intl/en/ipv6/statistics.html#tab=ipv6-adoption

      • 2014年3月部署率达到3%

    • IPv6

      • 提供更大的地址空间

      • 新的表示方法

        • 比如2001:0db8:0000:0000:0000:ff00:0042:8329可以简化成2001:db8::ff00:42:8329,注意中间只有两个冒号


      • 有很多小的改动

        • 头部流线型处理

        • Flow Label 可以将数据包分组

        • 更适合现代特性:移动网络,多播,安全性

    • IPv6转换

      • 如何部署IPv6?IPv6和IPv4是不兼容的

      • 有很多解决办法

        • 双IP头

        • IP协议转换

        • 通过隧道

    • IPv6隧道技术

      • 将IPv6封装到IPv4中:[ IPv4 [IPv6] ]

      • IPv6 -> IPv4 -> IPv6

      • 使用了隧道后,隧道可能需要经过多个路由器,但是在用户看来就只能感觉到只有两个路由器直接通信



  • NAT网络地址转换

    • 话题

      • 什么是NAT

    • 路由器不会看IP层以上的协议

    • 中间件

      • 处理IP层及以上的协议:比如防火墙、NAT

      • 优点

        • 能快速部署

        • 能控制很多主机

      • 缺点

        • 打破了协议层,有时候会产生奇怪的副作用

        • 如果网络流量大,NAT没什么优势

    • NAT中间件

      • NAT将内网的地址转换成外网的地址

      • 受到IP地址用尽的启发

    • NAT

      • 家庭中可能会有多台计算机,如果家庭路由器中使用了NAT,那么在ISP那里看起来好像只有一台电脑

    • NAT如何工作

      • 路由器中保存了 内网/外网 的映射表

      • 通常使用IP地址+TCP端口号

      • 路由表看起来如下:

      • 内网IP:端口外网IP:端口
        192.168.1.12:552344.25.80.3:1500
        192.168.1.13:123444.25.80.3:1501
        192.168.2.20:123444.25.80.3:1502
      • 需要端口级别的映射,因为外网IP只有一个

      • 从内网发送的时候,或者从外网接收的时候通过查表,将IP头中的地址和端口进行改写

      • 内网至少要向外网发送一个数据包才能激活NAT

    • NAT缺点

      • 连接被打断了,因为至少要内网向外网发送一个数据包才能激活NAT

      • 无法开启P2P服务器

      • 不能开启UDP

      • 有时候意外暴露内网IP

    • NAT优点

      • 减轻IP枯竭的压力

      • 容易部署

      • 功能实用

      • 缺点总能克服的