几种网络报文格式

2022-03-31 10:46:20 浏览数 (1)

物理层传输的以太网报文大概长这样

以太网报文的头部长度为6 6 2=14字节,数据部分长度为46-1500字节,不足46的,自动补零

几个常见的类型

  • 0x0800 ETH_P_IP
  • 0x0806 ETH_P_ARP
  • 0x8035 ETH_P_RARP
  • 0x86DD ETH_P_IPV6

ARP报文长这样

ARP报文长度固定为28字节(后面补18个零,凑齐46),再加上以太网的头部,因此完整ARP报文长度是14 28=42

ARP的操作类型大概有这几个

  • 1 ARPOP_REQUEST
  • 2 ARPOP_REPLY
  • 3 ARPOP_REVREQUEST
  • 4 ARPOP_REVREPLY
  • 8 ARPOP_INVREQUEST
  • 9 ARPOP_INVREPLY

IP报文的头部长这样

IP报文头部的长度是5*4=20个字节,再后面就是上层协议的数据了

常见的上层协议有这几个

  • 1 IPPROTO_ICMP
  • 2 IPPROTO_IGMP
  • 6 IPPROTO_TCP
  • 17 IPPROTO_UDP
  • 255 IPPROTO_RAW

而IP报文的总长度,包含头部和其它可能的分片,占16bit,因此最多为2^16-1=65535字节。不过,单包超过1500-20=1480字节时,就自动分片了

UDP报文的头部比较简单,长这样

这个UDP长度表示整个UDP报文的长度,包含头部和其它可能的分片。因此,最小值是头部的这8个字节;最大值是2^16-1=65535。那么,问题来了:使用recvfrom()接收的UDP报文,最多可以包含多少字节的数据?

TCP报文的头部一般长这样

TCP的头部长度占4个bit,因此最大值为15,表示TCP头部最长为60字节。一般情况下,值为5,表示5个字,即5*4=20字节,此时尾部没有选项和填充位。类似的问题:TCP报文,每帧最多包含多少字节的数据?

最后一个,ICMP。ICMP报文比较复杂,常用的是ping命令里使用的两个类型

  • 8 ICMP_ECHO
  • 0 ICMP_ECHOREPLY

ICMP的头部长度为8字节,数据位没有限制,最小为0,长度超过1500-20-8=1472时,IP层会自动分片

整理不易,彩色部分要重点关注

0 人点赞