IPv4协议

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kswkly/article/details/79736486

IP数据报

IP数据报包含两个部分:一个头和一个正文。其中,头是由一个20字节的定长部分和一个可选的变长部分组成。如下图:
来源于网络
下面说一下各个字段的含义:
版本号(vision)字段记录的是该数据报属于IP协议的哪个版本,IPv4依旧占主导地位,ipv6仅适用于教育网,ipv5是一个实验性的实时流协议,没有被广泛应用过。
首部长度(IHL),由于头的长度不固定,所以IHL显示的指明了头到底有多长,它是以32位字长度为单位的,比如说当IHL为5时,头的长度就是5*32/8=20字节。
服务类型(这个字段最初被称为Type of service,后来改为Differentiated service,翻译为区分服务),它的前六位用来标记数据包的服务类型(加速服务和确保服务),后面两位用来携带显式拥塞通知信息,比如数据包在传输过程中是否经历了拥塞。
总长度(total length),该字段记录头和数据的总长度,最大为65535字节。
标识(identification),这个字段是为了让目标主机确定一个新到达的分段属于哪一个数据报(当一个数据报过大时会被分段传输,到达目标主机后在组合起来)。同一个数据报的所有段它们的标识相同。
标志位,该字段有三位,让人感到很神奇的是第一位竟然没有被使用,第二位是DF(don’t fragment)标识“不分段”,这是给路由器的一条指令,不让路由器分割该数据报。其实这个是最初为了支持那些没有能力组装还原数据包的主机的。现在这个字段可以用来发现路径MTU(路径MTU是能经过路径而无须分段的最大数据包)。第三位是MF(more fragment),表示“更多段”,除了最后一个段以外,其他所有的段都要设置这一位,它让接收方知道什么时候一个数据报的所有分段都已经到达。
片偏移量(fragment offset),这个字段用来表示该段在数据报中的位置。除了最后一个段之外,其他所有段必须是8字节的倍数。该字段有13位,所以每个数据包最多有8192个段。
生存期(time to live),该字段是用来限制数据包生存期的计数器,最大生存期为255秒。没经过一跳该计数器就递减,而且当数据报在一台机器上等了太长时间,该计数器会多倍递减,当减到0时,该数据报就会被丢弃。
协议(protocol),该字段指明了组装完后的数据报会交给那个传输进程,TCP或者UDP。
首部检验和(header checksum)该字段用来检测数据报在传输过程中有没有发生错误。
源地址(source address)和目标地址(destination address)是数据报发送方和接收方的IP地址。

IP地址划分

IPv4总场32位,它由高位的可变长网络和低位的主机两部分组成。为了确定前缀的长度人们引用了“子网掩码”,它也是32位,前面1的个数代表着IP地址前缀的长度。如下图:
来源于网络
这种层次化的地址既有优点也有缺点,优点就是路由器仅仅根据地址的网络部分就能转发数据包,对于路由器来说网络地址的主机部分并不重要,因为同一网络上所有主机都在用一个方向,只有数据包到达他们的目的地网络后才被转发到正确的主机。这样做就能大大减少路由表的大小。缺点就是浪费了地址,如果网络分配大块的地址,将会有一些地址不会被使用。
子网划分:将一个网络块分成几个部分供多个内部网络使用,但对外部世界仍然像单个网络一样。如下图:
来源于网络
路由聚合:和子网划分相反,我们把多个小前缀的地址合并到一个大前缀的地址这个过程就叫做路由聚合。有了地址聚合,一个IP就可包含大小不等的前缀,比如说一个路由器把它当做/22的一部分对待,另一个路由器可能把它当做/20的一部分对待。它和子网划分协同工作,成为无类域间路由(CIDR)
举个列子,下图是一组分配的IP地址:
计算机网络
路由器会将这三个大学的IP地址前缀做一个聚合,将其变成194.24.0.0/19,这样通过聚合就将三个前缀减少成了一个。如下图:
这里写图片描述
不过这样就造成了一个问题,就是一个IP有多个前缀,那么数据报到底该发给谁呢?例如:192.24.12.0/22和192.24.0.0/19,显然和前一个IP地址匹配的数据报一定和后一个IP地址匹配,那么数据报该发给谁呢?为了解决这个问题人们引入了最长匹配前缀,顾名思义就是谁匹配的长度最长就发谁。22显然大于19,所以就发给第一个IP。

IP分类

IP地址被分为5大类如下图:
这里写图片描述
需要注意一些特殊IP,如下图:
这里写图片描述
全0的IP地址作为网络号表示的是当前网络,全1的IP地址表示指定网络中的所有主机,它允许在本地网络上广播,具有正确网络号和地址全1的IP地址允许向任何局域网发送广播。127.xx.yy.zz是用来回环测试的。

NAT网络地址转换

IPv4的地址已经不够用了,但是ipv6还没有被普及,所以为了解决这个问题人们引入了NAT(network address translation),它的基本思路就是给每个家庭或者公司分配一个IP或者尽量少的IP,用这个IP地址来传输数据,这客户网络内部,每台计算机有唯一的一个内部IP地址,该地址用来传输内部数据。当客户网络要给外部的网络发送数据时,它首先进行一个地址转换,把内部IP地址转换成那个共享的公共IP地址,然后再进行发送。如下:
计算机网络
内部IP的范围是固定的,如下:
10.0.0.0~10.255.255.255/8
172.16.0.0~172.31.255.255/12
192.168.0.0~192.168.255.255/16
这里面存在一个问题,就是当应答数据包返回时,NAT如何知道这个数据包是发给哪一个客户机的,为了解决这个问题他应用了应用层中TCP、UDP的源端口(source port)字段。具体流程如下:当一个数据包要发出时,首先将内部IP地址变成真实的IP地址,然后将TCP的source port变成一个索引值,这个索引值记录的是这个数据包是由哪一个客户机的哪一个源端口发出的,然后NAT重新计算IP头的校验和还有TCP头的校验和。当收到一个数据包时,首先将source port从TCP头中提取出来,作为索引查找这个数据包是发给哪一个客户机哪一个端口的,然后修改这个数据包的IP头和TCP头,传给客户机。
这一切看起来都很完美,但是NAT的缺点简直不胜枚举,即使他已经被广泛应用了,他依旧是那些网络纯粹主义者口诛笔伐的对象,下面来简单列举一下NAT的缺点:
1、首先,他从根本上违背了IP的设计理念:每个IP地址都唯一的标识一台机器。NAT的出现使得成千上万台的机器都有了相同的内部IP地址。
2、其次,它打破了Internet端到端的连接模型:任何一台机器在任何时间都能给任意一台其他机器发送数据包。但是由于NAT的存在,只有那些在出境数据包发出之后的入境数据包才能被接受。
3、一旦NAT崩溃了那么它手下的客户机都无法进行通信了。
4、NAT违反了最基本的协议分层规则:第k层不应该对第k+1层在本层的有效载荷字段中放什么做任何假设。这样可以保证曾与层之间的独立性。如果某一天TCP的格式改了,那么NAT就不能再用了。
5、由于TCP的source code 是16位的,所以最多有65536个机器可以被映射到一个IP下,但是又因为前4096个端口是被保留作为特殊用途的,所以每个IP地址最多映射61440台机器。

猜你喜欢

转载自blog.csdn.net/kswkly/article/details/79736486
今日推荐