一、IP协议
参考:rfc791.txt.pdf (rfc-editor.org)
IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议,提供不可靠的、无连接的、尽力而为的数据报传输服务。
IP报文数据头如下
- Version:4bit,4表示IPv4、6表示IPv6
- IHL:4bit,首部长度,以4字节为单位,如果不带Option字段,则为20。
- Type of Service:8 bit,务类型。只有在有QoS差分服务要求时这个字段才起作用。
- Total Length:总长度,16 bit,包括首部和数据之和,单位为字节,最长为65535,当总长度超过数据链路层的最大传输单元MUT时,需要进行分片。
- Identification:标识,主机每发一个报文,都会在该字段进行加1。当数据包进行分片时,每段分片的标识是相同的。
- Flags:标志位,3bit。
标志位:
0 1 2 +-----+------+------+ | 0 | DF | MF | +-----+------+------+
- Bit 0: 保留位,必须为0。
- Bit 1: DF(Don't Fragment),能否分片位,0表示可以分片,1表示不能分片。
- Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。
- Fragment Offset:片偏移,分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。例如第一个分片包的片偏移为0,分段长度为1480,则第二段的偏移为(1480/8),第三片的偏移为((1480+1480)/8)。具体可参考:TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式_ip分片偏移量计算-CSDN博客
- Time to Live:生存时间,8bit。可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。
- Protocol:协议类型,8 bit。
- Header Checksum:16 bit,首部检验和,只检验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法。
- Source Address:32 bit。
- Destination Addres:32 bit。
- Options(可变):选项字段,用来支持排错,测量以及安全等措施。
- Padding(可变):填充字段,全填0。
二、ICMP协议
CMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它是互联网协议族的核心协议之一。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。
虽然 ICMP 是网络层协议,但是它不像 IP 协议和 ARP 协议一样直接传递给数据链路层,而是先封装成 IP 数据包然后再传递给数据链路层。所以在 IP 数据包中如果协议类型字段的值是 1 的话,就表示 IP 数据是 ICMP 报文。
ICMP报文格式如图所示,每一个ICMP消息都将包含引发这条ICMP消息的数据包的完全IP包头,ICMP报文则作为IP数据包的数据部分封装在IP数据包内部。ICMP包头中包含的三个固定字段就是源端设备确定发生错误的类型的主要依据。
- Type字段表示ICMP消息的类型;
- Code字段表示ICMP消息类型细分的子类型;
- Checksum字段表示ICMP报文的校验和。
ICMP报文分类。
Type | Code | 描述 | 查询/差错 |
---|---|---|---|
0-Echo响应 | 0 | Echo响应报文 | 查询 |
3-目的不可达 | 0 | 目标网络不可达报文 | 差错 |
1 | 目标主机不可达报文 | 差错 | |
2 | 目标协议不可达报文 | 差错 | |
3 | 目标端口不可达报文 | 差错 | |
4 | 要求分段并设置DF flag标志报文 | 差错 | |
5 | 源路由失败报文 | 差错 | |
6 | 未知的目标网络报文 | 差错 | |
7 | 未知的目标主机报文 | 差错 | |
8 | 源主机隔离报文 | 差错 | |
9 | 禁止访问的网络报文 | 差错 | |
10 | 禁止访问的主机报文 | 差错 | |
11 | 对特定的TOS网络不可达报文 | 差错 | |
12 | 对特定的TOS主机不可达报文 | 差错 | |
13 | 由于过滤 网络流量被禁止报文 | 差错 | |
14 | 主机越权报文 | 差错 | |
15 | 优先权终止生效报文 | 差错 | |
5-重定向 | 0 | 重定向网络报文 | 差错 |
1 | 重定向主机报文 | 差错 | |
2 | 基于TOS的网络重定向报文 | 差错 | |
3 | 基于TOS的主机重定向报文 | 差错 | |
8-Echo请求 | 0 | Echo请求报文 | 查询 |
9-路由器通告 | 0 | 路由通告报文 | 查询 |
10-路由器请求 | 0 | 路由器的发现/选择/请求报文 | 查询 |
11-ICMP超时 | 0 | TTL超时报文 | 差错 |
1 | 分片重组超时报文 | 差错 | |
12-参数问题 | 0 | IP报首部参数错误报文 | 差错 |
1 | 丢失必要选项报文 | 差错 | |
2 | 不支持的长度报文 | 差错 | |
13-时间戳请求 | 0 | 时间戳请求报文 | 查询 |
14-时间戳应答 | 0 | 时间戳应答报文 | 查询 |
15-信息请求 | 0 | 信息请求报文 | 查询 |
16-信息应答 | 0 | 信息应答报文 | 查询 |
ICMP最常见的场景就是使用Ping去查询目的地址是否可以到达
Ping
Ping程序是最常见的用于检测IPv4和IPv6网络设备是否可达的调试手段,它使用ICMP的echo信息来确定:
- 远程设备是否可达;
- 与远程主机通信的来回旅程(round-trip)的延迟;
- 报文包的丢失情况
三、ARP 协议
ARP(Address Resolution Protocol,地址解析协议)是用来将IP地址解析为MAC地址的协议。主机或三层网络设备上会维护一张ARP表,用于存储IP地址和MAC地址的映射关系,一般ARP表项包括动态ARP表项和静态ARP表项。
为什么需要ARP?
在局域网中,当主机或其它三层网络设备有数据要发送给另一台主机或三层网络设备时,需要知道对方的网络层地址(即IP地址)。但是仅有IP地址是不够的,因为IP报文必须封装成帧才能通过物理网络发送,因此发送方还需要知道接收方的物理地址(即MAC地址),这就需要一个通过IP地址获取物理地址的协议,以完成从IP地址到MAC地址的映射。地址解析协议ARP即可实现将IP地址解析为MAC地址。
ARP 工作的基本流程
ARP 工作流程分为两个阶段,一个是 ARP 请求过程,另一个是 ARP 响应过程。
工作流程如下所示。
在上面图片中,主机 A 的 IP 地址为 192.168.1.1,主机 B 的 IP 地址为 192.168.1.2。
主机 A 与主机 B 进行通信,需要获取其 MAC 地址,基本流程如下:
- 主机 A 以广播形式向网络中所有主机发送 ARP 请求,请求包中包含了目标 IP 地址 192.168.1.2。
- 主机 B 接收到请求,发现自己就是主机 A 要找的主机,返回响应,响应包中包含自己的 MAC 地址
ARP报文格式
ARP请求和应答报文格式
报文的长度是42字节。前14字节的内容表示以太网首部,后28字节的内容表示ARP请求或应答报文的内容。报文中相关字段的解释如下图所示。