- IP头部信息,IP数据报的路由和转发。
2.1 IP服务的特点
- 为上层提供无状态、无连接、不可靠的服务。
- 无状态:无上下文关系,不同步传输数据的状态信息,每条数据都是互相独立的。
- 无状态的优点,简单高效。
- 无连接:通信双方不长久维持对方地址信息,每次发送数据都得明确指定对方的IP地址。
- 不可靠:IP协议不保证数据报的准确传达。所以为了保证数据传输的准确,这部分功能需要其他层来负责。
2.2 IPv4头部信息
2.2.1 IPv4头部结构
2.2.2 使用tcpdump观察IPv4头部结构
tcpdump -ntx -i lo
抓取本地回路上的数据包,x
代表二进制输出telnet 127.0.0.1
- 抓取到的数据
IP 127.0.0.1.43866 > 127.0.0.1.23: Flags [S], seq 1519816004, win 65495, options [mss 65495,sackOK,TS val 2307846140 ecr 0,nop,wscale 7], length 0
0x0000: 4510 003c cf1c 4000 4006 6d8d 7f00 0001
0x0010: 7f00 0001 ab5a 0017 5a96 8d44 0000 0000
0x0020: a002 ffd7 fe30 0000 0204 ffd7 0402 080a
0x0030: 898e effc 0000 0000 0103 0307
2.2.3 IP分片
- 当IP数据报的长度超过帧的MTU时,将会被分片传输。
- 分片可能发生在发送端,也可能在中转路由器上。
- 通过
ifconfig
命令可以查看MTU大小为1500字节
inet 地址:192.168.139.131 广播:192.168.139.255 掩码:255.255.255.0
inet6 地址: fe80::3bfc:8600:1107:9530/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:19766 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:8991 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:17383361 (17.3 MB) 发送字节:2082843 (2.0 MB)
sudo tcpdump -ntv -i ens33 icmp
抓取icmp报文- 由于本文使用linux虚拟机,使用windows主机向虚拟机发送报文,
ping xxx.xxx.xxx.xxx -l 1473
- 从id可以知道,这两个报文是同一个IP数据报的分片,第一个的长度是1500,第二个是21,其中头部20字节。
IP (tos 0x0, ttl 64, id 49520, offset 0, flags [+], proto ICMP (1), length 1500)
192.168.139.1 > 192.168.139.131: ICMP echo request, id 1, seq 4, length 1480
IP (tos 0x0, ttl 64, id 49520, offset 1480, flags [none], proto ICMP (1), length 21)
192.168.139.1 > 192.168.139.131: ip-proto-1
2.4 路由
- 路由是IP协议的核心任务,也就是控制IP数据包的传输路径。
- CRC校验:循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
IP模块工作流程
主要功能:
- 检查报文是否错误
- 判断是不是发给本机,不是发给本机需要判断本机是否允许转发。
- 计算下一跳的路由。
2.4.2 路由机制
- 使用
route
命令和netstat
命令查看路由表。 - 步骤:先找目标中的主机IP。无匹配找网关对应IP,无匹配。发往默认地址。
2.4.3 路由表更新
略
2.5 IP转发
- 不是发送给本机的IP数据包酱油数据包转发子模块处理。
- 主机一般不负责转发,只负责接收和发送,路由器能执行数据报的转发.
- 修改主机上的
/proc/sys/net/ipv4/ip_forward
内核参数, 参数默认0, 也就是不可转发, 修改为1就是可转发.
2.6 重定向
- 路由重定向表示将你原来在转发列表中发向一台路由的路径改成另外一条路径,也就相当于让你的数据走另外一条路到服务器。
2.7 IPv6头部结构
2.7.1 IPv6固定头部结构
2.7.1 IPv6扩展头部
略