Linux高性能服务器编程(3)IP协议详解

Linux高性能服务器编程(3)

IP协议

IP头部信息。IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。
IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器之外的所有主机和路由器上。它们决定数据报是否应该转发以及如何转发。

IP协议是TCP、IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。
**(1)无状态(stateless)**是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是互相独立、没有上下文关系的。缺陷是无法处理乱序和重复的IP数据报。
优点:简单,高效。
缺点:无法处理乱序和重复的IP数据报。
**(2)无连接(connectionless)**是IP通信双方都不长久地维持对方任何信息。这样,上层协议每次发送数据时,都必须明确指定对方地IP地址。
(3)不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力。

使用IP协议的上层协议(比如TCP协议)需要自己实现数据确认、超时重传等机制以达到可靠传输的目的。

IPv4头部结构

在这里插入图片描述

IPv4其长度通常位20字节,除非含有可变长的选项部分。

字段作用和功能
4位版本号指定IP协议的版本。其他IPv4协议的扩展版本(如SIP协议和PIP协议),则有不同的版本号,
头部结构也不同。
4位头部长度标识该IP头部有多少个32bit字(4字节)。因为4位最大能表示15,所有IP头部最长为60字节。
8位服务类型包括一个3位的优先权字段,4位的TOS字段和1位保留字段。
4位的TOS字段分别表示:最小延迟,最大吞吐量,最高可靠性和最小费用。
16位总长度是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535(2^16-1)字节。
由于MTU的限制,长度超过MTU的数据报都将被分片传输,实际传输的IP数据报长度远未达到最大值。
16位标识唯一地标识主机发送的每一个数据报。初始值由系统随机生成;每发送一个数据报,其值就加1.
该值在分片时被复制到每一个片中,因此同一个数据报的所有分片都具有相同的标识值
3位标志字段第一位保留,第二字位表示“禁止分片”。如果设置这个位,IP模块将不对数据报进行分片。该情况下,IP数据报长度超过MTU,IP数据报将丢弃该数据报并返回一个ICMP差错报文。
第三位表示“更多分片”。除数据报的最后一个分片外,其他分片都要把它置1
13位分片偏移是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)。
因此,除最后一个分片外,其他分片的数据部分的长度必须是8的整数倍。
这样才能保证后面的IP分片拥有一个合适的偏移值。
8位生存时间是数据报到达目的地之前运行经过的路由器跳数。TTL值(生存时间)被发送端设置(值64)。
数据报在转发过程中每经由一个路由,该值就被路由器减1.当TTL值减为0时,
路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
8位协议用来区分上层协议。/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。
其中ICMP是1,TCP是6,UDP是17.该文件是RFC1700的子集。
16位头部校验和由发送端填充,接收端对其使用CRC算法以检验IP数据报头部在传输过程中是否完整。
32位源端IP地址和目的目的端IP地址用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。
IPv4选项字段可变的可选信息。这部分最多包含40字节,因为IP头部最长是60字节。可用的IP选项有:
**记录路由:**告诉数据报途径的所有路由器都将自己的IP地址填入IP头部的选项部分,这样就可用跟踪数据报的传递路径。
**时间戳:**告诉每个路由器都将数据报被转发的时间(或时间与IP地址对)填入IP头部的选项部分,这样就可用测量途径路由之间数据报传输的时间。
**松散源路由选择:**指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。
**严格源路由选择:**和松散源类似,不过数据报只能经过被指定的路由器。

IP分片

当IP数据报的长度超过MTU(60字节)时,将分片传输。分片可以发生在任何阶段,可能发生在发送端,可能发生在中转路由器上,可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才能被内核中的IP模块重新组装。
IP数据报中三个字段给IP分片和重组提供足够信息:数据报标识、标志和不同的片偏移。除最后一个分片外都设置MF标志。此外,每个分片的IP头部的总长度字段将被设置为该分片的长度。(每个分片都有自己的IP头部)

IP路由

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

IP模块工作流程
1.先从网络驱动程序(网卡)中获取IP地址信息,将其放入到IP输入队列中。
2.对数据报的头部做CRC校验,判断数据报是否发生错误,确认无误,进行下一步操作。
3.检验是否接收端是本主机,如果目标IP地址是本网段中的某个IP地址,则将数据发送给具体主机,主机通过端口号确保发送给哪一个应用。如果不是则将该网段中的地址,进行数据报转发。
4.判断数据报是否允许转发,允许转发则转发,不允许则丢弃。
5.IP输出队列存放的是等待发送的IP数据报,除过要发送的IP地址外,还包括ICMP报文、TCP报文、UDP报文。

在这里插入图片描述

路由控制
路由表内容

字段含义
Destination(目的网络地址)目的网络或主机
Gateway(网关)网关地址,*表示目标和本机在同一个网络,不需要路由
Genmask(子网掩码)网络掩码
Flags路由表中常见的flag标记有:
(1) U:路由是动态的;
(2) H:目标是一个主机;
(3) G:路由指向网关;
(4) R:恢复动态路由产生的表项;
(5) D:由路由的后台程序动态安装;
(6) M:由路由的后台程序修改;
(7) ! :拒绝路由。
Metric路由距离,即达到指定网络所需的中转数
Ref路由项被引用的次数(Linux未使用)
Use该路由项被使用次数
Iface该路由项对应的输出网卡接口

路由表是如何按照IP地址分类?或者给定数据报的目标IP地址,它将匹配路由表的哪一项?这就是IP的路由机制,分三步:
1)查找路由表中和数据报的目的IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到则转到步骤2
2)查找路由表中和数据报的目标IP地址具有相同网络ID的网络IP地址;如果找到就使用该路由项;没找到转到步骤3
3)选择默认路由项,这通常意味着数据报的下一跳路由是网关。

路由表更新
1.如果更新的某路由表项在路由表中没有,则直接在路由表中添加该路由表项;
2.如果路由表中已有相同目的网络的路由表项,且来源端口相同,那么无条件根据最新的路由信息更新其路由表
3.如果路由表中已有相同目的网络的路由表项,但来源端口不同,则要比较它们的度量值,将度量值较小的一个作为自己的路由表项;
4.如果路由表中已有相同目的网络的路由表项,且度量值相等,保留原来的路由表项。

通过route命令或其他工具修改路由表,是静态的路由更新方式。对于大型的路由器,它们通常通过BGP、RIP、OSPF等协议来发现路径,并更新自己的路由表,这种更新方式是动态的、自动的。

IP转发

不是发给本机的IP数据报将由数据报子模块来处理。修改主机上/proc/sys/net/ipv4/ip_forward内核参数默认值(默认为0)来使能主机的数据报转发功能。

# echo 1 > /proc/sys/net/ipv4/ip_forward

对于运行IP数据报转发的系统(主机或路由器),数据报转发子模块将对期望转发的数据报执行如下操作:
1)检查数据报头部的TTL值。如果TTL值为0,则丢弃该数据报。
2)查看数据报头部的严格源路由选择选项。如果该选项被设置,则检测数据报的目标IP地址是否为本机的某个IP地址。如果不是,则发送一个ICMP源站选路失败报文给发送端。
3)如果有必要,则给源端发送一个ICMP重定向报文,以告诉它一个更合理的下一跳路由器。
4)将TTL值减1
5)处理IP头部选项
6)如果有必要,则执行IP分片操作

重定向

ICMP重定向报文能用于更新路由表。
在这里插入图片描述

ICMP报文头部的3个固定字段:8位类型、8位代码和16位校验和ICMP重定向报文的类型值是5,代码字段有4个可选值,用来区分不同的重定向类型。主机重定向,代码值为1.
ICMP重定向报文的数据部分含义很明确,它给接收方提供两个信息:
1.引起重定向的IP数据报的源端IP地址
2.应该使用的路由器的IP地址
接收主机根据这两个信息就可以断定引起重定向的IP数据报应该使用哪个路由器来转发,并且一次来更新路由表(通常是更新路由表缓冲,而不是直接更改路由表)。一般来说,主机只能接收ICMP重定向报文,而路由器只能发送ICMP重定向报文。

IPv6头部

IPv6头部由40字节的固定头部和可变长的扩展头部组成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3X8OeLnB-1684736907630)(C:\Users\17259\AppData\Roaming\Typora\typora-user-images\image-20230517203139979.png)]

字段内容
4位版本号指IP协议的版本。对IPv6来说,其值是6
8位通信类型指示数据流通信类型或优先级,和IPv4中的TOS类似
20位流标签是IPv6新增加的字段,用于某些对连接的服务质量有特殊要求的通信,比如音视频等实时数据传输。
16位净荷长度指的是IPv6扩展头部和应用程序数据长度之和,不包括固定头部长度。
8位下一个包头指出紧跟IPv6固定头部后的包头类型。如扩展头或上层协议头(TCP,UDP或ICMP)。
类似IPv4中的协议字段,且相同的取值有相同的含义。
8位跳数限制和IPv4中TTL含义相同

IPv6扩展头部

可变长的扩展头部是的IPv6能支持更多的选项,并且很便于将来的扩展需要。它的长度可以为0,表示数据报没有使用任何扩展头部。应该数据报可以包含多个扩展头部,每个扩展头部的类型由前一个头部(固定头部或扩展头部)中的下一个报头字段指定。目前可使用的扩展头部有:

扩展头部含义
Hop-by-Hop逐跳选项头部,它包含每个路由器都必须检查和处理的特殊参数选项
Destination options目的选项头部,指定由最终目的节点处理的选项
Routing路由头部,指定数据报要经过哪些中转路由器,功能类似于IPv4的松散源路由选择选项
和记录路由选项
Fragment分片头部,处理分片和重组的细节
Authentication认证头部,提供数据源认证、数据完整性检查和反重播保护
Encapsulating Security Payload加密头部,提供加密服务
No next没有后续扩展头部

注意:

IPv6并不是IPv4协议的简单扩展,而是完全独立的协议。用以太网封装的IPv6数据报和IPv4数据报具有不同的类型值。IPv4数据报的以太网帧封装类型值是0x800,而IPv6数据报的以太网帧封装类型值是0x800dd
olor=“red”>注意:

IPv6并不是IPv4协议的简单扩展,而是完全独立的协议。用以太网封装的IPv6数据报和IPv4数据报具有不同的类型值。IPv4数据报的以太网帧封装类型值是0x800,而IPv6数据报的以太网帧封装类型值是0x800dd

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值