文章目录
- 网络层的作用
- IP协议
- 协议报头格式
- 网段划分
- DHCP
- CIDR划分方案
- IP地址的数量限制
- 私有IP地址和公网IP地址
- LAN和WAN
- 路由
网络层的作用
前面学习了应用层和传输层,应用层的作用是为用户和应用程序提供网络服务,传输层的作用是提供端口到端口的通信服务。而网络层呢,其作用就是为了在复杂的网络环境中确定一个合适的路径,也就是在网络世界中找到目标主机。下面逐步介绍如何通过一个IP地址找到一台目标主机。
IP协议
协议报头格式
- 4位版本号:指定IP协议的版本,4表示的是IPv4
- 4位首部长度:IP头部的长度,单位是4字节,4个比特位表示的最大数为15,所以IP报头的最大长度为15*4=60个字节,最小为5*4=20字节。加粗样式
- 8位服务类型:3位优先权字段(已经弃用),4位TOS字段和1 位保留字段(必须置为 0)。4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个.
- 16 位总长度:数据报整体占多少个字节
- 16位标识:唯一标识主机发送的报文,也就是说每一次发送的报文的标识符都唯一。如果IP报文在数据链路层被分片了,那么每一个片里的标识符都是相同的,标识它们属于同一个报文。
- 3位标志字段:第一位保留。第二位置1表示禁止分片,此时如果报文长度超过MTU,IP模块就会丢弃报文。第三位置1表示有更多分片,如果分片,最后一个分片置为 0, 其他是 1. 类似于一个结束标记。
- 13位片偏移:表示数据包分片在原始数据包中的位置,以8字节为单位。是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置。接收方收到被分片的IP报文后,按照13位偏移量就可以将所有的分片排序,这样得到的整个报文就是正确的顺序。
- 8位生存时间:数据到达目的地后的最大报文跳数,一般是64。每经过一个路由器,TTL值减1,直到到达目的地或变为0时丢弃数据包。 主要用于防止出现路由循环。
- 8位协议:表示传输层使用的协议类型,例如,ICMP为1,TCP为6,UDP为17。
- 16位校验和:使用 CRC 进行校验, 来鉴别头部是否损坏.
- 32 位源地址和 32 位目标地址: 表示发送主机和接收主机.
- 选项字段(不定长, 最多 40 字节)。
网段划分
IP地址分为两个部分:网络号和主机号
- 网络号:保证相互连接的两个网段具有不同的标识
- 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
- 不同的子网其实就是把网络号相同的主机放到一起.
- 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
- 网络号用来标识网络中的某一个子网,主机号则是用来标识该子网中的某一台主机。更简单的,网络号指的是的一段范围,主机号指的是这段范围内的某台主机。
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同。
DHCP
DHCP技术通过服务器与客户端之间的交互,实现了IP地址和其他网络配置信息的动态分配。
工作原理:
DHCP的工作原理通常包含四个步骤:发现、提供、请求、确认。
- 发现:当设备(手机或者电脑)加入网络时,它会广播一条DHCP发现消息,寻找可用的DHCP服务器。
- 提供:DHCP服务器收到发现消息之后,会准备一个包含可用IP地址和其它网络配置如子网掩码等的DHCP提供消息,并将这个消息发送给请求的设备
- 请求:设备可能收到多个提供消息,会从中选择一个,并发送一个DHCP请求消息给对应的DHCP服务器,确认接受该服务器提供的IP地址等信息。
- 确认:DHCP服务器收到上面的请求后,再发送一个DHCP确认消息给你的手机,正式分配IP地址,设备收到后就可以正式连接网络了。
简单来说就是,DHCP,能够自动的给子网内新增主机节点分配 IP 地址。一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器.
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示
随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;显然,这种分类方式不太灵活。
针对这种情况提出了新的划分方案, 称为CIDR
CIDR划分方案
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个 32 位的正整数. 通常用一串 “0” 来结尾;
- 将 IP 地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关
其中,IP地址中的主机地址全0表示的就是这个局域网本身,全1就表示广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
此外, 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1
- 关于本地环回地址:
主要用于本地网络接口的测试和诊断。其实就是自己发送数据给自己,中间并没有经过局域网和其他网络。
CIDR 在一定程度上缓解了 IP 地址不够用的问题:提高了利用率, 减少了浪费(可以根据主机数量来增加主机号的位数)
IP地址的数量限制
IPv4下的IP地址只有32位,大概就是43亿左右。假设每台主机都要有一个唯一的IP地址,那么就意味着一共只有 43 亿台主机能接入网络?事实上,由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.
CIDR 虽然在一定程度上缓解了 IP 地址不够用的问题,但仍然不够用. 这时候有三种方式来解决:
- 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
- NAT 技术:通过允许多个内部设备共享一个或多个公共IP地址来访问互联网,从而节省了公网IP地址的使用。也就是说,不同的局域网中IP地址可以是一样的。
- IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及
私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet (公网)上, 理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
- 10.*,前 8 位是网络号,共 16,777,216 个地址
- 172.16.到 172.31.,前 12 位是网络号,共 1,048,576 个地址
- 192.168.*,前 16 位是网络号,共 65,536 个地址
包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP);
上图中的WAN口IP就是路由器所在网络的地址
- 一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP).
- 路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中.
- 不同的路由器, 子网 IP 可以是一样的(通常都是 192.168.1.1). 子网内的主机
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了.
- 家用路由器的WAN口地址通常是运营商的子网IP地址,运营商的WAN口地址通常就是公网。
- 子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation,网络地址转换).
- 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
LAN和WAN
LAN口地址和WAN口地址在路由器中扮演着不同的角色,分别用于局域网(LAN)和广域网(WAN)的连接与通信。注意,局域网和广域网的概念是相对的,我们认为一个路由器的子网可以是称为一个局域网,路由器“外面”的网络可以称为广域网,但路由器又可能处于运营商路由器的子网构建的局域网中。
LAN口地址通常用于局域网内部的设备之间的通信,WAN口地址,即广域网接口地址,是路由器从互联网服务提供商(ISP)处获得的公网IP地址。这个地址用于路由器与外部网络(如互联网)之间的通信。
路由
路由其实就是利用目的IP在复杂的网络中找到目标主机,这个过程类似于问路。
通常,路由的过程会经过多个路由器,我们把在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输称为"一跳"。
当IP数据包到达路由器时,路由器会先查看目的IP。路由器维护了一张路由表,表中有着与该路由器所处同一个网络中的其它路由器的IP地址以及子网掩码。如果目的IP与该表中的某个子网掩码与上之后恰好等于其对应的网络号,那么说明这个IP数据报下一跳就去该路由器的子网中继续找。如下图所示。
- 在linux中,路由表可以使用route指令查看
如果目的 IP 命中了路由表, 就直接转发即可,路由表中的最后一行即default
,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。