目录
一. 基本概念
二. 协议报文格式
三. 网段划分
1. 第一次划分
2. CIDR方案
3. 特殊的IP地址
四. IP地址不足
1. 私有IP和公网IP
2. DHCP协议
3. 路由器
4. NAT技术
内网穿透(NAT穿透)
五. 路由转发
路由表生成算法
结束语
IP指网络互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模,易构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则。IP只为主机提供一种无连接,不可靠,尽力而为的数据包传输服务
TCP协议提供传输控制,IP协议提供传输服务。TCP协议为传输层协议,其保证可靠性和传输效率,而下层的网络层和数据链路层负责数据在网络中的传输。
双方在进行网络通信时,数据并不是从一方的传输层直接发送到另一方的传输层的,而是需要依次向下交付给网络层和数据链路层,然后发送到网络中;对方主机拿到数据后,先需要依次向上交付解包。如下图
数据自顶向下交付,各协议层添加报头的过程叫做封装;报文自底向上,各协议层移除报头的过程叫做解包
专有名词解释
需要注意的是,现代操作系统的某些特定配置下,也可以使得主机具备一定程度的路由功能。比如支持NAT(网络地址转换),但这并不是主机的主要功能。路由器也可以被称为主机
IP报头在内核中本质是位段类型,给数据封装报头,实际上就是使用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,便完成了IP报文的封装
解包过程需要回答两个问题:
1. IP报头和有效载荷如何分离
方法与TCP一样。在IP报头中,前20字节是固定长度,其中有4位首部长度,根据首部长度就可以知道报头的长度,再根据16位总长度,将报头和有效载荷分离
2. 有效载荷如何向上交付
基于IP协议的传输层协议不止一种,因此IP封装时,需要记录上层协议类型。报头中的8位协议字段,就记录了上层协议类型
常见的8位协议字段有这些
IP地址标识网络中唯一一台主机,端口号标识主机中唯一一个进程。所以IP地址+端口号可以表示网络中唯一一台主机的进程
网络通信的实质是,网络中,两个不同主机的进程的通信
端口号在传输层使用,而IP地址在网络层使用
IP地址分为两部分:网络号和主机号
数据在网络传输过程中会遇到一个个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络中的数据慢慢接近目标主机。路由器在帮助数据进行路由转发时,会提取该数据的IP报头当中的目的IP地址,并以此作为数据路由转发的重要依据。
当主机A收到主机B的数据,可能要返回响应或者也要给主机B发送数据,此时双方身份就对掉了,主机B可以根据主机A发送的报文,其中有源IP地址——主机A的IP地址。此时主机B构建的IP报文,源IP是主机B的IP,目的IP是主机A的IP地址
过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图
当要判断一个IP地址属于哪一类时,只需要遍历IP地址的前5个比特位,第几个比特位最先出现0,那么就对应属于哪一类IP地址
主机号越多,代表该网络可容纳的主机数越多
但随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快分配完了,而A类却浪费了大量的地址:
例如,申请一个B类地址,理论上该子网中允许容纳6万5千多台主机
但实际网络架构中,不存在一个子网有这么多主机的情况,因此大量的IP地址都别浪费掉
针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)
在原有的五类网络的基础上继续进行子网划分,需要借用主机号当中的若干位充当网络号
下面举两个例子
因为255的比特位为8个1,即全1。任何数与之按位与都为其本身,所以IP地址的前三位不变。最后一位为0,按位与为0。并且不管最后一位数字怎么变,与子网掩码按位与都为0。所以该子网范围为140.252.20.0 ~ 140.252.20.255
240的比特位为1111 0000,即按位与后会保留最后一位的前4个比特位。68的比特位为0100 0100,与240按位与后保留前四位:0100 0000——64
因为最后一位的后4个比特位为主机号,所以最多有16台主机,即从140.252.20.64 ~ 140.252.20.79
可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围
此时一个网络就被更细粒度的划分成一个个更小的子网,通过不断地子网划分,子网中IP地址对应的主机号就越来越短,因此子网中可用的IP地址的个数也越来越少,这就避免了IP地址被浪费的情况
需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的内部再继续进行子网划分
因此一个数据在路由器转发时——路由,随着数据不断路由进入更小的子网,其网络号的位数是不断变化的,准确涞水其网络号的位数在不断增加,这就意味着IP地址中的主机号位数不断减少,子网规模不断变小。最终当数据路由到达目的主机所在网络时,就可以在该网络中找到对应的目的主机
IP地址和子网掩码还有一种更简洁的表示方法:例如140.252.20.68/24
这表示该主机的IP为140.252.20.68,子网掩码的高24位为1,也就是255.255.255.0
补充:运营商
运营商其实就是中国电信,移动,联通等等
也就是说,用户上网的数据首先必须经过运营商相关的网络设备,然后才能发送到互联网公司对应的服务器。网段划分,子网划分等工作都是运营商做的
并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就具有特殊用途
主机号全0和全1一般不被主机使用,所以一个子网(局域网)的主机数最多为,n为主机号位数。例如192.168.2.0。该子网的主机号为最后一位,有8bits,即主机数最多为
本地环回
本地环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本地环回不会讲数据写到网卡上
本地环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常
本地环回的基本原理:
loopback设备:
IP地址(IPv4)是一个4字节,32位的正整数,因此最多表示的主机数为,将近43亿个。又因为IP地址唯一标识网络中的一台主机,所以要想网络通信,就必须有IP地址。
但全球人口已经有超70亿,更何况不仅电脑,手机等设备,只要是需要上网的,都需要IP地址。由此可见,32位IP地址是远远不够的
因此才提出CIDR的方案,对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费。
CIDR虽然一定程度上缓解了IP地址不够用的问题,减少了IP地址的浪费,但IP地址的绝对上线并没有增加,即能表示的主机数没有增加。
为了,人们提出了以下几种方式:
如果一个组织内部组建局域网,IP只用于局域网内部的通信,而不直接练到Internet上,理论上,使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
包含在这个范围内的,都称为私有IP,只在子网(局域网)是使用,其余被称为公网IP(或全局IP)
在Linux中,可以使用ifconfig查看网络信息,第一段的etho代表这台主机的网络接口,第二段的lo(loop)代表本地环回。可以看到,私有IP为10.0.12.11
在Windows下,可以先Win+r,输入cmd打开命令行控制器,使用ipconfig命令查看网络信息
手动管理IP地址是非常麻烦的,当子网中新增主机时需要给其分配IP地址,当子网当中有主机断开网络时,又需要将其IP地址回收,便于后续给新增主机分配
举例:
比如家里面的局域网的网络号为:192.168.2.
可用的IP地址就是192.168.2.0 ~ 192.168.2.255;一般规定.0和.255是不用的;路由器一般为局域网中的第一台主机,即192.168.2.1
DHCP的作用就是,当你的手机和你的电脑连网时,按顺序分配IP地址,如果早上你的手机先连,那么手机的IP地址为192.168.2.2,电脑为192.168.2.3;中午手机和电脑都断了网,下午电脑比手机先连,那么电脑的IP为192.168.2.2,手机为192.168.2.3。这就是动态地址分配——DHCP
路由器是连接两个或多个网络的硬件设备,路由器上有两种网络接口,分别是LAN口和WAN口:
我们将LAN口的IP地址叫做LAN口IP,也叫子网IP;将WAN口的IP地址叫做WAN口IP,也叫做外网IP
我们使用的电脑,家用路由器,运营商路由器,广域网以及我们要访问的服务器之间的关系大致如下:
路由器在做IP地址替换时,还会将源IP和目的IP的映射关系保存,记录在NAT转换表中。
当局域网内的主机访问公网主机时,通常情况下,局域网出口路由器会将发往公网主机的数据包进行网络地址转换(NAT),将数据包中的源IP地址修改为路由器的公网IP地址,以便公网主机能够正确地返回响应。
在进行 NAT 转换时,路由器会将源 IP 地址替换为它自己的公网 IP 地址,并在其 NAT 转换表中记录转换信息,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。
当局域网出口路由器进行网络地址转换(NAT)时,它会在转换表中记录每个转换的信息,包括私有 IP 地址和对应的公网 IP 地址。这样,在接收到公网主机返回的响应数据包时,出口路由器可以根据目标 IP 地址查找转换表,并将目标 IP 地址从公网 IP 地址映射回相应的私有 IP 地址。
具体而言,当出口路由器接收到返回的数据包时,它会检查数据包的目标 IP 地址。然后,它会查询转换表,找到与目标 IP 地址对应的私有 IP 地址。接着,出口路由器会将数据包的目标 IP 地址修改为对应的私有 IP 地址,并将数据包发送到局域网内的相应主机。
所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。
但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。
内网穿透是一种网络技术,内网穿透通常用于实现两个不同局域网之间的通信。当两个局域网之间由于网络隔离或安全限制而无法直接通信时,可以使用内网穿透技术来建立一条安全的通道,使得两个局域网中的设备可以相互访问和通信。
常见的内网穿透技术包括端口映射、反向代理和虚拟专用网络(VPN)等。
端口映射:通过在路由器或防火墙上设置端口映射规则,将公网上的某个端口映射到私有网络中的设备,从而实现对该设备的访问。
反向代理:在公网上搭建一个反向代理服务器,当公网用户请求访问时,反向代理服务器会将请求转发到内网中的目标设备上,并将响应返回给公网用户。
虚拟专用网络(VPN):通过建立加密隧道,将公网用户连接到私有网络中,使得公网用户可以像在内网中一样访问内网设备或服务。
这些技术都可以实现内网穿透,但具体选择哪种方式取决于实际需求和网络环境。需要注意的是,在使用内网穿透技术时应确保网络安全,采取适当的安全措施来保护内网设备和数据的安全性。
上面说到,路由器是集连多个子网的设备,子网内的主机如果要访问公网的服务器,其数据需要路由器转发到公网。这就是路由转发
数据在路由过程中,实际是一跳一跳的(Hop by Hop)“问路”的过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
IP数据包的传输过程:
路由器的查找结果可能有以下三种:
Linux路由表可以使用route命令查看;Windows下使用route PRINT -4
route PRINT -4
route命令
当一个数据包从源设备发送出去时,它首先会通过源设备的网卡发送到本地网段。然后,根据目标 IP 地址,源设备的操作系统会查找路由表来确定下一跳的路由器。路由表中记录了网络的目的地址和相应的下一跳路由器。根据目的地址,源设备会将数据包发送给下一跳路由器。
下一跳路由器接收到数据包后,会根据自己的路由表,依次与子网掩码Genmask进行按位与操作,然后结果与子网掩码对应的目的网络地址Destination进行对比,如果匹配则将数据发送到这个子网,通过对应的发送接口Iface发出。这个过程会一直持续,直到数据包到达目标设备所在的网络,并被目标设备接收。如果没有匹配的子网,就会发送到默认路由——default,其对应的Flags是UG
路由转发过程中,路由器会根据目标地址进行决策,选择最佳路径来转发数据包。路由器之间通过路由协议来交换路由信息,更新各自的路由表,以保证网络中的路由信息能够得到更新和同步。
通过路由转发机制,网络中的数据包可以在不同的网络之间进行传输,实现了跨网络的通信和互联互通。
举例
假设某主机上的网络接口配置和路由表如下:
转发过程例1:如果要发送的数据包的目的地址是192.168.56.3
转发过程例2:如果要发送的数据包的目的地址是202.10.1.2
总结
路由器通过使用路由表和路由算法来进行路由转发。下面是一个简化的描述路由器路由转发的过程:
接收数据包:路由器首先接收到一个数据包,这个数据包通常是从其中一个接口进入路由器的。
解析目标 IP 地址:路由器检查数据包的目标 IP 地址,以确定下一步的路由决策。
查找路由表:路由器查询自己的路由表,路由表是存储在路由器内部的一个表格,记录了目标网络地址和相应的出接口之间的映射关系。
路由决策:根据路由表的信息,路由器选择一个最佳的出接口来转发数据包。这个决策可能基于多种因素,例如目标网络的距离、接口的负载情况或者其他策略。
封装数据包:路由器将数据包重新封装,更新源和目标的 MAC 地址,并将其发送到下一跳路由器或目标主机。
转发数据包:路由器将封装好的数据包通过选定的出接口发送出去。这可能涉及到数据链路层的处理,例如将 IP 数据包封装为适当的链路层帧。
循环直至目标:如果目标主机不在直接连通的网络上,路由器将重复上述过程,将数据包发送到下一跳路由器,直到数据包到达目标主机为止。
总之,路由器使用路由表和路由算法来决定如何转发数据包。它根据目标 IP 地址选择最佳的出接口,并封装数据包并转发到下一跳路由器或目标主机。这个过程在整个网络中重复进行,直到数据包到达目标位置。
路由可分为静态路由和动态路由:
路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。
本篇博客到此结束,感谢看到此处。
欢迎大家纠错和补充
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。