一、IP协议
IP协议,主要完成的工作,是两方面:
1. 地址管理.使用一套地址体系,来描述互联网上每个设备所处的位置.
2.路由选择 -> 一个数据包,如何从网络中的某个地址,传输到另一个地址.
1.1 IP协议的报头
其中的选项可以有一个,也可以有多个.
4位版本:
取值只有两种: 4 6
对应的IPv4 IPv6
4位首部长度:
IP报头,也是可变长的,单位也是4字节
8位服务类型(TOS):
type of service,实际上只有4位有效,这4位彼此是冲突的
其中只有1位为1,剩下的都是0.
表示当前IP协议所处的模式.
最小延迟,最大吞吐量,最高可靠性,最小成本.
16位总长度(字节数):
描述了一个IP数据报的长度.(包含 报头 + 载荷 )
ps:
虽然IP自身有长度限制,但是IP也提供了 拆包/组包 这样的功能.
此时.载荷就可以搞一个很大的,超过64KB也没关系.
在IP这一层会自动拆成多个IP数据报,每个IP数据报来携带载荷的一部分.
拆包过程都是IP(系统内核)自动完成的,程序员通过软件代码无法干预到.
IP拆包并不是因为数据达到64K,而是在数据链路层还有限制.
那么拆包之后,未来如何组包呢?
在IP报头中:
16位标识 -> 表示哪些IP数据报的载荷应该一起组装
3位标志 -> 只有2位有效 其中1位表示这次的IP数据是否拆包了 还有一位表示结束标记.
13位片移位 -> 描述了这些包之间的先后顺序.
ps:
如果确实需要基于UDP手动实现应用层的数据包拆包,此时也就可以参考IP的做法.
8位生存时间(TTL):
单位不是 s / ms ,而是次数,这里存储的是一个整数.一个IP数据报,每次经过一个路由器转发,TTL就-1,如果这个数值减到0了,此时就说明数据包要被丢弃了.
TTL一般是32 / 64 这样的整数.
8位协议:
表示在传输层使用哪个协议
16位首部检验和:
只是针对IP的首部校验的.
载荷部分不管了.
载荷中的 TCP / UDP 都自带了校验和
32位源IP地址、32位目的IP地址:
表示法发送方了接收方的地址.
二、IP协议如何管理的地址
IP地址本质上就是一个32位整数(int)
为了方便,就会把IP表示为 点分十进制 的方式
通过3个点分成4部分,每个部分1个字节,每个部分的取值是0-255
为了防止IP地址不够用,带用了以下几种方法:
1. 动态分配IP地址
全世界的设备,也不是同一时刻都在上网的,可以在使用时再分配IP地址.
2. NAT机制(网络地址映射)
先把IP地址分为两大类
1. 私网IP / 局域网IP
IP地址是以10.*,172.16-172.31.*,192.168.* 这三类都是私网IP
2. 公网IP / 广域网IP
要求公网上的设备,,对应的公网IP,都必须是唯一的.
但是私网上/局域网上的设备,使用私网IP,只要保证局域网内部的IP不重复即可.不同的局域网之间的IP允许重复.
由于上述设定,就有一个重要的限制:
1. 公网设备访问公网设备,没有任何问题,直接访问即可.
2. 局域网设备访问局域网设备(同一个局域网中),也没有任何问题
3. 局域网设备访问局域网设备(不同局域网中),不允许访问.
4. 局域网设备访问公网设备,就需要对局域网设备的IP进行 地址转换.
5. 公网设备访问局域网设备,不允许主动访问.
比如,自己的设备网络传输经过家里的路由器,路由器在把数据发送出去的时候,会把源IP从自己电脑的IP改成路由器的IP.
如果局域网的各个设备访问的都是不同的服务器,路由器就可以很简单的通过服务器IP地址,来进行区分.本质上都是通过查表.
路由器进行NAT替换的时候,会把这次通信的相关信息记录下来,记录这次通信过程中的
替换前源IP,替换后的源IP,目的IP,源端口和目的端口
如果出现两个源端口相同的情况,NAT会进行修改用以区分.
大部分情况下,局域网内的不同设施,访问的是不同网站,这个时候直接通过服务器IP就能区分了.
少数情况下,如果访问的是同一个服务器,就可以按照端口号来区分.
极少数情况,碰巧访问的是同一个服务器并且端口号相同,就可以在路由器这边自动映射成不同的端口了,仍然能够区分.
因此,再NAT机制下,当前的网络是足够使用了.
当前互联网就是 动态分配 + NAT相结合产生的方案.
3. IPv6
IPv6 从根本上解决了问题.,增加了IP地址的个数.
IPv6使用16个字节表示IP地址.
他的地址数使用16字节表示,是一个天文数字.