因特网协议(Internet Protocol, IP)是Internet的核心协议之一, 工作在网络层.IP协议提供节点间的寻址,路由以及顺序控制, 流量控制等服务.
IP协议分为IPv4和IPv6两个版本, 本文主要介绍目前被广泛应用的Ipv4协议.
路由器是网络层的重要设备, 它用于连接两个逻辑上独立的网络.在局域网的介绍中我讨论了使用交换机或集线器将多台主机连接起来的情况.两台交换机之间也可以连接, 但是连接到不同交换机的主机之间通信和连接到同一个交换机的两台主机之间的通信在逻辑上没有区别.
当使用路由器互联时情况就不同了.路由器A与路由器B互联, 路由器A上的主机试图与路由器B上的某台主机通信时, 路由器将拦截数据报并根据规则进行转发.
全球存在着各式各样的网络, 它们使用不同协议的硬件地址,要使这些异构网络能够使用硬件地址互相通信就必须进行非常复杂的硬件地址转换工作.
IP协议使用统一的IP地址标识网络和主机, 使得不同网路互联组成巨大的国际互联网.
IP的协议数据单元(PDU)称为数据报(packet), 一个 IP数据报由首部(header)和数据(data)两部分组成.
首部的前一部分是20bytes的固定首部, 其包含源IP地址, 目的IP地址等必须字段.首部的后半部分是长度可变的可选字段.
IP数据报的大小可能超过一个帧可能容纳的范围, 分片技术可以将IP数据报可以分成多个帧发送, 接收方根据数据报首部的信息重新进行排序.
IP协议的另一个重要功能是进行路由选择, 因为这一主题篇幅较长请移步一文
IP地址
IP地址是因特网为主机编址的方式, 由32位二进制码组成.
我们常见的是IP地址的点分十进制表示, 即8位二进制码变为一组转换为十进制数表示.
192.168.0.1 -> 11000000 10101000 00000000 00000001
8位二进制表示的最大整数为255, 所以点分十进制表示中每个数字的取值为[0,255]
IP地址由网络号和主机号两部分组成, 根据网络号和主机号所在的位不同IP地址可以分为5类.
每类地址都以一个特殊的序列开头, 用以识别地址的类型从而区分网络号和主机号.
类别 | 网络号 | 主机号 | 二进制标志 | 十进制范围 |
---|---|---|---|---|
A类 | 前8位 | 后24位 | 0* | 1.0.0.0 - 126.0.0.0 |
B类 | 前16位 | 后16位 | 10* | 128.0.0.0-191.255.255.255 |
C类 | 前24位 | 后8位 | 110* | 192.0.0.0 - 223.255.255.255 |
D类 | - | 多播地址 | 1110* | - |
E类 | - | 保留 | 1111* | - |
网络号有两个保留号码:
全0: 表示本网络上的任意地址, 常用于表示默认地址等
127: 环回测试, 用于本机进程之间的通信
主机号同样有两个保留号码:
全0: 本主机所在网络上的任意地址
全1: 广播地址, 表示网络中所有主机
特殊的IP地址:
0.0.0.0
代表任意的地址, 用来设置默认地址时使用127.0.0.1
本地环回地址, 用于本机进程之间通信时使用
传统的分类IP地址使用不灵活, 无法应对局域网下拥有多个子网的情况, 且存在着地址空间的严重浪费.IPv4引入了子网概念试图改善这些问题.
IPv4的子网掩码(subnet mask)是一个32位的二进制序列, 子网掩码左侧为1右侧为0, 不存在0和1交叉的情况.
将子网掩码与IP地址进行位与运算, 即可得到IP地址的网络号.也就是说, "1"所在位对应的IP地址中的网络号部分, "0"对应主机号部分.
子网掩码也可以像IP地址一样采用点分十进制记法,更方便的是采用无类别域间路由(Classless Inter-Domain Routing, CIDR)表示法.
CIDR在IP地址后加上子网掩码中"1"的位数, 也即网络号位数:
192.168.1.1/24 => musk:255.255.255.0
从分类IP的角度来看, 它将IP地址的主机号分为了子网号和主机号两部分.
每个类别的IP地址有拥有默认的子网掩码, 默认的子网掩码表示没有划分子网,网络号位数与类别指定的相同.
类别 | 掩码 | CIDR |
---|---|---|
A | 255.0.0.0 | 8 |
B | 255.255.0.0 | 16 |
A | 255.255.255.0 | 24 |
再来看一下CIDR的全名"无类别域间路由", 所谓"无类别"是指子网掩码可以脱离分类IP定义的网络号和主机号独立指示网络号.
没有了分类IP的限制, 我们可以更充分的利用IP地址资源.传统的A类IP地址只有8位网络号和24位主机号(约1.6亿个), 但几乎不存在拥有这么多主机的网络.使用CIDR可以设置更常用首位为0(传统A类地址), 24位网络号8位主机号的IP地址.
在多层网络中, 每一层都可以独立设置子网掩码将主机号分为子网号和主机号两部分, 子网划分更加自由.
CIDR的另一个好处就是可以进行前缀路由聚合, 16个前20位都相同的"/24"网络可以聚合成一个"/20"网络, 即所谓超网降低了路由和广播的开销.
ARP协议
不管网络层使用的什么协议, 在传送数据帧时必须使用硬件地址(MAC地址).地址解析协议(Address Resolution Protocol, ARP)协议的功能就是通过主机IP地址来寻找对应的MAC地址.
每个主机都设有一个ARP高速缓存(ARP cache), 里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表.
当主机A欲向本局域网上的某个主机B发送IP数据报时, 就先在其ARP高速缓存中查看有无主机B的IP地址.如有, 就可查出其对应的硬件地址, 将MAC帧发往该硬件地址.
当找不到对应的MAC地址时, 主机A将会广播ARP请求帧(ARP request), 只有IP对应的主机B收到该帧时才会发出响应(ARP response).
当主机A试图向不在本局域网的主机发送IP数据报时, ARP请求返回的通常是出口路由器的MAC地址, 数据报由路由器转发.
实际上,现在办公室局域网中一般为多台主机直接和路由器连接, 不使用交换机.主机发出ARP请求得到总是得到路由器的MAC地址, 局域网内的数据报也都由路由器转发,这种功能成为ARP代理.
ICMP协议
互联网控制消息协议(Internet Control Message Protocol, ICMP)用于为主机和路由器提供有关差错控制报告的支持, 是网络层的重要协议.
ICMP报文作为数据段加上IP报头,作为IP数据报进行传输. 因为使用IP数据报进行传输, ICMP报文的交付不是可靠的.
ICMP报文分为ICMP差错报告报文和ICMP询问报文.ICMP报文前4个字节的字段是固定的: 类型, 代码和校验和.
ICMP差错报告报文拥有8个字节的固定字段, 其后装载了出错IP数据报的首部和数据的前8个字节.
ICMP差错控制报文可以报告错误包括:
目标不可达: 如果在IP数据报的传送过程中, 路由器发现网络出现拥塞, 则路由器将向源主机发出“目标不可到达”的ICMP报文
源点抑制(Source quench): 若路由器或目的主机缓冲资源耗尽或即将耗尽而必须丢弃数据报, 则每丢弃一个数据报就向源主机发送一个ICMP源抑制报文
TTL超时: 一个IP包从源节点出发时, 其TTL值被设定一个初始值, 经过一跳一跳的传输, 如果这个IP包的TTL降低到零, 路由器就会丢弃此包并发出"TTL超时"差错报告报文
分片重组超时
路由重定向(redirect): 当一台主机向自己的缺省网关发送一个需要转发的数据包时, 如果该网关路由器查找路由表发现有更好的路由, 就会向源主机发出“重定向”的ICMP报文
参数错误
除了下列的例外情况外, 其它错误情况都将发送差错报告报文:
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文.
对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文.
对具有多播地址的数据报都不发送 ICMP 差错报告报文
对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文
回送请求(echo)是最著名的ICMP询问报文之一, 它被程序ping(Packet InterNet Groper)所使用用于检测两主机之间是否联通.
除此之外ICMP询问报文还有时间戳请求, 掩码请求等.
组播与IGMP协议
前文提及了两种通信方式:
单播(unicast): 端对端通信
广播(broadcast): 一台主机对网络中所有主机发送消息
组播(multicast)又称多播是一台主机向一个多播组内所有主机发送数据报的通信方式.同一个多播组成员共享一个多播地址, 它们可以分布在不同的子网上.多播组成员是动态的, 一台主机可以随时加入或退出某个多播组.
多播消息在每条网络链路上只需传递一次, 而且只有在链路分叉的时候, 消息才会被复制.相对于多次单播多播极大节省了带宽资源, 又避免了广播无法向分布在多个网络中的特定主机发送消息的弊端.
多播地址使用D类IP地址224.0.0.0~239.255.255.255:
局部链接多播地址: 224.0.0.0~224.0.0.255, 这是为路由协议和其它用途保留的地址, 路由器并不转发属于此范围的IP包;
预留多播地址: 224.0.1.0~238.255.255.255, 可用于全球范围(如Internet)或网络协议;
管理权限多播地址: 239.0.0.0~239.255.255.255, 可供组织内部使用, 类似于私有IP地址, 不能用于Internet, 可限制多播范围.
多播地址只能被用于目的地址, 不能被用作源地址.
因特网组管理协议(Internet Group Management Protocol, IGMP)是多播的管理协议, 相当于ICMP协议在单播中的作用.
目前常用的为IGMPv3协议, 在IGMPv1中主机可以加入多播组, 路由器使用定时器对组员取消预定.IGMPv2协议则允许多播组内的主机主动退出多播组.
这两个版本的协议都要求接收者必须加入多播组, 发送者不必加入多播组, 任何主机都可以向任意多播组发送信息.IGMPv3协议则允许接受者管理发送者, 仅接受特定发送者的消息或者屏蔽特定发送者.
IGMPv3协议定义了两种报文: 成员关系查询和成员关系报告.成员关系查询报文一般由多播路由器发送, 有3个子类型:
一般查询: 查询与路由器相连的网络上有哪些组, 每个组在当前网络上有哪些成员
指定组查询: 查询与路由器相连的网络上有哪些主机属于指定组
指定组和源的查询: 查询与路由器相连的网络上有哪些主机属于指定组, 且允许接受指定源的信息
查询报文中字段包括:
类型(Type)
最长响应时间(MRT)
校验和
组地址
S标志
查询者稳健型变量(QRV)
查询者查询间隙码(QQIC)
源地址
报告报文中包括字段:
类型
校验和
组记录数量
组记录
DHCP协议
动态主机配置协议(Dynamic Host Configuration Protocol, DHCP) 用于为局域网内的主机分配IP地址.DHCP协议用UDP协议通信, 服务器默认使用67端口, 客户端默认使用68端口.
DHCP有三种机制分配IP地址:
自动分配方式(Automatic Allocation), DHCP服务器为主机指定一个永久性的IP地址, 一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后, 就可以永久性的使用该地址.
动态分配方式(Dynamic Allocation), DHCP服务器给主机指定一个具有时间限制的IP地址, 时间到期或主机明确表示放弃该地址时, 该地址可以被其他主机使用.
手工分配方式(Manual Allocation), 客户端的IP地址是由网络管理员指定的, DHCP服务器只是将指定的IP地址告诉客户端主机.
当DHCP客户端与服务器不在同一个子网上, 就必须有DHCP中继代理来转发DHCP请求和应答消息.
DHCP中继代理接收到DHCP消息后, 重新生成一个DHCP消息, 然后转发出去.在DHCP客户端看来, DHCP中继代理就像DHCP服务器;在DHCP服务器看来, DHCP中继代理就像DHCP客户端.
VPN
虚拟专用网络(Virtual Private Network, VPN)是一种在公网上加密数据报进行通信, 实现逻辑上的专用网络.
VPN常用的应用场景有:
内联网: 部门A和B的私有网络在公司内网上建立虚拟专网连接
外联网: 在两个地点的部门A和部门B通过VPN在公网上建立连接
远程接入: 出差的员工使用在国际互联网上建立的VPN登录公司内网
VPN将内网数据报带首部加密, 加上新的公网数据报头组成新的数据报在公网传输.接收方接到公网去掉数据报首部, 取出原内网数据报在内网上传输.
NAT协议
网络地址转换(Network Address Translation, NAT)技术是在内网中使用内部地址通信, 在内部主机需要和外部主机通信时由网关(一般为出口路由器)将IP报头中的内部源地址转换为公网地址, 在收到外部IP数据报时则对目标地址进行相应转换.
NAT协议有3种实现:
静态NAT(Static NAT): 内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址
动态NAT(Pooled NAT): 在出现内部主机与外网建立TCP连接等需要时为其分配一个公网地址, 完成后回收地址
端口转换(Network Address Port Translation, NAPT): 将多个内部设备映射到同一个公网IP地址的不同TCP或UDP端口上.
内部地址仅需要保证在内网中唯一, 也就是说在不同的网络中允许使用重复的内网地址.结合动态NAT或端口转换NAT机制允许较多主机共享较少的公网IP地址缓解了IP地址不足的问题.
NAT协议同时隐藏了内网的细节, 提高内网安全性.通过NAT路由器的通信必须由内网主机发起, 因此内网主机不能作为服务器, 因为因特网上的用户无法请求专用网内的服务器提供服务.