0. 前言
举个例子:
假设张三跑五公里很快,有着极大的概率,每次都能跑进20分以内,但是着不代表着张三每次都能跑进20分。
李四是张三的班长,为了保证张三每次都能跑进20分,于是定制了策略:跑进20分,可以2天不用跑;如果没跑进,这次成绩不算,重新跑,直到跑进为止,然后记录成绩。
这样张三每次五公里成绩记录每次就是20分以内了
以上例子,张三就是TCP
协议,李四就是IP
协议
TCP
协议并没将数据发送到网络当中,而是提供可靠的策略IP
协议提供能力,能将数据跨网络发送
IP
协议的本质就是提供一种能力,将A主机发送到B主机
上层用户并不需要这种能力,上层用户需要的是可靠的将数据跨网络发送
一个局域网的A主机要将数据发送到另一个局域网的B主机,是要经过很多路由器的,这就需要对每台主机进行标识,即源ip和目的ip。
《西游记》中,唐僧去西天取经,西天这么大,他要去指定的地点大雷音寺,即:
目标城市:西天
目标地点:大雷音寺
ip
地址是由目标网络 + 目标主机构成的,打个比方:
我们学生有学生证号,但是这个学生证号里面是含义信息的,例如
2340210128
,前面的2340
代表着学院专业编号,210
代表着是哪个年级,128
代表着哪个班的多少号。我们这里简化一下,学生证号 = 学院编号 + 学号
假设小李是计算机学院的他捡到一张学生证,一看学号并不是计算机学院的,如果他很耿直,站在人流量较大的路边,碰见一个人就问:“同学这是你的学生证吗?”,这样问一天可能都问不到,甚至一直问不到,这就是直接遍历。
这时有人提出建议“小李,你直接给你辅导员吧,辅导员他们可能有一个大群,里面有学校所以的辅导员,让她发群里”,这样小李就将这个学生证给了辅导员小赵。当辅导员小赵拿到这个学生证之后拍照发到了大群,问这是哪个学院的,该学院辅导员看到之后,申领这个消息,然后再转发到学院群,问这个哪个学生的,这样,这个学生证就匹配到了该学生。
通过这种方法,一次性排除了一大批人,排除的效率高了
1. IP协议头格式
-
4位版本:指定
IP
协议版本,IPV4
就是4
-
4位首部长度:
IP
协议标准格式为20字节,4位的范围位[0, 15],因此范围是20~60字节 -
8位服务类型:3位弃用(优先权字段),4位
TOS
字段和1位必须保留字段
4位TOS
表示:最小延迟、最大吞吐量、最高可行性、最小成本,这四字相互冲突,只能选择一个 -
16位总长度:
IP
协议报文的总长度
UDP
和TCP
是没有总长度字段的,这说明不管是UDP
还是TCP
都要把数据交给IP
层,所以不管是字节流还是数据报,最后都是数据报
-
8位生存数据:
IP
报文再转发的时候,可能会经过多个路由器,每经过一个路由器TTL
(一般是64)就-1,如果到0了还没到达,那就丢弃了 -
8位协议:要将
IP
的有效载荷交给上层的哪个协议 -
16位首部校验和:使用CRC进行校验, 来鉴别头部是否损坏
-
32位源IP地址、目的IP地址:表明发送端和接收端
TCP
提供端口号,IP
提供IP
地址,因为TCP
是在双方的系统当中的,而中间的路由器是没有TCP
层的(路由器只工作在网络层)由于
IP
报头源IP
和目的IP
是四字节,所以才需要将点分十进制的IP
转换成4字节的IP
2. 网段划分
上面提到IP
地址是分为两部分的:
- 网络号:保证互相连接的网段具有不同的标识
- 主机号:同一网段内,主机之间具有相同的网络号,但主机号不能相同
- 路由器本质也是子网的一个主机,所以路由器也需要配置
IP
地址;- 路由器要进行数据包转发,所以路由器一定会至少同时连接2个子网,也相当于同时在2个子网及以上(简单理解路由器有多张网卡)
- 路由器一般是子网的第一个设备,
IP
地址一般是网络号.1
- 路由器功能不仅仅能对
IP
报文进行转发,还要很多功能(构建子网、对子网的IP进行管理…)
IP
用32位标识,2^32约为42亿多,但是全球的人数,远远大于42亿,这就说明**IP
地址是有限的资源**,这个有限资源是需要各个国家分配的。
历史上曾经提出过一种方式:
将
IP
地址分为5类:(图片来源:数据分析该知道的IP地址知识)
这种方案随着互联网的快速发展,这种方案的局限性就出来了,B类网络网络号多,主机号也不少,大部分组织都喜欢申请B类网络,导致B类网络很快就被分配完了
B类一个子网能允许6万5千多个主机,而A类更多
但是在实际上,一个子网不会存在这么多的主机,这就导致了大部分的
IP
地址都被浪费了
针对这种情况,提出了一个新方案CIDR
:
在原来的基础之上引入子网掩码来区分网络号和主机号;
子网掩码也是32位的正整数,通常用一串0来结尾;
将
IP
地址和子网掩码进行按位与操作,得到的结果就是网络号;网络号和主机号的划分与A、B类…无关;
子网掩码被配置在路由器当中。
IP地址 140.252.20.68 子网掩码 255.255.255.0:/24 网络号 140.252.20.0 子网范围 140.252.20.0 ~ 140.252.20.255
140.252.20.0
和140.252.20.255
这两个IP
地址是不用的,前者叫网络号,后者叫广播
这虽然了缓解资源的浪费,但是资源仍然是不够的,采用以下三种方式解决:
-
动态IP:只给入网的设备分配IP,因此同一个MAC地址设备每次接入网络,得到的IP地址不一定是相同的
-
NAT技术
-
IPv6:IPv6和IPv4是两个完全不相干的协议,彼此不兼容,目前还未普及
用16字节128位表示一个IP地址
我们国家是IPv6的技术是世界最顶尖的
3. 特殊IP地址
- 将
IP
地址中的主机地址全部设为0
,就成了网络号,代表这个局域网 - 将
IP
地址中的主机地址全部设为1
,就成了广播地址,用于给同一链路中互相连接的所有主机发送数据包 127.*
的IP
地址用于本地环回测试,通常是127.0.0.1
4. 公网IP和私有IP
如果组建内部局域网,IP地址只用于局域网通信,不连接到Internet上,理论上可以随意使用IP地址,但是RFC 1981规定用于组建局域网的私有IP:
-
10.*,前8位是网络号,共16777216个地址
-
172.16. ~ 172.31. ,前12位是网络号,共1048576个地址
-
192.168.*,前16位是网络号,共65536个地址
包含在这个范中的,都是私有IP,其余的都是公网IP
云服务器内网IP
我们之前一直用的都是私有IP,云服务器采用公网IP登录
谈谈运营商
要上网之前,需要联系运营商,让工作人员来接网线,给我们装一个路由器,交钱之后在运营商内部注册账号密码,然后每次上网的时候,在经过运营商验证,然后就可以入网了。
路由器还有一个功能就是构建局域网,所有我们可以给路由器本身设置账号和密码,然后家里人就可以一起使用了。
路由器有2套账号密码
我国不管是大城市还是小乡村,都可以上网,这就得益于我国的网络基础设施建设,国家提供经济支持运营商进行基础设施建设,就有了很多网民,人一多,需求就多,然后就孵化出了大大小小的互联网公司,互联网公司一起来,提供了岗位,带动了经济,国家还能通过税收资金回流,这样的循环,就使我国网络越来越发达。
WAN口IP和LAN口IP
我们目前都是使用的内网IP,内网IP是不能够出现在公网的。
我们的路由器有子网IP和WAN口IP:
- 子网IP:家里所使用的IP
- WAN口IP:家里的路由器和运营商是构建子网的,相当于运营商的内网IP
当我们要访问公网的时候,先是转交给路由器,路由器发现我们要出去,访问的目标不变,源IP变为WAN口IP转发出去;
到运营商公网出口路由器之后,访问目标依旧不变,源IP变为WAN口IP转发到公网。
这私有IP不断替换的过程,叫做NAT技术
所有整个互联网世界,采用的是公网+私网构成了现在的互联网
5. 路由
网络层是由操作系统实现的,所以我们的主机也是可以工作在网络层的,可以用route
指令查到本地的路由表。
我们查路由表的时候,用目标主机的IP地址&Genmask,然后与Destination做对比,比对结果分几种情况:
- 给出具体下一跳
- 不知道,转到默认路由(同一网段的另一台路由器)
- 到达入口路由器
这样就会越来越接近目标网络,又因为IP = 目标网络+目标主机,所以在转发的时候,我们是先到达目标网络的。
6. 数据链路层要求
实际上一台主机中,报文也并没有通过网络层直接发送到对方主机,而是继续向下交付(数据链路层)。
而数据链路层规定,一次不能发送过大的报文,这就表明上层不能给它交付过大的报文。
TCP流量控制,当网络情况良好,对方接收能力良好,可以直接发送大量的数据,而是将数据分成了一个一个的数据段,就是因为数据链路层不能收太大的报文
数据链路层能转发的最大字节数:
如果上层的数据就是特别大,这就需要IP层进行分片操作
7. 分片与组装
-
**16位标识:**每个报文都有自己的编号,而分片之后的报文,编号是相同的
-
**3位标志:**第2位为0表示允许分片,第3为表示结束标记(最后一个小包为0)
-
**13位片偏移:**每一位在原始报文偏移量
如何判断是否分片:
正常报文片偏移都是为0,如果不为0,则一定是分片的报文
如果是第一个,有3位标志位的第3位标识
判断条件片偏移!=0 || 更多分片 == 1
如何保证分片全部聚集在一起:
-
丢第一个
如果丢的是第一个,拼报文的时候,发现没有片偏移位0的,就能分辨出来第一个丢失 -
丢最后一个
所以报文都收到,但没有结束标记的(标志第3位位0的),就能发现最后一个丢失
-
丢失中间
分片排序的时候,前面报文的长度是下一个的片偏移,这样能识别出来
每个分片都是要加上IP报头的
但是分片并不是很建议,因为分片多了,发送的数据包就多了,这样就增加了丢包的概率,这个由TCP来控制
TCP有滑动窗口,但是还是分为了一小块一小块的,这就是因为数据链路层发送的报文不能太大,所以要一小块一小块发送,这个叫MSS
这样上层有了MSS,下层有MTU,就能减少IP的分片
8. 数据链路层
在网络层决策是转发到同一个网段的其他主机还是下一跳
网络层解决的是将报文从A主机发到B主机当中,要解决这个问题之前,要先解决这么将报文从A主机转发到相连的路由器当中
数据链路层解决的就是直接相连的主机(包括路由器)之间数据交付的问题
每个网卡都有自己唯一的MAC地址,这个主要用来区分在同一个局域网当中区分特定的主机
9. mac帧封装与解包
mac帧采用的是定长报文,根据定长的报头就可以将报头和有效载荷分离:
-
**目的地址:**要去的目标主机的mac地址
-
**源地址:**本台主机的mac地址
- **类型:**分别对应IP、ARP、RARP
- **类型:**分别对应IP、ARP、RARP
10. 局域网通信原理
同一局域网内,一个主机向另一个主机发送消息,其他主机是能收到的,对比目的地址,不是自己就直接丢弃了;如果是就接收报文做出处理。
可能同一时刻多头主机都发送消息,数据帧会发生数据碰撞,但是这个可以检测到,要进行碰撞避免算法,避免同时发送。
这就是mac数据包为什么有限制,因为短的数据包能够很快的放到局域网当中,这样就能将更多的报文在局域网当中发送
mac帧只在局域网内有效,因为在网络层核对完毕之后,如果不是,根据路由表,会重新发送到指定路由器,然后重新封装mac帧。