网络层IP协议

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络层IP协议相关的知识,希望对你有一定的参考价值。

目录

前言

一.基本概念 

二.IP协议报头

三.网络划分

        3.1 IP组成

        3.2 IP地址分类

         3.3 特殊IP地址

        3.4 IP地址数量限制

        3.5 私网IP地址和公网IP地址

        3.7 路由


前言

        应用层http协议是进行构建和解析请求request和响应response。

        传输层的TCP/UDP协议是不提供数据的运输。传输层是为数据传输指定规则。但是,UDP协议并不保证数据传输的可靠性。TCP协议制定了确认应答机制,超时重传机制,连接管理机制,拥塞控制等保证了数据的可靠性,制定了捎带应答,延时应答,快重传机制等保证了数据传输的效率。

        实际有数据传输能力的是网络层IP协议,提供了将数据从主机A跨网络送到主机B的能力。

一.基本概念 

        在网络层,有一个很重要的设备路由器,路由器可以连接两个局域网,具有数据在网络中路由的功能。

        路由器也相当于是局域网里的一台主机,含有网络层及其以下层,但是现在的路由器很强大,已经拥有了应用层及其以下层。

        主机:配有IP地址,但是不进行路由控制的设备。

        路由器:即配有IP地址,又能进行路由控制。

        结点:主机和路由器的统称。

二.IP协议报头

  •  4位版本号:指定IP协议的版本,对于IPv4,就是4。
  • 4位首部长度:IP头部的长度是以32bit(4字节)作为基本单位,也就是报头字节数等于4位首部长度乘4字节。最小报头长度等于20字节,4个比特位表示的最大数字是15,所以最长报头长度等于60字节,多余部分是选项。
  • 8位服务类型:3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者互相冲突,只能选一个,具体选哪个,决定于应用层协议。
  • 16为总长度:IP数据报整体占多少字节。包括了数据和报头。
  • 16位标识(id):唯一标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里面的这个id相同。
  • 3位标志:第一位保留(现在不用),第二位如果置为1,表示禁止分片,这个时候,如果来了一个超过MTU的数据,IP模块会丢弃报文,置为0表示可以分片。第三位表示"更多分片",如果分片了,如果该分片后面还有分片,当前位置为1,如果后面没有分片或者没有分片,当前位为0。意思就是分片了置为1,没有分片或者是数据分片的结尾置为0。
  • 13位偏移量:表示当前分片在原报文的哪个位置。实际偏移字节数等于当前值乘8,因此除最后一个报文外,其它报文的长度必须是8的整数倍。

分片概念:

分片就是将传输层发现来的数据,分成几段,再发送下去。

为什么要分片?

        在下一次链路层,对发送来的数据由长度的限制。这个值是MTU(链路层能接收有效载荷的最大长度)。当IP层数据超过MTU时,如果可以分片,就需要将数据分片后发送给链路层。

注意:分片对传输层时透明的,传输层并不知道分片了。只有网络层知道分片了。

所以在接收端的网络层IP协议还需要对分片数据进行组装。

接收端接收到的数可能会有没有分片的数据,不同组数据,分片的数据。组装首先需要将分片的没有分片的数据分开,再将同一组数据组装。

IP报头的3位标志的第三位标识了拿下报文的分片的,那些报文不是分片的,还标识了同一组数据分片的结尾(16位标识相同),13位偏移量不为0,并且3位标识第3位为0。

16位标识(id),标识了是否时同一组数据的分片。

13位偏移量:标识了当前分片在数据的哪个位置,更好组装。

判定是否分片:3位标识的第三位为1(针对分片第一个偏移量为0) 或者  13位偏移量不为0(针对分片结尾3位标识为0)

发送端IP协议如何组装?

        将偏移量排序,去报头,拼接即可。

是否能识别分片丢失情况?

        当前13位偏移量值加上报文长度(IP报头中有16位总长度),就是下一个偏移量值。如果排序后,后面的偏移量的值不同,就说明后面分片丢失了。

        如果有一个分片丢失了,传输层TCP就不能收到数据,传输层是保证可靠性的,没收到整个数据,会让发送方重发整个数据,而不是某个分片。

  • 8位生存时间(TIME TO LIVE,TTL):数据报到达目的地的最大报文跳数,也就是经过的路由器数。一般是64。每次经过一个路由,TTL减1,一般减到0还没到达,那么就丢失了,这个字段是防止出现路由循环。
  • 8位协议:标识上层协议类型。传输给上层哪个协议。
  • 16位头部校验和:使用CRC校验,来检验报头是否损坏,只需要检验头部,数据在TCP层检验了。
  • 32位源IP地址和32位目的IP地址:标识接收端主机和发送端主机。
  • 选项:选项最多40字节,报头超过20字节部分。

解决报头和数据分离问题:4位首部长度和16位中长度。

解决向上传输给哪个协议:8位协议。

三.网络划分

        3.1 IP组成

路由查找目标主机过程:路由查找是先找到目标网络,在找到目标主机。

IP地址分为两个部分:网络号和主机号

  1. 网络号:保证相互连接的两个网段具有不同的标识。
  2. 主机号:在同一网段内,主机具有相同的网络号,但是具有不同的主机号。标识相同网段里的不同主机。

  • 不同的子网其实就是把网络号相同的主机连接到了一起。
  • 如果在子网中新增一台主机,这台主机的网络号和这个子网的网络号一致,但是主机号必须不同和子网中的其它主机重复。

由上可知,在子网中新增一台主机需要为其分配对应且正确的IP,去除一台主机的话,需要回收IP。但是手动管理子网IP很麻烦。

  • 有一种技术DHCP,能够自动的给子网内新增主机结点分配IP地址,避免了手动管理的不便。
  • 一般现在的路由器都带有DHCP功能,因此路由器可以看作一个DHCP服务器。

        3.2 IP地址分类

过去提出一个划分网络号和主机号的方案,将IP地址分成5类,通过不同的类别来划分主机号和网络号。

 上面是按照二进制位数1~5位是否为0划分IP地址,划成点分十进制的范围是:

 A,B,C类越往下网络号表示越来越多,主机号表示越来越少。随着互联网的发展,大多数组织都申请B类网络地址,导致B类很快就用完了。

针对上面的情况,提出了一个新的方案,称为CIDR只与子网掩码有关,通过子网掩码要区分网络号和主机号。

  • 引入一个子网掩码来区分网络号和主机号。
  • 子网掩码也是32位正整数,通常用一串0结尾。
  • 将IP地址和子网掩码进行按位与,得到的结果就是网络号。
  • 这样划分就不需要这个IP地址局限于上面的哪一个类了,与A,B,C类无关,至于子网掩码有关。

举个例子:

         我们知道点分十进制,一个点前面是8位。上面例子用最后8位来表示主机号,所以可以表示主机号个数位255个。用前24位表示网络号。

         3.3 特殊IP地址

  • 将IP地址中的主机号全部设为0,就成了网路号,代表整个局域网。
  • 将IP地址全部设为1,就成了广播地址,给同一局域网的所有主机发送数据。
  • 127.0.0.1是本地环回测试,不发送到网络中。

        3.4 IP地址数量限制

IPv4协议的IP地址是32位的,那么只有2^32次方个IP地址,而TCP/IP协议规定,每一个主机都需要一个IP地址,这就意味着,一共只能由2^32次方台主机连入网络。

但是由于一些特殊网络的存在,并且IP地址并非是按照主机台数配置,而是每一个网卡都需要配置一个或者多个IP地址。,所以实际可以使用的IP地址远少于2^32次方。

CIDR虽然一定程度上提高了IP地址位数利用率,但是IP地址总数没变,仍然可能不够用。这时有三种解决方式:

  • 动态分配IP地址,只给接入网络的设备分配IP地址,比如:一台主机接入了网络分配一个IP地址,断开网络是IP地址被回收。因此同一个MAC地址设备,每次接入网络IP地址不一定相同,被其它接入网络的主机分配。
  • NAT技术
  • IPv6:IPv6的位数用16字节,128位表示一个IP地址,IP地址总数更多了。但是IPv6并不是IPv4的升级版本,两者不兼容,目前IPv6并没有普及。

        3.5 私网IP地址和公网IP地址

        首先介绍一个运营商的概念:

        运营商为我们建设了网络通信的基础设施。当我们在进行通信的时候,都需要经过运营商为我们建立的基础设施。

        我们知道IPv4的IP地址个数是一个确定的数,某些组织有将所有的IP地址分成了两大类,私网IP地址和公网IP地址。

私网IP地址和公网IP地址的区别:

  • 私网就可以理解成是一个局域网。私网可以有很多个,而公网只有一个。
  • 顾名思义,私网IP就是在私网中使用的IP地址,公网IP就是在公网中使用的IP地址。
  • 不同的私网私网IP可以相同,但是在公网中,公网IP只有一个,是唯一的。
  • 同一私网内的IP地址不能是重复的。

RFC1918规定,包含在以下范围的IP地址称为私有IP地址,其余的都是公网IP地址。

  • 10.*,前8位是网络号,共16777216个地址。
  • 172.16.到172.31,前12位是网络号,共1048576个地址。
  • 192.168.*前16位是网络号,共65536个地址。

  •  一个路由器可以配置两个IP,一个WAN口IP,一个LAN口IP(子网IP)。
  • 路由器的LAN口连接的主机,都从属于当前这个路由器的子网中。
  • 不同路由器,子网IP其实是一样的(通常是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址可以重复。
  • 每一个家用路由器其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能又很多级,最外层的运营商路由器,WAN口IP就是一个公网IP。不是最外层的路由器的WAN口IP是下一级局域网的私有IP。
  • 子网内的主机需要和外网进行通信时,路由器将IP地址报头的源IP地址替换成了WAN口IP,这样逐级替换,最终数据包中的源IP地址成为了一个公网IP,这种技术称为NAT,网络地址转换。

比如:

 为什么发送信息时要进行源IP地址的替换?

        因为私网IP不能出现在公网中。广域网就相当于公网。

注意:正常情况下,不同的局域网,不通过公网,一般不能通信。

        3.7 路由

        主机A跨网络通信主机B,首先需要找到主机B所在的局域网,再在该局域网中找到主机B。路由就是找下一跳往哪跳,下一次发送给那个节点。

        路由表:路由表存储着指向特定网络地址的路径。

注意:路由表不仅仅存在于路由器中,还存在于联网的计算机中。

        路由表可以通过route命令查看。

         路由过程:根据IP地址和子网掩码,按位与得到目的网络号,找路由表中找是否有匹配的目的网络号。有匹配的目的网络号,通过Iface接口发送出去,去找目标主机。没有匹配到,会发送给默认网络号(default),一般是路由器,然后该路由器循环上面操作,直到找到主机。

比如:

        局域网之间通信:主机A发送给主机B,主机A知道目的IP地址,通过子网掩码,按位与获得目的网络号,查主机A的路由表,有对应的目的网络号,直接将数据发送到局域网,所有主机都能收到数据,实际发送的数据实际还会包裹一层MAC地址(在我下一篇博客有介绍),这个MAC地址是主机B的MAC地址,所以只有主机B收到该数据会向上交付。

        跨网络通信:主机A发送给主机B,主机A知道目的IP地址,通过子网掩码,按位与获得目的网络号,查主机A的路由表,没有对应的目的网络号,会将数据发送给数据在外层包裹上路由器的MAC地址,发送到局域网中,只有路由器收到该数据是有效的,路由器重复上面操作。

        先查路由表,再决定发送给局域网中的路由器还是其它主机。

        数据在网络中是以光电信号的形式传输的,在路由过程中,由于距离的问题,可能会不断被削弱。集线器的作用是可以放大数据信号。

以上是关于网络层IP协议的主要内容,如果未能解决你的问题,请参考以下文章

网络基础之网络协议

第7章 网络层协议_网络层首部

Linux 网络基础--网络层+数据链路层

从网络协议说起:TCP/IP协议

OSI——网络层

网络层协议 ——— IP协议