1、ARP 和 RARP 协议
1.1 ARP:任意网络层地址 --> 任意物理地址
网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址机器,所以网络层必须把目标机器的IP地址转换为物理地址,才能使用数据链路层提供的服务。
① 以太网ARP请求报文格式
- 硬件类型字段:表示物理地址的类型,若值为1表示MAC地址。
- 协议类型字段:表示要映射的协议地址类型,若值为
0x800 ,表示IP地址 - 硬件地址长度字段:顾名思义,其值表示所使用的硬件地址的长度,单位是字节。MAC地址的长度为6。
- 协议地址长度字段:顾名思义,其值表示所使用的网络层协议地址的长度,单位也是字节。IPv4地址的长度为4。
- 操作字段:可表示4种ARP报文类型:ARP请求、ARP应答、RARP请求 和 RARP应答。其值分别为1,2,3,4。
- 最后四个字段填写通信双方的以太网地址和IP地址。
- ——发送端填充 除 目的端以太网地址 外的其他三个字段,从而构建ARP请求并发送。
- ——接收端发现请求的目的端IP是自己,接把自己的以太网地址写入,交换两个目的端地址和发送端地址,从而构建ARP应答并返回。
综上,ARP请求/应答报文的长度位28字节,再加上以太网帧头部和尾部的18字节就是46字节。不过,有的实现要求以太网数据部分长度至少为46字节,此时ARP请求/应答报文会增加填充字节,以满足此要求。此时,一个携带ARP请求/应答报文的以太网帧长度为64字节。
1.2 RARP:任意物理地址--> 任意网络层地址
RARP协议仅用于网络上的无盘工作站,他们缺乏存储设备,没法记住自己的IP地址,他们只能用网卡上的物理地址向网络管理者(服务器 或 网络管理软件)查询自己的IP地址。运行RARP服务的网络管理者通常存有该网络上所有机器的物理地址到IP地址的映射。
2、ICMP 协议
2.1 概述
ICMP协议是IP协议的重要补充,主要用于检测网络连接。 ICMP协议并非严格意义上的网络层协议,因为它使用了处于同一层的IP协议提供的服务,而一般来说,上层应该为下层提供服务。
2.2 ICMP报文格式
其报文格式如图所示:
① 8位类型字段
用于区分报文类型,他将ICMP报文分为三大类:
- 差错报文。这类报文主要用来回应网络错误。
- 查询报文。用来查询网络信息,比如
ping 程序就使用ICMP查询报文查看目标是否可达。 - 重定向报文。在5.3节细讲。
这里有对两种报文的具体讲解
② 8位代码字段
ICMP报文使用8位代码字段进一步细分不同的操作。如:重定向报文使用代码值0表示对网络重定向。代码值1表示对主机重定向。
③ 16位校验和字段
ICMP报文使用16位校验和字段对整个报文进行循环冗余校验(CRC),检验内容是否正确。
④ 内容字段
其余部分为内容字段,《Linux高性能服务器编程》的第2章详细讲解了主机重定向报文。
3、SCTP(流控制传输协议)协议
一种相对较新的协议,为了在因特网上传输电话信号而设计的。《Linux高性能服务器编程》里面并没有讲。
4、DNS 工作原理
DNS是一台分布式的域名服务系统。每个DNS服务器上有大量机器名和IP地址的映射,且动态更新。
4.1 DNS 查询 和 应答报文格式
报文格式如下图所示:
- 16位标识字段:用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。
- 16位标志字段:用于协商具体的通信方式和反馈通信状态。16位标志字段的细节如下所示:
-
- ——
QR :查询 / 应答标志。0表示这是个查询报文,1表示这是应答报文。 -
- ——
opcode :定义查询和应答的类型。0为标准查询,1为反向查询(IP到域名),2为请求服务器状态。 -
- ——
AA :授权应答标志。仅由应答报文使用。1标识域名服务器是授权服务器。 -
- ——
TC :截断标志,仅当DNS保温使用UDP服务时使用。UDP数据报有长度限制,过长的NDS报文将被截断。1标识DNS报文超过512字节,并被截断。 -
- ——
RD :递归 / 迭代查询标志。1表示执行递归查询,0表示执行迭代查询。 -
- ——
RA :允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询。 -
-
- ——
rcode :4位返回码,表示应答状态。常用值有0(无错误)和3(域名不存在) - 接下来的4个16位的字段分别指出DNS报文的最后4个字段的资源记录数目。对查询报文而言,一般包含1个查询问题,而应答资源记录数、授权资源记录数和额外资源记录数则为0.应答报文的应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0。
- 下面的内容直接截图了,不敲了。
5、IP 协议
5.1 IP分片
分片可能发生在发送端,也可能发生在中专路由器上,而且可能在传输中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。
IP分片实验:
5.2 IP 路由
IP协议的核心任务是数据报的路由,即,决定发送数据包到目标机器的路径。为了理解IP路由过程,下面先分析IP模块的基本工作流程。
① IP模块工作流程
② 路由机制
要研究IP路由机制,要先了解路由表的内容。可以直接使用route命令查看路由表。
③ 路由表更新
④ IP转发
一般来说,路由器都能转发数据报,而主机只能接收/发送数据报,不能转发。这是因为主机上proc/sys/net/ipv4/ip_forward 内核参数默认被设置为0。可以通过修改它使主机能转发数据报。
5.3 ICMP 重定向
① 什么是重定向?
假设一主机A,一路由器B,他们在一个网络中。 A给另一个网络中的主机发送数据报,数据先被传到了B,但是B给不到那个主机所在的网络。但是他知道发送给哪个路由器可以给到。所以,他就给A发送一个ICMP重定向报文,里面有那个路由器的IP,告诉A,你发到另一个路由器。并且还能更新A的路由表。
重定向过程:
综上,重定向有两个功能:
② ICMP 重定向报文
- ICMP重定向报文的类型值为5.
- 代码字段有4个可选值,用于区分不同的重定向类型,这里只重点讨论主机重定向,其值为1。
接收ICMP重定向报文的主机根据这两个信息就可以断定引起重定向的IP数据包应该使用哪个路由器转发,并且以此来更新路由表。
/proc/sys/net/ipv4/conf/all/send_redirects 内核参数指定是否允许发送ICMP重定向报文,而/proc/sys/net/ipv4/conf/all/accept_redirects 内核参数指定是否允许接收ICMP重定向报文段。一般来说,主机只能接收,路由器只能发送。
5.4 IPv6 头部结构
IPv6头部由40字节的固定头部和可变长的扩展头部组成。
① 固定头部
固定头部如下所示:
② 扩展头部
|