网络层使用IP地址寻址一台机器,数据链路层使用物理地址寻址一台机器。因此网络层将目标机器的IP地址转化成物理地址,从而使用数据链路层提供服务。
应用层协议或程序可能会跳过传输层,直接使用网络层提供的服务。
应用程序数据再发送到物理网络上之前,沿着协议栈从上往下依次传递。每层协议都在上层数据的基础上加上自己的头部、尾部信息,从而实现该层的功能,这一过程称为封装。
TCP封装后的数据称为TCP报文段,包含头部信息和内核缓冲区;
UDP封装后的数据称为UDP数据报;
IP封装后的数据称为IP数据包,包含头部信息和数据部分;
经过数据链路层封装的数据为帧。
当帧达到目的主机后,沿着协议栈自底向上依次传递,各层协议依次处理本层负责的头部数据,获得所需信息,将处理后的帧交给目标应用程序,此过程称为分用。
略
ARP协议实现网络层到物理层的转换,其工作原理为:主机向所在的网络广播一个ARP请求,其包含目标机器的网络地址。此网络上其他机器都会收到这个请求,只有被请求的目标机器会回答一个ARP应答,其包含自己的物理地址。
以太网ARP请求/应答报文格式:
ARP请求/应答报文的长度为28字节,以太网帧头部和尾部为18字节,以太网ARP请求/应答帧总长度为46字节,也有64字节等。
通常ARP维护一个高速缓存,其中包含经常访问(或最近访问)的IP地址到物理地址的映射,可以避免重复的ARP请求,提高发送数据包的速度。
Linux下可以使用 arp 命令查看和修改ARP高速缓存。
由tcpdump抓取的数据包本质上是以太网帧,可通过该命令的选项控制帧的过滤与显示。
ARP通信过程:
DNS是一套分布式域名服务系统,每个DNS服务器上都存放大量的机器名和IP地址的映射,且动态更新。其查询和应答报文格式如下:
Linux使用 /etc/resolv.conf 文件存放DNS服务器的IP地址,其包含首选DNS服务器地址和备选DNS服务器地址。
Linux下常用访问DNS服务器对的客户端程序时host,其查询方式如:
$ host -t www.baidu.com
host命令使用DNS协议和DNS服务器通信,-t代表使用何种查询类型。
$ sudo tcpdump -i eth0 -nt -s 500 domain $ host -t A www.baidu.com
数据链路层、网络层、传输层协议在内核中实现,操作系统需要实现一组系统调用,使得应用程序可以访问这些协议提供的服务。实现这组系统调用的API主要有socket和XTI。
由socket定时的API主要有两点功能: