文章目录
- 前言
- 一、IP协议
- 协议头格式
- 认识IP地址
- 格式
- 组成
- 子网掩码
- 地址管理
- 1.动态分配
- 2.NAT机制
- 3.IPv6协议
- 路由选择
- 二、以太网
- 以太网帧格式
- 认识MTU
- 总结
前言
本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!
IP协议是网络层的重要协议,我们编写代码很难直接接触到,因此本文只讲解IP协议的两个核心功能:地址管理与路由选择,废话不多说,直接上干货。
一、IP协议
协议头格式
- 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
- 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 长度 * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是 15 * 4 字节。
- 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位源地址和32位目标地址:表示发送端的网络地址和接收端的网络地址。
- 选项字段(不定长,最多40字节):选项字段用来支持排错、测量以及安全等措施,内容很丰富。 此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。
认识IP地址
格式
IP地址格式
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)如:
01100100.00000100.00000101.00000110。
通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:
100.4.5.6。
组成
IP地址分为两个部分:网络号和主机号。
1️⃣网络号:标识网段,保证相互连接的两个网段具有不同的标识。(表示局域网)
2️⃣主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。(表示局域网的内部设备)
图解如下:
一个路由器,有两个IP地址,分别对应不同的局域网,路由器的作用就是把多个局域网连接起来。 一个路由器所在的两个局域网的网络号不能重复
子网掩码
一个IP地址中,哪个部分是网络号,哪个部分是主机号? 一定是前三个字节是网络号吗?? 答案是不一定的。
对于网络号与主机号的划分,主要有两种分类方式。 1️⃣IP地址分类(ABCDE)【教科书上存在,但是已经淘汰,不做介绍】 2️⃣子网掩码
在命令行中输入"ipconfig" 可以查看Windows IP 配置。
子网掩码,也是一串32位的二进制数。
1所占的二进制位就表示网络号,0所占的二进制位就表示主机号 。
上述的子网掩码用二进制表示:
111111111.11111111.11111111.00000000
也就是说这个IP地址前24位表示网络号,后8位表示主机号。
所有的子网掩码,左侧都是1,右侧都是0,不会出现0101这种混合情况。
地址管理
在协议头格式中为
源IP地址:发送方设备的网络地址
目的IP地址:接收方设备的网络地址
- 每个网络设备都要有一个 唯一的IP地址 。
IP地址是32位二进制数,所以IP地址的总数量为 232 个,大约为42亿9千万。
在如今这样一个网络高度发达的时代,物联网兴起的时代,不止是电子产品联网了,还有家具,电器等设备都进行了联网。所以这些IP地址早就已经不足以支持这么多设备了。
为了解决这个问题,大佬们提出了三种解决方案。
目前主流的解决方案是 动态分配 与 NAT机制 这两种。
1.动态分配
动态分配比较好理解,
动态分配:任何一台设备,只有在上网的时候才分配IP地址,不上网就不分配 。
这个方案只是增加了IP地址的利用率,并没有增加IP地址的数量,只是一定程度上的缓解,不能彻底解决问题。
2.NAT机制
NAT(Network Address Translator,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。
NAT机制内容
NAT机制将所有的IP地址分为了两大类 内网与外网 。
内网IP: 10.*;172.16. * —— 172.31. * ;192.168. *
外网IP: 剩下的所有IP
内网IP在同一个内网中,
不可重复;不同内网中可以重复 (如下图)。
外网IP必须是唯一的
内网设备如果要访问外网,会给他分配一个外网IP,这个外网IP是内网设备共有的,因此一个外网IP就代表了许多设备。
如上图,如果内网1中的任何一台设备要访问外网,就会分配一个外网IP,假设为 66.66.66.66,并且使用这个外网IP去访问其他外网。
而这个分配下来的外网IP是这个内网中所有设备共有的,此时内网1中的任意设备访问外网时都会使用这个外网IP。
内网与外网
内网与外网的区别可以这样理解:
对于省份来说,河北省就是保定市,沧州市这些市的外网IP,这些市就是内网IP。
河北省(外网)包括保定市,沧州市,其他省份(外网)要想找到保定市(内网),就要先找到河北省(外网)
对于国家来说:中国就是河北省,河南省,这些省的外网IP,这些省就是内网IP。
中国(外网)包括河北省,河南省(内网),其他国家(外网)要想找到河北省(内网),就要先找到中国(外网)。
对于星球来说:地球就是中国,俄罗斯这些国家的外网IP,这些国家就是内网IP。
地球(外网)包括中国,俄罗斯(内网),其他星球(外网)要想找到中国(内网),就要先找到地球(外网)。
内网与外网并不是绝对的。
在命令行中输入"ipconfig" 可以查看Windows IP 配置。
实际上这个IPv4就是一个内网地址。
这个IP是在百度中查的这就是我的主机的外网IP,这个外网IP一定会被很多设备共用。外网IP查询地址
搞个流程图,可能更容易理解。
多台计算机向服务器发送请求
服务器向多台主机返回响应
当然了网络环境是很复杂的,因此可能需要经过多台路由器,交换机的转发才能到达服务器,因此可能请求发送过程中源IP地址被记录替换很多次,响应返回过程中目的IP被替换很多次。
你一定有个疑问???
如果多个设备经过同一路由器发出请求,而网络状况,请求都不一样,所以响应回到路由器肯定也是没有顺序可言的。那么路由器是怎么区分哪个响应该返回给哪台主机的呢??
此时,需要 NAT 设备根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如 TCP 或 UDP 端口号 。
在NAT的背景下,设备之间通信是有要求的
外网设备 -》外网设备,不需要任何NAT设备,直接通信。
内网设备 -》其他内网设备,不允许!
外网设备 -》内网设备,不允许!
内网设备 -》外网设备,经过对应内网的NAT设备即可完成通信。
3.IPv6协议
目前主流的IP协议是IPv4协议,就是目前介绍的协议。
而IPv6协议是一个新的IP协议,大概在2000年左右提出。
他与IPv4的最大区别就是:
IPv4用 4个字节 32位二进制位数来表示IP地址。 IPv6用 16个字节
128位二进制位数来表示IP地址。
故 IPv6协议有 2128个IP地址 ,这个数字是十分巨大的。这些IP地址可以给地球每一粒沙子都分配一个IP地址,因此IPv6协议从根本上解决了IP地址不够用的问题。
那为什么现在主流的IP协议还是IPv4协议呢??
因为:IPv4与IPv6并不兼容
IPv4出世的早,故而市面上的设备基本都是IPv4协议。
一个普通的IPv4设备,要想支持NAT,软件上升级下系统就可以了(成本很低)
一个普通的IPv4设备,要想支持IPv6,不仅要升级软件,还要升级硬件(成本很高)
所以大家就都用动态分配与NAT机制暂时解决IPv4的弊端,凑合用IPv4.
路由选择
现在主机A要给主机B发送一条消息。
互联网当中存在大量冗余,即A到B之间有很多条不同的线路可以选择,而 路由选择就是来选择到底走哪条路的 。
某个路由器是无法把整个网络环境记录下来的,路由器只能选择记录周围的情况(路由器内部使用 路由表这样的数据结构来记录邻居信息),即同一个局域网的情况。
因此网络转发的过程,就是一个逐渐问路的过程。
每个路由器只知道周围的情况,很可能你要找的IP地址他不知道(目的IP在路由表中没有匹配到),
此时路由器就会给你指出一条默认路径即路由表中的 “下一跳表项”(更上一级的路由器),
越上级路由器越牛,路由表记录的IP也就越多,因此重复这个过程就能找到目的IP了。
上述就是一个路由转发过程(简化版)了
二、以太网
“以太网” 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。
以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等。
以太网帧格式
以太网帧中的地址,指的是mac地址,可以作为网络上身份识别的一种有效的技术手段,与IP地址类似。
mac地址占六个字节,数量是IP地址的6万多倍,因此够用,可以做到每个网卡都有唯一一个mac地址,且mac地址都是在网卡出厂时被写死的,不需要动态分配。
帧协议类型字段有三种值,分别对应IP、ARP、RARP,此处只介绍IP类型;
不同的数据链路层协议,对应不同的硬件物理设备,此时传输数据的上限也不一样。
认识MTU
数据链路层的数据帧的最大载荷长度,称为MTU。
此处的载荷已经添加过传输层报头与网络层报头了
如果承载的数据长度超过MTU,就会在网络层进行分包,将一条数据拆分成多条数据,使每个载荷长度都小于MTU
IP协议的一个工作就是进行分包组包
组包过程
注意
不同数据链路层协议MTU不同。
虽然可以进行拆包组包,但是不能改变UDP协议最多只能传64K数据的事实,因为UDP头部中,表示长度的大小处只有两个字节。
总结
以上就是今天要讲的内容,本文NAT机制是难点,其中的内网与外网的界限比较模糊,如果还是有点不明白,可以私信我,一起讨论。
路漫漫不止修身也养性。