这是我在Coursera上的学习笔记。课程名称为《Computer Networks》,出自University of Washington。
由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了。这门课程在2013年左右录制,知识相对还是比较新的。覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细。学完这门课程之后对计算机网络会有比较深刻的了解。
本章详细讲解了网络层的一些概念。通常网络层是通过IP协议实现的,网络层是所有协议的核心。本章介绍了IP地址、协议、IPv6、ARP、DHCP等重要概念。
?概述
课程位置
已经到达网络层了。网络层基于链路层,路由器可以通过多个网络发送数据包
为什么要网络层
我们已经建立链路层了,所有的主机之间可以发送数据,为什么要需要网络层呢?
交换机的缺点
无法大规模应用:向后学习的时候要向整个网络广播,每个交换机要记录所有机器的地址
不同的链路技术之间,比如无线和有线之间无法通信
没有流量控制机制
网络层方案
大规模:层级结构
非均匀:IP
带宽控制:路由成本极低,QOS流量控制
话题
网络服务模型
IP 互联网协议
IPv6
NAT(中间代理)
路由算法
路由和转发的比较
路由的成本很大,因为涉及到广播
转发的成本稍微小一点
课程计划
先讲转发,后讲路由
网络层为传输层提供哪些服务呢
两种网络服务模型
数据报模型(无链接)
虚拟电路模型(面向连接)
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地址都有相同的网络前缀
路由器使用路由表来连接下一跳地址
最长匹配前缀
在路由表中的前缀可能会重叠
为了解决这个问题,我们使用了最长匹配前缀来选择路由规则。也就是路由的时候选择最具体的地址作为下一条
举例
路由表:
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是多少
方法:手动配置,通过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 (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是IPv4的将来,目前仍然在部署
互联网增长
至少有10亿的互联网主机
但是我们现在在用32位的地址空间,最多只有40多亿的地址
IPv4地址用尽,IPv6可以拯救
由IETF 1994开始,提供更大的地址空间
1998年成为IETF标准
IPv6部署情况
实时图表:
2014年3月部署率达到3%
提供更大的地址空间
新的表示方法
比如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:5523
44.25.80.3:1500
192.168.1.13:1234
44.25.80.3:1501
192.168.2.20:1234
44.25.80.3:1502
需要端口级别的映射,因为外网IP只有一个
从内网发送的时候,或者从外网接收的时候通过查表,将IP头中的地址和端口进行改写
内网至少要向外网发送一个数据包才能激活NAT
NAT缺点
连接被打断了,因为至少要内网向外网发送一个数据包才能激活NAT
无法开启P2P服务器
不能开启UDP
有时候意外暴露内网IP
NAT优点
减轻IP枯竭的压力
容易部署
功能实用
缺点总能克服的