网络层--IP协议详解

目录

IP协议的特点

网络层解决的问题

IPv4头部结构

IP分片

IP路由

IP模块的工作过程

路由机制

 路由表的更新

IP的转发

其他补充

DHCP协议

数据转发顺序


我们知道的是IP协议是TCP/IP协议族的核心协议,也是socket网络编程的核心之一(后期介绍Linux下的socket通信),本文章会从IP协议的格式和七工作过程入手。

IP协议的特点

我们通常说IP协议提供的是跨网络传输的能力,那么该能提是如何被提供的呢?

IP协议为上层提供无状态、无连接、不可靠的服务

无状态:指的是IP通信双方不同步传输数据的。也就是说所有的IP数据报的发送,接收都是相互独立的、没有上下文关系。

无状态的特点也很明显:简单和高效,我们不需要为保持通信状态而额外的分配内核资源。

无连接:指的是IP通信的双方不需要建立长久的的连接关系(不需要长久的维持对方的任何信息),这样上层协议在每次发送数据的时候,都需要接收方的IP地址

不可靠:指的是IP协议不能保证IP数据报能够准确的到达接收端

注意的是保证数据可靠的是传输层TCP协议的特点

网络层解决的问题

我们知道TCP作为传输层的协议,保证了数据传输的可靠性和传输效率,但是TCP只作为传输层的一个协议并且仅仅提供的是数据传输的策略,而不是真正执行传输的,而真正负责数据传输的是网络层和数据链路层

双方在进行网络通信时,发送的数据并不是直接从一方的传输层直接发送到了另一方的传输层,而是需要传输层将数据继续向下进行交付,在网络层和链路层经过数据封装后再通过网络发送到对方主机,对方主机收到数据后也同样需要在链路层和网络层进行数据解包,此时对方的传输层才拿到了发送过来的数据,然后再继续将该数据向上进行交付。

也就是说我们在网络通信中我们每一层都只关心本层的内容,而不关系其他层的内容,所以网络层所解决的问题就是提供数据的路由。

IPv4头部结构

IPv4头部长度一般是20字节,不包含可变长的选择部分。

  1. 4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
  2. 4位首部长度(header length):表示IP报头的长度,以4字节为单位。
  3. 8位服务类型(Type Of Service):3位优先权字段(现以被忽略),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。
  4. 16位总长度(total length):指的是整个IP数据报的长度,以字节为单位。因此IP数据报的最大长度就是2^16-1字节。但是由于MTU的限制(帧MTU后期介绍),超过MTU的数据报会被进行分片处理
  5. 16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
  6. 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,如果设置了这位,IP模块将不对数据进行分片,此时如果IP数据报长度超过了MTU长度,IP模块会丢弃该数据报并返回一个ICMP差错报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  7. 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
  8. 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
  9. 8位协议:表示上层协议的类型。
  10. 16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
  11. 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
  12. 选项字段:不定长,最多40字节。

IP模块是如何将报头和有效数据进行分离的?

我们知道的是IP报头的钱20个字节是IP的报头信息,在这其中有4位首部长度保存的是IP报头的长度

所以当IP收到一个报文时,先读取前20个字节,然后提取首部长度,就可以获取到IP报头的长度为size,然后检测其是否超过了20个字节,如果超过了就再读取size-20个字节(为可变的选择部分),然后剩下的就是有效数据。

IP分片

在前文中提到当IP数据报中的长度超过了帧MTU时,要进行分片处理,分片可以发生在发送端,也可以发生在中转路由上,并且可以在传输过程中被多次分片,只有到达目的机器上,才会被重新组合。

简单的介绍一下最大传输单元MTU

MAC帧是数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络中,但是MAC帧所能携带的有效载荷也是有长度限制的,并且MAC帧作为TCP/IP协议族的最底层,其在最下面一层,也就决定了其有权利确定一次传输的最大长度,一般是1500字节

在Linux下可以通过ifconfig或者netstat查看,所以它携带的IP数据报的有效载荷最大是1480字节,因为有20字节的报头长度

所以我们如果将一个长度为4500字节的IP数据报会被拆分为四个IP分片

分片标号       总字节IP报头字节有效数据
11500201480
21500201480
31500201480
4802060

为什么是4个?

因为每一个分片都要保存头部字段(20字节)

并且需要注意的是在设置分片之后,需要将1,2,3头部字段中的MF设置为1.

然后就是16为标识需要将四个分片的标识设置为一样的

分片偏移设置:分片相对原始IP数据报开始处(数据部分)的偏移,实际的偏移值是该值左移3为然后×8得到的

例如分片3的分片偏移在原始数据开始的偏移处是2960 ÷ 8 = 370

分片标号总字节IP报文字节有效载荷MF标识16位标识分片偏移
1150020148011110
215002014801111185
315002014801111370
48020600111555

IP路由

IP协议的一个核心任务就是数据的路由,即决定发送数据报到目标主机的路径。

IP模块的工作过程

从右到左依次分析

  1. 当IP模块收到来自数据链路层的IP数据报时,会先将其放到IP输入队列,然后对头部字段左CRC校验,没问题之后再分析头部字段的信息
  2. 如果该IP数据报头部中目标IP是本地的某个IP地址或者广播信息时,即该数据时发给本机的,那么IP模块就根据数据报头部字段中的协议字段来决定将其发送给哪个上层应用(分用),如果IP模块中的数据报不是发送给本机的,那么会调用数据报转发来处理该数据报
  3. 数据报子模块先检测系统是否允许转发,如果不允许,IP模块就会将该数据报丢弃,如果允许,数据报转发模块就会对该数据报进一步处理,然后将其交给IP数据报输出模块进行转发
  4. IP数据报应该发送给哪个下一跳路由(目标主机),以及通过哪个网卡来发送,就时IP路由过程,图中的计算吓一跳路由模块就时IP模块实现数据路由的核心,其结构是路由表,该表是通过数据报总的目标IP来分类的,同一类型的IP地址会被发往相同的下一条路由器
  5. IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报之外,还包括封装了本机的上层数据(ICMP报文、TCP报文段、UDP数据报)的IP数据报

路由机制

 上图中虚线部分标识了路由表更新的过程,这一过程指通过路由协议或者route命令来调整,使之适应当前网络结构,这一改变称之为IP路由策略。

我们在Linux上使用route查看本机的路由表

[sjf@VM-8-12-centos ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.0.8.0        0.0.0.0         255.255.252.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0

该路由表包含两项,每一项都包含8个字段

第一项中的default表示的是默认路由项

那么路由表是如何根据IP地址进行分类的呢?

1.先查找路由表中有没有和数据报中目标IP地址完全匹配的主机IP地址,如果有,则就使用该路由项,没有则下一步

2.再查找路由表中和数据报中目标IP地址具有相同的网络ID的网络IP地址(子网),如果找到就使用该路由项,没有则下一步

3.选择默认路由项,这通常意味着该数据报的下一跳路由是网关

 路由表的更新

路由表必须能够进行更新,以此反应网络连接的变化,只有这样IP模块才能准确高效的完成数据的转发

我们可以通过route进行路由表的修改(不建议),所以不再做过多介绍,但是需要知道的是使用route进行路由表的修改是静态的更新方式,对于大型的路由器,他们通常是自己动态的更新路由表,根据的是BGP--边际网关协议、RIP--路由信息协议、OSPF等协议来动态更新。

IP的转发

我们在路由路中提到了不是发给本机的数据报,会通过数据报转发子模块来进行处理

需要注意的是一般的主机只能进行发送和接收数据报,不能进行数据的转发,我们可以修改该ipv4下的ip_forward来支持转发

[sjf@VM-8-12-centos ~]$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward

对于支持路由转发的系统来说,一般对转发操作会进行以下操作

  1. 先检查数据报头部字段中的TTL(8位生存时间),如果TTL为0,则丢弃该数据报
  2. 将TTL值减一
  3. 处理IP头部字段
  4. 如果有必要,则执行IP分片操作

其他补充

DHCP协议

在实际管理IP地址的时候,都是采用动态分配技术来进行IP地址的划分

DHCP通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络环境中的主机动态获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器。

数据转发顺序

当IP模块要将一个数据报跨网络传输到另一个IP模块时,不是直接将数据发送给对方,而时先将数据发送到目标主机所在的网络上,然诺再将数据发送到目标主机

所以数据再路由的时候不是找目标主机,而是寻找目标主机所在的目标网络,然后再在目标网络中找到目标主机

也就是先找目标网络,再找目标主机

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
大家知道,TCP/IP已成为计算机网络的事实上的标准。在关于TCP/IP的论著中,最有影响的就是两部著作。一部是Douglas E. Comer的《用TCP/IP进行网际互连》,而另一部就是Stevens写的这3卷书。这两套巨著都很有名,各有其特点。无论是从事计算机网络的教师还是进行科研的技术人员,这两套书都应当是必读的。   《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。本书适合作为计算机专业学生学习网络的教材和教师参考书。也适用于研究网络的技术人员。   《TCP/IP详解 卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多播、长肥管道支持、窗口缩放、时间戳选项以及其他主题等等。读者阅读本书时,应当具备卷1中阐述的关于TCP/IP的基本知识。本书适用于希望理解TCP/TP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。   《TCP-IP详解卷三TCP事务协议,HTTP,NNTP和UNIX域协议》是“TCP/IP详解系列”的延续。主要内容包括:TCP事务协议,即T/TCP,这是对TCP的扩展,使客户-服务器事务更快、更高效和更可靠;TCP/IP应用,主要是HTTP和NNTP;UNIX域协议,这些协议提供了进程之间通信的一种手段。当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。本书同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。 本书适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值