物理层传输的以太网报文大概长这样
以太网报文的头部长度为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层会自动分片
整理不易,彩色部分要重点关注