网络协议基础学习(六):网络层

一、网络层

  • 网络层数据包(IP数据包, Packet)由首部、数据2部分组成
    • 数据: 很多时候是由传输层传递下来的数据段

image.png

二、网络层首部

1、版本 (Version)

  • 版本: 占4
    • 0b0100: IPv4
    • 0b0110: IPv6
  • 使用终端给百度发数据包
ping baidu.com
复制代码
  • 使用Wireshark抓取百度返回的数据

image.png

  • 点击 Intenet Protocol , 可以看到版本 0100 .... = Version: 4, 这说明百度使用的是IPv4网络

2、首部长度 (Header Length)

  • 首部长度: 占4位, 二进制乘以4才是最终长度, 表示整个首部的长度, 包括可选部分
    • 0b0101: 20 (最小值, 固定部分)
    • 0b1111: 60 (最大值, 固定部分20, 可变部分40)

image.png

  • 查看刚才抓到的数据, 可以看到 .... 0101 = Header Length: 20 bytes (5), 0101的十进制值是5, 乘以4就是20

3、区分服务 (Differentiated Services Field)

  • 区分服务: 占8位, 可以用于提高网络的服务质量

image.png

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

image.png

4、总长度 (Total Length)

  • 总长度: 占16
    首部 + 数据的长度之和, 最大值是 65535

image.png

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

image.png

5、标识 (Identification)

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

image.png

6、标志 (Flags)

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

image.png

  • 上图中的标志数据
    • 10是保留位
    • 20标识允许分片
    • 30标识最后一片

7、ping - 几个用法

(1) ping -h
  • ping -h: 查看 ping 的用法

image.png

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

image.png

  • 可以看到
    • IP数据包的总长度是828字节
    • IP首部20字节
    • ICMP首部8字节
    • 时间8字节 + Data数据792字节, 共800字节
  • 其中时间+Data800字节, 就是指定的数据包大小

8、片偏移(Fragment Offset)

  • 片偏移: 占13位
    • 片偏移乘以8: 字节偏移
    • 每一片的长度一定是8的整数倍

image.png

(1) 实践片偏移
  • 指定传送的数据包大小为 4000
ping 163.com -s 4000
复制代码

image.png

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

image.png

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

image.png

  • 点击标志Flags
    • 10是保留位
    • 20表示允许分片
    • 31表示不是最后一片

image.png

  • 点开第二片数据, 片偏移是1480, 接着第一片Data数据之后的1480字节数据
  • 点击标志Flags
    • 10是保留位
    • 20表示允许分片
    • 31表示不是最后一片

image.png

  • 点开第三片数据, 片偏移2960, 接着第二片Data数据之后的1040字节数据
  • 点击标志Flags
    • 10是保留位
    • 20表示允许分片
    • 30表示最后一片

image.png

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

image.png

9、生存时间 (Time to Live, TTL)

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

image.png

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

image.png

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

image.png

10、协议 (Protocol)

  • 协议: 占8
    • 表明所封装的数据是使用了什么协议

image.png

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

image.png

11、首部检验和 (Header Checksum)

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

image.png