IP协议与硬件地址
- 硬件地址(物理地址):数据链路层和物理层使用的地址
-
IP地址(逻辑地址):网络层及以上各层使用的地址
在发送数据时,都是自上而下,最后才到通信链路上传输。使用IP地址的IP数据报一旦提交给数据链路层就封装成了MAC帧,MAC帧在传输时都使用的是硬件地址,这两个地址都写在MAC帧的首部。
连接在通信链路的设备接受到MAC帧时,根据MAC帧首部中硬件地址决定丢弃或者接受。只有剥去MAC帧的首部尾部把MAC层的数据上交给网络层以后,网络层才能在IP数据报中找到源IP地址和目标IP地址。
注意几点:
- IP层抽象的互联网上只能看到IP数据报
- 虽然IP数据报首部中有源地址,但只根据目标地址的网络号进行路由选择
- 局域网的链路层传输只能看见MAC帧,IP数据报被封装在MAC帧的中
- IP层抽象的互联网屏蔽了许多的底层细节,能够使用同一的、抽象的IP协议研究主机与主机、主机与路由之间的通信
地址解析协议ARP
简介
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。是解决统一局域网的IP地址和硬件地址映射的问题。
ARP高速缓存
ARP高速运行的关键是每个主机都有一个ARP高速缓存,存放最近的internet地址到硬件之间的映射纪录,每一项的生产时间为20分钟。
一个简单的流程
主机A向同网内的主机B发送数据,现在A的ARP告诉缓存中查找是否有B的IP地址,若有,则在ARP高速缓存中查找B的MAC地址,再把这个硬件地址写入MAC帧,通过局域网将该MAC帧发给该地址。
若没有查找到,主机A自动运行ARP,并通过以下流程找到B的MAC地址:
- 通过本地局域网广播发送一个ARP请求分组,请求分组中同时将A自己的IP地址与硬件地址的映射协议ARP请求分组中
- 本局域网中所有主机上运行的ARP进程都收到该ARP请求分组
- 各主机将这个请求传回网络层,对比IP地址,检验是否可以接受,如果不行,则直接丢失这个信息,如果可以那么向主机A回复ARP请求,同时在该回复中写入自己的硬件地址以及在自己的ARP高速缓存中写入A的IP地址与硬件地址的映射
- 主机A收到主机B的ARP响应分组,在A的ARP高速缓存中协议主机B的IP地址与硬件地址的映射
地址解析协议几种经典应用场景
发送方是主机H1,要把IP数据报发送到同一个网络上的另一个主机H2.这时H1发送ARP请求分组(在网1上广播),找到目的主机H2的硬件地址;
发送方是主机H1,要把IP数据报发送到另一个网络上的另一个主机H3.这时H1发送ARP请求分组(在网1上广播),找到网1的一个路由器R1,剩下的工作由路由器R1来完成;
发送方是路由器R1,要把IP数据报发送到R1连接在同一个网络(网2 )上的主机H3。这时R1发送ARP请求分组(在网2上广播),找到目的主机H3的硬件地址;
发送方是路由器R1,要把IP数据报发送到网3上的一个主机H4。这时R1发送ARP请求分组(在网2上广播),找到连接在网2上的一个路由器R2的硬件地址,剩下的工作由路由器R2来完成。
IP数据报格式
简介
TCP/IP标准中,各种数据报格式以32位(4字节)为单位莱描述。
一个IP数据报由首部和数据报部分组成,首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。首部中的源地址和目的地址都是IP协议地址
各字段含义
版本
占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。
首部长度
占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
区分服务
占8位。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。
总长度
总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
在进行分片是,数据报首部的总长度字段指分片后的每一个分片的首部长度与该分片的数据长度的总和
(5)标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
标志(flag)
占3位,但目前只有2位有意义。
标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
片偏移
占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
生存时间
占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把 TTL值减1。当TTL值为0时,就丢弃这个数据报。
TTL通常是32或者64,scapy中默认是64
协议
占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。(在scapy中,下层的这个protocol一般可以从上曾继承而来,自动填充,我们一般可以省略不填此项)
常用协议和字段对应值:
首部检验和
占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量
源地址
占32位
目的地址
占32位
IP层转发分组流程
根据目的网络地址来确定下一跳路由器
IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
只有到达最后一个路由器时,才试图向目的主机进行直接交付。
注:在互联网上转发分组时,是从一个路由器转发到下一个路由器。总之,在路由表中,对每一条路由最主要的是以下两个信息:(目的网络地址,下一跳地址)。
特定主机路由
虽然因特网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即对特定的目的主机指明的一个路由。,这种路由叫做特定主机路由。
采用特定主机路由的好处:
(1)可使网络管理人员能够更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。
(2)在对网络的连接或路由表进行排错时,指明到某一主机的特定路由就十分有用。
注:特定主机路由是要到某一台机器的路由。特定网络路由是你到某一个子网的路由。特定主机路由也可视为特定网络路由的一个特例,即Mask为255.255.255.255的特定网络路由。
默认路由
默认路由是一种特殊的静态路由,指的是当路由表中与包的目的地址之间没有匹配的表项时路由器能够做出的选择。
如果没有默认路由,那么目的地址在路由表中没有匹配表项的包将被丢弃
。
默认路由在某些时候非常有效,当存在末梢网络时,默认路由会大大简化路由器的配置,减轻管理员的工作负担,提高网络性能。
主机里的默认路由通常被称作默认网关,默认网关通常会是一个有过滤功能的设备,如防火墙和代理服务器。
默认路由和静态路由的命令格式一样,只是把目的地ip和子网掩码改成0.0.0.0和0.0.0.0,默认路由只能存在末梢网络中。
分组转发算法
注:当发送一连串的数据报时,上述的这种查找路由表、计算硬件地址、写入MAC帧的首部等过程,将不断地重复进行,造成了一定的开销。尽管如此,也不能在路由表中直接使用硬件地址,因为使用抽象的IP地址,就是为了屏蔽各种底层网络的复杂性而便于分析和研究问题,这样就不可避免地多了一些开销。
(1)从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。
(2)若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付给目的主机(这里包括把目的主机地址D转换为具体的硬件地址,把数据报封装为MAC帧,再发送此帧);否则就要执行(3)进行间接交付。
(3)若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器,否则执行(4)。
(4)若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器,否则执行(5)。
(5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的下一跳路由器,否则执行(6)。
(6)报告转发分组出错。