【lwip】09-IPv4协议&超全源码实现分析( 二 )


9.2.7 本网络本主机地址IP 地址 32bit 全为 0 的地址(0.0.0.0)表示的是本网络本主机,只能做源IP地址 。
在当设备启动时但又不知道自己的 IP 地址情况下常见 。
9.2.8 子网子网掩码 & 判断是否在同一子网:IP 与 子网掩码 做 按位与,就可以得出该 IP 的子网网段 。如:

  • 子网掩码:255.255.255.0
  • IP-1: 192.168.1.2 & 255.255.255.0 = 192.168.1.0
  • IP-2: 192.168.1.123 & 255.255.255.0 = 192.168.1.0
  • IP-3: 192.168.2.123 & 255.255.255.0 = 192.168.2.0
  • 因为 192.168.1.0 = 192.168.1.0,所以IP-1与IP-2处于同一子网 。
  • 因为 192.168.1.0 != 192.168.2.0,所以IP-1与IP-3不在同一子网 。
在发数据包时,子网的作用:
  • 若源IP和目标IP在同一子网:直接获取目标IP主机的MAC,然后把数据包丢出去 。
  • 若源IP和目标IP不在同一子网:获取默认网关的 MAC ,然后把数据包丢给默认网关那边 。
9.2.9 NAT 概念在计算机网络中,网络地址转换(Network Address Translation,缩写为 NAT),也叫做网络掩蔽或者 IP 掩蔽(IP masquerading) 。
当前只需要知道NAT就是网络地址转换的作用即可,详细技术细节自行百度 。
9.3 IP数据报
【lwip】09-IPv4协议&超全源码实现分析

文章插图
9.3.1 版本号字段占用4 bit 。
这个字段规定了数据报的 IP 协议版本 。
如:
  • IPv4:值为4 。
  • IPv6:值为6 。
9.3.2 首部长度字段占用4 bit 。
用于记录 IP 首部的数据的长度 。
单位,字 。最大可以表示15*4=60字节 。
IP首部的长度默认是20 byte , 但是如果有选项字段,就不止20 byte了 。
9.3.3 服务类型(TOS:type of service)字段占用8 bit 。
该字段用于描述当前IP数据报急需的服务类型,如:
  • 最小延时;
  • 最大吞吐量;
  • 最高可靠性;
  • 最小费用等 。
路由器在转发数据报时,可以根据该字段的值来为数据报选择最合理的路由路径 。
9.3.4 总长度字段占用16 bit 。
是 IP 数据报的总长度(IP首部+数据区) 。
单位,字节 。最大能表示65535字节 。
数据报很少有超过1500字节的 , 因为以太网数据帧的数据最大长度为1500字节 。
如果一个IP数据报过大时,需要进行分片处理 。
9.3.5 标识字段标识字段、标志字段和13位偏移字段常在IP数据报分片时使用 。
占用16 bit 。
用于标识IP层发出去的每一份IP数据报,每发送一份 , 该值+1 。
如果IP数据报被分片,该字段在每个分片的IP数据报上是一致的,表示属于同一个IP数据报 。
在接收端会根据该字段识别同一个IP数据报进行重装 。
9.3.6 标志字段占用3 bit 。
第一个bit保留未用 。
第二个bit是不分片标志位:
  • 0:则表示 IP 层在必要的时候可以对其进行分片处理 。
  • 1:则表示 IP 数据报在发送的过程中不允许进行分片 , 如果这个 IP 数据报的大小超过链路层能承载的大小,这个 IP 数据报将被丢弃 。
第三个bit是更多分片标志位:
  • 0:后续没有更多分片 。即是当前分片的IP数据报是最后一个分片 。
  • 1:表示后续还有分片 。即是当前分片的IP数据报不是最后一个分片 。
9.3.7 分片偏移量字段占用13 bit 。
表示当前分片所携带的数据在整个 IP 数据报中的相对偏移位置 。
单位,8字节(2个字) 。
目标主机要接收到从0分片偏移量到最高分片偏移量的所有分片才能进行组装出完整的IP数据报 。
9.3.8 生存时间(Time-To-Live,TTL)字段占用8 bit 。
该字段用来确保数据报不会永远在网络中循环 。
IP数据报没经过一台路由器处理,该值-1 。
如果TTL字段下降到0 , 则路由器会丢弃该数据报 , 且会返回一个 ICMP 差错报文给源主机 。
9.3.9 协议字段占用8 bit 。
表示上层协议类型 。即是表示数据区的数据是哪个协议的数据报 。如:
  • 6:表示TCP协议 。
  • 17:表示UDP协议 。
  • 其它值可以自行度娘 。
9.3.10 首部校验和字段占用16 bit 。
只针对IP首部做校验,并不关系数据区在传输过程中是否出错,所以对于数据区的校验需要由上层协议负责 。
路由器要对每个收到的 IP 数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则表示出现错误,路由器一般会丢弃检测出错误的 IP 数据报 。

推荐阅读