- 我最近开了几个专栏,诚信互三!
====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
====> |||《C#专栏》::记录我复习C#的经历,深度理解,查漏补缺,不定期更新。|||
====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||
IP协议解析
- 网络层的作用
- IP报文格式
- 网段划分
- 子网划分
- 数据路由过程
- NAT
- 内网穿透
- 内网打洞
网络层的作用
网络层的作用主要有两个,1.路由选择,2.主机定位,网络层提供了一种能力,让数据可以跨网络传输的能力。
IP报文格式
报文格式如下。
1).版本:版本用来表示IP版本,如IPV4,和IPV6。
2).首部长度:和TCP报文一样,4比特位范围为[0 - 15]当然,存在一个单位,为4B。
3).总长度:其代表的是整个IP数据报的总长度,包括报头 + 内容,单位是字节。
4).标示,标志,片偏移:都是IP分片需要用的字段。
IP分片,数据链路层存在一个MTU(最大传输单元),当IP数据报的长度大于MTU,则会导致分片。
1).标识:用来标识唯一的IP数据报,如果没分片,则也会存在标识,如果分片了,则同一个IP报文的标识都相同。
2).标志:IP的标志位有三个比特位,只有前两个标志位有意义,第一个标志位代表MF,第二个标志位代表DF,MF:MF = 1,则代表后续还有分片,MF = 0,则代表该分片已经是最后一个分片了,DF:代表是否允许分片,DF = 0,则代表允许分片,否则不允许分片。
3).片偏移:每一片的起始位置除以8,可以通过片偏移 * 8得到其原先的位置。
5).生存时间:TLL(生存时间)是一个整数,没经过一个路由器,TLL就减一,减到0后,该IP数据报直接删除。
6).协议:代表IP数据报的载荷部分使用的是什么协议。
7).其他字段与TCP之前介绍的相同。
网段划分
划分网段是比较重要的知识,我们将IP地址分为了两部分,一部分叫做网络号,一部分叫做主机号,我们按照网络号和主机号的位数,可以划分以下四类地址。
这种划分很粗鲁,在当今,IP地址已经不够用,所以我们将所以IPV4的网络划分成了公网IP和内网IP(私有IP),以下是两者的范围。
公网IP是不能重复使用的,而内网IP可以重复使用,在现实中,我们也是这样做的,如下图。
在不同的局域网内,可以重复使用已经使用过的IP,这样就极大的缓解了IP地址不够用的问题,同时需要NAT技术进行辅助,关于NAT后面在详谈。
同时每个路由器都可以动态分配IP地址,回收不在使用的IP地址,这样有效减少了IP地址的浪费。
子网划分
CIDR技术,将一个较大的网络,划分成更小的子网络,减少IP地址的浪费。该技术目前广泛被使用,它将IP地址表示为 [ 网络号 ]/网络号的比特位数 ,比如192.168.1.0/24,为了掩盖真实的IP地址,以及快速计算出某个IP地址的网络号和主机号,有人提出了子网掩码这个概念。
比如。
我们将IP地址和子网掩码做与运算,就能得到该IP地址的网络号。
数据路由过程
路由,就是从网络中的一个结点,到达另一个结点的过程。数据在网络中是如何路由的呢?这需要借助路由器。
我们知道,IP报头中存在这src ip和dest ip这两个字段,这让我们明白了,我们要发给谁,但是在网络中,我们必须一步一步路由,所以,在主机/路由器中,存在路由表,数据报到达链路层后,我们可以用dest ip与路由表中的子网掩码进行按位与操作,如果与网络地址向匹配,则在通过ARP协议将IP转换为MAC地址,封装在MAC帧中,发送出去。
路由表结构如下。
比如说,我们的目的地址为192.168.10.66,则我们同目的地址与所有的子网掩码进行按位与操作,得到,我们应该向Destination为192.168.10.0的网络接口发送数据,如果没有任何匹配,则向默认接口发送,如上图,默认网关为192.168.10.1。
网络中的数据没经过一个路由器,就会进行上述操作,知道找到我们dest ip的网络,随后在局域网内进行转发,这就是链路层的事了。
NAT
通过公网和内网的划分,我们知道,内网和内网间的IP是可以重复的,那么我们将数据发送过去后,数据就无法发送回来的,因为不同内网的IP可以重复, 当前网络在该框架下,为了解决该问题,就提出了NAT技术。
比如。
从一个局域网内的某台主机要访问某个服务器。
当私有IP通过一个局部路由器时,就会将该路由器的WAN口地址替换IP报头的src地址,当经过运营商的路由器时,运营商的WAN口IP已经接入了外网,所以将该外网地址作为IP报头的src地址,随后使用新的IP报文在网络中通信,在每次转换的时候,路由器内都会记下一组映射,当服务器要发送返回报文时,就与各种路由器的NAT表进行比对,如果比对成功,则发送到该路由器,依次发送下去。
对于NAT表,我们有两种填充方法,一种是静态NAT,及人为的手工加入映射,第二种是动态NAT,及在路由过程中,将映射加入NAT表。
更具NAT技术的描述,我们可以发现,只能内网先访问公网,公网才能返回到确定的内网,并且无法由内网直接访问内网,这是NAT的特点。
以下内网穿透和内网打洞皆是利用了NAT的特点。
内网穿透
一台内网中的主机可以通过外网访问到另一台内网中的主机,解决了NAT无法从内网访问到另一个内网的缺点。
1).内网穿透首先需要一个中转服务器,同时,接收方与服务器进行TCP链接,将内网的主机端口和中转服务器的端口进行映射,同时在路由器中建立NAT转化表,为数据返回内网做准备(NAT技术的特点)。
2).当其他内网主机访问中转服务器的对应端口,就可以通过转换表和之前建立的映射,直接访问到另一个内网中的数据。
所以传统的内网穿透,是需要经过中转服务器的。
内网打洞
内网打洞的原理和穿透很相似。
1).依旧是接收方向某个服务器建立TCP链接,此间经过路由器生成NAT表,为数据返回内网做准备。
2).发送方与服务器建立链接,生成NAT表,根据建立TCP链接的接口,我们可以知道接收方内网的运营商的WAN口IP,同时将该信息发送给发送方的主机。
3).发送方就可以拿着接收方的运营商WAN口IP,访问该路由器,通过早在第一次链接服务器就建立好的NAT表,就能找到对应的主机了。
内网打洞,在真正跨内网访问的时候,没有经过任何中转服务器。