报文封装整体结构

mac帧头定义

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

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;          //源ipunsigned int m_uiDestIp;          //目的ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;

详细字段,可以参考IPV4数据报头部格式

tcp头部定义

/*TCP头定义,共20个字节*/
typedef struct _TCP_HEADER
{short m_sSourPort;              // 源端口号16bitshort m_sDestPort;              // 目的端口号16bitunsigned int m_uiSequNum;         // 序列号32bitunsigned int m_uiAcknowledgeNum;  // 确认号32bitshort m_sHeaderLenAndFlag;        // 前4位:TCP头长度;中6位:保留;后6位:标志位short m_sWindowSize;            // 窗口大小16bitshort m_sCheckSum;              // 检验和16bitshort 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个字节的时间戳
*/
  • 源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。

  • 顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。

  • 确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。

  • 头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。

  • 标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:

    • URG:紧急指针(urgent pointer)有效。
    • ACK:确认序号有效。
    • PSH:接收方应该尽快将这个报文段交给应用层。
    • RST:重建连接。
    • SYN:发起一个连接。
    • FIN:释放一个连接。
  • 窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。

  • TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。

  • 紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

  • 选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。

udp头部定义

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

wireshark使用前储备:MTU和MSS
wireshark以太网帧的封包格式为:

Frame=Ethernet Header +IP Header +TCP Header +TCP Segment Data

  • Ethernet Header =14 Byte =Dst Physical Address(6 Byte)+ Src - Physical Address(6 Byte)+Type(2 Byte),以太网帧头以下称之为数据帧。
  • IP Header =20 Byte(without options field,不包含可选字段时一般为20个字节),数据在IP层称为Datagram,分片称为Fragment。
  • TCP Header = 20 Byte(without options field,不包含可选字段时一般为20个字节),数据在TCP层称为Stream,分段称为Segment(UDP中称为Message)。
  • 54个字节后为TCP数据负载部分(Data Portion),即应用层用户数据。

Ethernet Header以下的IP数据报最大传输单位MTU(Maximum Transmission Unit,Effect of short board),对于大多数使用以太网的局域网来说,MTU=1500

TCP数据包每次能够传输的最大数据分段MSS,为了达到最佳的传输效能,在建立TCP连接时双方将协商MSS值——双方提供的MSS值中的最小值为这次连接的最大MSS值。MSS往往基于MTU计算出来,通常MSS=MTU-sizeof(IP Header)-sizeof(TCP Header)=1500-20-20=1460

这样,数据经过本地TCP层分段后,交给本地IP层,在本地IP层就不需要分片了。但是在下一跳路由(Next Hop)的邻居路由器上可能发生IP分片!因为路由器的网卡的MTU可能小于需要转发的IP数据报的大小。

这时候,在路由器上可能发生两种情况:

(1)如果源发送端设置了这个IP数据包可以分片(May Fragment,DF=0),路由器将IP数据报分片后转发。

(2)如果源发送端设置了这个IP数据报不可以分片(Don’t Fragment,DF=1),路由器将IP数据报丢弃,并发送ICMP分片错误消息给源发送端。

【网络】报文封装整体结构相关推荐

  1. 【原创】网络报文抓取研究

    1     引言 网络报文抓取是指通过对主机网络设备的探测,实现获取该网络当前传输的所有信息,并根据信息的源主机.目标主机.服务协议和端口等信息简单过滤掉不关心数据,然后提交给上层应用程序进行进一步处 ...

  2. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  3. linux网络报文接收发送浅析_Docker容器网络-基础篇

    Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...

  4. 网络报文的数据格式定义和使用

    文章目录 1 网络报文的数据格式定义和使用 1.1 概述 1.2 服务端实现 1.3 客户端实现 1 网络报文的数据格式定义和使用 1.1 概述 上次我们的代码使用了结构化的网络消息,但是只能发送指定 ...

  5. IOS网络框架的Alamofire5.4高版本网络工具封装

    IOS网络框架的Alamofire5.4高版本网络工具封装 网上一般的封装都是过期的swift写法,或者低版本的Alamofire,照搬照抄只会报错一大堆.令开发者很是头疼.特此公开最新的网络工具封装 ...

  6. MVVM+Retrofit+Kotlin网络框架封装

    上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...

  7. Calico网络报文处理过程

    Calico网络报文处理过程 node的报文处理过程 报文处理过程中使用的标记位: 一共使用了3个标记位,0x7000000对应的标记位 0x1000000: 报文的处理动作,置1表示放行,默认0表示 ...

  8. java报文封装_Java自定义协议报文封装 添加Crc32校验的实例

    刚做完的demo,直接进入主题了,开启两个线程,模拟Socket服务端和客户端通信,将数据封装为指定格式报文发送 代码: import java.io.IOException; import java ...

  9. Pycharm实现645协议解析器(五)DL645协议的报文封装

    (五)Pycharm实现645协议解析器DL645协议的报文封装 目录 (五)Pycharm实现645协议解析器DL645协议的报文封装 帧结构回顾 帧报文的数据封装 (1)前导符和起始符 (2)地址 ...

最新文章

  1. Java HashMap的put操作(Java1.8)
  2. ROS学习(十):ROS URDF-joint
  3. ubuntu20.04运行《大航海家2》
  4. .net core 源码解析-web app是如何启动并接收处理请求
  5. 18款 非常实用 jquery幻灯片图片切换
  6. 7.15 HTMl + CSS 笔记整理(一)
  7. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
  8. java jdk 9 64位下载地址_jdk9.0官方下载|jdk9 64位下载官方正式版 1.9 - 系统天堂
  9. himawari-8卫星叶绿素a产品、_海洋卫星眼中的台风quot;海神quot;
  10. 启发式搜索求解八数码问题(Java实现,八数码小项目已开源)
  11. 【Windows】Windows10 企业版 LTSC/Windows Server 2019如何安装应用商店和UWP应用?
  12. 你不会因为实施了Scrum而变敏捷
  13. 负载均衡(四层) LVS(看完就能去上班)
  14. 简述FPGA的一些优势
  15. Msg 15138 The database principal owns a schema in the database, and cannot be dropped.
  16. 如何写毕业论文(个人心得,不是保姆级)
  17. 复杂背景下的自动驾驶目标检测数据集
  18. outlook邮件标题乱码_如何在Outlook中阅读邮件标题
  19. 如何实现高速卷积?深度学习库使用了这些「黑魔法」
  20. ffmpeg 在线音频上传合成mp4格式视频,可以在网络中直接播放。

热门文章

  1. 一加9pro怎么样 哈苏摄像引领智能手机新潮流
  2. 小米游戏电视ES Pro 90 评测
  3. 【阿不】深入ASP.NET数据绑定(下)—多样的绑定方式
  4. 不知是哪个年代的景泰蓝,请专家鉴定
  5. 用 卡莱特A35播放盒子 在局域网内更新单行文本
  6. 阿里某员工吐槽:工作九年因为换岗被坑,主动离职还是坐等被裁?
  7. 秒杀抢购系统架构分析与实战
  8. 解决非Unicode编码的软件多语言版本在日语、韩语环境下的乱码问题
  9. 对象转map(object转map)
  10. Win11图标闪烁不停怎么办?Win11图标不停闪烁的解决方法