IP协议是TCP/IP协议族中最核心的协议,它提供不可靠、无连接的数据报传输服务。所以理解IP协议对于我们学习网络至关重要。
IP首部
重要字段介绍:
4bit首部长度:以4字节为单位,决定了IP首部长度最大为15*4=60,一般的IP数据报首部长度为20,此时该字段为5.
8bit的服务类型:包括一个3bit的优先权子字段(可以忽略),4bit的tos子字段和1bit的未用位但必须置0.4bit的TOS分别代表:最小延时、最大吞吐量、最高可靠性和最小费用。
比如在telnet交互应用中就要求有较小的传输时延,在FTP中要求有最大的吞吐量。这些可以通过设置socke选项来设置该字段。
16bit的总长度:最大为65535字节,包含首部和数据长度。
16bit的标识:唯一得标识主机发送的每一份数据报。需要注意的是分片后的各组数据报其标识是相同的。
3位标志:只有两位有意义,最低位为MF,MF=1表示后面还有分片;中间一位DF,DF=1,不允许分片。
13位片偏移:数据报分片后个数据段的偏移量,以8字节为单位。
TTL生存时间:设置数据报可以经过的最多路由器数,俗称跳数。它指定了数据报的生存时间。通常为32或者64.若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。
8bit协议:标记数据报的上层协议。
选项:后面的篇幅介绍
IP路由选择
IP地址
查找主机的ip地址可以使用ifconfig -a(windows上为ipconfig) 命令来看,比如我本机的Ip地址可以这样查看:
这里我们可以看到连个网络接口etho和lo,可以看到etho接口的Ip地址为192.168.152.130 内网地址,掩码为255.255.255.0
物理地址为00:0c:29:e3:72:92,最大MTU=1500,接口支持广播和多播。
下面的lo为环回接口 其MTU=16436
一些特殊的IP地址
路由表表项
1.目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段制定。
2.下一站路由器的IP地址,或者有直接连接的网络IP地址。
3.标志。其中一个标志指明目的地址是网络地址还是主机地址。另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。
4.为数据报的传输指定的一个网络接口。
这是我本机上的路由表项,对于一个给定的路由器,可以打印出五种不同的标志:
U 该路由可以使用
G 该路由是到一个网关,如果没有该标志,说明目的地址是直接相连的。
H 该路由是到一个主机,也就是说目的地址是一个完整的主机地址。如果没有设置标志,说明该路由是到一个网络,而目的地址时一个网络地址。
D 该路由是由重定向报文创建的。
M 该路由是已被重定向报文修改的。
IP路由选择过程
1.搜索路由表,寻找能与目的地址的iP地址完全匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或者直接相连的网络接口。
2.搜索路由器,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或者直接连接的网络接口。
3.搜索路由器,寻找标为默认的表目。如果找到,则把报文发送该表目指定的下一站路由器。
4.如果上面的都没成功,则数据报不能被发送。
ARP协议
协议格式
工作原理
当一台主机要把以太网数据帧发送到位于同一个局域网的另一台主机时,是根据48bit的以太网物理地址来确定目的接口的。设备驱动程序从来不检查IP数据报中的目的IP地址,IP地址是协议分层设计中虚拟出来的用来进行路由选择的,而真正用于通信的地址是物理网卡的地址即MAC地址。当主机发送数据确定了目的IP地址后,就需要知道目的地址的
物理地址,因为根据链路层的以太网帧格式,我们发现其封装了目的MAC地址。ARP协议正是为IP地址到对应的硬件地址之间提供动态的映射,它工作在以太网。当它想要给知道网络中某一IP地址(可以是路由器或者主机) 对应的物理地址,就发送广播消息,消息内容大致就是:“喂,我是192.168.152.xxx,物理地址是xxxxx,我想要知道192.168.152.yyy的物理地址”。以太网中的主机收到该消息就将消息中的ip地址和自己进行比较,如果是自己,就发送响应告诉发送主机自己的mac地址。这样发送主机就能向其发送ip数据了。
arp缓存
其实并非每次发送数据前都要发送arp广播消息,这主要是由于每个主机都有一个arp高速缓存。这个高速缓存存放了最近ip地址到硬件地址之间的映射地址。因此可以通过该缓存读取到对端的物理地址。但高速缓存中每一项有一定的生存时间,一般为20分钟。
可以通过arp -a 命令来查看最近的arp表目。
下面看一个例子:
首先在本机(192.168.152.130 mac addr:00:0c:29:e3:72:92)上运行tcpdump -e 命令来捕获arp消息,在另一台主机(ip:192.168.152.128 mac addr: 00:0c:29:7c:cf:fc)上运行telnet命令。得到的arp消息如下:
首先消息中0x0806代表该消息为arp请求或者应答。length 60 是指以太网数据帧的长度,由于arp请求或者应答的数据帧长都是42字节(28字节的arp数据,14字节的以太网帧头)因此必须加入填充字符以达到以太网的最小长度要求:60字节(有些书籍说是64,它包含了以太网的帧尾)。后面的46代表arp请求数据大小。在请求中可以看到ubuntu-2.local发送了该arp请求。
在响应消息中本机对其进行了回复告诉它自己的硬件地址。响应数据长度为28.
接着打印出本机的arp缓存条目,发现增加了第二条表目,这说明了在其他主机请求本主机的硬件地址时,同时也将对端的硬件地址添加到映射表来,这样以后和其通信就不需要进行arp请求了,如下图:
RARP协议
RARP协议和ARP协议的目的相反,它的作用是只知道自己硬件地址的主机能够通过RARP协议找到其IP地址。RARP的分组格式与ARP分租基本一致。主要是其帧类型代码为0x8035。这个协议在过去比较重要,用于无盘引导系统时获取主机的IP地址。现在的DHCP协议已经包含了RARP的功能。在这里就不多做介绍了。
完。