第一章 TCP/IP协议详解
1.1 TCP/IP 协议族体系结构及其主要协议
1.1.1 数据链路层(对接物理传输媒介)
- ARP协议(地址解析协议)
- RARP协议(逆地址解析协议)
网络层使用IP地址寻址一台机器,数据链路层使用物理地址寻址一台机器。因此网络层将目标机器的IP地址转化成物理地址,从而使用数据链路层提供服务。
1.1.2 网络层(数据包的选路与转发)
- IP协议(因特网协议):根据数据包的目的IP地址决定如何传递数据;
- ICMP协议(因特网控制报文协议):IP协议补充,用于检测网络连接,其报文格式如下:
| - - - - - - - - | - - - - - - - - | - - - - - - - - - - - - - - - - |
8位类型 8位代码 16位校验和
8位类型:用于区分报文类型(差错报文、查询报文);
8位代码:进一步细分不同条件;
16位校验和:进行循环冗余校验。
ICMP报文并非严格意义的网络层协议,其使用IP协议提供的服务。
1.1.3 传输层(提供端到端的通信)
- TCP协议(传输控制协议):提供可靠的、面向连接的、基于流的服务,使用超时重传、数据确认等方式确保可靠性;
- UDP协议(用户数据报协议):提供不可靠、无连接、基于数据包的服务;
- SCTP协议(流传输控制协议):为因特网上传输电话信号设计。
1.1.4 应用层(负责处理应用程序的逻辑)
- ping(应用程序,非协议):利用ICMP检测网络连接、调试网络环境;
- telnet(远程登录协议):在本地完成远程任务;
- OSPF(开放最短路径优先):动态路由更新协议,用于路由器之间的通信;
- DNS(域名服务):提供机器域名到IP地址的转换;
应用层协议或程序可能会跳过传输层,直接使用网络层提供的服务。
1.2 封装
应用程序数据再发送到物理网络上之前,沿着协议栈从上往下依次传递。每层协议都在上层数据的基础上加上自己的头部、尾部信息,从而实现该层的功能,这一过程称为封装。
-
TCP封装后的数据称为TCP报文段,包含头部信息和内核缓冲区;
-
UDP封装后的数据称为UDP数据报;
-
IP封装后的数据称为IP数据包,包含头部信息和数据部分;
-
经过数据链路层封装的数据为帧。
1.3 分用
当帧达到目的主机后,沿着协议栈自底向上依次传递,各层协议依次处理本层负责的头部数据,获得所需信息,将处理后的帧交给目标应用程序,此过程称为分用。
1.4 测试网络
略
1.5 ARP协议工作原理
ARP协议实现网络层到物理层的转换,其工作原理为:主机向所在的网络广播一个ARP请求,其包含目标机器的网络地址。此网络上其他机器都会收到这个请求,只有被请求的目标机器会回答一个ARP应答,其包含自己的物理地址。
1.5.1 以太网APR请求/应答报文详解
以太网ARP请求/应答报文格式:
- 硬件类型:定义物理地址类型,值为1表示MAC地址;
- 协议类型:表示要映射的协议地址类型,值为0x800表示IP地址;
- 硬件地址长度:单位是字节,MAC地址为6,IPv4地址为4;
- 操作字段:指出4种操作类型:ARP请求(1)、ARP应答(2)、RARP请求(3)、RARP应答(4);
- 最后四个字段:通信双方的以太网地址和IP地址。
ARP请求/应答报文的长度为28字节,以太网帧头部和尾部为18字节,以太网ARP请求/应答帧总长度为46字节,也有64字节等。
1.5.2 ARP高速缓存的查看和修改
通常ARP维护一个高速缓存,其中包含经常访问(或最近访问)的IP地址到物理地址的映射,可以避免重复的ARP请求,提高发送数据包的速度。
Linux下可以使用 arp 命令查看和修改ARP高速缓存。
1.5.3 使用tcpdump观察ARP通信过程
由tcpdump抓取的数据包本质上是以太网帧,可通过该命令的选项控制帧的过滤与显示。
ARP通信过程:
1.6 DNS工作原理
1.6.1 DNS查询和应答报文详解
DNS是一套分布式域名服务系统,每个DNS服务器上都存放大量的机器名和IP地址的映射,且动态更新。其查询和应答报文格式如下:
1.6.2 Linux下访问DSP服务
Linux使用 /etc/resolv.conf 文件存放DNS服务器的IP地址,其包含首选DNS服务器地址和备选DNS服务器地址。
Linux下常用访问DNS服务器对的客户端程序时host,其查询方式如:
$ host -t www.baidu.com
host命令使用DNS协议和DNS服务器通信,-t代表使用何种查询类型。
1.6.3 使用tcpdump观察DNS通信过程
$ sudo tcpdump -i eth0 -nt -s 500 domain
$ host -t A www.baidu.com
1.7 socket和TCP/IP协议族的关系
数据链路层、网络层、传输层协议在内核中实现,操作系统需要实现一组系统调用,使得应用程序可以访问这些协议提供的服务。实现这组系统调用的API主要有socket和XTI。
由socket定时的API主要有两点功能:
- 将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据,或是从内核接TCP/UDP收缓冲区复制数据到用户缓冲区,以读取数据。
- 应用程序通过他们来修改内核中各层协议的某些头部信息或其他数据结构,从而更加精细的控制底层通信行为。