1. 报文格式
"网络数据报",往往是由报头和正文(载荷)构成的.
所谓报文,里面其实就是一些结构化数据,被赋予了特定含义.
1.1 4位版本
- 用来表示IP协议的版本.
- 现有的IP协议有两个版本:IPv4,IPv6.
- 其它版本可能只是在实验室中存在,并没有真正大规模商用.
1.2 4位首部长度
- 设定和TCP一样.
- IP报头是可变长的.
- IP报头又是带有选项的.
- 此时单位也是4字节.
1.3 8位服务类型
- 真正只要4位才有效果.
- 四种可切换状态:
①最小延时:传输一个数据报的时间尽量短.
②最大吞吐量:一定时间内传输的数据量尽量多.
③最高可靠性:在传输过程中最不容易触发丢包.
④最小成本:在传输过程中消耗的硬件资源最低.
注: 四种形态是互斥的,只能切换到一种形态.
- 虽然IP协议支持这个机制,实际上开发中很少使用.
1.4 16位总长度
- IP报头+载荷的长度
- 总长度-IP报头长度=载荷长度=TCP报文总长度.
- TCP报文总长度-TCP报头长度=TCP载荷长度.
- 这里的16位总长度,也涉及到64KB的问题.但是IP协议,自身支持"拆包组包"机制.这里的64KB,只是约束了一个IP数据报.
- 如果携带比较长的数据的时候,IP协议会自动的把一个数据报拆成多个数据报,接收方在进行分用的时候,也会把多个数据报合并成一个数据报.
1.5 16位标识/3位标志位/13位片偏移
- 描述了整个IP数据报拆包组包的过程.
- 当IP数据报需要携带比较长的数据的时候,就在IP协议这一层触发拆包操作.把一个打包拆成多个小包.
- 多个小的IP数据报就会都带有IP报头,载荷是TCP数据报的几个部分.
这就和搬家一样,一趟搬不完,多搬几趟.
1.5.1 16位标识
- 拆出的这多个包,16位标识是相同的.(是一伙儿的)
1.5.2 13位片偏移
- 每个包的偏移是不同的,前一个包片偏移更小,后一个更大.
- 通过片偏移,就可以区分包的先后顺序.
1.5.3 3位标志位
- 其中有一位是不用的.
- 还有一位,表示是否允许拆包.在这里已经拆了,这一位都是1.
- 剩下一位,表示"结束标记",标识当前的包是否是最后一个.这一位为0,表示这是最后一个包.
1.6 8位生存空间TTL
- 单位是-次.
- 初始情况下TTL会有个数值(32/64/128).
- 每次经过一个路由器转发,TTL就会-1,减到0了就会被丢弃.
- 正常来说,TTL足以支持数据报到达网络的任意一个位置.如果确实出现0了,基本可以认为目标IP不可达.(通过转发情况,做出限制)
比如说设置了64,64够用吗??
理论上来说是可以的.经过最多64次转发,就能到达世界的任何一个角落.(参考六度空间理论)
1.7 8位协议
- 描述了上层-传输层,使用哪种协议.
1.8 16位首部校验和
- 校验数据是否正确的机制,只需要校验首部即可.
- 载荷部分,要么是TCP,要么是UDP,都已经自己校验过了.此时IP只要校验好自己的报头就好.
1.9 32位源IP地址,32位目的IP地址
- IP协议,网络层协议中最重要的部分.
- 数据报,从哪来?到哪去?
2. IP 地址
网络上有这么多主机,需要有办法描述主机的具体位置.IP地址就是解决这个问题的关键.
32位源IP地址:
- 所谓的IP地址,其实是一个32位的整数(4字节).
- 点分十进制,由于按照32位的方式表示,就会使这个数字变得很大,难以理解.
- 一般会把IP地址,按照点分十进制的方式来表示.
- 即,使用三个"."把32位分成4个部分,每个部分就是8位,1个字节,每个字节的范围0-255(不带符号).
32位表示的数据量,非常有限.既然是"地址",原则上不能重复的,每个设备的IP不能相同.
但全世界能上网的设备,早就超过这个数据量了!!!
还有物联网!!!
2.1 [重点]IP地址不够用了怎么办?
2.1.1 动态分配IP(DHCP)
你的这个设备,不会一直需要上网.
需要上网的时候,就分配IP,不需要不分配.
但这种方案,只能缓解,不能根治.
2.1.2 NAT机制(网络地址转换)
理解网络结构的关键要点!!!
发现,这两个IP地址不同,这就是NAT机制.
IP地址不够用,想了个办法:
把IP地址,分成两大类.
2.1.2.1 内网IP
- 不同的局域网内的设备,内网IP可以重复,同一个局域网的设备,内网IP不能重复. (10.* 172.16.*-172.31.* 192.168.*)
- 很明显,属于内网IP,只需要保证在局域网内不重复即可.换言之,在其他局域网中,也可以使用这样的IP地址.
- 此时,大量的设备可以在不同局域网中使用同样的IP了,此时IP不够用问题得到了很大改善.
2.1.2.2 外网IP
- 外网IP不能重复.
2.1.2.3 通信情况
1)如果局域网内部的设备之间进行通信,肯定是可以的(局域网内部,内网IP都是唯一的)
2)A局域网中的设备,想和B局域网中的设备通信,如果这两个设备的IP相同,怎么办?
- 规则:直接禁止这种情况.
- 要想通信,就需要一个带有外网IP的设备进行中转.
3)局域网内部的设备访问带有外网IP的设备.
像平时使用的电脑,手机,都是在局域网内部使用,都有一个内网IP.
还有一类设备,"服务器",服务器可以有外网IP.
我的电脑,向QQ服务器发送请求:
这个数据报,经过电信路由器的时候,会触发NAT机制.
电信路由器,就会使用自己的外网IP替换掉当前IP数据报中的源IP.
当这个数据报到达服务器之后,服务器不知道这个数据报是源自于172.29.29.92,而是源自于10.20.30.40
NAT机制下,意义在于,一个外网IP代表的不一定是一个设备了,而是很大设备.看到的是一个,其实背后代表了很多.
QQ服务器返回相应,返回的响应里面也是IP数据报.
这个数据报,就会先到达电信路由器.
那么电信路由器如何知道,这么多设备,这个数据报要给谁?
对于NAT设备(路由器),会在触发NAT的时候,维护一个映射表,形如:
NAT设备,通过查表,就知道了,要把目的IP再替换回来.
这个时候,电信路由器,和我的电脑之间时,局域网内部的通信了,此时就容易完成通信了.(不够严谨)
真实的情况,是我的电脑的数据,经过我的路由器,会进行NAT,经过电信光猫,会进行NAT,经过电信路由器,又会进行NAT(每次经历,路由器转发,都可能会触发NAT机制:看路由器是怎么配置的,有的模式下会触发,有的不会)
当前的互联网世界,是通过NAT构建起来的.
但NAT的缺点很明显
2.1.2.4 NAT优缺点
1)缺点:
①效率不高
②非常繁琐
③不方便直接访问局域网内的设备
提高了IP地址的"利用率",并没有从根本上解决IP不够用的问题.
2)最大的优点:
NAT是一个"纯软件实现"的方案.
2.1.3 IPv6
从根本上解决IP地址不够用的问题.
- IPv4,是4个字节,32位表示IP地址.
- IPv6,是16个字节,128位表示IP地址.这个数字足以支持把地球上的每一粒砂子都分配一个IP地址.
其实,IPv6的诞生时间和NAT差不多.但为什么NAT能够成功,IPv6举步难行?
- 因为IPv6和IPv4不兼容!!!
- 要想升级IPv6,就需要更换路由器设备(不会提高网速,不会提高流畅性).
- 相比之下,NAT方案,只需要路由器开发商开发出新版本的软件(路由器固件),升级软件,即可直接支持(成本低).
- 其实,国内网络环境中,IPv6普及程度已经超过了70%.
- IPv6具有一定的战略价值.
- IPv4地址分配,是美国管的,为了摆脱制约,国内大力发展IPv6.
优点:
1.IPv6难以封锁.
2.IPv6新的领域,有很多的基础设施需要建设,深入参与,可以拿到更大的话语权.
3. 网段划分
3.1 组成
- 网络号:表示网段,保证相互连接的两个网段具有不同的标识.
- 主机号:标识主机,同一网段中,主机之间具有相同的网络号,但是必须有不同的主机号.
在日常开发中,不必关心这个IP地址是怎么来的,以及规则是什么.
IP地址,可以是自动分配(家里的设备,网络环境简单).也可以是手动分配的(企业的设备,网络环境复杂,网管来配置).
那么一个IP地址,哪个部分是网络号,哪个部分是主机号?
是通过子网掩码来识别的.
3.2 子网掩码
- 子网掩码和IP地址一样,也是4字节,32位的整数.
- 左侧必须是连续的1,右侧必须是连续的0. (255=1111 1111 240=1111 0000 0=0000 0000 这里0和1不能穿插)
- 1的范围就描述了IP地址的对应哪些位是网络号.
- 即前20个bit位是网络号,后12个bit位是主机号.
- 家用路由器子网掩码一般是255.255.255.0
子网掩码是现代的划分网络号的方案,下面来看看之前的的方案(虽然不用,但笔试可能会考):
分类 | 范围 |
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 |
3.3 特殊的IP地址
①将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网.
- 不能给具体的设备分配这个IP.
②将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有 主机发送数据包.
- 比如,有一个网段:192.168.0 子网掩码:255.255.255.0
- 如果IP地址为192.168.0.255,这个全1就属于"广播IP".
- 往这个IP上发送数据报,这个数据报就会被转发给局域网中的所有设备.
- 此处广播,在传输层只能使用UDP,不能使用TCP.
TCP无法针对广播地址进行三次握手,建立连接操作.
③127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1.
- 本机和本机通信,可以使用这个IP.
- localhost也可以表示本机.是一个"域名",会被解析成127.0.0.1,从使用层面来看,这两个东西是等价的,更推荐使用127.0.0.1,使用localhost可能会有幺蛾子.
④本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输), 对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
4. 路由选择(简单介绍)
- 即数据报在IP协议下是如何进行传输的.
- 互联网,整体来说,非常复杂庞大,任何一个路由器都无法认识到网络的全貌!
举个例子:
在高德地图上,搜一个目的地,能规划处很多条路线.地图路径规划,是站在全局的角度.地图服务商能够知道整个城市的道路情况,交通情况,做出一个"最优解".
但是路由器,无法做到理解全貌,只能认识部分网络环境,能够知道和它相邻的一些设备的情况.在这个前提下,进行路由转发,就只能走一步算一步.这里给出的路径,也不一定是最优解,只能说是"较优解".
路由器转发数据的过程,类似于问路,走一段路,问一个人.
每个路由器内部,有一个数据结构,"路由表",数据报到达路由器的时候,就需要查询路由器.
1)如果查到了,就可以直接按照这个方向继续转发,数据就能到达.
2)如果没查到,路由器会给一个默认的方向(下一跳地址),沿着默认的方向走,(往往是走到了上级路由器这里),上级路由器了解的会更详尽一点.
这个过程,是一个"启发式"的过程.