计算机网络 - IP
结果发现这一块的笔记早就有人写了,而且很全,就像学校期末考试前看的学长们开源的资料一样。那好吧,我就权当复习了
按照顺序来说,这一篇应该写网络层:数据平面,其功能是根据转发表,将到达路由器的输入链路之一转发到输出链路之一。我最后还是把路由器的部分跳过了,只选择写一些后面的 IP 部分
IPv4 数据报
版本:IP 协议版本
首部长度:有选项字段,IP 首部长度可变
服务类型:区分 IP 数据报的类型,比如实时数据包和非实时数据包,识别这些对于网络管理是有必要的
数据报长度:首部 + 数据的总长度
标识、标志、片偏移:和 IP 分片有关字段
寿命:TTL,保证数据段不会再网络中循环,每经一条路由器该字段减一
上层协议:顾名思义
首部检验和:首部每两字节做一个数,加起来取反(毕竟 IP 不一定运载 TCP)
IPv4 编址
主机与物理连接的边界称为接口,IP 要求每台主机和路由器的接口拥有自己的 IP(不考虑 NAT)。从技术上讲,不是一台主机/路由器一个 IP,而是一个接口关联一个 IP
每个 IP 地址长 32 位,用点分十进制记法(说白了就是分成四个 8 位的数,用十进制表示后再用 . 连起来)
IP 地址不是随便选择的,一个接口的 IP 的一部分由其子网决定。假设子网分配到了 223.1.1.0/24,其中 /24 称为子网掩码,那么子网内的 IP 前 24 位是固定的,范围在 223.1.1.0 ~ 223.1.1.255
一个路由器和一群主机可以形成一个子网,路由器之间的连线也可以形成一个子网
255.255.255.255(全是 1)是 IP 广播地址,会向子网所有主机交付保温,路由器也肯选择性地发给其他子网(一般不会)
子网的 IP 是网络管理员联系 ISP(因特网提供商),ISP 再分配一块地址给子网。ICANN 是一个全球性的权威机构,负责管理 IP 分配,解决域名纷争,管理 DNS 根服务器,它向 ISP 和其他组织分配 IP 地址块
DHCP 动态主机配置协议
为新连入子网的主机自动分配 IP。网络管理员可以配置 DHCP 使某给定主机可以得到一个相同的 IP,也可以每次为主机分配一个临时 IP,即每次与该网络连接时,IP 都不一样。并且 DHCP 也允许一台主机得知子网掩码,默认网关(第一跳路由器 IP),本地 DNS 服务器 IP
DHCP 是即插即用的,也被称为零配置协议。考虑简单的情况,一个子网有一台 DHCP 服务器,没有则需要一个 DHCP 中继代理(一般路由器)
下面是一台新到达的主机获得 IP 的步骤:
客户在 UDP 向端口 67 发送 DHCP 发现报文,IP 数据包首部的源 IP 设为 0.0.0.0(这时候主机还没有分配到 IP),目的地址为广播地址 255.255.255.255
DHCP 服务器收到了 DHCP 发送报文,同样使用广播地址发送 DHCP 提供报文,包含报文事务 ID,向客户推荐的 IP,网络掩码和 IP 地址租用期(IP 有效的时长,一般几个小时或几天)
新来的客户可能受到很多服务器的提供报文(子网内可能有多个 DHCP 服务器),选择一个后,并向那个服务器发送 DHCP 请求报文响应,回显配置参数
服务器发送 DHCP ACK 报文
收到 DHCP 报文后,分配就完成了
从移动性的角度看有一大缺陷,当主机移动到一个新的子网,其 IP 地址就会发生变化,意味着其 TCP 连接需要重新建立
NAT 网络地址转换
NAT 使得路由器在外界看来不像是路由器,而像是一台只有一个 IP 的单一设备。这个单一设备的 IP 是由 ISP 的 DHCP 所提供。路由器内部也运行着一个 DHCP 服务器,为其内部的主机提供地址
举一个例子来看看 NAT 是如何工作的:假如在一个家庭网络主机 10.0.0.1 请求 IP 为 11.4.51.4 的某台 Web 服务器,指定了端口号 2233 将数据报推向网络,NAT 路由器收到这个数据报,将源 IP 地址替换为其广域网一侧的接口的 IP 19.19.8.10,替换源端口号为 3322,并向 NAT 转换表添加一个表项。Web 服务器收到了这个修改后报文,并向修改后的 IP 和端口返回响应报文。该报文到达路由器时,路由器使用 NAT 转换表,将目的 IP 和目的端口号还原成 10.0.0.1 和 2233,再发送回这个主机
体系结构纯化论者并不喜欢这个方法,因为它跨越了两个本应解耦的层(网络层的组件修改了运输层的首部信息)。但是不可置否的是,NAT 已经成为了因特网的一个重要组件:中间盒。其不再是执行传统的转发,而是执行 NAT、负载均衡、防火墙等功能;还可以使用更综合的方式实现转发
IPv6
IPv6 删除了分片,首部检验和以及选项字段,并引入了“流”的概念,虽然流量类型和流标签(表示优先权用的)的概念有点似曾相识了
跳限制和 TLL 是一个意思
有一种广泛采用的 IPv4 迁移到 IPv6 的方法还是挺想写的。IPv4 的路由器的固件不支持 IPv6,硬件实现的转发表装不下 128 位的 IPv6 地址,还有处理器速度跟不上的问题(想想 Gbps 级别的流量,如果不在纳秒级完成操作缓存会爆的,IPv6 地址增长 4 倍必然拖慢速度),数十亿台的网络设备不可能在一朝一夕改变的
所以有一种叫做建隧道的方法:隧道两端的节点支持 IPv6,对于中间仅支持 IPv4 的网络,我们将 IPv6 的数据报整个作为载荷,装进 IPv4 的数据报中