我是靠谱客的博主 感性冰棍,最近开发中收集的这篇文章主要介绍mac头和ip头部详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

报文封装整体结构

mac帧头定义
/*数据帧定义,头14个字节,尾4个字节*/
typedef struct _MAC_FRAME_HEADER
{
char m_cDstMacAddress[6];
//目的mac地址
char m_cSrcMacAddress[6];
//源mac地址
short m_cType;
     //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp
}__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;

ip头部定义


/*IP头定义,共20个字节*/
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8
ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8
version:4,
ihl:4;
#else
#error
"Please fix <asm/byteorder.h>"
#endif
__u8
tos;
__be16
tot_len;
__be16
id;
__be16
frag_off;
__u8
ttl;
__u8
protocol;
__sum16 check;
__be32
saddr;
__be32
daddr;
/*The options start here. */
};
  •  

    iphdr->version
        版本(4位),目前的协议版本号是4,因此IP有时也称作IPv4。

    iphdr->ihl
        首部长度(4位):首部长度指的是IP层头部占32 bit字的数目(也就是IP层头部包含多少个4字节 -- 32位),包括任何选项。由于它是一个4比特字段,因此首部最长为60个字节。普通IP数据报(没有任何选择项)字段的值是5 <==> 5 * 32 / 8 = 5 * 4 = 20 Bytes

    iphdr->tos
        服务类型字段(8位): 服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TOS子字段分别代表:最小时延、最大吞吐量、最高可靠性和最
    小费用。4 bit中只能设置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务。

    iphdr->tot_len
        总长度字段(16位)是指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道 IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535字节
         总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。

    iphdr->id
        标识字段(16位)唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。

    iphdr->frag_off (16位)
        frag_off域的低13位 -- 分段偏移(Fragment offset)域指明了该分段在当前数据报中的什么位置上。除了一个数据报的最后一个分段以外,其他所有的分段(分片)必须是8字节的倍数。这是8字节是基本分段单位。由于该域有13个位,所以,每个数据报最多有8192个分段。因此,最大的数据报长度为65,536字节,比iphdr->tot_len域还要大1。

    iphdr->frag_off的高3位
        (1) 比特0是保留的,必须为0;
        (2) 比特1是“更多分片”(MF -- More Fragment)标志。除了最后一片外,其他每个组成数据报的片都要把该比特置1。
        (3) 比特2是“不分片”(DF -- DonDon't Fragment)标志,如果将这一比特置1,IP将不对数据报进行分片,这时如果有需要进行分片的数据报到来,会丢弃此数据报并发送一个ICMP差错报文给起始端。
         
       |---|-------------|
       |DM0|   offset    |
       |---|-------------|
       15 1312          0 
           

    iphdr->TTL
     TTL意为“Time to Live”,指定了从发送者到接收者的传输路径上中间站点的最大数目(或跳数)。

    iphdr->protocol
     Protocol标识了IP分组承载的高层协议(传输层)。例如, TCP和UDP协议都有对应的唯一值。

    iphdr->check
     Checksum包含了一个校验和,根据首部和数据的内容计算。如果指定的校验和与接收方计算的值不一致,那么可能发生了传输错误,应该丢弃该分组。
     
    src和dest指定了源和目标的32位IP地址。

     options用于扩展IP选项,在这里不讨论了。

     data保存了分组数据(净荷)。

  •     4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31 bit。这种传输次序称作big endian字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。

最后

以上就是感性冰棍为你收集整理的mac头和ip头部详解的全部内容,希望文章能够帮你解决mac头和ip头部详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部