多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 概述 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。 ## IP服务的特点 ### 无状态 * 无状态指的是IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。无法处理乱序和重复IP数据报。 * 接收端的IP模块只要收到了完整的IP数据报(如果是IP分片的话,IP模将先执行重组),就将其数据部分(TCP报文段、UDP报文段或ICMP报文)上交给上层协议。 * 上层协议,面向连接的协议,比如TCP协议,则能够自己处理乱序的、重复的报文段,它递交给上层协议的内容绝对是有序的、正确的。 * IP数据包头部提供了一个标识字段用以唯一标识一个IP数据,但它是用来处理IP分片和重组的,而不是用来指示接收顺序的。 * 无状态的服务的优势是:简单、高效。 ### 无连接 * 无连接是指IP通信双方都不长久的维持对方任何信息。上层每次发数据时,都必须明确指定对方的IP地址。 ### 不可靠 * 不可靠是指IP协议不能保证IP数据准确的到达接收端,它只是尽最大的努力。 * 比如某个中转路由器发现IP数据报在网络上存活的时间太长了,那么他将丢弃,并返回一个ICMP错误消息(超时错误)给发送端, * 又比如,接收端收到的IP数据报不正确(校验机制),它也将丢弃之,并返回一个ICMP错误消息(IP头部参数错误)给发送端。 ## IPV4头部结构 头部长度通常是20字节,除非含有可选的变长部分。 ![wxF6KK.png](https://s1.ax1x.com/2020/09/23/wxF6KK.png) 4位版本号:指定IP协议的版本,对IPV4来说,其值是4。 4位头部长度:标识该IP头部有多少32bit(4字节)。因为4位最大能表示15,所以IP头部最大是60字节。 8位服务类型:包括3位的优先权字段(现在已经被忽略),4位TOS字段和1位保留字段(必须置0)。4位TOS字段分别表示:最小延时,最大吞吐量。最高可靠性和最小费用。其中最多有一个能置为1,应用程序根据实际需要来设置它。 16位识别:唯一地标识主机发送的每一个数据报,其初识值系统随机生成;没发送一个数据报,其值就加1。 3位标志:第一位保留,第二位表示禁止分片。如果设置了改值,IP模块就不能对数据分片。第三位表示更多分片,除了数据报的最后一个分片外,其他分片都要置为1。 13位分片偏移:是分片相对原始IP数据报开始出(仅指数据分)的偏移,每个IP分片数据部分的长度必须是8的整数倍。保证后面的IP分片有一个合适的偏移值。 8位生存时间(Time TO Live ,TTL):是数据报到达目的地之前允许经过的路由器跳数。TTL常被发送端设置为64。 8位协议:用来区分上层协议,/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。ICMP=1,TCP=6,UDP=17。 16位头部校验和:由发送端填充,接收端用CRC算法来检验IP数据报头部在传输过程中是否损坏。 32位源端IP地址和32位目的端IP地址:用来标识发送端和接收端。 选项,最多40字节:可变长的可选信息。因为IP头部最长是60字节。可用的IP选项包括: ``` 记录路由 时间戳 松散源路由选择 严格源路由选择 ``` ![](https://s1.ax1x.com/2020/09/23/wxA8mT.png) ## IP分片 当IP数据报的长度超过帧的MTU时。它将被分片传输。分片可能发生在发送端,也可能发生在中转路由器中。 IP数据报中的如下三个字段给IP的分片和重组提供了足够的信息:数据报标识、标志和片偏移。 一个IP数据报的每个分片都具有自己的IP头部,他们具有相同的IP标识,但有不同的片偏移。并且除了最后一个分片外,其他分片都将设置MF标志,此外,每个分片的IP头部的总长度字段将被设置为该分片的长度。 第一个分片的偏移量是0,第二个是1480,则说明第二个分片的偏移量是第一个分片的ICMP报文的长度。 以太网帧的MTU是1500字节(通过ifconfig或netstat查看) 因此它携带的IP数据包最多是1480字节(IP头部占20字节) **考虑用IP数据报封装一个长度为1481字节的ICMP(包括8字节的ICMP头部,所以其数据部分长度为1473)。则该数据报在使用以太网帧传输的时候必须分片。** ``` sudo tcpdump -ntv -i en0 icmp ping baidu.com -s 1473 ``` 长度为1501字节的IP数据报被拆分成了两个IP分片,第一个分片的长度为1500字节,第二个为21字节,每个分片都含有自己的IP头部20字节。且第一个IP分片的IP头部设置了MF标志,而第二个IP分片的IP头部则没有设置该标志。 ## IP路由 ## IP转发 不是发送给本机的IP数据报将由数据报转发子模块来处理。路由器都能执行数据报的转发操作,而主机一般只发送和接收数据,这是因为主机上/proc/sys/net/ipv4/ip_forward内核参数默认被设置为0,我们可以通过修改它来使主机有数据转发功能。 数据报子模块将对期望转发的数据报执行如下操作: 1. 检查数据报头部的TTL值,如果TTL值已经是0,则丢弃该数据。 2. 查看数据报头部的严格源路由选择选项,如果该选项被设置,则检测数据报的目标IP地址是否为本机的某个IP地址,如果不是,则发送一个ICMP源站选路失败报文给发送端。 3. 如果有必要,则给源端发送一个ICMP重定向报文。告诉它一个更合理的下一跳路由器。 4. 将TTL减一。 5. 处理IP头部选项 6. 如果有必要,则执行IP分片操作 ## 重定向 ICMP重定向报文也能用于更新路由表。 ICMP报文头部的三个固定字段:8位类型、8位代码和16位校验和。 ICMP重定向报文的类型值是5,代码字段有4个可选值,用来区分不同的重定向类型。 主机重定向,其代码值为1。 ICMP重定向报文的数据部分含义明确,他给接收方提供了如下两个信息。 * 引起重定向的IP数据报的源端IP地址 * 应该使用的路由器IP地址 ## IPV6头部结构 IPV6头部由40字节的固定头部和可变长的扩展头部组成。 4位版本号: 值为6 8位通信类型:指数据流通信类型或优先级,和IPV4中的TOS类似 20位流标签:是IPV6新增的字段,用于某些对连接的服务质量有特殊要求的通信,比如音频和视频等实时数据传输 16位净荷长度:指IPV6扩展头部和应用程序数据长度之和,不包括固定头部长度 8位下一个包头:指出紧跟IPV6固定头部后的包头类型,如扩展头或某个上层协议(比如TCP,UDP或ICMP),它类似于IPV4头部中的协议字段,且相同的取值有相同的含义。 8位跳数限制:和IPV4中TTL含义相同 128位源端IP地址/128位目的端IP地址: 使得IP地址的总量达到了2的128次方。 32位表示IPV4地址一般用点分十进制来表示,而IPV6地址则用十六进制字符串表示。