第五章 网络层(二)
Internet中的网络层
- Internet 综述
- IP 协议
- IP 控制协议
- IP 路由
- IPv6
Internet 综述
- Internet的发展
- 1970年:第一个分组交换网ARPA诞生,连接了四所大学
- 1972年:ARPA网有40个网点,应用有e-mail、rlogin、FTP,至此,网络的核心技术产生并开始研究网络的互联
- 1974年:产生了两个基本的Internet协议:IP协议和TCP协议
- 80年代后期:产生了NSF网,它连接了美国所有的超级计算中心,并逐步取代了ARPA网
- 技术特点
- 使用TCP/IP协议
- 因特网是怎样把全球不同的网络互联起来的呢?
- 它建立了一个虚拟的网络,他不管这个世界上有多少网络,它提供一个世界语
- 你这台机器在你自己的网络传输信息的时候,那就用自己的网络协议去传输,如果你要跟其他的网络交换信息的话,那你要把你这个信息变成世界语的格式来传递,那么这个世界语就是TCP/IP协议
- 网络互联结构:各网之间一般采用路由器加专线连接
- 各个网络之间是怎样互连起来的呢?
- 网络1+路由器—专线—-路由器+网络2
- 所有的路由器都认识TCP/IP
- 路由器既可以理解子网络的语言,也认识世界语言(TCP/IP)
- 层次结构的域名及网络管理
- 这么大的一个网络,他是怎样确定他的网络资源呢?请求网络就是为了获取网络的资源
- 因特网给他所有资源规定了一个唯一命名的规则-这个名字就是域名
- 怎样保证域名的唯一性呢? 采用的就是层次结构
- 分布式的管理模式,没有一个Internet管理中心
- 开发了通用的应用技术
- 使用TCP/IP协议
- TCP/IP分层模型
- 应用层(应用层+表示层)
- 传输层(传输层+会话层)
- 互联网层(网络层+网络互联功能)
- 主机至网络
- 分析:
- TCP/IP跟七层网络协议不一样,他是一个四层的协议
- 层和层之间是通过网络结构来调用的,层和层之间的接口就相当于是一个函数调用
- TCP协议和OSI协议不一样,OSI是一个完整的网络协议,二TCP/IP他只是一个把网络互联起来的协议,他只考虑让两个网络互相认识,至于子网内部的传输,不管
- 因此最后一层归纳为主机至网络的一个接口,即网络层到数据链路层的一个接口
- Internet的发展方向
- Internet 2:美国各大学,主要解决QoS
- Ipng:(Next Generation Internet) 美国政府组建机构研究,主要解决已有的Internet的一些限制,如地址、安全和多媒体传输等问题
- Internet 中的”I”的注意:
- 如果大写,代表全球最大的互联网因特网
- 如果小写即internet,代表网络互联技术
IP 协议
- 在TCP/IP协议当中他的网络层就是互联网层,互联网层他的主要的协议就是IP协议(当然还有其他协议)
- IP协议就是网络互联的协议(Internet Protocol)
- IP协议主要就是完成了在不同的网络当中怎样来传递数据包
- IP协议提供了一种公共的数据包格式
- 在分组交换的网络中怎样来实现网络的互联呢?有3个问题需要解决
- 各个不同的网络他的数据包的格式是不一样的
- 采用了一种统一的数据包格式-IP包格式
- 每一个网络的地址是不一样的,比如:发送方网络地址有2个字节,而接收方网络地址是4个字节,那么怎样把4个字节地址放到2个字节的物理帧里面呢?
- 显然是不可行的,因此,在网络互联的情况下,所有的站点都给他赋一个虚拟的地址,不管你在你的物理网络当中的地址是什么,都给他附一个虚拟的地址-IP地址
- 举例说明: 就像联合国开大会,每个国家都派代表开会,每个代表在自己的国家都有自己的名字(自己的网络当中的地址),但是在开大会的时候,会给每一个国家的代表起一个名字(**代表),这个名字就是全球唯一的,这就是IP的地址
- 不同的网络有不同的长度,就是在IP协议当中怎样解决分段和重组的问题
- 各个不同的网络他的数据包的格式是不一样的
IP包格式
- 它是在整个因特网上每个路由器都认识的数据包的格式
-
IP数据包格式如下
- 数据包分为报头部分+SDU部分(真正的传输层交过来的数据)
- 数据包的报头又分为固定部分和可变部分
- 固定部分是每一个数据包都有这些字段
- 而可变部分是如果你需要由这个功能你可以增加
- 因此IP包的报头最小长度是,最短的长度是前面的固定部分(有五行,每行4个字节)20个字节(20B)
- 数据包的报头又分为固定部分和可变部分
- 报头20个固定字节的内容
- IP协议的版本号
- 版本为4(Ipv4)
- 头部的长度
- 头部长以32位字长(即4个字节)为单位, 即一行
- 服务类型(基本没用)
- 8位(两位保留)
- 总长:
- 包括报头和数据报,最长216 –1(2个字节),即 65535个字节
- 标识、标志、段偏移:
- 用于数据报的分段
- 生存时间:
- 以秒为单位也,可以经过路由器的个数为单位
- 类型或协议
- 指的是承载的数据是什么类型的
- IP协议通过这个字段把数据包解析,判断交给上层的哪个协议(UDP/TCP…)
- TCP: 6
- UDP: 17
- ICMP: 1
- OSPF: 89
- 头部校验和
- 按16位相加,结果求反
- 源和目的地址:32位
- IP可选项:用于控制和测试
- 充填域:凑成32位的整倍数
- IP协议的版本号
P包的分段与重组
- 从上面可以看出,IP数据包最长可达65535的长度,但是事实上不是每一个物理网络都支持65535的长度数据,如果物理网络不支持65535长度,这就需要分段与重组
分段
- 分段过程
- 按MTU的及数据包的实际负载长度计算所需段数并划分,分段应满足两个条件:
- 各段在不大于MTU的前提下,尽可能地大,即按照这个物理网络的最大长度分段
- 段的长度为8的整倍数
- 原数据包的报头作为每段的数据包报头,并修改其中的某些字段,指明:
- 属原来的哪个分组(分组标示)
- 属原来段中的第几个分段 (偏移量)
- 哪一个是段尾(最后一段标志)
- 按MTU的及数据包的实际负载长度计算所需段数并划分,分段应满足两个条件:
- 通过标志、标识和段偏移实现
- 标识(identifier):16位
- 发送方每发送一个分组(IP包)编号加一 (其实就是IP包的编号)
- 各分段的标识相同
- 源地址加标识来区分各个分段
- 标志(flag):3位(一位保留)
- DF
- = 0 表示本分组允许分段
- = 1 表示本分组必须完整到达,途中不允许分段
- MF
- = 0 表示本段为本分组的最后一个段
- = 1 表示本段后面还有更多的分段
- DF
- 段偏移(fragmentation offset):13位
- 实际偏移量 = 段偏移值 x 8 Byte
- 标识(identifier):16位
- IP包分段举例
- 一个物理网络的MTU为1500B,现要传输一个IP分组(IP包)(其IP分组头为20B,数据区长度为1400B)到MTU为620B的另一个物理网络,其分段情况为:
- 上面的意思是一个数据包的长度为1420B,经过的是一个1500B的网络(这个是没问题的),但是传到下一个网络只有620个字节,因此需要分段发送
- 分段如下
- 将1400B分为600/600/200这3个分段(600,600,200都是8的整数倍遵循前面讲的规则)
- 每个分段的头部其基本部分(如源地址、目的地址等)是copy原IP分组(IP包)的头部,与分段相关的域则应重新生成
分段的重组
- 途中的任意一台路由器都无法重组,重组必须在各分段都到达目的地之后才能进行
- 每个分段可以走不同的路径
- 每个分段不能保证按顺序到达
- 减少路由器中保存的信息量及路由器的工作量
- 互联网层是遵循尽力而为来传送IP包的,也存在力不从心的时候,此时只能丢弃
- IP协议采用非透明重组,主机将遵循:要么重组成功,要么全部丢弃的原则
IP地址
- 在Internet网络当中,每一个数据包在寻找路径的时候,都是根据目的站点的地址来寻找路径的
- 也就是说每一台机器要上Internet,必须有一个全网唯一的一个IP地址
- 如何保证这个IP地址是全网唯一的呢?采用了分层的方法
IP地址分类与表示
-
层次结构和分类
- IP地址把地址分成了2个部分,NetID(网络号)/HostID(主机号)
- 网络号: Internet主机机构控制的是网络号,一个单位组建一个网络需要向Internet申请网络号(NetID),分配的是惟一的
- 主机号:由这个单位自己为自己分配的主机号,也是唯一的
- 因为Internet机构不会把一个网络号分给2个单位,惟一的;一个网络内部也不会把一个主机号分配给两台主机,也是惟一的;上面两种一组合就是全球唯一了
- 按照网络号和主机号不同的长度,可以把IP地址分为A/B/C/D/E类
- 常见的是A/B/C三大类
- 每一个IP地址唯一的对应了一个网络接口(单址传输)
- D类: 一个IP地址对应了一组接口(多组传输),当发送一个消息,多个接口同时收到
- E类: 保留着没有使用的那一部分
- 常见的是A/B/C三大类
- ABC三类特点:
- A类:刚开始做互联网时,认为在互联网当中网络不会很多很多,所以把1个字节划分给网络号(0-127),3个字节划分给主机号
- B类: 后来越来越多,网络号为2个字节,主机号长度2个字节
- C类: 网络号为3个字节,主机号长度2个字节
- 网络/主机号总长4个字节
- 如何判断ABC类
- 看第一个字节如果小于127就是A类,前1个字节为网络号,最后一个字节为主机号
- 大于127就是B类,前2个字节为网络号,最后一个字节为主机号
- 大于191就是c类,那么前3个字节为网络号,最后一个字节为主机号
- 例如: 202.120.1.154,C类,主机号为154
- IP地址把地址分成了2个部分,NetID(网络号)/HostID(主机号)
- IP地址的表示
- 由于IP地址是32位二进制,如果直接表示是记不住的,因此,采用点分十进制表示,如:202.120.1.154
- 什么是点分十进制?
- IP地址4个字节,每个字节看成一个10进制的数,所以每个字节的值是0-255,每个字节之间用”.”分开,因此这种方法称为点分十进制表示方法.
- 什么是点分十进制?
- 当组网的时候,要给每台主机分配一个IP地址,但是在这些IP地址当中有些IP地址是不分配个任何主机的–特殊地址
- 前缀是指: 网络号
- 后缀指: 主机号
- 由于IP地址是32位二进制,如果直接表示是记不住的,因此,采用点分十进制表示,如:202.120.1.154
- 私有网络IP地址
- 除了特殊地址不能用外,还有一些地址也不用-私有IP地址,
- Internet也是一种网络互联的技术,很多单位比如规模比较大,内部也有很多小的网络,我想把这些小的网络互联起来,但是为这个单位是一个独立的孤岛,我不想与互联网连接,那么我就没有必要想Internet申请IP地址,但是我需要用IP的技术来互联,那么每台机器也必须有一个地址,那么Internet机构就留出了这些用户.
- 即自己组了一个网络,但是有不想跟Internet相连,但是有用到IP的技术,那么就可以用这些地址
- 如果建的私有网络比较大,那么在A类中选择
子网划分
- 分好一个一个网络后,在主干网上的路由器就有一张路由表,这张路由表不是对每台机器有个路由向,而是每个网络有个路由向,因为路由器的端口连着的是一个网络,因此主干路由器的路由表上面是每一个网络的地址.
- 一个数据包过来要进行路由的步骤:
- 拿出数据包的目的IP地址,从目的IP地址抽取出网络号(IP地址是由网络号+主机号组成)
- 用这个号到路由表中去找
- 如何判定网络号的长度呢?
- 判断目的地址是A/B/C类然后在分别取值(A类:1个字节,B类2个字节,C类3个字节),因此主干网上面的路由器放的是每个网络,不是一台主机
- 为什么好子网划分?
- 比如这个单位比较大,向Internet申请了一个B类地址,一个B类地址可以支持65535台主机
- 如果这个单位的主机组网用以太网,65535台主机用一个一台网组,那就会一直竞争,数据无法正常传输,解决办法:对于以太网来说规模不能够大,要把它分成一个一个的小网络
- 若把以太网分成一个一个的小网络,对于主干网他是只认网络的,因此,这就需要向Internet申请多个网络的B类IP地址,这样就回造成地址的浪费.
- 现象: 原来只需要一个B类地址就可以搞定65535台主机的,但是现在把主机分成1000个主机一个的小网络,那么就需要1000个B类地址,这就造成了很大的浪费.
- 那么如何解决这个问题呢?
- 关键问题是Internet分配一个地址只能对应一个网络,主干网查找路由就是通过这个地址的网络号,来查找对应的网络
- 如果这个网络地址能够对应一组网络呢? 问题就解决了
- 子网划分就是用来解决这个问题的.
- 简介
- 随着网络规模的扩大,虽然能为一个网络提供大量的IP地址(如B类地址),但通常在一个网络(如以太网)内支撑不了那么多的主机
- 如果再申请一个IP地址,那将造成地址的浪费
- 问题在于一个网络ID(网络号),只能对应一个网络,而不是一组网络
- 解决的方法是允许在内部将一个网络分成若干个子网,而对外仍像一个网络
- 一个网络中的主机都必须具有相同的网络ID
- 然而子网之间的数据传输,必须通过路由器
- 如下图:
- 如上图,中央路由器接到数据包,要根据中央路由器的路由表查找是哪一个端口的那一台主机,那么这个路由表就非常长了
- 那么如何解决这个问题呢?能不能像Internet一样,主干网路由器下面连着是子网的路由器呢?只要把数据包,转送给子网路由就行了呢? 那么中央路由器只需要8个路由就行了.
- 那么就存在一个问题,中央路由器如何确定每个子网的网络号呢?Internet中是通过目的地址,拿到网络号寻找对应的子网,但是中央路由器如何找到对应的子网呢?那就需要每个内部的子网也需要有一个网络号-子网号
- 在内部的网络号成为子网号,实现方法跟Internet一样,把内部地址也分成网络号(ID)+主机号(ID)
- 那么如何划分呢?
- 我们知道中央路由器的地址是由Internet分配的—网络号(ID)+主机号(ID)
- 网络号(ID)是由Internet分配的,不可以自定义的,但是主机号是由我们自己定义的
- 因此我们可以这样定义: 网络号+(子网号(内部网络号)+ 主机号(内部主机号)),即把Internet分配的IP的主机号部分自定义成:子网号+内部主机号
- 主机的IP地址分配
- 任意指派
- 对B类网络,主路由器上的路由表中至少有65536个表项
- 按子网划分
- 从IP地址的主机号的高位部分取出若干位作为子网的标识(子网号(ID)),其余作为子网中的主机标识(主机 号(ID)),在子网中,主机标识可任意指定
- 从IP地址的主机号的高位部分取出若干位作为子网的标识(子网号(ID)),其余作为子网中的主机标识(主机 号(ID)),在子网中,主机标识可任意指定
- 任意指派
- 子网掩码
- (假设当前为B类地址,那么子网长2个字节)子网中的网络号多长,主机号多长呢? 每个单位的划分不一样的,有可能2个byte给子网号,剩下的给主机号,或者其他,那么如何知道一个单位的子网号有多长呢? – 子网掩码
- 子网掩码的作用
- 因为子网地址长度不是固定的,所以必须说明设备地址中的哪一部分是包含子网的网络地址段,地址中哪一部分是主机地址段
- 子网掩码使用与IP编址相同格式
- 子网掩码的网络地址部分和子网地址部分全为1,它的主机部分全为0
- 一个标准C类IP地址网络号3个字节,主机号1个字节,那么他的的掩码为:(前面3个字节全部为1,后面一个字节为0)
- 子网掩码的表示方法也是用点分十进制表示
- 255.255.255.0
- 例1
- 一个C类主机地址为202.120.3.99,子网号为 011,其掩码应为:255.255.255.224
-
划分方法如下图:
- 包含子网地址的网络号 = IP地址∧掩码
- 掩码也可用更简洁的方式表示:202.120.3.99/27,其中27表示掩码中1的个数
- 例2
- 某单位有三个部门,分别有自己的网络,虽然每个部门的主机数都比较少,但也需要三个C类地址(因为没有比C类地址更小的了),掩码为:255.255.255.0
- 如下图
- 可以看出向Internet申请了3个C类地址,
201.120.1.*/201.120.2.*/201.120.3.*
- 一个C类地址可以连接256台主机,这样就造成了极大的浪费.
- 可以看出向Internet申请了3个C类地址,
- 采用子网划分
- 选择子网号长度
- 三个子网一共只有10台主机,因此一个C类地址就足够了
- 子网和主机所需位数的分配:可以根据子网数或者每个子网中的主机数来决定
- 如按子网数来决定:3个子网需要2位编码:00,01,10,11,但一般00和11保留,因此3个子网需要3位编码,则子网掩码为:202.120.1.0/27
- 采用子网划分技术,可节约IP地址,图中掩码为:255.255.255.224
- 如下图
- 选择子网号长度
- 例3
- 某单位有多个部门,每个部门的机器数为20个左右,现申请有一个C类地址 202.10.23.0,问: 就目前而言,如何划分子网较为合理,请确定子网掩码,每个子网中主机数最多为多少台?
- 析:用3位表示子网号,5位表示主机号是合理的,所以:掩码为:255.255.255.224;最多的子网个数:8(6)个每个子网中主机数最多可接:32 – 2 = 30(台)某个主机IP地址及其掩码也可写成:202.10.23.47/27
- 例4
-
某主干网(通信子网)使用一个C类地 200.120.8.0,主干网的结构如下图所示,图中有A、B、C、… … H、I 等9个路由器,所示的两个子网分别通过其边界路由器X和Y与主干网连接,应如何设计主干网的子网划分策略,即确定掩码,以分配路由器的端口地址
-
析:
- 两个原则:
- 两个路由器上相互连接的两个端口必须在同一个子网
- 该子网中不可能包含第三个端口
- 每个子网中仅有两个有效地址
- 所以,掩码为:255.255.255.252
- 两个原则:
-
CIDR-Classless InterDomain Routing
- CIDR:无类域间路由
- 为什么要引入CIDR
- 一个B类地址对大多数机构来说还是太大,C类地址又太小,网络地址本身又非常紧缺
- 解决办法:(RFC1519)
- 以可变长分块的方式分配所剩的C类网络,把若干个C类地址(必须是连续的)捆绑成一个组地址,作为一个分配单元
- 甚至也可把256个C类地址合成一个B类地址
- 引入CIDR的好处
- 提高IP地址的利用率
- 缩短路由表
NAT-Network Address Translation
- 简介
- 网络地址转换产生的原因: IP地址不够,引起的一种补救的方法
- 一般来说每台主机都有一个IP地址才能进入Internet网络,但是现在很多时候申请不到IP地址,比如有1000台机器,但是却值申请到了一个C类地址(256),那怎么办呢?—NAT就是一种补救的方法
- 形象举例: 一个穷人家有10个人,却只有3套新衣服,为了让每个人出去都有新衣服穿,那么这十个人,出去就传这3套中的一套,回来之后再换给其他人.这就是NAT的思想
- 那么问题来了,假设目前只有一个C类地址,最多256个机器,目前有1000台机器,但是如何来组网呢?因为每台机器必须有一个IP地址.那就需要使用–私有地址了.
- 还有一种情况使用私有地址: 单位为了安全而不向Internet公开单位内部的地址,所以企业内部的主机通常都使用私有地址,当内部主机要访问Internet时,必须进行“网络地址转换”,即把私有IP地址转换成公开IP地址
- 私有地址是大家都能用,并且不需要想Internet申请的.但是私有地址只能内部使用,不能出去,主干网不识别.
- 因此,在单位内部用私有地址为每台主机分配一个IP,在内部通信时大家都用这个唯一第IP地址来通信,一旦访问外部网络,需要转换成合法IP,用完之后在让下个用
- NAT的工作过程
- 要实现网络地址转换,在这个单位的出口的路由器上要具备NAT功能
- 有了这个NAT功能,它就能检查这个机器是否出去,出去就给一个合法地址,不出去就用原来的私有地址.
- 假设内部网络使用内部网络地址192.168.44.0,并已申请到公开IP地址为202.120.8.65-202.120.8.79,内部主机PC3的IP地址为192.168.44.89
- PC3发出一个请求通过ISP访问Internet,目的IP地址为202.120.1.154
- Router(Firewall)(路由器)将对请求IP包和返回的应答IP包作NAT(网络转换)
- 回来的IP包如何到达源端
- 如果PC3发送数据包出去,分配的IP为202.120.8.70,使用完毕后,PC2也发送数据包出去,如果分配的地址也为202.120.8.70,当服务器分别对PC3/PC2返回数据包,此时这两个包的目的地址都是202.120.8.70,那么如何知道哪个返回给PC3,那个返回给PC2呢? 更深入一点,同一台主机上的不同应用进程之间呢?
- 解决办法:
- 利用传输层(传输层的数据包记录了源/目的端口号)的源端口号字段(区分不容的应用进程)
- IP包承载的数据主要就是TCP或UDP
- TCP/UDP里面标识的是源进程/目的进程
- TCP/UDP通过端口号来标识源进程/目的进程
- 在NAT中有一张映射表
- 这个表中记录了源地址/源端口号
- 请求IP包和应答IP包的NAT
- 当请求IP包到达路由器时,将IP包中的源IP地址和源端口号信息填入NAT表(映射表),同时将对应的NAT表表项序号(0,1,2….65535)取代IP包中的源端口号字段,并将选定的合法地址(即公开IP地址)取代IP包中的源IP地址字段,重新计算校验和并发送
- 比如:上图中的192.168.44.89:33030,映射到NAT表中,为第12051项,选定的合法IP为:202.120.8.70,因此NAT后IP地址为: 202.120.8.70 : 12051
- 当应答IP包从ISP发回来时,路由器将抽取该应答IP包中目的端口号字段,查NAT表将表中对应的内容放回目的IP地址字段和目的端口号字段,发回源节点
- 当请求IP包到达路由器时,将IP包中的源IP地址和源端口号信息填入NAT表(映射表),同时将对应的NAT表表项序号(0,1,2….65535)取代IP包中的源端口号字段,并将选定的合法地址(即公开IP地址)取代IP包中的源IP地址字段,重新计算校验和并发送
- 利用传输层(传输层的数据包记录了源/目的端口号)的源端口号字段(区分不容的应用进程)
- 要实现网络地址转换,在这个单位的出口的路由器上要具备NAT功能
- NAT存在的问题
- NAT违反了IP的体系结构
- IP规定一个IP地址对应一个网络接口,而在NAT中,某个地址可能会对应成千上万个地址
- NAT将Internet的无连接服务变成了有连接服务
- 因为NAT必须包含所有经过它的连接信息
- NAT违反了网络分层原则
- 在第三层用了第四层协议格式中的字段(端口号)
- 如果IP包的载荷不是TCP或UDP,则NAT无法工作
- 因为在其他协议的信息中不包含源端口号
- 在有些应用中NAT可能会出错
- 在有些应用中,发送方会将源IP地址嵌在它的消息中,接收方必须从信息中取用源IP地址,但NAT不作此类处理,因而将导致错误
- NAT违反了IP的体系结构
- 综上所述,IP如何发送数据包呢?
- 一个数据包在源站点看一下目的站点是不是跟我是同一个网络(只要看源地址与目的地址的网络号是否相同即可),如果相同就直接通过这个当前子网传递过去,反之,发送到NAT
- NAT根据目的地址在路由表中查找,找到下一站的地址
- 下一站再经过地址解析找到下一站…