本文是为了记录学习过程中的知识点所写,用于对自己的理解做一个记录
-
4位版本:目前的版本号为4,因此IP也称为IPv4。
-
4位首部长度:首部占32bit(4字节)的数目,4bit最大值为15,也就是说最多为480bit 即60字节,包括选项。(也就是说IP首部范围是 20字节-60字节)
-
8位服务类型:包括一个3bit的优先字段(现在被忽略了),4bit的服务类型(TOS)字段和1bit的未用为但必须置0。4bit的TOS分别代表:最小时延,最大吞吐量,最高可靠性和最小费用。4bit中只能置其中一个为1。且如果4bit均为0则表示一般服务,下面是不同应用的服务类型的推荐值。
-
16位总长度(字节数): 利用首部长度和总长度字段就可以知道该数据报中数据的起始位置和长度。同样因为16bit的最大值为65535,所以最大长度可以达到65535字节。以太网的MTU为1500字节。当数据被分片的时候,该字段也随之变化。(以太网最小帧是46字节,但是IP报文最小为20字节,如果没有该字段,IP层就不知道这46字节中有多少是IP报文的内容)
-
16位标识: 唯一的标识主机发送的每一份数据报,每发送一个报文他的值就会加1.
-
3位标志位: 共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。
-
13位片偏移:
-
8位生存时间TTL: time-to-live,该字段设置了数据报可以经过的路由器的数量,它指定了报文的生存时间,TTL的初始值由源主机设置(通常为32或64),每经过一个路由器就减一,当该字段为0时,则丢弃这个数据报,并发送ICMP报文通知源主机。
-
8位协议: 可以识别是哪个协议向IP传送数据。TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
-
16位首部检验和: 为了计算一份数据包的IP检验和,首先把检验和字段全部置0,然后对首部中每个16bit进行二进制反码求和,结果存在检验和字段中。当传输过程中没有发生错误的时候,接收方对首部进行二进制反码求和的结果应该全为1.如果不是则检验和错误。那么IP就丢弃收到的数据包,但是不生成差错报文,由上层去发现丢失的报文。
-
32位源IP地址: 发送方的IP地址
-
32位目的IP地址: 目标的IP地址
-
选项: 这是一个任选项,是数据报中的可变长的可选信息。目前很少被使用,并不是所有主机和路由器都支持这些选项,感兴趣可以自行了解。
路由表
IP层在内存中有一个路由表,当收到一份数据报并进行发送时,他都要对该表搜索一次。
接收到数据报时,首先检查IP地址是否为本机的IP地址之一或者IP广播地址。
1、如果是则会把数据报送到 IP首部中8位协议字段所指定的协议模块进行处理
2、如果目的IP地址不是以上两种,则进行如下处理
- 如果IP层被设置为路由功能,那么就对数据报进行转发
- 如果没有设置路由功能,则丢弃数据报
查询路由表的指令:
//windows 在cmd中
route PRINT
//linux下
route -nv
IP路由选择是逐跳的(hop-by-hop)。这是因为IP并不知道到达目的IP地址的完整路径。只能为数据报提供下一站路由器的IP地址。这里是假设下一站路由器比发送数据报的主机更接近目的IP地址。而且下一站路由器和本机是直接相连的。
IP地址的格式如上图所示,分为5类,前面的数字是用以区分不同类的网络号的,IP地址都分为两部分,即网络号和主机号。
可能有人不能理解这5类地址前面的数字是什么,其实这个图表达的不明确,因为IP地址采用的是“点十分进制表示法”,如192.168.10.1。
其中每个点之间表示的是8bit,而上图应该应该表示的是每类地址的起始网络号:
- A类:0000 0000 —— 0
- B类:1000 0000 —— 128
- C类:1100 0000 —— 192
- D类:1110 0000 —— 224
- E类:1111 0000 —— 240
IP路由的工作规则:
1、搜索路由表,首先去匹配是否能找到和目的IP地址完全匹配的表目,即网络号和主机号都匹配。如果存在则发送给该表目指定的下一站路由器或者直连的网络接口。
2、如果不存在完全匹配的表目,则去寻找与目的网络号匹配的表目,如果存在则发送给该表目指定的下一站路由器或者直连的网络接口。
3、如果以上两种都匹配不到,则选择"默认"表目。
在Internet上的路由器一般为一个网络号指定下一站路由,这样可以为一个网络上所有的主机指定路由器,极大地缩小了路由表的规模。
子网掩码
现在所有的主机都要求支持子网编址,之前在讲路由表的时候有说过网络号和主机号。而A类和B类IP地址为主机号分配了过多的空间,可以容纳相当多的主机数。但是在一个网络中我们一般没有这么多的主机,所以子网号就出现了。
ps:主机号全0和全1是无效的
从InterNIC获得了某类IP网络号后,就会由管理员来决定是否建立子网,以及分配多少bit给子网号和主机号,这里的主机号不再是之前的主机号了。
下图是一个B类地址示例:
这是最常用的划分方法,即把16位的主机号平分给 子网号和新主机号,这样可以根据IP地址很容易确定子网号。但是,这不是强制要求的。
好了,可能你现在还不知道什么是子网。
假设我们有一笔钱,可以建6000个房间(主机号)。一开始有人想建一座6000个房间的大厦,但是有人发现这座楼附近根本没有这么多人来住。所以有人提议,陆续建60座(子网号)100间房间(新的主机号)的楼,这样我们就可以把每栋楼卖完以后再建新楼。这些楼就是“子网”。但是可能会建70座、80座楼,因为这并不是固定的建法。
对于一个IP地址,例:192.168.10.1 电脑并不知道那些是网络号、子网号和主机号。所以我们需要告诉电脑那些是网络号,于是子网掩码出来了。
十进制:255.255.255.0
二进制:1111 1111 . 1111 1111 . 1111 1111 . 0000 0000
把子网掩码和IP地址相与得到的就是网络号和子网号。即192.168.10.0。
获取本机的IP地址和掩码的指令
//windows
ipconfig
//linux
ifconfig