前置知识
主机:配有IP地址,但是不进行路由控制的设备
路由器:既配置了IP地址,又能进行路由控制的设备节点:主机和路由器的总称
IP协议主要完成的任务就是
地址管理和路由选择
地址管理:使用一套地址体系,将网络设备的地址描述出来
路由选择:一个数据报如何从源地址到目的地址
IP协议头格式
下面开始解释这里的含义
1.4位版本号
这里表示的是IP地址使用的是IPv4还是IPv6的地址
2.4位首部长度
这里就是和TCP报头一样,表示的是IP报头也是可变长的 (同样单位是4字节)
0-15 代表这里最大长度仍然是60字节
3.8位服务类型(TOS)
分别是三位优先权字段(已弃用),一位保留位和四位TOS字段
这里的四个字段分别表示 最小延时 最大吞吐量 最高可靠性(相对TCP的可靠性还是有差距,意思位相对的最高可靠性) 最小成本
这里相对不同的应用场景会使用不同的服务,像ftp这样的程序使用最大吞吐量比较重要
4.16位总长度
表示了IP数据报整体占用多少个字节
这里就并不是64KB的限制了,因为IP协议包含了拆包组包的功能
比如说一个相对大的TCP包这里分三个IP数据包装
到对端就会按照顺序组包
5.16位标识 3位标志 13位片偏移
之所以把它们放在一起说是因为它们彼此是有联系的,
在数据较大的情况下分包就会用到这三个表示
16位标识:表示几个IP数据包是同一个数据拆分而成
3位标志:一位标志着数据是否分包,一位标志着结束的标志,一位则作为保留位
13位片偏移:排序的依据,标志着分块的变量在原报文中的位置
6.8位生存时间(TTL)
表示着报文在传输过程中的最大生存时间,这里的时间并不是真正的时间,衡量单位是"次",就是一个报文在网络传输中传输了多少次还没有到达目的地址那么就将其丢弃,常见的生存时间为32/64次
为啥这么少的次数就能达到对方??
因为其增长的速度是指数级别的增长
7.8位协议
表示上层协议的类型,也就是传输层使用什么协议
TCP/UDP/KCP???
8.16位首部检验和 和之前一样,检验报文传输过程中是否发生了比特翻转
9.32位源地址和目标地址
表示发送方和接收方的地址
10.选项 和之前一样可有可无
如何管理IP地址
最早是使用IPv4地址来描述一个IP地址的
IPv4地址本质上是一个32位整数
为了方便表示,我们使用点分十进制的方式来表示
例如 192.168.1.1
通过三个点来讲32位分成四个部分,每个部分取值范围分别为0-255
总共能表示一个42亿左右大小的数字
实际上现在全球使用网络的终端设备远远超过了42亿,给每个人分配一个网络地址都不够
所以我们提出了如下的解决方案
1. 动态分配IP地址(治标不治本)
全世界的设备也不可能同一时刻上网,利用现有空闲的IP地址
2.使用Nat机制(网络地址映射) 仍然治标不治本
常用方案
这个机制将IP地址分为两个大类 私网IP 公网IP
私网IP
10.* 192.168.* 172.16 - 172.31.*
其余的是公网IP
要求公网上的设备使用公网IP
局域网之间使用私网IP,只需要保证局域网之间的内部IP不重复即可,不同的局域网之间的IP允许重复
由于上述的设定,就有一些限制
1.公网设备相互访问,没有限制
2.局域网内设备相互访问,没有限制
3.局域网设备访问其他局域网设备,不允许访问
4.局域网设备访问公网设备,就需要对局域网设备进行IP地址转换
5.公网设备访问局域网设备是不允许主动访问的
试想下面一个场景
我的电脑访问一下服务器,
此时源ip就是 192.168.2.10
目的IP就是1.2.3.4
一般路由器会带有两个地址
WAN口地址 :可能是局域网IP也可能是公网IP 这里假设为5.6.7.8
LAN口地址:往往是局域网IP
这里想从这个路由器发起转发,这里源IP就变成了5.6.7.8,目的IP不变
不是每个路由器都会替换
数据包到达服务器的时候,服务器感受到的IP就是5.6.7.8
进行了上述替换本质上就是一个公网IP能对应多个设备,就起到了节省IP的效果
此时主机abc三个想与外界访问都只能通过路由器
'
此时这个NAT机制使得发出去的数据的源ip替换了,那么服务器怎么找到替换前的IP呢??
试想一个这样的场景
此时在转换的时候路由器就会保存一个路由表来记录替换前的ip和替换后的ip
此时服务器发送报文的时候,如果找到对应的表项的时候,就可以转发回去了
'
如果同一个局域网多个设备访问一个服务器,形式还会更复杂
保存的就是
替换前ip 替换后ip 服务器ip 源端口 目的端口
192.168.1.10 5.6.7.8 1.2.3.4 9090 10000
192.168.1.20 5.6.7.8 1.2.3.4 9090 20000
这就区分了两者
IP报头 + TCP 报头 + 应用层数据包
就可以让路由器收到响应后看传输层的目的端口来比对一下
万一局域网中的两个设备端口也相同??
此时路由器也会对端口号进行映射
将端口也进行替换,假设两个端口号都是10000
就会将两个进行替换 也许是 10001 10002
所以路由器也会修改传输层的报头
总结:
大部分情况下,访问的服务器不同,此时使用端口号就能区分
少数情况下,访问的是相同的服务器,此时就可以映射不同的端口来区分
3.IPv6策略(根本解决问题)
将IP地址从32位增加成了128位
相当于变成了2^128 个地址
"给每粒沙子都分配一个地址"
迟迟没有完全落地 因为所有的硬件设备都得换,而且对体验提升不大
但是中国已经覆盖到70%,虽然使用率一般,但是防止了美国在IP地址上的垄断操作
避免美国直接给你断网
今天的分享就到这里,待续.....