ip 协议在网络中是一个十分重要的角色,属于 TCP 协议的 支撑协议,由于它是传输层以及数据链路的中间角色,使得它对高性能的要求更加强烈
一、ip协议在哪一层工作
(图片来源于极客时间)
ip 协议工作在七层协议中的第三层(网络层)中,主要的功能是 ip寻址,选路,封装打包以及分片
在这一层,我们亲切的将其传输单位称之为数据包,这是一个粒度算是最小的完整包体了,就像手机外壳那样,再拆就不是手机了,而是各类小零件(帧)
在每一层数据块体的描述都是不同的,这是因为在在不同的环境下,数据都需要进行不同的修饰,例如 tcp 报文 主要是进程之间的通讯单位,为了适应这种通信,便加上了 TCP协议 的种种特性,而在网络层,主要是处理在不同主机之间的通信,所以通讯的单位反而是ip数据包,在硬件之间的通讯方式,却是数据链路层的数据帧,但是不管是什么,物质都是由粒子构成,而这些粒子在网络中就是光电信号,所以在物理层,就是网线之间传递的光电信号了。
所以,不管是七层协议还是五层协议,只要跟着数据了解其在每一层的流向以及大致样貌,就可以把这几层的联系打通
二、ip协议层包括哪些协议
我们常常把 网络层 称之为 ip层,搞得大家以为 ip层就只有ip协议,跟很多人以为 tcpdump 只能抓取 tcp 报文一样,都是误区啊,其实在 ip 层,不单单只有 ip协议一个人,他还有很多小弟呢?
- IP协议
- ARP 协议
- RARP 协议
- ICMP 协议
- IGMP 协议
下面我简单介绍一下这些协议的作用,因为每个协议如果都细讲的话都可以独立成一篇文章,本文篇幅有限,只重点说说ip协议,其他协议不做过多的描述
2.1 IP 协议
这个协议大家比较熟悉,主要的分类是 ipv4 和 ipv6 ,前面我们有说,在网络世界中,主机间的网络寻址都是基于ip地址的,局域网的通信则是基于网卡中的 mac 地址,其实这种说法并不是十分的严谨,因为从本质上来说,Mac 地址可以说是独一无二的,类似于我们的指纹,而ip地址更像是我们的身份证号码,首先我们无法组织一份巨大的用户-指纹数据库,注意一下,这里说的是一份,不是多份,因为这种存储方式十分的不好管理,主要是因为我们根据Mac地址无法推测出他的归属地址,只能简单推测出厂商,这样的话,我们就没办法知道这个 mac 地址是在哪个地方被使用的,ip 地址的诞生,更多为了是用户的管理,我们基于 ip 地址,就可以轻松推测出 这个 ip 地址所位于的位置,因为公网 ip 是独一无二的,如果需要上网,就必须至少拥有一个公网 ip (企业内网的出口公网ip 往往是固定的,而内网的 ip 则可以按需分配),而这些 ip 会被基于地域进行分配,例如我把某个网段的 ip地址列表给了广州,那么你需要上网的时候我就分配给你,此时你的ip就会被监控了。所以,如果没有匿名代理,千万别乱来,真的可以顺着网线找到你家的。
2.2 ARP 协议
既然实际上通信的底层标识是 mac 地址,那么就需要一种机制可以将ip地址对应的识别成 mac 地址,这就是 ARP 协议,利用一种广播的机制,在局域网中拿着大声公到处乱喊,谁知道这个ip地址的Mac地址是多少啊?听到的主机就会进行ip的匹配,如果发现是自己在用的ip地址,就会进行回应
2.3 RARP 协议
和 ARP 协议相反,这是基于已经存在的 ARP 表中或者缓存上请求指定 Mac 地址的 ip地址的作用,栗子就是 无盘工作站
2.4 ICMP 协议
这也是个十分重要的协议,简单而高效,主要是用于主机和路由器之间传递消息,属于 ip 协议的子协议 或者说是辅助协议,因为其报文结构简单,而且不传递数据,简单来说就是一个探头兵(让我想起了http报文的 option 请求),我们常用的 ping 命令 和 tracert 实际使用的就是 ICMP 协议,可以用来测试连通性和选路追踪
2.5 IGMP 协议
这个协议大家可能比较陌生,这个是组播协议,用于 ip 主机向任一个直接相邻的路由器报告组员情况,允许Internet主机参加多播,也是IP主机用作向相邻多目路由器报告多目组成员的协议。多目路由器是支持组播的路由器,向本地网络发送IGMP查询。主机通过发送IGMP报告来应答查询。组播路由器负责将组播包转发到所有网络中组播成员
(图片来源于极客时间)
三、ip数据包结构剖析
在了解了 ip 协议的大致位置功能以及家族成员后,我们还需要继续剖析 ip 的协议的结构,进行深入了解,下面是数据包结构图;
数据包主要是分为两个部分,一个是 ip 首部,另一个是数据部分
我们现在主要说明一下每个字段的作用:
-
版本 :
- 1个字节的版本号,目前只有两个取值,ipv4 为 0100 ,ipv6为 0110,说明该 ip 包的版本
-
首部长度:
- 1个字节大小,说明首部的大小,一般来说除了可选字段,固定的长度是 20 字节,该值为 0110 (5 * 4 =20 字节) ,可选字段部分长度不确定,但是最大值为 1111 即,(23+22+21+20) * 4 = (8 + 4 + 2 + 1) * 4 = 15 * 4 = 60 字节,这里注意一下,单位是 4字节,根据算出来的值 去乘这个单位才是最后的结果,网络上有些文章把单位搞成了 8 字节,这点要注意一下
-
区分服务:
- 8bit的服务器类型(TOS)字段,其中前3个bit表示优先权(现在已经忽略该字段),随后的4个bit表示服务类型,按顺序分别表示为最小时延、最大吞吐量、最高可靠性、最小费用四种。这个4个bit中最多只能有1个bit置位,如果全是0则表示一般服务。最有1个bit为未用位,必须置0
-
总长度:
- 总长度就是这个数据包的长度(包括了首部), 2 个字节大小,16 个比特,单位是 字节, 最大长度为 2^16 -1 = 65535 字节,但是 以太网的 MTU 一般是 1500 字节,这是数据链路层的数据包大小限制,所以超过这个大小就得去分片,而 ip 分片成本很高,这是因为在 网络层没有 重发的概念,导致数据包丢失就得从头再来,除去了 20 ip固定头部,也就是说实际上数据部分也只有1480字节大小了,所以这个 65535 大小并没有多大暖用
-
生存时间
- 即常说的 ttl ,我们可以简单理解为跳数,人的生命是有限的,数据包也不例外,跳的够多了,就该跑路了,一般来说这是值可能是64,也可能是128,当ttl 的值达到了这个值,路由器就会把它抛弃掉,免得它祸害人间,成为不死妖怪,最大的数值为 255
-
标识
- 用来标识数据报,占 16 位。IP 协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。其实就分班之后,怎么知道哪些班是哪个年级的标志
-
标志
- 占 3 位。第一位未使用,其值为 0。第二位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。标识和标志都是分片所需要使用的字段,对分片意义重大
-
片位移
- 占 13 位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 位)的整数倍
-
协议
- 协议两个字节,占 8 位,表示这个数据包所使用的协议,不同的协议有着不同的协议号,字段指出此数据报所携带上层数据使用的TCP协议还是UDP协议,以便对等层接收到数据报交给上层相应的协议(TCP或者UDP协议)进行处理
-
首部校验和
- 只校验数据报的首部,不包含数据部分;看IP数据报头部是否被破坏、被篡改和丢失等,这是验证数据包完整性的约束,避免黑客修改 ip 首部,类似于我们的签名算法,基于所传递的参数作为因子计算出 sign,如果中途参数被修改,那么sign 就会验证不通过
-
源地址
- 源 ip 地址,发送机器本身的IP地址,32 位
-
目的地址
- 目的ip地址,即目标地址,32 位
四、下文预告
四元组的概念,大家估计听得也不少了,就是 源ip + 源端口 + 目的ip + 目的端口,这时你可能会问,上面怎么没有端口啊,你仔细想想,端口是用来干嘛的,是系统用来区分进程服务的啊,ip 数据包没必要存储这个啊,端口是传输层干的活,路由器之间的数据包传输,有 ip 就可以找到下一跳了
网络层的知识,上面的内容还是杯水车薪,还有很多其他的概念,例如 ip 地址的分类、子网划分、 nat 技术、子网掩码的使用、路由器自学习和路由表、ipv6 、单播,多播,组播 等相关的概念,这些内容,我会在后续的文章逐渐补充
走过路过,不要错过,欢迎点赞收藏关注一键三连,一起在网络世界探索吧!