IP协议解析_ip协议分析-程序员宅基地

技术标签: 服务器  网络协议  tcp/ip  

目录

1.网络层功能

2.IP地址分类

3.ARP与RARP协议

3.1ARP报文格式:FrameType = 0x0806

3.2 RARP:从mac地址中寻找IP地址

3.3 ARP存在的问题:ARP欺骗

 4.IPv4地址短缺解决方案

 4.1 NAT地址转换技术

 4.2 LVS/NAT模式

 4.3 NAT优缺点

 5.MTU与IP报文分片

5.1IP报文格式

 5.2 MTU分片

6.ICMP协议(IP协议的助手)

 6.1 ICMP协议格式

 6.2 ICMPv4报文类型

7.IPV6地址演进

7.1 ipv6的表示方法

 7.2 网络地址和主机地址

8.ipv6报文格式 

8.1 ipv6主首部格式


1.网络层功能

  1. IP寻址(根据IP地址确定目标在哪个网络中)
  2. 选路(OSPF(开放式最短路径优先)就是这样一个基于链路状态路由协议,广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway Protocol,简称 IGP)。内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候 OSPF 可以发现多个最短的路径,可以在这多个路径中进行负载均衡,这常常被称为等价路由。有了内网协议,内部选路就知道如何走了
    BGP(外网路由协议)在一个国家内部,有路当然选近的走。但是国家之间,不光远近的问题,还有政策的问题。对于网络包同样,每个数据中心都设置自己的 Policy。例如,哪些外部的 IP 可以让内部知晓,哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过。这就好比,虽然从我家里到目的地最近,但是不能谁都能从我家走啊!)
  3. 封装打包(添加IP头部)
  4. 分片(超过MTU)

细腰结构,IP 层是在网络中的核心地位,性能很高,无连接(管理连接和维护连接成本很高),非可靠,无确认。(为什么称作细腰结构?

我们再看看network layer上面的transport layer, application layer等等, 这些层内容协议包罗万象.

它们仅仅能通过IP与下面的层通讯, 这种设计可以用"anything over IP (一切基于IP)"描述.

同样的, 在network layer下面的physical layer等等层内容也十分丰富.

它们也只能通过IP与上面的层通讯, 这种设计对应地被描述为"IP over anything (IP兼顾一切)".

于是, 由于当中这一层由于只包含IP, 又起到承上启下的作用, 所以人们形容这一层为"细腰".

        交换机工作在数据链路层,路由器工作在网络层。报文传输示例:

客户端的ip+mac,首先会根据目标ip地址,根据数据链路层配置的默认网关,找到了10.2.14.1这台路由器,根据link2路由器,进入BGP骨干网,BGP协议会选择最短的路径,link3,link4,link5找到了企业的内网服务器21.44.191.36,然后通过企业路由器,找到了server。

2.IP地址分类

        层层分配的IP地址,最高层结构为IANA,IANA在每个洲又创建了机构,由子机构进行分配,APNIC就是亚洲分配ip的机构,中国的IP地址就是由CNNIC进行分配的。从这个网络拓扑图可以看到,ip地址是分区域的,并且是有父子结构的,

3.ARP与RARP协议

        ip地址都有对应的mac地址,但是从ip地址找到mac地址,就是通过ARP协议(RFC826)。

        动态地址解析:广播。示例:

        主机A想和主机D通信,但是主机A只有主机D的IP地址,没有mac地址,而交换机只认识MAC地址,所以主机A必须首先获取主机D的mac地址后,才能组装出合适的数据链路层帧,才能被交换机识别,转发给主机D。 现在主机A通过ARP协议发送一个广播包,谁是IP地址,大家都收到后,只有B回复它的MAC地址。

        广播的性能损耗十分的大。每次通过ARP获取到一个ip地址和mac地址的对应关系后,都会加入到本地的缓存当中。所以在发送ARP报文之前,都会先检查本地的缓存。可以通过如下命令获取:

        linux:        arp -nv 

        windows:        arp -a

        Mac:        arp -nla

arp的请求是广播形式的,arp的响应是单波形式的

3.1ARP报文格式:FrameType = 0x0806

  1. 硬件类型:1表示以太网
  2. 协议类型:0x0800 表示ipv4
  3. 硬件地址长度:通常是6个字节
  4. 协议地址长度:4表示ipv4
  5. 操作码:1表示请求,2表示应答
  6. 发送方硬件地址
  7. 发送方协议地址
  8. 目标硬件地址
  9. 目标协议地址

抓包分析:第一个广播报文中可以看到,想要获取target ip address:192.168.2.2的mac地址,以广播的形式发送,接着在第二张图中,可以看到,在reply报文中,带上了192.168.2.2的mac地址。

3.2 RARP:从mac地址中寻找IP地址

        1.为什么需要从mac地址中寻找IP地址呢?

        比如有一个打印机,启动的时候,没有配置IP地址,会有一个RARP服务器会自动给他分配IP地址,设备A会发送一个RARP报文,我的mac地址是这样的,我的IP地址是多少? RARPserver收到了RARP报文,会回复对应的ip地址。所以RARP的工作流程也是发送RARP广播,然后以单波的形式回复。

         2.RARP报文格式与ARP非常相似,主要差距在opcode,3表示请求,4表示应答

3.3 ARP存在的问题:ARP欺骗

        如果在正确的情况下,Alice中缓存的Bob的Mac地址是B,Bob中缓存的Alice的Mac地址是A。但是现在有一个攻击者,Charlie,回主动回复Alice和Bob发出的ARP报文,告诉Alice Bob的mac地址是C,告诉Bob Alice的mac地址是c。

        这样alice和Bob互相发送消息的时候,组装出的数据链路层的帧的mac地址就会填成c。

        

如何防范?

        1.在主机绑定网关MAC与IP地址为静态(默认为动态),命令:arp -s 网关IP 网关MAC

  2.在网关绑定主机MAC与IP地址

  3.使用ARP防火墙

 4.IPv4地址短缺解决方案

 4.1 NAT地址转换技术

         每个机器都使用公网地址,那么是不需要NAT转换,但是公网地址是十分稀缺的。

        

         当企业有大量的主机,少量的公网地址的时候,就可以使用NAT技术,A类,B类,C类和D类地址。

 

        NAT(IP Network address Translator)应用的前提:

  • 内网中主要用于客户端访问互联网
  • 同一时间仅有少量主机访问互联网
  • 内网中存在一个路由器负责访问外网

        单向转换NAT:动态映射

端侧是10.0.0.207是一个A类的私有地址,公网是不认这个私有地址的,发送的request是源IP 10.0.0.207 目的IP,204.51.16.12。经过路由器后,源IP变为了194.54.21.11,目的IP不变。

服务器返回,源地址是服务器地址,目的地址是路由器地址。 接着路由器将目的地址改为客户端地址。        为什么可以将目的地址改为客户端的ip地址呢? 因为同一时间,只有少量的客户端可以上网,可以上网的客户端的数量,和路由器上配置的公网ip的数量是相等的。所以发送一个报文之后,就会记住对应的映射关系,即10.0.0.207和194.54.21.11存在映射关系。

        那么存在一个问题,家里的路由器,可以连接很多设备,而运营商并不会给我们分配很多的IP地址,其实是使用了NAPT端口映射 

        那么当外网想访问内网的时候怎么办?双向NAT,IP地址静态映射。

在一段时间内,将10.0.0.207和194.54.21.6对应起来,只要在这段时间内访问内网,就能访问成功。缺点:是不能够通过端口映射,并且使用的运营商网络,IP地址经常会变化,所以很难使用到这个技术。

 4.2 LVS/NAT模式

        lvs有三种工作模式,其中NAT工作模式相对于其他两种,是性能最差的,但是相对于很多四处和七层的负载均衡来看,三层的负载均衡要更好,因为它只解析到网络层就可以了。

  1.         User发送一个请求后,LVS相当于是一个NAT,将源地址改掉后,通过负载均衡算法,直接将目标地址改为上游服务器的ip地址。
  2. 后端服务器回复数据的时候,因为LVS存在映射表,就将报文改为了客户端的IP地址,返回给了客户。
  3. lvs的NAT技术性能最差,就是因为客户端和服务器的交互,都要经过lvs,负载压力很大。

 

 4.3 NAT优缺点

优点:

  1. 共享公共IP地址,节约开支
  2. 扩展主机的时候,不涉及公共地址
  3. 更换ISP服务商,不对主机地址产生影响
  4. 更好的安全性,外部服务无法访问内网服务
  5. 更好的隔离性

缺点:

  1. 网络管理复杂
  2. 性能下降
  3. 重新修改校验和
  4. 某些应用层协议由于传递网络层信息而功能受限

 5.MTU与IP报文分片

5.1IP报文格式

Version:版本号

IHL:头部长度,单位是字节

TOS:应用于服务质量,很少使用

Total Length:包含data数据的报文总长度

identification/Flags/Fragment:都是用来做分片的,identification是分片标识(值相同表示是同一类分片);D和M标识能不能分片,如果分片了,是不是中间分片,或者最后一个分片;Fragment offset将无序的分片报文组装起来。

TTL:没经过一个路由器这个值就会减1,到0的时候,报文会被路由器丢弃

Protocol:传输层承载的协议

 5.2 MTU分片

  • MTU最大传输单元(RFC791: >= 576字节)
  • ping命令:
    -f:设置DF标志位为1,表示不能分片
    -l:指定负载中的数据长度(使用ABCDEFG字符填充长度)

        常见的MTU

        可能出现多次分片

        ip分片示例:

分片主题:源主机,路由器

重组主机:目的主机

举例:一个11980字节的IP报文,经过MTU为3300的设备。每一份承载的数据长度是3280字节,因为还有20个字节的ip头部。 ip头部需要将MF标志位置为1,最后一个报文MF标志位0。 这些分片为了能够正确顺序组装,必须添加offset,offset单位是8个字节,410 * 8 = 3280。

本地通过ping 服务器 -l 8000抓包来进行验证。(此处是ping的www.baidu.com)

可以清楚的看到,是一个分片报文,因为More fragments值为1,偏移为0,是因为是第一个。identification是0xd405,并且可以看到数据是用abcd来进行填充的

        这是分片的最后一个报文,可以看到MF位置为了0,因为identification值和上面一样,可以确定是同一个分片的报文,并且是最后一个报文。 

6.ICMP协议(IP协议的助手)

        因为IP协议聚焦于性能,诸如传递错误和其他信息的功能都是ICMP协议实现的。

ICMP(internet Control Message Protocl),RFC 792.是IP助手

  • 告知错误
  • 传递信息

当A向B发送消息的时候,在R3中出现了错误,R3会通过ICMP协议,将错误传送给A,并且ICMP携带的错误信息不会被R2和R1处理,因为它们承载在IP报文之上,而R3发送的目标接受者很明确是A。

 6.1 ICMP协议格式

  • 承载在IP协议之上
  • 组成字段
    • 类型
    • 子类型
    • 校验和

 6.2 ICMPv4报文类型

  • 错误报文
    • 3:目的不可达
    • 4:发生拥塞,要求发送方降低速率
    • 5:告知主机更好的网络路径
    • 11:路径超出TTL限制
    • 12:其他问题
  • 信息报文
    • 0:连通性测试中响应
    • 8:连通性测试中的请求
    • 9:路由器通告其能力
    • 10:路由器通知请求
    • 13:时间戳请求
    • 14:时间戳应答
    • 17:掩码请求
    • 18:掩码应答
    • 30:Traceroute

 

TTL超限:Type = 11

traceroute/tracert

当IP报文到达R4的时候,TTL=0,此时R4将会回复TYPE=11的ICMP报文。

举一反三:Traceroute的工作原理,就是首先把TTL设置为1,查出第一个路由器IP,接着设置为2,查出第二个路由器IP,以此类推...

 windows可以通过tracert+域名来测试,抓包分析可以验证上述观点。

7.IPV6地址演进

         ipv4地址只有32位长度,ipv6地址有128位长度,它允许各种设备终端都拥有唯一的公网IP地址,并且连接到公网中,所以它是万物互联的基础。

        ipv6目的:

  • 更大的地址空间:128位
  • 更好的地址管理空间
  • 消除了NAT寻址技术
  • 更简易的IP配置管理(物理mac地址映射到ipv6中)
  • 优秀的选路设计
  • 更好的多播支持
  • 安全性
  • 移动性

7.1 ipv6的表示方法

  • 首零去除
  • 零压缩

        

wireshark中可根据ip6过滤,抓包看ipv6地址

 7.2 网络地址和主机地址

        主机地址占据64位,网络地址也占据64位(由全局路由(48位)+子网ID(16位))。  主机地址会映射mac地址。

        48位mac地址,后24位表示设备标识,前24位表示组织唯一表示OUI,先将 OUI放在主机64位地址中的前24位,并且把第七位的数字改为1,接下来中间的16位,硬编码为FFFE,最后把mac地址的后24位,放在主机后面的最后24位,这就是RFC规范中定义的mac地址映射方法。

        这会带来一个问题,那就是通过IP地址把mac地址暴露在网络中,所以包括微软等公司,提出了方法来隐藏我们的mac地址。这边可以本地抓包看下,根据报文中的ip地址和mac地址,看最后24位有没有对应上。可以看到,没有对应上,那是因为我们操作系统给我们打开了隐私增强设置,我们可以关闭隐私增强,然后在抓包看下。

        win10中netsh interface ipv6 set privacy state=disabled. 然后查看ipconfig/all,查看ip和mac地址。  

8.ipv6报文格式 

  • ipv4中的IHL头部长度取消
  • Id/Flags/FO全部从主首部移到了扩展首部当中
  • HC校验和也取消了

8.1 ipv6主首部格式

  • Version
  • Traffic Class,替代了Ipv4中的TOS,结合着Flow Label,共同用于做流量控制,Traffic Class会定义我们报文的优先级
  • Payload Length:(在Ipv4中有一个Total Length,将ipv4的20个字节的头部也算进去了)这边是负载的头部,会减去40个字节ipv6的主头部
  • Next Header:1.把很多扩展首部结合起来  2.和Ipv4当中的Protocol字段完全一致(ipv6后面承载的TCP/UDP协议填上)
  • Hop Limit:和ipv4中的TTL完全一致

        抓包看下

        IPv6报文格式:

  • 40字节主首部
  • 可选的扩展首部
  • 数据

 

        将可选的扩展首部和主首部串联在一起,扩展首部和主首部如何串联在一起呢?通过Next Header进行串联,如果没有扩展首部,那么Next Header中填写的是6,即代表TCP Data。

        如果后面有扩展首部,Next Header应该填入固定的值,比如第一个是0,代表是逐条选项,接收方收到0的时候,知道接下来要解析逐条首部的长度...

 

        接下来以分片扩展首部为例,

  • Next Header:后面是否仍有扩展首部
  • Reserved:保留位
    接下来的几个字段是和Ipv4中完全一致的:
  • Fragment Offset: 8个字节,表示在分片中的便宜,
  • More Fragment:MF标志位,为0表示最后一个分片,为1表示非最后一个分片
  • identfication:扩展为4个字节,表示是否是同属于一个报文的分片。 

 

        抓包分析:可以看到这个报文没有扩展字段,主首部后面直接跟着UDP data。 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/c243311364/article/details/125253082

智能推荐

UVA 1411 Ants 二分图最佳完美匹配_给定一个二分图,该二分图有 nn 个黑点与 nn 个白点-程序员宅基地

文章浏览阅读370次。UVA 1411题意:有n个白点和n个黑点,要求用n条不相交的线段把他们连接起来,其中每条线段恰好连接一个白点和一个黑点。思路:连接两点a1和b1,如果还有其他的线段a2,b2相连与之相交,必有dist(a1,b1)+dist(a2,b2)大于dist(a1,b2)+dist(a2,b1),原因是两条相交线段构成了几个三角形,三角形性质有两边之和必大于第三边,所以,如果每条线段都没有与之相..._给定一个二分图,该二分图有 nn 个黑点与 nn 个白点

TensorFlow学习2:使用自己的数据批量训练网络_tensorflow 实现简单的批处理训练例子-程序员宅基地

文章浏览阅读1k次。使用自己的数据训练网络时,需要用到两个函数:tf.train.slice_input_producer、tf.train.batch和两个类tf.train.Coordinator和tf.QueueRunner。参考博客:tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数和tensorflow中协调器 tf.train.Co..._tensorflow 实现简单的批处理训练例子

通用检测模型合集-程序员宅基地

文章浏览阅读368次,点赞8次,收藏10次。其中,基于注意力的伪标记方案是主要来获取候选未知查询的,从中间特征的注意力图上求取各个查询的平均分数(比如a-e),然后再用top-k来分配是不是物体,此阶段只区分unknown和no-objects两类,上图中a,b,c是unknown类别,d,e是非目标类别。论文的开放世界目标检测模型使用基于能量的分类头和对未知类别敏感的RPN来识别潜在的未知对象,此外,在特征空间中进行对比学习,以学习有区分性的聚类,并可以灵活地以连续的方式添加新的类别,而不会遗忘先前的类别。然后,查询的目标分数用于识别伪未知对象。_检测模型

动手构建你的第一个知识图谱 by RDF (3)_rdf绘制知识图谱-程序员宅基地

文章浏览阅读92次。RDF 的全称叫 Resource Description Framework (资源描述框架)。它是实现语义网络的三个基础技术之一 (其他两个是 SPARQL 和 OWL)。它是被 W3C 推荐的一个数据模型:这意味着所有的语义网络数据都用 RDF 来存储;另外它也是一种在万维网中表示资源信息的语言,有着一套自己的语法规则。_rdf绘制知识图谱

ElasticSearch:highlight_query与rescore_query_rescorerbuilder-程序员宅基地

文章浏览阅读1k次。highlight_query突出显示搜索查询之外的其他查询的匹配项rescore_query重新打分 QueryRescorerBuilder rescorerBuilder = new QueryRescorerBuilder(QueryBuilders.matchPhraseQuery("search", keyword)); rescorerBuilder.setQueryWeight(0.7f); rescorerBuilder.setRescoreQueryWeight(1.2f);_rescorerbuilder

c语言分治算法求最近对,分治法求解最近对问题(c++)-程序员宅基地

文章浏览阅读689次。#include"stdafx.h"#include#include#define TRUE 1#define FALSE 0using namespace std;typedef struct Node//坐标点{double x;double y;}Node;typedef struct List{Node* data; //点int count; //点的个数}List;..._c++分治法求平面最近点对。

随便推点

element-ui使用axios获取并下载流文件到本地_elementui下载文件到本地-程序员宅基地

文章浏览阅读1k次。首先使用axios发送一个GET请求,并将其响应类型设置为“stream”。这将使axios返回一个包含可读流的响应对象。我们然后创建一个可写流,并将响应数据流(pipe)到可写流中。最后,我们返回一个Promise,以便在下载完成时进行通知。当Promise被resolve时,文件将下载到本地磁盘,并且可以使用相应的路径访问。如果下载过程中发生错误,Promise将被reject,并且在控制台上将打印出错误消息。_elementui下载文件到本地

Stream踩坑2:list转map,value为空报空指针_stream list空的会报空指针吗-程序员宅基地

文章浏览阅读1.5k次。stream_stream list空的会报空指针吗

完整的POM文档内容-程序员宅基地

文章浏览阅读121次。?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859..._pom完整的内容

SpringBoot整合ElasticSearch_spring elasticsearchproperties-程序员宅基地

文章浏览阅读86次。SpringBoot默认支持两种技术来和ElasticSearch交互。Jest(默认不生效)1.首先需要导入jest的工具包(io.searchbox.client.JestClient)。<dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifac..._spring elasticsearchproperties

Docker compose_docker-compose-linux-x86_64-程序员宅基地

文章浏览阅读1.9k次。️接上一篇Docker自定义镜像️第1步去github官网上下载搜索docker-compose选择most stars最多收藏,点击第一个选择发行版本️2. 下载的拖拽到Xterm中/root目录下_docker-compose-linux-x86_64

SAP SMARTFORMS打印设置默认LP01格式打印_sap lp01-程序员宅基地

文章浏览阅读525次。1.设置默认打印格式并不是再代码里写,而是跟用户绑定。2.输入事务码SU01。_sap lp01

推荐文章

热门文章

相关标签