文章目录
- 概要&序論
- 一、如何理解IP协议
- 二、IP的核心作用与构成
- 2.1 IP的核心作用与定位
- 2.1.1 主机到主机与进程到进程
- 2.1.2 通过生活比喻理解网络分层
- 2.2 IP地址的构成与寻址
- 2.2.1 IP地址的组成
- 2.2.2 路由的本质与关键设备
- 三、IP协议的核心构成与工作机制
- 3.1 IP协议的版本与头部结构
- 3.1.1 IPv4头部字段布局
- 3.1.2 头部字段的解析与计算
- 3.2 服务类型与路由选择
- 3.2.1 8位服务类型(TOS)
- 3.2.2 服务类型的实际应用
- 3.3 数据包的内核表示
- 3.3.1 struct iphdr 结构体
- 3.3.2 sk_buff 结构
- 3.4 网络环路与TTL机制
- 3.4.1 网络环形转发问题
- 3.4.2 TTL的工作原理
- 3.5 数据链路层干扰与首部校验和
- 3.5.1 电磁干扰与比特翻转——16位首部校验和的由来
概要&序論
Hello大家好,我是此方。终于把传输层协议讲完了!按照从上到下的讲解顺序,我们来到了倒数第三层——网络层。
这篇文章会从IP地址构成与路由寻址出发,详解IPv4头部结构、服务类型(TOS)及路由选择。进而结合Linux内核sk_buff结构,探讨数据包的内核表示。最后重点解析TTL机制如何防止网络环路,以及首部校验和如何应对链路层干扰
一、如何理解IP协议
IP协议:提供一种能力,把数据报从A主机,跨网络,送到B主机。
所谓“能力”,在字典意义上可以解释为:有非常大的概率,能做到某件事情。但是有能力不代表这件事情一定可以办成!
我们来讲述一个不恰当的故事:张三品学兼优。张三的爸爸是市教育厅主任,现在有一个保送名额。张三爸爸想要让张三拿到,于是组织考试,数学考到150分可以保送。张三有考取150分的能力,但是不能保证一定能考到150分,那么考上了,皆大欢喜,考不上怎么办呢?张三爸爸就会重新组织考试,直到张三考到了150分,前面所有的考试作废,以此为准。
目的:将报文100%发送给对方。
张三爸爸提供策略 => 传输层协议TCP;张三提供能力 => 网络层协议IP。
把数据100%可靠的从主机A发送到主机B(这也是网络要解决的核心问题与它的核心功能)。
二、IP的核心作用与构成
2.1 IP的核心作用与定位
2.1.1 主机到主机与进程到进程
IP协议解决的是“主机到主机”的通信问题。要在茫茫网络中找到并定位一台特定的机器,就必须给每台主机分配一个独一无二的IP地址(这里我们暂且只讨论公网IP),它就像现实中的门牌号一样,用于唯一标识这台主机。而当数据包跨越网络到达目标主机后,还要面临“交给哪个程序处理”的问题——这正是传输层(TCP/UDP)要解决的“进程到进程”通信问题。为了区分同一台主机上的不同进程,传输层引入了端口号,确保数据能准确送达对应的应用程序。
2.1.2 通过生活比喻理解网络分层
我问你去旅游,去长城是直接到长城还是先到北京再到长城?去兵马俑是直接去兵马俑还是先去西安再到兵马俑?
2.2 IP地址的构成与寻址
2.2.1 IP地址的组成
IP = 目标网络 + 目标主机。例如128.18.45.165,其中前段表示子网,后段表示主机。
2.2.2 路由的本质与关键设备
路由的本质理解:路上的时候,本质是在进行从一个子网,进入另一个子网。
主机:配有IP地址,也要进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;工作在网络层。当代路由器,已经是一台小型计算机了!是可以工作在应用层的!
节点:主机和路由器的统称。
三、IP协议的核心构成与工作机制
3.1 IP协议的版本与头部结构
3.1.1 IPv4头部字段布局
有IPv4和IPv6两个版本,两个版本不互相兼容。IPv4头部包含以下字段:
3.1.2 头部字段的解析与计算
我们现在明白了,为什么我们当初写代码要把点分十进制转化成4字节IP传递给下层。四位首部长度还是老样子 [20,60];16位总长度-四位首部长度=数据长度;四位首部长度-20字节=选项长度。两者联合解决了解包问题。
3.2 服务类型与路由选择
3.2.1 8位服务类型(TOS)
8位服务类型(Type Of Service)由3位优先权字段(已经弃用)、4位TOS字段和1位保留字段(必须置0)组成。4位TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
3.2.2 服务类型的实际应用
如何理解8位服务类型?比如,我们有这样一个报文发送给路由器,我们将8位服务类型中的最小延迟被置为1。路由器会根据报文中的八位服务类型选择要走哪条路。
3.3 数据包的内核表示
3.3.1 struct iphdr 结构体
在内核代码中,IP头部通过struct iphdr 结构体表示,代码中处理了大小端问题。
3.3.2 sk_buff 结构
在 sk_buff 结构中,有 head、data、tail、end 指针。通过向上指向IP报头的位置,也就是sizeof(iphdr),然后强制类型转换为iphdr*类型,填入数据。数据区包含头空间、二层帧头、IP协议头、TCP协议头、应用层数据、尾空间。
3.4 网络环路与TTL机制
3.4.1 网络环形转发问题
我们全世界的网络系统非常无比复杂。一定会有因为软件编写bug,路由表转发策略问题,硬件架设存在问题,我们的报文会在网络中的某几个路由器中引发环形转发的问题。如图,这个报文不断的在三个路由器之间循环转发,同时有集线器帮助放大信号,让这个循环无休止的进行下去。这样的报文越来越多,就会占用网络资源,导致全球网络设备周期性大范围重启。
3.4.2 TTL的工作原理
如何理解TTL?我们通过 ping 命令可以看到,ttl=49。TTL就是一个计数器,表示报文的最大报文生存时间,转发一定次数后报文自动丢弃。
3.5 数据链路层干扰与首部校验和
3.5.1 电磁干扰与比特翻转——16位首部校验和的由来
我们的计算机硬件在布线的时候,几根线可能会比较近,于是会引发一个问题,我们初中时学过:当大量数据传输的时候,电流量大,电流会产生磁场与周围的布线相互影响。引发问题:部分比特翻转,信号出现个别错误——于是我们就需要16位首部校验和。