IP数据报组成
IP数据报是由首部与数据部两部分组成。
首部的前一部分是固定的20个字节,后一部分是可选的,是每个数据报必不缺少的一部分。后面的数据部分是来自于传输层。
这是IP数据报首部的结构图,上图中每行为4个字节,其中固定部分为5行,则固定部分为20个字节。
IP数据报首部的分为固定部分与可变部分。(一般情况下可变部分为0)
IP数据报首部的各个信息
- 版本:标识TCP/IP是IPV4还是IPV6
- 首部长度:如果IP数据报首部只包含固定部分,则该值为20,如果首部包含可选部分,则该值不固定。
- 区分服务:类似于IP数据报的优先级。
例如:当我们在使用微信进行视频通话时,恰巧这是路由上有人发送邮件信息,路由器会判断哪个数据报的优先级高,优先级高的先进行转发。 - 总长度:用来表示数据报整体的总长度。总长度占2个字节,所以数据报的总大小为2^16-1,也就是65535个字节。但是数据链路层最大支持的传输单元MTU为1500个字节,导致网络层产生的数据报过大,数据链路层传不了,这时在网络层还会将数据报进行分片处理,处理成为支持数据链路层传输的数据大小。
- 标识:上述所产生的数据片,接收端收到后,会通过标识将数据片进行整和,整和成一个完整的数据报。
- 标志:有的数据报需要进行分片处理,有的数据报不需要进行分片处理,该标志就是用于区分数据报是否分片。标志位有3bit,当最低位值为1时,表示后面还有分片,当最低位值为0时,表示该为最后一个分片。
- 偏移量:为了将数据片进行整和,偏移量的作用就是,标记该数据片的位置在数据报中的那一部分。
- 生存时间:TTL,每过一个路由器,值减一。
- 协议:用来标识数据部分交给那个协议处理。
- 首部检验和:用于判断该数据在传输的过程中是否发生改变。
- 源地址:指传输段的IP地址。
- 目标地址:指接收端的IP地址。
- 最后变长地址长度为对多包含40个字节,因为IP地址头部最长60个字节。
IP模块的工作流程
从右往左分析:
- 先从网络驱动程序(网卡)中获取IP地址信息,将其放入到IP输入队列中。
- 对数据报的头部做CRC校验,判断数据报是否发生错误,确认无误,进行下一步操作。
- 检验是否接收端是本主机,如果目标IP地址是本网段中的某个IP地址,则将数据发送给具体主机,主机通过端口号确保发送给哪一个应用。如果不是则将该网段中的地址,进行数据报转发。
- 判断数据报是否允许转发,允许转发则转发,不允许则丢弃。
- IP输出队列存放的是等待发送的IP数据报,除过要发送的IP地址外,还包括ICMP报文、TCP报文、UDP报文。