IP实验二:IP分片

2015年11月29日

一、实验目的

通过简单实验来了解IP分片

二、简介

  • IP分片
    • IP层接收到上层数据报后,会将数据报长度与物理层MTU进行比较,决定是否分片
    • 任何运输层的首部只会出现在第一个分片,片偏移的单位为8 Bytes(因为IP长度为16 bit ,二片偏移为13 bit,所以需要乘以8)

三、实验环境

表1 IP实验环境
机器 IP地址 网卡名称 链路层/MTU
CentOS V1 192.168.1.1/24 eth1 以太网/1500
CentOS V2 192.168.1.2/24 eth1 以太网/1500

四、实验步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 下载stevens大神的源代码
wget ftp://ftp.kanga.nu/Devel/Docs/stevens.tcpipiv1.tar.Z

# 解压
tar zxvf stevens.tcpipiv1.tar.Z
cd tcpipi/sock

# 修改strerror.c,只剩下两行
vim strerror.c
#include<string.h>
char *strerror(int errno);

# 修改Makefile
vim Makefile
CFLAGS  = -Wall                                # 修改
# LIBS  = /usr/ucblib/libucb.a -lsocket -lnsl  # 注释

# 第一次编译,产生警告
make

# (可选)依据警告,修改下面的文件,将相应变量的定义由int修改为socklen_t
buffers.c
cliopen.c
servopen.c
sockopts.c

# (可选)重新编译
rm -rf *.o sock
make

# 参数说明
-i    "source" data to socket, "sink" data from socket (w/-s)
-u    use UDP instead of TCP
-v    verbose
-w n  #bytes per write() for "source" client (default 1024)
-n n  #buffers to write for "source" client (default 1024)
  • 在CentOS V1上监听网络内容
1
tcpdump  -i eth1 -vxnn -s 100 not arp and not icmp and host 192.168.1.1 and 192.168.1.2
  • 从CentOS V1 向CentOS V2发送一份数据长度(不包括首部)为1473的UDP数据报
1
2
3
4
5
6
# 命令
./sock -u -v -n1 -i -w1473 192.168.1.2 discard

# 结果
connected on 192.168.1.1.59755 to 192.168.1.2.9
wrote 1473 bytes
  • 在CentOS V1上监听到的网络内容
1
2
3
4
5
6
7
8
9
10
11
12
04:32:49.274065 IP (tos 0x0, ttl 64, id 8340, offset 0, flags [+], proto UDP (17), length 1500)
    192.168.1.1.59755 > 192.168.1.2.9: UDP, length 1473
	0x0000:  4500 05dc 2094 2000 4011 b129 c0a8 0101
	0x0010:  c0a8 0102 e96b 0009 05c9 5ed1 2021 2223
	0x0020:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
	0x0030:  3435 3637 3839 3a3b 3c3d 3e3f 4041 4243
	0x0040:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0050:  5455 5657 5859
04:32:49.274134 IP (tos 0x0, ttl 64, id 8340, offset 1480, flags [none], proto UDP (17), length 21)
    192.168.1.1 > 192.168.1.2: ip-proto-17
	0x0000:  4500 0015 2094 00b9 4011 d637 c0a8 0101
	0x0010:  c0a8 0102 4f

五、实验结果分析

  • 由监听得到的数据报易得
关键字段分析
标识 标志 片偏移 UDP长度 IP长度
第一个数据报
0x2094 0x1 0x0 0x05c9 0x05dc
8340 还有更多分片 0 1481(含UDP首部) 1500(MTU)
第二个数据报
0x2094 0x0 0xb9 0x0015
8340 没有更多分片 185 * 8 = 1480 21
  • 分析
    • 发送1473 Bytes的UDP数据,加上8 Bytes的UDP首部和20 Bytes的IP首部,为1501 Bytes,超过了链路层的MTU(1500),应该进行分片
    • 第二个IP数据报到链路层之前还需要填充内容(一般是0)到46 Bytes(以太网的物理特性)
    • 被分片的数据报,标识相同,接收端依据接收到数据报的标识、标志、片偏移来组装完整的数据报

六、参考内容