IP数据报首部字段分析
IP数据报传输使用的是网络字节序,网络字节序是大端字节序
IP数据报首部一般为20个字节(没有选项的情况),最大是60字节,60字节如何算出参考下面 首部长度字段
- 版本号 区分IPv4和IPv6 IPv4是0100 IPv6是0110
- 首部长度 单位是32bit,即4个字节,即图中的一行,所以首部最大长度是(2^4-1)* 4=60个字节 减一是因为首部长度不能为0
- 服务类型TOS Type Of Service
RFC791中划分为3bit的优先权子字段,4bit的TOS子字段和1bit保留字段
后来发现3bit,8个优先级不够用,后来在RFC 2474中又重新对TOS进行了划分,前六位为DSCP(Differentiated Services Code Point)后两位为保留位,详细可google DSCP
- 总长度 16bit,是整个IP数据报的大小,单位是字节,一个IP数据报最大是(2^16-1)=65535bytes,利用总长度和首部长度就可以算出数据长度
- 标识Identification 16bit,相当于IP数据报的ID,如果因为数据大于链路层MTU导致IP数据报分段(Fragment)的话,则每个分段的IP数据报的标识都是一样的
- 标志Flag 3bit,只有两位在用,DF(Dont Fragment)和MF(More Fragment)用于分段标志,DF标志是否分段,MF标志分段后后面是否更多分段
- 位偏移Offset 13bit 用于分段后标志该IP数据报相对原来数据报的偏移量(以8字节为单位)
- 生存时间TTL Time To Live 限制数据报在网络上的存留时间,数值为经过的路由器的数目(Hop Count)每当一个IP数据报到达路由器或者主机,TTL就会被减一。如果减到0还没到达目的地,数据报会被丢弃,并用ICMP包告诉发送主机,TraceRoute的原理就是用TTL字段
- 协议 表示上层协议,1代表ICMP,2代表IGMP,6代表TCP,17代表UDP。
- 首部校验和 16位,用于验证数据完整性,计算方法为,首先将校验和位置零,然后将每16位二进制反码求和即为校验和,最后写入校验和位置。接收方验证时把数据和校验和一起做16位求和,如果二进制结果全为1,则数据无差错,如果不是全1,则丢弃该数据报,但不会跟TTL为0时一样发送ICMP报文,而是交给上层协议发现数据丢失进行重传,数据报经过路由器时TTL减一,对应的检验和也需要加一,这样不用重新计算校验和,具体可见RFC1141
- 源IP地址
- 目的IP地址