IP协议:
在了解IP协议之前,我们市面上看到的"路由器"其实就是工作在网络层。如下图:
那么网络层中的IP协议究竟是如何发送数据包的呢?
IP报头:
IP协议的报头是比较复杂的,作为程序猿只需要我们重点理解几个点。
4位版本:
当今的IP的版本有两种:IPv4和IPv6。
现如今IPv4是主流的版本。
4位首部长度:
IP协议报头的长度是可变的。IP报头的长度 = 0-15 * 4 KB.
(4位的取值范围就是0-15)
8位服务类型:
16位总⻓度(total length):
16位标识(id):
需要注意的是IP数据报会自动完成拆包和组包。
3位标志字段:
13位分片偏移:
13位分⽚偏移(framegament offset): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后⼀个报⽂之外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).
8位⽣存时间(Time To Live, TTL):
8位协议:
IP数据报传输过程中里面携带的载荷肯定是传输层的相关协议,8位协议里面的数值就代表着传输层的哪一个协议。
16位首部检验和:
检验IP报头中数据是否出错。这里不需要检验载荷中传输层协议的正确性。
地址管理:
路由器工作在网络层,现在的路由器都有自动分配IP的功能DHCP。
在IPv4的报头中我们也可以观察到,IP一共是32位,也就是一共42亿9千万个,但是随着时代的发展,这么多的IP地址已经不够用了,那么该如何解决以上的问题呢?
方案1:
动态分配IP,一个设备上网就分配一个IP,不上网就不分配。
方案2:
NAT网络地址转换。
可不可能使用一个IP代表一大波设备?
把IP地址分为两大类:
1.公网IP\外网IP
2.私网IP\内网IP
要求公网IP必须是唯一的,私网IP是允许重复的(在不同的局域网中是可以重复的)。
一个设备在上网的时候,IP数据包中的IP地址会被NAT设备(通常是路由器)进行自动修改。
那么就会有以下几种4种情况:
1.同一个局域网内:主机A访问主机B
2.公网的设备A访问公网的设备B
3.一个局域网中的主机A,访问另一个局域网中的主机B
4.局域网中的设备A,访问公网中的设备B
一共有以上的4种访问情况,究竟哪种情况会触发NAT机制?
首先第一种:同一个局域网下的设备互相访问,不会触发NAT机制。
其次第二种:公网之间相互访问的设备,不会触发NAT机制。
再其次第三种,第三种这种访问时不被允许的,所以也谈不上NAT机制。
所以只有第四种情况才会触发NAT机制。
那么究竟是怎样出发的呢?
如下图:
那么此时一个路由器可能关联着许多设备,那么这么多设备如果同时发送QQ消息,此时发送给QQ服务器的IP地址都是一样的了。
结论:此时就相当于一个公网IP地址代表着一大波设备!!
但是此时还是有问题,此时QQ服务器给我返回响应,最后通过路由器传回客户端,那么这个端口号应该怎么填写:
例如:
此时在经过路由器的时候,路由器不仅进行了NAT,其实还将端口号进行了一个修改定制:
此时所有设备在经过路由器的时候,相当于路由器这边会自动生成一个表记录IP和端口号的键值对,最后都已新的IP和端口号发送给对端。
之后等服务器相应过来的数据,经过路由器,对应查表之后发送给不同的客户端。
方案3:
使用IPv6解决IP不够用的问题.
IPv4使用的是32位4个字节。
IPv6使用的是128位16个字节.
IPv6是16个字节,可以说,能够表示的IP数量够地球上每一粒沙子拥有一个独立的IP。
网络号&主机号:
那么理解完IP的协议和地址管理之后,问题又来了,IP中的数字是什么含义?
IP地址一共是32位,可以一分为二,左半部分表示网络号,右半部分表示主机号。
例如:
这里的一半并不代表均分,至于左半部分占的多还是右半部分占的多,就和主机上面的子网掩码有关。
网络中规定:
同一个局域网下,网络号必须相同,但是主机号一定不同。
两个相邻的局域网,网络号必须不同。