zoukankan      html  css  js  c++  java
  • TCP/IP包格式详解

    文章参考地址:http://blog.chinaunix.net/uid-20698826-id-4700710.html http://blog.csdn.net/mrwangwang/article/details/8537775

    一、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;
    
     
    
    typedef struct _MAC_FRAME_TAIL
     {
      unsigned int m_sCheckSum;    //数据帧尾校验和
     }__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL;

    二、IP头结构的定义

    /*IP头定义,共20个字节*/
     typedef struct _IP_HEADER 
     {
      char m_cVersionAndHeaderLen;       //版本信息(前4位),头长度(后4位)
      char m_cTypeOfService;            // 服务类型8位
      short m_sTotalLenOfPacket;        //数据包长度
      short m_sPacketID;              //数据包标识
      short m_sSliceinfo;               //分片使用
      char m_cTTL;                  //存活时间
      char m_cTypeOfProtocol;          //协议类型
      short m_sCheckSum;             //校验和
      unsigned int m_uiSourIp;          //源ip
      unsigned int m_uiDestIp;          //目的ip
     } __attribute__((packed))IP_HEADER, *PIP_HEADER ;

    三、tcp头结构定义

    *TCP头定义,共20个字节*/
     typedef struct _TCP_HEADER 
     {
      short m_sSourPort;              // 源端口号16bit
      short m_sDestPort;              // 目的端口号16bit
      unsigned int m_uiSequNum;         // 序列号32bit
      unsigned int m_uiAcknowledgeNum;  // 确认号32bit
      short m_sHeaderLenAndFlag;        // 前4位:TCP头长度;中6位:保留;后6位:标志位
      short m_sWindowSize;            // 窗口大小16bit
      short m_sCheckSum;              // 检验和16bit
      short m_surgentPointer;           // 紧急数据偏移量16bit
     }__attribute__((packed))TCP_HEADER, *PTCP_HEADER;
    /*TCP头中的选项定义
    
    kind(8bit)+Length(8bit,整个选项的长度,包含前两部分)+内容(如果有的话)
    
    KIND = 1表示 无操作NOP,无后面的部分
    
      2表示 maximum segment   后面的LENGTH就是maximum segment选项的长度(以byte为单位,1+1+内容部分长度)
    
      3表示 windows scale     后面的LENGTH就是 windows scale选项的长度(以byte为单位,1+1+内容部分长度)
    
      4表示 SACK permitted    LENGTH为2,没有内容部分
    
      5表示这是一个SACK包     LENGTH为2,没有内容部分
    
      8表示时间戳,LENGTH为10,含8个字节的时间戳
     */
    typedef struct _TCP_OPTIONS
     {
      char m_ckind;
      char m_cLength;
      char m_cContext[32];
     }__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;

    四、UDP头结构的定义

    UDP在IP报文中的位置如图所示

    image

    UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:

    image

    *UDP头定义,共8个字节*/
    
    typedef struct _UDP_HEADER 
    {
     unsigned short m_usSourPort;       // 源端口号16bit
     unsigned short m_usDestPort;       // 目的端口号16bit
     unsigned short m_usLength;        // 数据包长度16bit
     unsigned short m_usCheckSum;      // 校验和16bit
    }__attribute__((packed))UDP_HEADER, *PUDP_HEADER;

    五、TCP/IP报文格式

     

    图中括号中的数字代表的是当前域所占的空间大小,单位是bit位。

    黄色的是数据链路层的头部,一共14字节

    绿色的部分是IP头部,一般是20字节

    紫色部分是TCP头部,一般是20字节

  • 相关阅读:
    网络流24题
    Preliminaries for Benelux Algorithm Programming Contest 2019
    2019 ICPC Asia Xuzhou Regional
    2019 ICPC Asia Nanjing Regional
    后缀自动机学习
    2018 ACM-ICPC 焦作区域赛 E Resistors in Parallel
    2019 ICPC 上海区域赛总结
    LA 3641 Leonardo的笔记本 & UVA 11077 排列统计
    UVA 10294 项链与手镯 (置换)
    CF 1288 E. Messenger Simulator
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/5778949.html
Copyright © 2011-2022 走看看