IP协议
简介
IP协议是TCP/IP中核心的协议,也是听得最多的协议,不管是TCP、UDP的数据都是以IP数据进行传输的。
IP协议不能保证IP数据报能成功到达目的,IP只提供数据传输,如果发生错误的话,会丢弃该报文并且发送一个ICMP消息报给信息源。可靠性的服务是由TCP来完成。
报文格式
普通的IP首部长为20个字节,除非含有选项字段
1.版本号
主要有IP4,IP6现在大部分还是在用IP4协议。4位长度
2.4位首部长度
首部长度从IP数据报开头,每32bit算一个首部长度,首部长度这个字段占4个bit.
全为1的话,换算成十进制就是15,则15*4=60字节.
3.服务类型
其中3bit的优先权字段,4bit的TOS子字段,1bit未用字段但必须置为0
4bit的TOS分别代表【最小时延、最大吞吐量、最高可靠性和最小费用】
4.16位总长度
以字节为单位,代表整个IP数据报的内容,由于16位bit,所以ip数据报最长可达65535字节
但是大多数链路层都会对它进行分片,而且主机也要求不能接收超过576字节的数据报
5.16位标识
主机发送一份数据报,它的值就会加1
6.TTL
数据报可以经过最多的路由器时间
7.协议
上层协议
8.校验和
把首部中每个16bit进行二进制反码求和。结果存在检验和字段
注意:ICMP、IGMP、UDP和TCP都采用相同的算法,但是TCP和UDP除了本身的首部喝数据外,在IP首部中还包含不同的字段
校验和计算
1.IP首部校验和
1.1接收方: IP首部校验和主要是针对IP首部看成16bit为单位的数字组成
,依次进行二进制求和,然后得出反码
0x4500 0x0040 0x40d2 0x4000 0x8006 0xD272 0xc0a8 0x0301 0x2762 0xfc5c
求和为
3FFFC
高位溢出值为3
FFFC+0x0003=FFFF,转换为2进制为:1111111111111111
反码为:0
1.2接收方:
4500 0028 a5a7 4000 7406 79c0 2762 fc5c c0a8 0301
求和为:3FFFC.
高位溢出:FFFC+0003=FFFF 转换为二进制反码为0
发送方例子
1.发送方1
4510 0054 7e02 4000 4006 0000 c0a8 031f c0a8 030e
求和值为:2CAE9
高位溢出为2,0002+CAE9=CAEB 转换为2进制为:1100101011101011
反码为:11010100010100 转为十六进制:3514
IP路由选择
目的主机和源主机直连(点对点链路),或者都在一个共享网络上,那么IP数据报就可以直接发送
IP层在内存中有一个路由表,当收到一份数据报的时候,它都要对该表进行搜索一次。
在liunx上采用route命令查看路由表。主要包含:目的地址、下一站、标志、网络接口
IP路由选择是逐跳进行,逐跳的意思就是IP不知道到达任何目的的完整路径,所有的IP路由选择只为数据报传输数据提供下一站路由器的IP地址。
IP路由选择主要完成以下功能:
1.搜索路由表,寻找能与目的IP地址完全匹配的表目
2.搜索路由表,寻找能与目的网络号相匹配的表目
如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口
3.搜索路由表,寻找标为【默认】的表目
如果上述步骤没有成功,该数据报不能被传送。并且会返回一个ICMP的主机不可达或者网络不可达错误
例子
主机bsdi有一份IP数据报要传到ftp.uu.net主机上,它的IP地址时192.48.96.9,经过的前三个路由器如下图
1.主机bsdi搜索路由表,没有找到与主机地址或网络地址匹配的表目
只能用默认的表目,把数据报传给下一站路由器,即【主机sun】
注意:数据报在发送的时候目的以太网是140.25.213.33这也是默认路由表。但是目的IP地址不变
2.sun接收到数据报后,目的IP地址时最终的信宿机地址(192.48.96.9)
但是链路层地址却是sun主机的以太网接口地址
3.sun接收到数据报后,发现目的IP并不是本机的任一地址,
而sun被设置成具有路由器的功能,因此它把数据报进行转发
经过搜索路由表,选用了默认表目
4.根据sun默认表目,它把数据报转发到下一站路由器netb,该路由器的地址时
140.252.1.183
5.数据报是经过点对点SLIP链路被传送的
6.当netb收到数据报后,它执行和sun主机相同的步骤,把数据报发送到下一站
路由器gateway(140.252.14).
位于以太网140.252.1上的主机netb用ARP获得对应于
140.252.1.4的48bit以太网地址。
这个以太网地址就是链路层数据帧头上的目的地址
子网寻址
首先了解互联网地址分为五类,如下图所示
例如有一个B类网络(140.252),在剩下的16bit当中,8bit用于子网号,8bit用于主机号,这样的话就允许有254个子网,每个子网可以有254台主机。
1.A类网络号
1.网络号占一个字节,但这个字节【最高位为0】,只剩下7位可以进行分配
2.网络号为127保留作为本地【环回测试】
2.B类网络号
1.网络号占二个字节,最高位是【10】,只剩下14位进行分配
2.主机号占2个字节
3.C类网络号
1.网络号占三个字节,只剩下21位可以进行分配
2.c类主机号占一个字节