转载地址https://www.cnblogs.com/embedded-linux/p/4986449.html

头文件netinet/ip.h中定义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 */

};

解析

  • 4位首部长度(ip_hl):这个值以4字节为单位,IP协议首部的固定长度为20个字节,
    如果IP包没有选项,那么这个值为5.
  • 4位版本(ip_v):这里是4,现在IPV6已经出来了。
  • ip_tos服务类型:说明提供的优先权。
  • ip_len:IP数据包的总长度,最大为65535,字节数。包括IP首部和IP层payload(数据)。
  • ip_id:唯一地标识主机发送的每一份数据报,一个数据报的所有分片具有相同的标识。
  • 3位标识,第一位RF保留,第二位DF是否分片,1不分片(默认),0分片;第三位MF*是否还有分片,1还有片(默认),0无片。
  • ip_off碎片偏移:和上面ID一起用来重组碎片。
  • ip_ttl生存时间:每经过一个路由时减1,直到为0时被抛弃。单位不是秒,而是跳hop。
  • ip_p协议:表示创建这个IP数据包的高层协议,如TCP,UDP,ICMP和IGMP协议。
  • ip_sum首部校验和:提供对首部数据的校验。
  • ip_src,ip_dst:发送者和校验者IP地址。

  • 分片: 把一个数据报为了适合网络传输而分成多个数据报的过程称为分片,被分片后的各个IP数据报可能经过不同的路径到达目标主机。 一个IP数据报在传输过程中可能被分片,也可能不被分片。如果被分片,分片后的IP数据报和原来没有分片的IP数据报结构是相同的,即也是由IP头部和IP数据区两个部分组成: 分片后的IP数据报,数据区是原IP数据报数据区的一个连续部分,头部是原IP数据报头部的复制,但与原来未分片的IP数据报头部有两点主要不同:标志和片偏移

    • 标志:在IP数据报头部有一个叫“标志”的字段,用3位二进制数表示: 不分片DF(Do not Fragment)标志如果被置1,则数据报在传输过程中不能被分片,如网络连通性测试命令ping就可以用-F参数设置为在数据传输时不分片,但这样当数据不能通过MTU较小的网络时,将产生数据不可达的错误。 片未完MF(More Fragment)标志如果被置1,说明该数据报不是分片后的最后一个数据报,最后一个数据报的该位被置0。

    • 片偏移:IP数据报被分片后,各片数据区在原来IP数据区中的位置用13位片偏移来表示。上图中分片1的偏移为0;分片2的偏移为600;分片3的偏移为1200。实际在IP地址中,由于偏移是以8个字节为单位进行计算的,因而在IP数据报中分片1的偏移是0;分片2的偏移是75;分片3的偏移是150。

  • 重组: 当分了片的IP数据报到达最终目标主机时,目标主机对各分片进行组装,恢复成源主机发送时的IP数据报,这个过程叫做IP数据报的重组。 在IP数据报头部中,标识用16位二进制数表示,它唯一地标识主机发送的每一份数据报。在一个数据报被分片时,每个分片仅把数据报“标识”字段的值原样复制一份,所以一个数据报的所有分片具有相同的标识。 目标端主机重组数据报的原理是:

    • (1)根据“标识”字段可以确定收到的分片属于原来哪个IP数据报;

    • (2)根据“标志”字段的“片未完MF”子字段可以确定分片是不是最后一个分片;

    • (3)根据“偏移量”字段可以确定分片在原数据报中的位置。

  • IP数据包的首部长度和数据包长度都是变长的,但总是4字节的整数倍。每个IP数据包长度最大为1500字节(MTU),包首长20~60字节(选项最多40字节),所以数据长度为1480~1440字节。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐