IP数据报格式和IP地址路由(三)

来源:互联网 发布:阿里云服务器ecs建站 编辑:程序博客网 时间:2024/05/06 08:18

一、IP数据报格式

注:注意的是网络数据包以大端字节序传输,当然头部也得是大端字节序

linux中的IP数据结构体:

struct ip  {#if __BYTE_ORDER == __LITTLE_ENDIAN    unsigned int ip_hl:4; /* header length */    unsigned int ip_v:4; /* version */#endif#if __BYTE_ORDER == __BIG_ENDIAN    unsigned int ip_v:4; /* version */    unsigned int ip_hl:4; /* header length */#endif    u_int8_t ip_tos; /* type of service */    u_short ip_len; /* total length */    u_short ip_id; /* identification */    u_short ip_off; /* fragment offset field */#define IP_RF 0x8000 /* reserved fragment flag */#define IP_DF 0x4000 /* dont fragment flag */#define IP_MF 0x2000 /* more fragments flag */#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */    u_int8_t ip_ttl; /* time to live */    u_int8_t ip_p; /* protocol */    u_short ip_sum; /* checksum */    struct in_addr ip_src, ip_dst; /* source and dest address */  }; 


版本
IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6


首部长度
以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP首部20个字节;最大值为15,所以首部长度最大为60个字节


服务类型(TOS)
长度为8位。此字段包含3位的优先权(现已忽略),4位的服务类型子字段(只能有一位置1)和1位的保留位(必须置0)。4位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F),如下图。


总长度
该字段长度为16位,以字节为单位,该字段长度包含IP的头部和数据部分(payload)。IP数据报最大可达65535(2^16-1)个字节。

标识
16位标识,用来标识一个IP数据报,每发送一个此值会加1,可用于分片和重新组装成数据报。



标志与片偏移

3位标志其中第一位不使用, 每二位DF(Don’t Fragment),该位如果为1,如果传输的数据报超过最大传输单元(MTU),该数据报会被丢弃,并发送一个ICMP差错报文。第三位MF(More Fragment)表示是否有更多的片,该位为1,说明后续有分片。最后一片MF为0。


假设一个IP数据报大于最大传输单元MTU,那么如果设置了分片标志位,将会被分片传输。

每一片都有自己的IP 头部,IP头部中的标识是一样的,但是片偏移不同(以8字节为单位)。除了最后一片,分片要求其他片除去IP头部的大小必须是8字节的整数倍。除了第一片有tcp/udp头部,其他片都没有。分片完成后,每一片独自成为一个数据包(跟数据报概念不同,参见这里),可以走不同的路由,最后到达目的地的时候IP层根据它们各自IP头部的信息重新组成一个IP数据报。如下图,这里IP数据报被分出了2片





TTL
TTL(Time To Live)表示数据报最多可经过的路由器的数量。数据报每经过一个路由器,TTL减1,减为0时丢弃,并发送ICMP报文通知源主机。TTL可以避免数据报在路由器之间不断循环。


协议类型
表示IP层上承载的是哪个高级协议。在封装与分用的过程中,协议栈知道该交给哪个层的协议处理。1 ICMP 2 IGMP 6 TCP 17UDP


头部校验和
保证数据报头部的数据完整性,但校验不包括数据部分。



源IP地址
发送数据的主机IP地址


目的IP地址
接收数据的主机IP地址


选项与填充(选项为4字节整数倍,否则用0填充)


二、IP地址与路由

IPv4的IP地址长度为4字节,通常采用点分十进制表示法(dotted decimal representation),Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。


这台主机只有一个网络接口连到172.16.148.0/24网络(172.16.148.166 & 255.255.255.0 = 172.16.148.0)

路由表的Destination(目标)是目的网络地址网关;(Gateway)是下一跳地址,接口(Iface)是发送接口,标志(Flags)中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,因此下一跳地址处记为*号。


路由的处理过程如下



0 0
原创粉丝点击