深入浅出谈谈IP协议

                                                    深入浅出谈谈IP协议

     经过老师的介绍,最近开始学习《linux高性能服务器编程》这本书。读完才发现作者的伟大,写的是真的很完美,特别通俗易懂。为了给自己的学习和复习方便使用,我总结如下的一些知识点,更多的就是读书笔记吧。我也将这本书生成了链接,可以供大家的学习,附链接:https://pdf.maitube.com/pdf/?e=ag/CZgi6GyOpka

IP协议:点对点的通讯协议,作用在网络层协议,最小单位(帧)

特点:无状态,无连接,不可靠。

       1.无状态就是说 IP协议通讯的双方不同步传输数据的状态信息,会造成的问题就是:无法处理乱序和重复的IP数据报。通俗点讲就是说,发送端发送了很多个IP数据报。但是呢当我们的第N个数据报比N+1个数据报晚到,或者是同一个数据报经过不同的路径多次到达。这样的话就会造成我们上诉的错误问题。有不好的地方肯定有好的地方,那么IP协议的特点就是:简单、高效。因为我们不需要分配多余的内核资源去进行我们数据的检验。

2.无连接:就会说IP协议通讯的双方是不建立长久的联系的。这样的话我们每次发数据的时候我们都需要制定对方的地址。

3.不可靠:是指IP协议不能保证IP数据报准备地到达接收端。我们只会尽可能的去最大努力的去交付。但是IP协议发送数据报的时候,中间会经过多个路由器的转发等等,这些会出现网络问题时,就会丢失,在接收端收到的数据就是错误的。这时候,我们会返回一个错误信息给发送端,但是不会重发数据。

 

IPv4的头部信息:(参考于本书)

深入浅出谈谈IP协议

IPv6固定头部结构

深入浅出谈谈IP协议

区别就是:

IPv6的头部包括(固定头部和可扩展头部)。可扩展头部是一个可变长的扩展头部,可以支持更多的选项,并且很便于将来的扩展需要。IPv4数据报的以太网帧封装的类型值是0x800,而IPv6的类型值是0x86dd。

 

IP分片

   为什么会发生分片呢?当我们的IP数据报的长度超过帧的MTU时候,它将被分片处理。这个过程可以发生在发送端或者是中转的路由器,当然有了分片就一定有重组,那么重组就发生在最终的目标机器。因为要实现分片和重组,那么我们就需要三个字段:数据报标识、标志和片偏移。对于同一个数据报的每个分片的话,他们就会有自己IP头部,但是他们具有相同的标识值,来找到自己的同伴,还有个不同的片偏移,这个就会使我们的不同数据报拼装起来。(除了最后一个分片以外,其他分片会设置MF标示)

   下面我们就来举一个例子:以太网的MTU为1500字节。当我们要分装一个1481字节的ICMP报文(包括8字节的ICMP头部)这个时候我们就需要分片,首先我们的IP头部就占据了20个字节,对于第一个就是8字节的ICMP头部信息+1472字节的ICMP数据。第二个分片就为20字节的IP头部+1字节的ICMP数据。

深入浅出谈谈IP协议

 

下面就是IP协议的转发:

IP模块的工作流程:

 

深入浅出谈谈IP协议

这幅图是从右往左看的:

首先我们要进行的就是对数据报的头部进行CRC的检验,看一下对不对,对了就开始分析信息,不对的话那么久不要了。

分析头部的信息,如果当IP协议的头部目标地址是本机的IP地址或者是广播地址。就将数据信息发送给本机,那么IP协议的头部就会决定将他的信息传送到上层的哪个应用。如果发现不是发到本机的,就看一下是发给谁的。

这时候我们就需要先看一下这个消息是不是允许转发的,不能转发那就丢掉就好了。能转发的话我们将数据交给转发子模块,我们的数据要发送至下一级的路由,从哪一个网卡发送出去的话, 这个是由计算下一跳路由来决定的。然后经过输出子模块进行输出。

 

IP模块最关键的就是路由表,我们根据查询路由表来进行地址的查询,那么我们的路由表是怎样分类的呢?

1)查找路由表中和数据报的目标I地址完全匹配的主机IP地址。如果找到,就使用该

路由项,没找到则转步骤2。

2)查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址。如果找到,就使用该路由项;没找到则转步骤3。

3)选择默认的路由项,那就确定下一跳路由是网关。

 

 

对于IP协议还有些其他的内容还需要好好学习。

对于IP协议的一些linux命令:

topdump           可以观察IPv4的头部结构  -x就是二进制。

ifconfig、netstat     查看MTU的字节

route  netstat       查看路由表