IP协议(Internet protocol)是网络层最核心的协议,IP协议根据数据包的目的IP来决定如何投递它。
IP协议特点
无状态
就是所有IP数据报的发送,传输,接收都是互相独立,没有上下文关系的。所以它带来的缺点就是无法处理乱序和重复的数据报,
虽然IP报头有16位的标识可以唯一的标识数据报,但它被用来处理IP分片。当然无服务的优点是 高效 简单。无需为保持通信而分配内核资源,也不用每次都传输数据都携带状态信息。
无连接
IP通信双方都不长久的维持对方的任何信息,所以每次发送数据的时候都要明确对方的IP地址。
不可靠
不可靠是指IP协议不能保证数据包能准确到达接收端,只是、承诺尽最大努力。
IPv4的头部结构
4位版本号:IP协议的版本号
4位头部长度:标识出该IP报头有多少个4字节,因为4位最大能表示到5,所以IP头部长度最大为60字节
8位服务类型:4位的TOS字段和一位的保留字段(必须置0)
16位总长度:整个IP数据报的长度,以字节为的单位.所以IP数据报的最大长度为2^16-1,但是由于MTU(帧的最大传输单元)的限制,长度超过MTU的数据报都会被分片传输,所以IP数据报的长度都远远没有达到最大值。
16位标识:用于唯一的标识数据报,其初始值由系统随机生成,每发送一个数据报都将其值加1,该值再分片时被复制到每个分片中,所以一个数据报的所有分片都有相同的标识。
3位标识字段:第一位保留,第二位标识“禁止分片”,如果设置了这个位,IP模块就不会对数据报地进行分片,这时候如果数据包的长度超过MTU,就将丢弃数据报 并返回一个ICMP差错报文。第三位标识“更多分片”,除了数据报的最后一个分片外,其他分片都要将此位设置为1.
13位分片偏移:是分片相对于原始数据报开始出数据部分的偏移。实际的偏移值是该值左移3位(乘8)得到的。所以IP分片的数据部分长度都是必须是8的倍数(以此来保证后面的IP分片有合适的偏移值)
8位生存时间:Time to Live,TTL. 是数据报到达目的地之前允许经过的路由器的跳数。当TTL减为0时,路由器将丢弃数据报。并向源端发送一个ICMP错误报文,TTL可以防止数据报进入路由循环。
8位协议:用来区分上层协议。
16位头部校验和:由发送端填充,接收端对其使用CRC算法以检验IP数据报头部在传输过程中有没有损坏。
32位的源端地址和32位的目的地址:用来标识数据报的发送端和接收端。
选项字段:可变长的可选字段,最多包含40个字节。
IP模块工作流程
如果IP数据报的头部目的IP地址是本机的某个IP地址,或者是广播地址,即这个该数据报是发送给本机的,则IP模块就会根据报头的协议字段决定将它发送到哪个上层应用。如果不是发送给本机的,则数据转发子模块就会检测数据是否是允许发送的,如果不允许,IP模块就会将数据丢弃。如果允许,数据报转发子模块将会对数据报执行一些处理,然后交给IP模块的输出子模块。
IP的输出队列存放所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层数据(ICMP报文,TCP报文段和UDP报文段)的IP数据报。