深入浅出谈谈IP协议

                                                    深入浅出谈谈IP协议

特点:

IPv4的头部信息:

IP分类:

私网与公网

IP分片

IP模块的工作流程:

特殊的ip地址


     经过老师的介绍,最近开始学习《linux高性能服务器编程》这本书。读完才发现作者的伟大,写的是真的很完美,特别通俗易懂。为了给自己的学习和复习方便使用,我总结如下的一些知识点,更多的就是读书笔记吧。

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

特点:

无状态,无连接,不可靠。

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

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

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


 

IPv4的头部信息:

4位的版本号:ipv4   ipv6

4位的首部长度:  描述首部头部有多长,以4字节位单位,描述IP报头最小20字节,最大60字节。

8位服务类型:3位优先权弃用,4位TOS字段,1位保留,必须置为 0.

16位数据长度:描述IP报文最大长度不能超过64k。

16位的分片标识:表示当前分片属于哪个完整报文。

3位的标志位:1位保留,1位分片标示—描述是否允许分片,1位结束标示;最后一个分片置0.

13位分片偏移:描述当前分片在原始报文中的位置---相对起始位置的偏移量---以8字节位单位(因为要用13位表示整个64k的内容)

8位TTL:报文的最大生存周期,最大的数字是255,描述当前数据最多经过多少个路由器,没经过一个路由器则减一,如果为0,则丢弃,避免路由环绕。

8位的上层协议:描述传输层的协议,用于数据分用时,上层协议的选择。

16位的校验和:检验数据一致性。

32位源端IP和32位的目的端IP:描述数据从哪个主机来,要到哪个主机去。

0~40字节选项数据。

 

IPv6固定头部结构

区别就是:

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


IP分类:

ipv4的ip地址:uint32_t 类型的数据,用于在网络中唯一标识一台主机;

ip地址分配规则:按网络进行分配,每个网络分配的IP地址都应该具有这个网络的标识,这样的话不同的网络分配的IP地址就会不同。由网络号+主机号组成。网络号就是这个IP所在网络的标识,也就是网段;主机号就是说在这个网段中唯一标识的主机。

早期将所有的IP地址划分为五类-----ABCDE

但是由于我们分配的一个网段有时间会造成大量的浪费,不能满足于我们的使用,在此之后提出了CIDR方案:采用子网掩码进行网络划分。

子网掩码:uint32_t类型的数据,必须由连续的二进制1组成。

作用:

1.子网掩码于IP地址相与可以得到网络号。例如:192.168.122.132于255.255.255.0 -》192.168.122.0

2.子网掩码取反后,可以得到网络中最大的主机号,且主机号的范围是0~最大主机号。

私网与公网

公网/外网:表示的是我们通常的互联网,或者就是说与互联网一起相连接的主机或者路由器。

私网/内网:一个只能在内部通信的网络,若要对外通信的话,则使用每个网络同一的对外地址进行通信。

为什么要区分公网和私网呢? 

随着我们的使用在不断的增加,需要的IP地址就不断的上升,为了避免ip地址发生冲突,这时候,我们就出现了私网。比如说:在自己的家里,这时候我们拉了一个网线,并安装了一个路由器,这时候,我们通过交钱就会给这个路由器一个公网的IP地址,这时候,我们就可以通过这个IP地址进行访问互联网。在这个路由器下,我们就组建了一个私网,我们可以在路由器上连接手机,电脑等设施,这时候我们的电脑,手机就会配一个私网的IP地址,这些设备在使用互联网的时候,就会使用路由器的那个ip地址进行通信,如果是同一个私网下,就可以使用自己的私网IP地址进行通信。

正如这样,在我家里的路由器分配给我的私网IP地址,有可能和你家里的路由器分配给你的IP地址是一样的。但是这两个并不会构成冲突,当我们两个想要通信的时候,首先我们需要把自己的信息发送到自家的路由器,发现不是私网内的,就需要在互联网中去寻找另外的一个你所在的路由器的IP地址,然后发送到你的路由器下,由你的路由器发送到你的手上。(在私网中,对于不相邻的网络可以使用相同的网络号)

在私网的分配过程中:使用DHCP动态地址分配;NAT地址转换。

DHCP动态分配:简单来说,就是当我们的手机连到路由器的时候,我们的手机首先会在整个网段中进行广播,这时候与我们相连的只有路由器,路由器就会反应,给他分配一个私网的ip地址,当他不使用这个ip地址的时候,就会分配给另外一个主机使用,增加使用率。

NAT/NAPT地址转换:NAT:网络地址转换服务, NAPT:在NAT的基础上增加了连接的映射。作用就是:在组建私网的时候,让私网内的主机使用同一个公网IP进行上网,节约IP地址。当然我们要建立映射关系,我们要保证我们发出会的消息,等被人回复回来的时候,可以到我们自己。

在分配私网ip的时候,我们不能使私网ip和公网ip地址重复,不然就不知道发送给谁呢?

在RTC1918文档中规定了:用于组建大型私网:10.*.*.*   用于组建中型私网:172.16.*.*~172.31.*.*   用于组建小型私网:192.168.*.*


IP分片

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


MTU:链路层规定的最大的传输单位。

MTU:对于TCP和UDP协议的影响。

   TCP:在三次握手的时候,就会根据MTU计算出MSS(最大的数据段大小),经过双方协商后,选择两方中较小的那个作为传输的大小,之后每次传输的时候数据大小就不会大于MSS,TCP在传输的过程中在传输成就会进行数据分片,因此在网络层的时候不会进行数据的分片。

              MSS=MTU-ip协议的最小报头-TCP最小报头。

   UDP:在UDP中没有mss的概念,只要数据大小小于64k-28就可以进行传输,但是在网络层的时候就会进行分片然后传输,当其中的某一个分片出现了问题,则接收方就会将整个数据全部丢掉。如果想要增加安全型,那么我们在应用层最好将数据进行计算,分割成小于MTU 的大小,在进行传输。


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

 

下面就是IP协议的转发:

IP模块的工作流程:

 

这幅图是从右往左看的:

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

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

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

 

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

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

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

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

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

路由选择:主要是根据路由表的识别,数据中的目标地址属于哪一个网段中,就将数据通过连接传输到这个网络上。在每一个路由器上,都会有一个路由表,路由表上至少有两条信息,一个是连接上层网络的信息,一个是自己的私网信息。


特殊的ip地址

1.主机号为0的ip地址:就是一个网络号,用于标识网络,这种IP地址不能分配给主机。

2.主机号全为1的ip地址:UDP局域网广播地址,将数据发送到这个地址,表示发送给局域网的所有主机,这个地址也不能分配给主机。

3.127.0.0.1 每个主机都会有的本地虚拟回环网卡地址---主要用于本地网络的测试

4.255.255.255.255 全网广播,任意主机收到这个目标地址的数据,都会认为是发送给自己的,进行匹配。

5.0.0.0.0 可以识别本机上的任意网卡IP地址,常用于tcp的服务端地址监听地址。

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

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

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

ifconfig、netstat     查看MTU的字节

route  netstat       查看路由表

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值