网络层--ip协议/路由/NAT精讲

一.IP协议简介

        在网络模型中,我们可以看到,ip协议就是在网络层工作的,这一层的数据叫作数据包。IP协议又叫网际协议(Internet Protocol,IP)通常被认为提供的是无连接不可靠的,但实际上,在网络性能良好的情况下,IP传送的数据能够完好无损的到达目的地。无连接是指没有确定目标系统是否已做好接收数据的准备之前就发送数据。不可靠是指目的系统不对成功完成接收到的分组进行确认。其次IP协议它定义了数据包的格式和规范,并负责数据包的分组封装、路由选择和数据包转发。IP协议使用IP地址来唯一标识主机和网络,实现数据包的传输和路由。

二.IP协议头格式

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.

4位头部(首部)长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此 IP协议头部最大长度是60字节,最少是20字节.
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.  

16位总长度(total length): IP数据报整体占多少个字节.

16位标识(id): 唯一的标识主机发送的报文. 如果 IP报文在数据链路层被分片 了, 那么 每一个片里面的这个id都是相同的 .
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片 , 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片" , 如果分片了的话,最后一个分片置为1, 其他是0. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.

32位源IP地址和32位目标IP地址: 表示发送端和接收端.

选项字段(不定长, 最多40字节): 略

数据:存放的是高层协议需要传输的数据,如果上层协议是 TCP(传输控制协议),那么这部分数据就可能包含了 TCP 头部和 TCP 承载的数据。如果上层协议是 UDP(用户数据报协议),则包含了 UDP 头部和其相关的数据。

在学习协议格式都必需搞清楚两个问题。

Q1.IP报文头部如何和有效载荷分离?

在协议格式中,我们可以看到4位头部(首部)长度(header length)和16位总长度。通过总长度减去头部长度,剩下的便是有效载荷即数据部分。

Q2。如何讲有效载荷向上交付?

通过源IP地址和目的IP地址。因为IP地址来唯一标识主机和网络。

 三.IP地址

         在前面总提到IP地址来唯一标识主机和网络。那么IP地址是个啥,它有为啥能唯一标识主机和网络呢?

IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址分为两个部分,:网络号和主机号。

网络号: 用于标识设备所属的网络。保证相互连接的两个网段具有不同的标识;

  • 网络号代表某个完整的范围 [范围]

主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

  • 主机号代表某台独立的主机 [精确地址]

IP地址有32位二进制数,常用点分四段十进制表示。eg:1.14.16.220

同一子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。

        通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.从而使得每个IP地址标识唯一的主机和网络。

随着而来便又出现了一个问题,一个子网下那么多主机,IP地址又不同,如何管理呢?手动一个一个记录吗?当然不是。

有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.如何分配这里不过多介绍。

一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器。

IP地址的分类

        过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示:

A类 0.0.0.0到127.255.255.255

B类 128.0.0.0到191.255.255.255

C类 192.0.0.0到223.255.255.255

D类 224.0.0.0到239.255.255.255

E类 240.0.0.0到247.255.255.255

 以A类地址举例:

第一位固定是0 ,后七位也从0开始 :00000000(八位)--->网络号

主机号也从0开始   00000000 00000000 00000000 (24位)--->主机号

IP地址为:00000000 00000000 00000000 00000000=0.0.0.0

满了时。第一位固定是0 ,后七位变成1:01111111--->网络号

主机号也都变成1 :11111111 11111111 11111111   --->主机号

IP地址为:01111111 11111111 11111111 11111111=127.255.255.255;

注意:

A类:0-127,其中0代表任何地址,127为回环测试地址,因此,A类ip地址的实际范围是1-126.其中127.0.0.1是一个特殊的IP地址,表示主机本身,用于本地机器的测试。A类,B类,C类的IP地址可供普通用户使用,D类和E类都不属于私有或公地址,做特殊用途。D类用于组播,E类用于科研实验。将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。0.0.0.0是一个特殊的IP地址,表示整个网络中的所有主机

        从上面的注意事项中又有几个问题:

        Q1.什么是公网(公有)IP,什么是私网(私有)IP?

私有IP地址,也被称为局域网IP或内网IP,是专门为组织机构内部网络所使用的IP地址。这类IP地址在公网上是无法访问的,它们主要用于内部网络的设备之间的通信。私有IP地址的范围包括10.0.0.0至10.255.255.255、172.16.0.0至172.31.255.255以及192.168.0.0至192.168.255.255。这些地址不会在互联网上被路由,因此它们可以用于任何内部网络,而不用担心与公网上的其他设备发生冲突。

公网IP地址,也被称为广域网IP或外网IP,是可以直接在公网上访问的IP地址。它们是互联网上唯一可识别的地址,用于设备之间的通信和数据传输。与私有IP地址不同,公网IP地址在全球范围内是唯一的,并且可以在互联网上被路由和访问。

补充:路由主要指的是分组从源到目的地时,决定端到端路径的网络范围的进程。具体来说,路由是指导数据分组(或数据包)从源节点传输到目的节点的路径选择过程。

包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
 

        Q2.什么又是组播呢?

广播 -- 就是指同时向子网中的多台计算机发送消息,并且所有子网中的计算机都可以接收到发送方发来的消息。每个广播消息包含一个特殊的IP地址。

广播消息地址分为两种类型:直接广播地址和本地广播地址。

广播的通信模式虽然能够实现一对多的通信需要,但是,由于广播是向子网中的所有计算机用户发送消息,没有目的性,不但增加了网络传输负担,而且资源消耗较高。组播的出现,较好地解决了这个问题。组播也叫多路广播。

所谓组播是将消息从一台计算机发送到本网或全网内选择的计算机子集上,即发送到那些加入指定组播组的计算机上。组播组是开放的,每台计算机都可以通过程序随时加入到组播组中,也可以随时离开。

        随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址

例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了

子网掩码

针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing);
无分类域间路由(Classless Inter-Domain Routing,简称CIDR)是为了应对IP地址资源紧缺而设计的一种网络技术。

1.引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;

2.子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾(前面连续的“1”部分用于标识网络地址,后面连续的“0”部分用于标识主机地址。以“0”结尾能够清晰地界定出主机地址的范围。);

3.将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;

4.网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

划分子网例子:

可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0。

补充:子网掩码取反就可得到最大主机号。

IP地址数量限制

        IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址。实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.
        CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;

NAT技术(后面的文章会重点介绍);

IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

四.路由

        路由器

        路由器是用来连接两个或多个网络的硬件设备,工作在网络层,在网络间起到网关的作用。路由器可以通过查询路由转发表为接收到的报文寻找一条最佳的传输路径,然后从对应的接口转发出去,最终将报文送达到对应的目的地址。

 路由器通过从下往上,不断的解包到IP层。为啥到IP层就不继续解包到TCP/UDP呢?前面我们提到过,IP协议格式中有32位源IP地址和32位目标IP地址。当路由器拿到这两个IP时它就知道了这个报文要发往哪个网络哪个主机。若就是该网络则直接发给该网络主机。若不是则通过查询路由转发表,来找一个路径。最后在封包发回要去的网络中。然后下一个路由器又重复这样做,直到到达目标IP地址;

一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).

Q1.为什么说子网之间的IP地址就可以重复了?

如下图:

 被运营商路由器进行子网划分后,这些子网都变成了私有网络,里面的都是私有ip地址。这些地址不会在互联网上被路由。在公网上是无法访问的,它们主要用于内部网络的设备之间的通信。只有最外面的运营商路由器有公网ip,可以在互联网上访问和路由。所以子网之间的IP地址就可以重复,这样还提高了ip利用率。

路由/路由表

路由主要指的是分组从源到目的地时,决定端到端路径的网络范围的进程。具体来说,路由是指导数据分组(或数据包)从源节点传输到目的节点的路径选择过程。简单来说就是在复杂的网络结构中, 找出一条通往终点的路线;

那么当前路由器是如何判定当前这个数据包该发送到哪个网络的哪个路由器呢? 这就依靠每个节点内部维护一个路由表。

路由表:简单点说路由表就是路由器用于指导数据包如何转发的表项,记录了去往目的IP的下一跳去哪里。如下:

IP路由表中包含了目的网络/掩码,协议类型,优先级,开销,标志,下一跳,出接口这个七大要素。

下面我们来看下几个真实的路由表:

 

转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3

跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符

再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;

由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

补充:这里没有细讲路由表的生成算法,大家要是对生成算法感兴趣可以看看下面这个文档

常见的路由表生成算法 - fei33423 - 博客园 (cnblogs.com)

详细关于路由表各个元素的介绍请看这个文档

18张图带你详解IP路由表七大要素:路由前缀、协议类型、优先级、开销、下一跳、出接口-腾讯云开发者社区-腾讯云 (tencent.com)

五.NAT技术 

NAT

之前我们讨论了, IPv4协议中, IP地址数量不充足的问题。NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;它是能够将私有IP对外通信时转为全局IP. 也就是一种将私有IP和全局IP相互转化的技术方法。全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的(上面我们介绍过为什么);

转化过程如下:

NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;

NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;在NAT路由器内部, 有一张自动生成的, 用于地址转换的表(注意和路由表不一样);

当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;

之后在发送接收数据时,就不要转换/替换ip,直接根据表中的映射关系,直接拿到要去的ip。

此时又存在一个问题:如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?如图:

NAPT

这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
 

这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。为什么这么说呢?大家想想看,在TCP建立连接时,会发送报文,tcp报文的格式里面可是有源端口号和目的端口号啊,当tcp连接断开时,再重新连接,端口号可能会变化,所以要删除表项,避免资源浪费和耗时。

补充:路由器往往都具备NAT设备的功能

NAT技术的缺陷


        由于NAT依赖这个转换表, 所以有诸多限制:

无法从NAT外部向内部服务器建立连接;

装换表的生成和销毁都需要额外开销;

通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;

 代理服务器

        代理服务器(Proxy Server)是个人网络和Internet服务商之间的中间代理机构,它负责转发合法的网络信息,对转发进行控制和登记。代理服务器作为连接Internet(广域网)与Intranet(局域网)的桥梁,在实际应用中发挥着极其重要的作用,它可用于多个目的,最基本的功能是连接,此外还包括安全性,缓存,内容过滤,访问控制管理等功能。代理服务器,顾名思义就是局域网上不能直接上网的机器将上网请求(比如说,浏览某个主页)发给能够直接上网的代理服务器,然后代理服务器代理完成这个上网请求,将它所要浏览的主页调入代理服务器的缓存;然后将这个页面传给请求者(正向代理服务器。这样局域网上的机器使用起来就像能够直接访问网络一样。并且,代理服务器还可以进行一些网站的过滤和控制的功能,这样就实现了我们控制和节省上网费用。一般代理服务器拥有较大的带宽,较高的性能,并且能够智能地缓存已浏览或未浏览的网站内容,因此,在一定情况下,客户端通过代理服务器能更快速地访问网络资源。

那么NAT和代理服务器的区别有哪些呢?

从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.

从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上

 代理服务器是一种应用比较广的技术:

翻墙: 广域网中的代理.

负载均衡: 局域网中的代理

代理服务器又分为正向代理反向代理
         正向代理前面提到过了,常见的用途就是访问国外网站,教育网等。

        反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。反向代理往往作为一个缓存.

反向代理的用途:隐藏服务器真实IP,提供安全保障等

正向代理和反向代理的区别

虽然正向代理服务器和反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。

1、正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。

2、正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。

3、正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。

4、正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。

六.参考

IP地址分类及私网IP-腾讯云开发者社区-腾讯云 (tencent.com)

终于有人把正向代理和反向代理解释的明明白白了!-腾讯云开发者社区-腾讯云 (tencent.com)
代理服务器的概念及其工作原理_代理 上网 原理-CSDN博客
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值