网络协议基础学习(六): 网络层
一、网络层
- 网络层数据包(IP数据包, Packet)由首部、数据2部分组成

二、网络层首部
1、版本 (Version)
- 版本: 占
4位
- 0b0100: IPv4
- 0b0110: IPv6
- 使用终端给百度发数据包
ping baidu.com

- 点击 Intenet Protocol , 可以看到版本
0100 .... = Version: 4, 这说明百度使用的是IPv4网络
2、首部长度 (Header Length)
- 首部长度: 占
4位, 二进制乘以4才是最终长度, 表示整个首部的长度, 包括可选部分
- 0b0101: 20 (最小值, 固定部分)
- 0b1111: 60 (最大值, 固定部分20, 可变部分40)

- 查看刚才抓到的数据, 可以看到
.... 0101 = Header Length: 20 bytes (5), 0101的十进制值是5, 乘以4就是20
3、区分服务 (Differentiated Services Field)

- 如上图所示, 当三台计算机都发送网络到右边的局域网时, 如果同时到达路由器, 那么路由器就会根据
区分服务进行优先级判断, 优先级高的优先通过
- 上面抓取的数据包中, 区分服务的值为
0, 说明是一个普通的网络, 不会被优先处理

4、总长度 (Total Length)
- 总长度: 占
16位
首部 + 数据的长度之和, 最大值是 65535

- 由于帧的数据不能超过
1500字节, 所以过大的IP数据包, 需要分成片(fragments)传输给数据链路层
- 刚抓取的数据包, 总长度为84字节, 首部20字节, 数据64字节

5、标识 (Identification)
- 标识: 占
16位
- 数据包的ID, 当数据包过大进行分片时, 同一个数据包的所有片的标识都是一样的
- 有一个计数器专门管理数据包的ID, 每发出一个数据包, ID就加1

6、标志 (Flags)
- 标志: 占
3位
- 第
1位(Reserved Bit): 保留
- 第
2位(Don't Fragment): 1代表不允许分片, 0代表允许分片
- 第
3位(More Fragments): 1代表不是最后一片, 0代表是最后一片

- 上图中的标志数据
- 第
1个0是保留位
- 第
2个0标识允许分片
- 第
3个0标识最后一片
7、ping - 几个用法
(1) ping -h

(2) ping ip地址 -s 数据包
ping ip地址 -s 数据包: 发送指定大小的数据包
ping baidu.com -s 800

- 可以看到
- IP数据包的总长度是
828字节
- IP首部
20字节
- ICMP首部
8字节
- 时间
8字节 + Data数据792字节, 共800字节
- 其中
时间+Data的800字节, 就是指定的数据包大小
8、片偏移(Fragment Offset)
- 片偏移: 占13位
- 片偏移乘以8: 字节偏移
- 每一片的长度一定是8的整数倍

(1) 实践片偏移
ping 163.com -s 4000

- 因为数据链路层接收到网络层的数据, 最大是
1500字节, 所以会进行分片传输
- 可以在
Wireshark中看到一个数据包, 分为了三片发送

- 点击第一片数据, 可以看到总大小是1500
- IP首部: 20个字节
- Data: 1480个字节
- 片偏移是
0

- 点击标志
Flags
- 第
1个0是保留位
- 第
2个0表示允许分片
- 第
3个1表示不是最后一片

- 点开第二片数据, 片偏移是
1480, 接着第一片Data数据之后的1480字节数据
- 点击标志
Flags
- 第
1个0是保留位
- 第
2个0表示允许分片
- 第
3个1表示不是最后一片

- 点开第三片数据, 片偏移
2960, 接着第二片Data数据之后的1040字节数据
- 点击标志
Flags
- 第
1个0是保留位
- 第
2个0表示允许分片
- 第
3个0表示最后一片

- 这三片实际传输数据的总大小是
1480 + 1480 + 1040 = 4000, 即发送的4000个字节

9、生存时间 (Time to Live, TTL)
- 生存空间: 占
8位
- 每个路由器在转发之前将会TTL减1, 一旦发现TTL减为0, 路由器会返回错误报告
- 观察使用ping命令后的TTL, 能够推测出对方的操作系统, 中间经过了多少个路由器

- 生存时间可以解决: 因路由器链接错误, 导致信息循环发送的问题
- 例如下图, 计算机0发出的消息, 在路由器0和路由器1之间不停地循环, 即不停地经过
3和4两条线路, 此时如果没有生存时间的限制, 信息就会一直占用资源, 无法释放
- 存在生存时间, 当TTL减为0时, 路由器会停止发送信息, 并将错误信息返回给计算机0

- 可以使用
Wireshark抓取数据, 查看网络层首部的TTL

10、协议 (Protocol)

- 可以使用
Wireshark抓取数据, 查看网络层首部的协议

11、首部检验和 (Header Checksum)
- 首部检验和: 占
16位
- 一开始首部检验和全是0, 等其它首部信息填充后, 会根据一定的算法计算出一个数据, 然后填充到首部位置
- 可以使用
Wireshark抓取数据, 查看网络层首部的协议
