「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》
IP协议规定,网络上的所有设备都必须有一个「唯一」的IP地址(同一设备可以有多个不同的IP)
cmd 执行 ipconfig
,可以查看本机的IP地址:
IP地址由「网络地址」和「主机地址」两部分组成。
192.168.31.121
,前段的 192.168
就是网络地址。IP在路由的时候,就是根据网络地址,决定数据发给哪个网络。192.168.31.121
,后段的 31.121
就是主机地址。IP路由到指定网络以后,就根据主机地址,决定数据发给哪个设备。为了适应「不同大小」的网络规模,IP地址被划分为A、B、C、D、E五类。
A类地址第一段是网络地址,剩下三段是主机地址;
B类地址前两段是网络地址,剩下两段是主机地址;
C类地址前三段是网络地址,最后一段是主机地址;
类别 | IP范围 | 子网掩码 | 描述 |
---|---|---|---|
A类(1~126) | 1.0.0.1 ~ 127.255.255.254 | 255.0.0.0 | 共有126个网络,每个网络有1600万台主机,适合大规模的网络。 |
B类(128~191) | 128.0.0.1 ~ 191.255.255.254 | 255.255.0.0 | 共有16384个网络,每个网络有6万台主机,适合中等规模的网络。 |
C类(192~223) | 192.0.0.1 ~ 233.255.255.254 | 255.255.255.0 | 共有209万个网络,每个网络有254台主机,适合小型网络。 |
D类(224~239) | 224.0.0.0 ~ 239.255.255.255 | 组播地址,一次请求发给一组特定的主机 ,常用于视频会议等场景。 | |
E类(240~255) | 240.0.0.0 ~ 255.255.255.254 | 保留地址 |
其中A、B、C三类地址比较常用,分别适用于大、中、小型网络,公司可以根据自己的规模申请合适的网络地址。比如我是个大公司,我就可以申请 126.0.0.0
这个网络地址,我公司的员工可以使用它的主机地址。
IP地址是有限的,总有用完的一天,为了节约IP资源,从A、B、C类地址中抽出一部分作为「私有地址」。私有地址不需要注册,也不不能跟互联网直接通信。比如我们公司的网络可以用192.168.100.1
这个私有IP,其他公司的网络也可以用同样的IP。
私有地址如下:
A、B、C类地址范围中,私有IP外的地址都是「公有地址」(特殊地址除外)。
为了满足不同的应用场景,产生了很多不同作用的「特殊地址」
类型 | 地址格式 | 描述 |
---|---|---|
全0地址 | 0.0.0.0 | 路由表的默认路由,表示整个网络,即网络内的所有主机,而非某一个主机,不可用。 |
网络号全0 | 0.x.x.x | 本网内某个特定主机 |
主机号全0 | x.0.0.0 | 网络地址,表示整个网络 |
全1地址 | 255.255.255.255 | 子网的广播地址,路由器不转发 |
主机号全1 | x.255.255.255 | 广播地址,对当前网络所有主机进行广播 |
环回地址 | 127.0.0.1 ~ 127.255.255.254 | 代表本机IP,可用于测试网络连通性 |
IP协议的报文分为「首部」和「数据」两个部分,首部分由固定部分(20字节)和可变部分组成。
结合数据包解释下每个字段的含义
Version
:版本【4位】,目标主机按照此版本解释数据,如果目标主机使用的是其他版本,则丢弃数据报。Header Length
:首部长度【4位】,数据报协议头长度,最小值为5,最大值为15。Differentiated Services Field
:服务【8位】,用于分配优先级、延迟、吞吐量以及可靠性;前3位是优先级,后面4位成为服务类型,最后1位没有定义。Total Length
:总长度【16位】,IP数据报的字节长度(协议头部和数据),其最大值为65535字节。Identification
:标识【16位】,一个整数,数据报分段时,用于识别当前数据报。Flags
:标记【3位】,由3位字段构成,最低位(MF)控制分段,存在下一个分段置为1,否则置0代表该分段是最后一个分段;中间位(DF)指出数据报是否可进行分段,如果为1则机器不能将该数据报进行分段;第三位即最高位保留不使用,值为0。Fragment offset
:分段偏移【13位】,指出数据在源数据报中的相对位置,用于重组源数据。Time to live
:生存时间【8位】,一种计数器,在丢弃数据报的每个点值依次减1直至减少为0。这样确保数据报拥有有限的环路过程(即TTL),限制了数据报的寿命。Protocol
:协议【8位】,指明上层接收数据报的协议。Header checksum
:头部校验和【16位】,该字段帮助确保IP协议头的完整性。由于某些协议头字段的改变,这就需要对每个点重新计算和检验。计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分,将个部分相加,再将计算结果取反码,插入到校验和字段中。Source
:源地址【32位】,源主机IP地址,该字段在IPv4数据报从源主机到目的主机传输期间必须保持不变。Destination
:目的地址【32位】,目标主机IP地址,该字段在IPv4数据报从源主机到目的主机传输期间同样必须保持不变。IP协议接收传输层的数据包,添加IP首部后,发送给数据链路层,由链路层「封装成帧」进行传输。
由于帧(默认MTU)最多只能封装1500字节的数据,当「超过最大限制」时,IP协议就会将报文的数据部分「分割」成若干个报文,也就是IP分片。
分片的时候,用标记位(Flags
)和偏移量(Fragment offset
)来记录报文的顺序。
等目标主机接收到所有的IP分片以后,再按照顺序「重组」起来。
1)Wireshark开启抓包后,cmd 执行 ping 54.222.162.186 -n 1 -l 3200
,向百度发送一个3200字节的数据包
2)找到IPv4协议的数据包,前三个是「请求包」,后三个「响应包」是
数据帧的最大传输限制(MTU)是1500字节,我们 ping 的数据包是 3200 字节,会被IP协议分割成三个数据包(1500 + 1500 + 200),刚好对应前面三个请求包;
三个请求包最后以一个ICMP协议数据包结尾,用来传输「控制信息」。响应包的作用也是如此。
3)先看第一个数据包(IPv4),重点看我圈中的字段:
Flags
字段第二个值是 More Fragments
,表示这个数据报后边有多余的数据分片;
Fragment Offset
字段的值是0,表示这个数据分片从第0个字节开始保存数据。
4)再看第二个数据包(IPv4),重点看我圈中的字段:
Flags
字段第二个值仍是More Fragments
,表示这个数据报后边也有多余的数据分片;
Fragment Offset
字段的值是1480,表示这个数据分片从第1480个字节开始保存数据。
从这里也可以反推出,第一个字段保存了 0~1480个字节。之所以只保存了1480个字段,是因为首部占了20个字节,首部+数据刚好够1500个字节,达到数据帧的上限。
5)再看第三个数据包(ICMP),重点看我圈中的字段:
Flags
字段第二个值为「空」,表示这个数据报没有多余的数据分片;
Fragment Offset
字段的值是2960,表示这个数据分片从第2960个字节开始保存数据。
从这里可以反推出,第二个字段保存了第 1480 ~ 2960个字节。
最下面的 IPv4 Fragments
字段记录了数据报的分片信息:第一、二个数据包保存了1480个字节,第三个数据包保存了248个字节。
接收方可以根据这些分片信息,重组被分割的数据。