1. 数据包封装
传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用 socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下 处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层 数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation),如下图所示
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数 据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目 的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
2. 以太网帧格式
其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网 卡出厂时固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地 址。协议字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码。
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够 46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络 类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路 的MTU了,则需要对数据包进行分片(fragmentation)。ifconfig命令的输出中也有“MTU: 1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。
3. ARP数据包格式
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机 的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的 硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议 就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多 少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示 广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应 答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间 (一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP 请求来获得目的主机的硬件地址。想一想,为什么表项要有过期时间而不是一直有效?
ARP数据报的格式如下所示
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为 以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链 路层网络类型,1为以太网,协议类型指要转换的地址类型&