计算机网络-网络层

Posted by 小拳头 on Wednesday, November 4, 2020

网络层的分组是数据报, 一般由路由器把报文段封装成数据报, 或者从数据报提取报文段给运输层.

概述

转发与路由选择

  • 转发: 分组到达路由器的输入链路时, 路由器把该分组移到合适的输出链路.
  • 路由选择: 根据路由选择算法, 网络层决定分组从发送方到接收方的路径.

路由器根据**路由表(forwarding table)**转发分组, 如下图所示, 分组的首部值会映射到某一个输出链路. 名词使用上我们通通讲网络层(第三层)的分组交换机统称为路由器.

虚电路和数据报网络

仅在网络层提供连接服务的计算机网络叫虚电路网络(Virtual-Circuit), 仅在网络层提供无线连接服务的计算机网络叫数据报网络(datagram network).

虚电路网络

因特网是数据报网络, 但是许多其他网络结构(ATM, 帧中继体系结构)是虚电路网络. 虚电路组成如下:

  1. 源和目的主机之间的路径
  2. 沿该路径每段链路的VC号
  3. 沿该路径每台路由器的转发表表项, VC号由路由器中的转发表决定.

虚电路主要有三个阶段:

  1. 虚链路建立. 网络层决定发送方接收方路径, 为每条链路决定VC号, 并在路径中的路由器转发表中添加表项.
  2. 数据传送. 分组在虚电路流动.
  3. 虚电路拆除. 发送方通知网络层终止虚电路, 网络层遍通知接收方结束呼叫, 并更新路径上路由器的转发表.

虚电路的概念最早来自于电话线的连接. 对比运输层的连接, 可以发现虚电路的连接是涉及整个路径的, 路径上所有的路由器都参与虚电路的建立, 并且都知道经过它的所有虚电路.

数据报网络

端系统为分组加上目的端系统的地址, 并把分组推进网络中. 每个路由器根据分组的目的地址转发分组, 转发表保存了目的地址到链路接口的映射. 保存精确的所有IP地址(假设32位)是不可能的, 所以路由表是根据最长前缀匹配规则来匹配这个映射.

路由器工作原理

路由器体系结构如下:

输入端口

将输入的物理链路和路由器连接, 完成查找功能, 控制分组从输入端口转发到路由选择器. 这里的端口指路由器的物理端口, 而不是嵌套字的软件端口.

交换结构

将输入端口, 输出端口连接, 也就是路由器中的网络.

输出端口

从交换结构接收分组, 并通过输出链路转发(第六版中文书上翻译错成了输入链路)

路由选择器

执行路由选择协议, 维护路由选择表和连接的链路状态信息, 为路由器计算转发表.

何处出现排队

输入输出端口都有队列, 所以都有可能发生排队. 如果队列过长, 耗尽了路由器的缓存空间, 就有可能丢包.

因特网转发与编址

网络层三大组件:

  1. IP协议
  2. 互联网控制报文协议ICMP
  3. 路由选择

数据报格式

IPv4的数据报格式如下:

  • 版本号: 规定IP协议版本, IPv4是4, IPv6是6
  • 首部长度: 指明首部的长度, 确定数据部分从哪里开始
  • 服务类型: 区分不同类型的IP数据报
  • 数据报长度: IP数据报的总长度(首部字段+数据部分)
  • 表示/标志/片偏移: IP分片相关, 表示分片的开始与结束. IPv6中没有, 这也意味着IPv6没有分片.
  • 寿命(Time-To-Live, TTL): 确保数据报不会长时间在网络中循环, 跳一个路由器就会减1, TTL为0时数据包就被丢弃了,, 路由器就会发送ICMP通知源主机. 这个地方准确的说是每处理1秒都应该减1, 但实际上处理datagram的时间通常小于一秒,所以协议规定了就算没有1秒也应当减1, 也就可以近似每一跳减1了.
  • 协议: 指示数据报的数据部分应该给哪个运输层协议, 运输层实验也可以看到UDP对应17, TCP对应6. 将网络层和运输层绑定了起来.
  • 首部校验和: 校验数据报的比特错误. IP校验不包括数据位.
  • 源地址/目的地址: 顾名思义.
  • 选项: 允许IP首部扩展, IPv6中去掉了.
  • 数据: 会被交付给运输层的TCP/UDP. 也可能承载ICMP报文等等.

IP数据报分片: 链路层承载的最大数据量叫做最大传送单元MTU, IP数据报需要比MTU小, 故分片. 而重新组装的工作交给端系统.

IPv4

32bits, 4byte, 一共有$2^{32}$个可能的IP地址(约40亿). 在下图中, 左边三个主机构成一个LAN, 3个主机接口和一个路由器接口构成一个子网(subnet), 这个子网最左侧24比特相同, 地址可以由233.1.1.0/24来表示, 这个24就是子网掩码(network mask), 其对应的高比特位就是前缀. 因特网地址分配策略叫CIDR, 可以子网掩码是可变的, 并且不局限于8, 16, 24. CIDR之前, IP根据分类编制, IP地址的网络部分长度被限制在8, 16, 24比特(主机号就是32减网络号), 成为A, B, C类网络, 所对应的首位为0, 10, 110, 全为0做网络号, 全为1做广播号, 用A类举例, 那么实际的ip范围就是1.0.0.1~126.255.255.254. 除此之外还有D类地址(多播地址), 首位是1110, 范围224.0.0.1~239.255.255.254; E类地址为保留地址, 首位为11110, 范围是240.0.0.1~254.255.255.254

**接口(interface)**指的是路由器或者主机与物理链路的边界, 当我们抽象思考的时候, 应该把这个接口看作是ip.

子网不仅指主机和路由器接口之间的网络, 也可以是路由器和路由器之间. 为了确定子网, 可以分开主机和路由器的接口, 产生隔离的网络岛, 使用接口隔离这些网络的端点. 如下图中R1和R2之间的223.1.9.0/24, R 2和R3之间的223.1.8.0/24, R1和R2之间的223.1.7.0/24, 以及主机端口和路由器之间的子网. 可以看出一共有6个子网.

组织如何为设备分配地址块, 设备如何从组织中分配到一个地址?

  1. 获取一块地址, 一般是从isp手中买一组地址.
  2. 获取主机地址: 配置路由器各个接口的IP地址, 现在通常通过DHCP(动态主机配置协议), 使主机动态地获得一个IP地址. 一般有一个4次握手的过程, 让DHCP服务器向主机推荐IP地址, 掩码, IP地址租用期等东西, 这里直接会用广播地址255.255.255.255, 使得主机可以在多个DHCP提供者中进行选择.
  3. 网络地址转换(NAT(Network Address Translation)): 用下图过程解释, 实际上就是通过一个NAT转换表, 将WAN的ip和端口映射到LAN的ip和端口. 一方面解决了地址短缺的问题, 一方面隔离LAN和WAN. 这也是为什么有的人需要在路由器上实现内网穿透, 内网穿透本来也就叫NAT穿透. 这里我想提一点, 就是NAT既然改变了ip地址和端口, 那么TCP的时候校验字也就改变了, 所以NAT其实也应该去重新计算校验和.
  4. UPnP: 解决了P2P的主机在NAT的LAN中的问题, 时LAN中的主机也能变成服务器, 其实就是把一个WAN口的ip和端口和这个做服务器的主机的ip和端口建立一个映射关系.

因特网控制报文协议(ICMP)

通常被认为是IP的一部分, 但体系结构上是IP之上. 但是通常认为是网络层协议. 头部有8个byte, 用type和code就可以知道这一个ICMP的功能.

通常有如下的差错报告或询问.

IPv6

IPv6地址长度变成了128bit, 长这样2001:0D12:0000:0000:02AA:0987:FE29:9871, 每16位分一段, 分为8段, 暂时不研究这个.

路由选择算法

与主机直接连接的路由器叫default router, 或者first-hop router. 路由选择的过程中, IP只知道下一跳的地址. 网关指的是**自治系统(AS)**中, 向本AS之外的路由器转发分组的路由器.

广播和多播路由选择

广播

从一个源节点向其他节点发送分组. N次单播就是一种实现方法.

多播

从一个源节点向其他网络节点的子集发送分组的副本, 提供批量传输的数据, 常用语交互式游戏, 流媒体, 数据供给等. 一般由间接地址(address indirection)编址,这种表示一种接收方的单一标识就是D类地址, 关联多播组. 通过**IGMP(因特网组管理协议)**来管理

实验

IP

直接用的log. 分别用traceroute发送了56/2000/3500byte的数据报. 从192.168.1.102发送, 可以看到IP有中的protocal对应的是0x01, 代表了ICMP.

下图的ip分段了, 从flag中就可以看出, 而offset = 0代表了它是第一个分段的数据报, ip的总长度是1500byte, 1514这个多出来的14byte是以太网的头.

而ICMP的data实际上就是我们设置发送的数据报长度, 如果我理解正确的话, 3500指的是了除ICMP头以外的所有东西, 因为最后的总长度是3508. 分段也可以查看到, 1480就是1500 - 20的ip头. 中括号内的内容不是首部字段的信息, 而是wireshark自己解析出来的信息.

NAT

分两个方向抓包, 以路由器为界, ISP方向抓一次, home端再抓一次. 对比三次握手后的第一个HTTP请求, 可以看到在LAN端的发送ip/端口是192.168.1.100/4335, 而在ISP端就变成了71.192.34.104/4335. 实际上就是通过NAT转换表将LAN到WAN进行了映射.

ICMP

mac系统ping -c 10 gaia.cs.umass.edu, ping10次, 下面是用的原实验的log. 我们会发现ICMP没有端口号, 因为ICMP是网络层协议, 用IP承载, 不需要传输层的TCP或者UDP, 不需要指明端口.

下面是traceroute的抓包, 因为traceroute的TTL会逐渐增加, 所以前面可能发生TTL变为0的情况. 返回的ICMP中包含了普通的ICMP响应没有的IP头.

DHCP

为了测试, 先释放了当前ip, 我们的主机ip变成0.0.0.0, 然后再重新取得ip, renew2次. 然后再次release ip, renew ip.

首先就可以的看到, DHCP跑的是UDP. (只是从运输层的信息判断是什么协议不直观, 从网络层ip头的protocol来看其实一目了然). 获取IP经历了Discover/Offer/Request/ACK四个阶段. host一直使用68端口, 而server使用67端口. (offer其实可能是单播, 见参考8). 从Transaction ID可以判断出是否是一组DHCP请求. 从ACK中可以查到IP Address Lease Time等信息. 而成功ACK后, host也有了自己的IP, 并确认使用这个IP, 即使offer是单播回复, 也需要ACK之后才能确认使用.

参考

  1. 计算机网络-自顶向下方法(第6版)
  2. Computer Networking A Top-Down Approach(7th edition)
  3. 作业
  4. 习题答案
  5. wireshark实验
  6. 对于Ping的过程, 你真的了解吗?
  7. 程序羊-计算机网络面试题总结
  8. DHCP offer报文到底是单播还是广播?车小胖的回答

comments powered by Disqus