Linux系统编程-网络基础(四)-协议03:数据包封装【以太网(Mac)帧:最大值1500字节称为以太网的MTU(最大传输单元),不包括帧报头长度】
传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:
不同的协议层对数据包有不同的称谓:
- 在传输层叫做段(segment);
- 在网络层叫做数据报(datagram);
- 在链路层叫做帧(frame);
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
一、以太网(Mac)帧格式
以太网的帧格式如下所示:
其中:
- 源地址、目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位(6字节),是在网卡出厂时固化的。可在shell中使用ifconfig命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。
- 类型:协议类型字段有三种值,分别对应:
- IP:0800;
- ARP:0806;
- RARP:8035;
- CRC:帧尾是CRC校验码。
- 数据:以太网帧中的数据长度规定最小46字节,最大1500字节。
- ARP和RARP数据包的长度不够46字节,要在后面补填充位。
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片(fragmentation)。
- ifconfig命令输出中也有“MTU:1500”。
- 注意:MTU这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。