三、 网际互联的网络层——IP地址【计算机网络全景梳理系列】

本文主要是介绍三、 网际互联的网络层——IP地址【计算机网络全景梳理系列】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0.回顾——数据链路层

上一节讲到,Bob和Alice等小伙伴建立了一个小团伙的局域网。在这个局域网中:

  • 他们把原始的信息流(Bits)封装成帧(Frame)来传输,这样可以区分出一个与一个消息。
  • 同时,使用转义字符解决了某些数据和帧符号相同的问题,实现了可以传输任意字符的透明传输效果。
  • 为了避免传输过程中受到噪声的影响,在这些帧中还添加了差错控制,避免传输错误的信息。

在局域网中的每个小伙伴,都有一个自己独特的身份证号——MAC地址,这个MAC地址在每个人的一生中是不会改变的。而且在局域网的范围中,通过交换机自学习功能,小伙伴们可以通过这个MAC地址中来互相发送信息,实现了物理路由

在这个局域网中,为了节省资金,大家会共用一个公共信道(逻辑上总线型)。而为了避免发生冲突,大家分想了不少的办法

  • 大家根据令牌轮流使用(令牌
  • 边发边听,相互谦让(CSMA/CD 载波监听多点接入/冲突检测
  • 发前预约信道(CSMA/CA 载波监听多点接入/冲突避免
1. 新挑战——不同局域网之间如何交流

Bob和小伙伴们创建的局域网大大方便了同学间的学习交流,从此声名远扬。大家纷纷效仿创建了一个又一个类似的局域网。在世界各地创建的局域网中,人们又希望世界各地不同的局域网之间任意两台机器也能实现相互交流的效果。

为了在不同的局域网之上,提供统一的任意地方到任意地方的信息传输服务,Bob和全世界的小伙伴们在数据链路层的基础上又创建了网络层

回顾一开始的假设,网络层要解决的最大问题就是如何实现任意两台设备的互联,一个信息可以准确的从发送地传输到目的地?

2. 面向连接与无连接之争

在一开始的计算机网络领域,大家曾对网络层要使用类似与电报面向连接的虚电路服务还是分组交换的无连接服务。针对面向连接的虚电路服务,ITU-T组织层发布多X.25协议。但是不同于电报中电话机设备简单,计算机网络设备比较智能,同时为了降低网络造价,面向无连接的分组交换协议成为现在网络层的主流方法。

服务方式连接方式协议
虚电路面向连接ITU-T X.25
分组交换无连接IP
3. 网络层之魂——IP地址
3.1 为什么需要IP地址,而不用MAC地址

为了实现任意两个网络设备之间的互联通信,需要辨别不同设备,即需要有一个身份辨别。在上一节中,我们讲到了在数据链路层中,每个设备都有一个自己的唯一ID(MAC地址)。

那么可以在网络层中使用MAC地址来寻址吗?

显然不能,理由很简单——在写信的时候,信封上地址栏会写身份证号码吗?哈哈,显然不会。我们不会写对方的身份证号码而是它的地址。仅仅靠身份证号码可找不到对方,所以我们需要另外的信息——IP地址。

所以,IP就是网络世界中的地址,数据包就是靠着这个IP地址传输到对方设备。

概念唯一性现实世界类比
MAC地址物理世界唯一身份证号码
IP地址网络世界唯一住址

就跟人会搬家一样,不同的网络设备可能会接入不同的网络中。所以在写信寄包裹时候只能凭借具体的住址。

3.2 IP地址分配

IP地址是互联网上每台设备在全世界范围内唯一32位标识符

不同与真实世界中,各地的地址根据地理位置已经有所划分。网络中的IP地址是需要分配的,具体的机构为ICANN。IP地址可以分为两个部分:

  • 网络号:设备所处的网络,类似小区的地址,这必须是全球唯一的
  • 主机号:标志者主机在网络中的位置,例如3栋401,这个可以类似的

不同的局域网中有着不同数量的主机数量,为了分层次管理,全球的IP分为了A类到E类五种类型。

私有地址

即使可供分类的IP很多,但是全世界的主机更多。每个网络设备都有一个自己IP不太现实。所以为了避免这种情况,IP地址分为了公有地址私有地址。其中私有地址不会出现在全球网络中,但是可以在一个局域网中中分配。这样,一个局域网对外可以只有一个共有IP,而在内部可以分配多个私有IP。

在不同的类型IP都有对应的私有地址,例如 A类中的10.x.x.x、B类中的172.16.x.x, C类中的192.168.0.x。

3.3 IP数据报封装

类似于以太网帧,网络层会把分组的数据封装为一个IP数据包。一个IP数据包可以分为两个部分,首部数据部分。其中首部说明了一个数据报的很多相关信息,首部的最小长度为20字节。其中每个字段的含义如下:

字段bit含义常见值
版本4IP协议的版本4(IPV4)
首部长度4所有首部的字节数(20-60字节)20(最小长度)
区分服务8服务类型(实际上没有使用)
总长度16首部和数据之和,单位为字节最大为65535字节
标识16表示字段 (计数器)
标志3是否分片
片偏移13分片后在原来的位置偏移
生存时间8TTL (1-255)
协议8协议号TCP:6 UDP:17 ICMP:1
首部校验和16校验值
源地址32发送设备的IP地址
目的地址32接收设备的IP地址
可选字段/用于测试 调试 安全限制等
填充/让部分长度为32的整倍数
4. 是谁的包裹?——ARP协议

上一节中讲到数据包在发送时候使用的是IP地址(类别于信封上的信息),而具体的数据是必须发送到一个具有特定MAC地址的设备上(类似于有唯一身份证ID的一个人)。那从网络层到数据链路层,网络是需要知道具体的数据报属于谁。

这就像快递小哥把快递送到学校后,还需要找到包裹上信息的对应的人。(但是不同于真实世界可以打电话,这里加速快递小哥没有电话)

那该怎么办呢?——ARP协议出现了!

ARP协议机制
广播机制——逐个问:“是不是你的包裹?”

想象一下你就是快递小哥,你已经把包裹送到对应的宿舍里,宿舍里有四个人,而你肯定也都不认识。那你接下来应该怎么确定是谁的包裹呢?

“这不很简单,一个个问呗”。对,ARP协议也是使用这么粗暴的方式。

在不知道IP地址对应着的是哪个设备时候,设备会向同一链路的所有设备广播ARP请求包

  • 请求包中包含了目的地的IP地址
  • 每个设备接收到后会查看和自己匹不匹配
  • 若匹配,主机会发送回ARP请求包(请求包中会包含了主机的MAC地址)

这样,包裹(数据包)就被成功的送到对应的同学(设备)上了。

cache机制——拿小本本记下

但这也不是事,总不能每次都一个一个去问,这也太浪费时间了吧。那有什么好的办法呢?

“嘿,这不简单,拿小本本记下呗!”

类似的,在每个设备上会维护一个APR表,用来记录每个IP对应下的MAC地址。这样,就不用每次去一个个问了。

超时清除机制——人员流动

类似于现实世界中人员会流动(学生更换寝室),小本本不能一直用下去需要更新一样,ARP表中的内容超过一定时间期限后就会被清除

ARP结构

ARP协议会被包括在以太网帧中被发送。

整体的以太网帧结构为

  • DST 以太网的目的地址,全1表示广播
  • SRC以太网的源地址
  • 帧类型
  • ARP数据包
    • 硬件类型 ,以太网来说,此值为 1
    • 协议类型, 指出映射的协议地址类型,对于 IPv4 地址,这个值是 0x0800
    • 硬件大小协议大小 分别指出硬件地址和协议地址的字节数。常见值分别是 6 和 4
    • Op 字段指出操作类型
    • 后面就分别是发送者目的以太网地址IP地址
  • 后面就是以太网帧帧尾了,包括对齐PAD和校验CRC
ARP攻击

从上面快递员送快递的例子来就可以感受到ARP协议是一个不安全的协议,很容易受到ARP攻击

攻击类型详细类比
泛洪攻击发送大量假的ARP包,占用资源假冒快递员给你打骚扰电话,把你弄的贼烦
主机欺骗攻击骗过主机,使得局域网内被攻击主机发送给网关的流量信息实际上都发送给攻击者假冒快递员,去收你的快递。把你的快递占为己有
网关欺骗攻击骗过网关,攻击者源源不断的获取局域网内其他用户的数据小红假冒小绿去领快递,所有小绿的快递都被小红领了
中间人攻击同时欺骗局域网内的主机和网关,局域网中用户的数据和网关的数据会发给同一个攻击者小红和小黄写信,本来是小红和小黄之间直接交换的。但是小绿作为中间人可以获得其中的私密信息
IP冲突攻击假冒别人的IP地址真假小红,有两个人都声称包裹是自己的。
IPv6中NDP协议

邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现以及重定向等功能。

这篇关于三、 网际互联的网络层——IP地址【计算机网络全景梳理系列】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639505

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景: