《Linux高性能服务器编程》第二章笔记

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

2.1 IP服务的特点

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态无连接不可靠的服务。

无状态

无状态(stateless) 是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种情况下接收端的IP模块无法检测到乱序和重复,因为这些IP数据报之间没有任何上下文关系
接收端的IP模块只要收到了完整的IP数据报(如果是IP分片的话,IP 模块将先执行重组),就将其数据部分(TCP 报文段、UDP数据报或者ICMP报文)上交给上层协议。那么从上层协议来看,这些数据就可能是乱序的、重复的。面向连接的协议,比如TCP协议,则能够自己处理乱序的、重复的报文段,它递交给上层协议的内容绝对是有序的、正确的

虽然IP数据报头部提供了一个标识字段用以唯一标识一个IP数据报,但它是被用来处理IP分片和重组的,而不是用来指示接收顺序的。

无状态服务的优点:简单高效
我们无须为保持通信状态而分配一些内核资源,也无须每次传输数据时都携带状态信息。在网络协议中,无状态是很常见的,比如UDP协议和HTTP求之间没有任何关联,它们将被Web服务器独立地处理。

无连接

无连接(connectionless)是指IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须明确指定对方的IP地址

不可靠

不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力(best efort)。很多种情况都能导致IP数据报发送失败。比如,某个中转路由器发现IP数据报在网络上存活的时间太长,那么它将丢弃之并返回一个ICMP错误消息给发送端。又比如,接收端发现收到的IP数据报不正确(通过校验机制),它也将丢弃之,并返回一个ICMP错误消息(IP头部参数错误)给发送端。无论哪种情况,发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,而不会试图重传。因此,使用IP服务的上层协议(比如TCP协议)需要自己实现数据确认、超时重传等机制以达到可靠传输的目的

2.2 IPv4头部结构

2.2.1 IPv4头部结构

其长度通常为20字节,除非含有可变长的选项部分
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 IP分片

前文曾提到,当IP数据报的长度超过帧的MTU时,它将被分片传输。分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。
IP头部的数据报标识、标志和片片偏移给IP分片和重组提供了充足的信息。
以太网帧的MTU是1500字节,因此它可以携带的IP数据报的数据部分最多1480字节(IP头部占用20字节)。如果使用IP数据报封装一个长度为1481的ICMP报文,则该数据报必须分片。
在这里插入图片描述

2.4 IP路由

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

2.4.1 IP模块工作流程

在这里插入图片描述

  1. 对IP数据报的头部做CRC校验,确认无误后分析其头部的具体信息
  2.  - 如果该数据报是发送给本机的,则IP模块就根据数据报部中的协议字段来决定将它派发给哪个上层应用。
     - 如果不是发送给本机的,则调用数据报转发子模块来处理该数据报
    
  3. 数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。
  4. IP数据报应该发送至哪个下一跳路由(或者目标机器),以及经过哪个网卡来发送,就是IP路由过程,即“计算下一跳路由”子模块。IP模块实现数据报路由的核心数据结构是路由表。
  5. IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层数据(ICMP报文、TCP报文段和UDP数据报)的IP数据报。
  6. 虚线箭头表示路由表更新的过程。

2.4.2 路由机制

要研究IP路由机制,需要先了解路由表的内容。我们可以使用route命令或netstat命令查看路由表。

路由表包含两项,每项都有8个字段
在这里插入图片描述
路由机制:

  1. 查找查找路由表中和数据报的目标IP地址完全匹配的主机中地址。如果找到, 就使用该路由项,没找到则转步骤2。
  2. 查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址。如果找到,就使用该路由项,没找到则转步骤3。
  3. 选择默认路由项,这通常意味着数据报的下一跳路由是网关。

2.4.3 路由表更新

路由表必须能够更新以反映网络连接的变化.这样P模块才能准确、高效地转发数据报。route命令可以修改路由表。

通过route命令或其他工具手工修改路由表,是静态的路由更新方式。对于大型的路由器,它们通常通过BGP (Border Gateway Protocol, 边际网关协议)、RIP (RoutingInformation Protocol,路由信息协议)、OSPF等协议来发现路径,并更新自己的路由表。这种更新方式是动态的、自动的。

2.5 IP转发

前文提到,不是发送给本机的IP数据报将由数据报转发子模块来处理。路由器都能执行数据报的转发操作,而主机一般只发送和接收数据报,这是因为主机上/ro/s/s/s/tipve4/ip_forward内核参数默认被设置为0。我们可以通过修改它来使能主机的数据报转发功能。

对于允许IP数据报转发的系统(主机或路由器),数据报转发子模块对期望转发的数据报执行如下操作:

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

2.6 重定向

下图显示了ICMP重定向报文也能用于更新路由表,因此这里我们讨论ICMP重定向

2.6.1 ICMP重定向报文

在这里插入图片描述
ICMP重定向报文的数据部分含义:

  1. 引起重定向的IP数据报的源端IP地址
  2. 应该使用的路由器的IP地址

接收主机根据这两个信息就可以断定引起重定向的IP数据报应该是用哪个路由器来转发,并且以此来更新路由表(通常是更新路由表缓冲,而不是直接更改路由表)

2.7 IPv6头部结构

IPv6协议是网络层技术发展的必然趋势。它不仅解决了IPv4地址不够用的问题,还做了很大改进。比如,增加了多播和流的功能,为网络上多媒体内容的质量提供精细的控制;引入自动配置功能,使得局域网管理更方便;增加了专门的网络安全功能等。

2.7.1 IPv6固定头部结构

在这里插入图片描述

  • 4位版本号,对IPv6来说是6
  • 8位通信类型
  • 20位流标签:IPv6新添加的字段,用于某些对连接的服务质量有特殊要求的通信,比如音频或视频等实时数据传输
  • 16位净荷长度
  • 8位下一个包头
  • 8位跳数限制

32位表示的IPv4地址一般用点分十进制来表示,而IPv6则用十六进制字符串表示

2.7.2 IPv6扩展头部

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

在这里插入图片描述

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值