首页 > 代码库 > 网络层(二)
网络层(二)
IP数据报格式
常常为32位,4字节为单位来描述。由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须有的,在首部的固定部分后面是一些可选字段,长度是可变的。
IP数据报首部的固定部分:
1,版本,4位,IP协议版本,通信双方IP协议版本必须一致。IPv4,IPv6。
2,首部长度,4位,可表示最大十进制数值15。可这字段表示的单位是32位字(4字节),当IP首部长度是1111时,首部长度就是4*15=60字节。当IP分组首部长度不是4字节整数倍,必须用后的填充字段填充。最常用的首部长度是20字节,即0101,这时不适用任何选项。
3,区分服务,8位,只有在区分服务时才使用。
4,总长度 ,16位,首部和数据之和的长度,数据报最长为2^16-1=65535字节。IP层下面每一种数据链路层都有自己的帧格式,包括帧格式中的数据字段最大长度,MTU。IP数据报封装成数据链路层数据报的总长度不能超过MTU。为了高效传输,主机和路由器必须能够处理IP数据报长度不得小于576字节,这个也就是最小的数据报的总长度。如果超过MTU会被分片,分片后的每一个分片首部长度与数据之和就是数据报中首部的总长度。
5,标识,16位,每产生一个数据报,计数器就+1,将值赋值给标识字段。相同标识字段的值使分片后的各个数据报片最后能正确地重装为原来的数据报。
6,标志,3位,目前只有前两位有意义。最低位MF=1,还有分片,MF=0最后一个。中间一位DF=0允许分片
7,片偏移,13位,分片后,某片在原分组中的相对位置,以8字节为偏移单位,每个分片的长度是8字节的整数倍。
8,生存时间,8位,TTL,数据报在网络中的寿命,TTL是跳数,TTL的意义指数据报在因特网中至多可以经过多少个路由器。最大为255,TTL设置为1,只能在局域网传播。
9,协议,8位,数据报携带的数据使用何种协议。
10,首部校验和,16位。只检验数据报的首部,但不包括数据部分。数据报每经过一个路由器,路由器都要重新计算一下首部校验和。计算方法:把数据报首部划分为许多个16位字的序列,把校验和字段设置为0,用反码算数运算把16位字相加后,写入校验和字段。接收方,收到后,将首部一样的16位字相加一次。将得到的和取反,若首部不发生变化,结果必为0.于是保留数据,否则丢弃数据。
11,原地址,目的地址,32位
IP数据报首部可变部分:为了增加IP数据报首部功能,1到40字节不等。
IP层转发分组流程。
如果在路由器所在的网络就直接交付,如果不在就转发到下一跳。路由表中,对每一条路由的主要信息,(目的网络地址,下一跳地址),
设置默认路由能够减少搜素路由表所用的时间。
在路由器接收到待转发的数据报时,在通过路由表得到下一跳的路由器IP地址后,不是把这个地址填入IP数据报,而是交给下层的网络接口软件,它负责把下一跳路由器的IP地址转换成硬件地址,并把地址放在链路层的MAC帧首部,然后根据硬件地址找到下一跳路由器。
分组转发算法:
1,从数据报首部提取IP地址D,得出网络地址N
2,若N为路由器直接相连网络地址,直接交付(包括IP转换硬件地址,封装MAC帧,发送帧)。否则执行3
3,若路由表中有目的地址D的主机路由,发送给下一跳路由器。
4,如果路由表中有N的路由,转发给下一跳路由器,否则5
5,若路由表有一个默认路由,把数据报发送给指明的默认路由,否则6
6,报告转发分组出错。
划分子网,构造超网
IP地址设计不合理之处
1,IP地址空间利用率低
2,每一个物理网络分配一个网络号会使路由表变得太大,因而网络性能变坏。
3,两级IP地址不够灵活
划分子网:
1,本单位外的网络看不见子网内部,子网内部,对外仍然是一个网络
2,划分子网两级IP变为3级IP,借用主机IP位。
IP::={<网络号>,<子网号>,<主机号>}
3,其他网络发送本单位主机的IP数据报,和原来一样,由网络号找到本单位网络上的路由器。路由器收到后,再按照目的网络和子网号找到子网,把IP数据报交给主机。
子网掩码:
使用子网掩码能使路由器通过2级地址转换成3级地址,能够发送到子网。子网掩码和IP地址进行AND运算,得出的就是子网的网络地址。不管有没有划分子网,都进行AND运算。
默认子网掩码
划分子网增加了灵活性,但减少了能够连接在网络上的主机总数。
同样IP地址和不同的子网掩码可以得出相同的网络地址,不同的掩码效果不同
使用子网时分组转发:
路由表包含:目的网络地址,子网掩码,下一跳地址。
算法:
1,提取数据报首部目的IP地址
2,判断是否直接交付,无执行3
3,如果路由表有目的地址D,转发下一跳路由,否则4
4,把路由表每一行和子网掩码运算,结果与目的网络地址匹配就传送到下一跳路由器。否则5
5,若有默认路由,转发到默认路由否则6
6,报告转发出错。
网络层(二)