目录
网络层介绍
一.协议头格式
1.属性介绍
2.第二行16位标识,3位标志,13位片偏移 介绍
(1)网络层分片
①网络层进行分片不是主流!
②如何做到减少分片呢? ? ?网络层是否分片,是否由网络层决定? ?
(2)分片组装
(3)分片对UDP和TCP有影响吗?
二.网段划分(重要)
1.IP地址构成
2.网段划分
(1)介绍
(2)为什么要网段划分?
3.私有IP地址和公网IP地址
(1)介绍
(2)NAT技术——大大缓解IP不足的创举
4.路由
网络层介绍
应用层:读取完整报文&&序列化&&协议处理问题。(数据提取出来--处理数据)
传输层(tcp/udp):解决可靠性。提供流量控制,超时重传等策略。
网络层(IP)提供的是: 将数据从A主机 跨网络 送到B主机 的能力。传输层(TCP):保证可靠性。
TCP/IP ——>可靠的将数据从A主机,跨网络送到B主机
![](https://i-blog.csdnimg.cn/blog_migrate/2430d0086031dfe6f71973362e34b07c.png)
网络层
在复杂的网络环境中确定一个合适的路径
.
IP
协议
基本概念
主机
:
配有
IP
地址
,
可以进行路由控制的设备
;
路由器
:
即配有
IP
地址
,
又能进行路由控制
;
节点
:
主机和路由器的统称;
一.协议头格式
![](https://i-blog.csdnimg.cn/blog_migrate/3fbc92225542cc8a102b9f597cd08a77.png)
1.属性介绍
4位版本号(version):
指定
IP
协议的版本
,
对于
IPv4
来说
,
就是
4.
4位头部长度
(header length): IP
头部的长度是多少个
32bit,
也就是
length * 4
的字节数
. 4bit
表示最大 的数字是15,
因此
IP
头部最大长度是
60
字节
.
8位服务类型
(Type Of Service): 3
位优先权字段
(
已经弃用
), 4
位
TOS
字段
,
和
1
位保留字段
(
必须置为
0). 4
位TOS分别表示
:
最小延时
,
最大吞吐量
,
最高可靠性
,
最小成本
.
这四者相互冲突
,
只能选择一个
.
对于
ssh/telnet
这样的应用程序
,
最小延时比较重要
;
对于
ftp
这样的程序
,
最大吞吐量比较重要
.
16位总长度
(total length): IP
数据报整体占多少个字节
.
16位标识
(id):
唯一的标识主机发送的报文
.
如果
IP
报文在数据链路层被分片了
,
那么每一个片里面的这个id都是相同的
.
3位标志字段
:
第一位保留
(
保留的意思是现在不用
,
但是还没想好说不定以后要用到
).
第二位置为
1表示禁止分片, 这时候如果报文长度超过
MTU, IP
模块就会丢弃报文
.
第三位表示
"
更多分片
",
如果分片了的话
, 最后一个分片置为0,
其他是
1.
类似于一个结束标记
.
13位分片偏移(framegament offffset):
是分片相对于原始
IP
报文开始处的偏移
.
其实就是在表示当前分片在原报文中处在哪个位置.
实际偏移的字节数是这个值
* 8
得到的
.
因此
,
除了最后一个报文之外
,
其他报文的长度必须是8
的整数倍
(
否则报文就不连续了
).
8位生存时间(Time To Live, TTL):由于网络的Bug或者对端主机不可达等不可控因素的存在,导致IP报文在网络中长时间游离,而不消失,会占用资源。则设置一个IP报文
8位生存时间——
数据报到达目的地的最大报文跳数(计数器). 一般是64.
每次经过一个路由
, TTL -= 1, 一直减到
0
还没到达
,
那么就丢弃了
.
这个字段主要是用来防止出现路由循环
8位协议:
表示上层协议的类型
16位头部校验和:
使用
CRC
进行校验
,
来鉴别头部是否损坏
.
32位源地址和32位目标地址:
表示发送端和接收端
.
选项字段(不定长, 最多40字节):
略
网段划分
(
重要
)
2.第二行16位标识,3位标志,13位片偏移 介绍
(1)网络层分片
链路成有发送单个数据帧的最大值约束,所以,我们不能发送太大的IP报文,如果要发的IP报文很大,就需要网络层自己分片,再交付给数据链路层。
对IP进行分片,由谁来做?——发送方的网络层来进行分片(就好比你要顺丰帮你寄一个10公斤的电脑,顺丰不可能给你拆开分包裹,到时候组装不起来是要担责任的,应该是你自己拆电脑,然后分成5个包裹让顺丰寄)
全部收到之后,由谁来组装?——对方的网络层进行组装
无论是对发送方还是接受方, 分片和组装行为,双方的传输层,知道吗?——不需要知道,也不关心。网络层和传输层的功能解耦!
①网络层进行分片不是主流!
解释:网络层分片不利于网络可靠传输,网络层进行分片,假设一段3000字节数据分成3份,向传输层交付时,只要一份丢包了,就算整个数据包丢失了。即1个报文丢包和3个报文丢包,后者概率更大。所以一但只要网络层进行分片,就会增加丢包率。(不建议分片!!)
②如何做到减少分片呢? ? ?网络层是否分片,是否由网络层决定? ?
网络层是否分片,不是由网络层决定,而是由传输层决定!减少分片——传输层要考虑别传太大的报文。分片之后。每一个分片也是一个独立的IP报文, 也要有报头。一般在三次握手的时候, 就会协商单次传输数据的报文大。
(2)分片组装
16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片(关闭分片功能), 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0, 其他是1. 类似于 “字符串以\0结尾”的 结束标记。(最后一个更多分片虽然是0,但是如果分片了的话,13位片偏移一定不是0!)
13位片偏移(framegament offffset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
![](https://i-blog.csdnimg.cn/blog_migrate/115b6fb7e28ab057dc1f9ed3699aa8fb.png)
组装:
1.先要识别该报文是被分片的!——3位标志字段+13位片偏移。最重要的属性是“更多分片”,识别该报文是否被分片,看“更多分片”是1就是分片;如果“更多分片”是0,再看“13位片偏移”,如果“13位片偏移”不为0则是分片,如果为0则不是分片。即:( 更多分片==1 )||( 更多分片==0&& 偏移!=0 )
2.将序号相同的报文先得收集在一起。——16位标识(id) 相同的就收集起来
3.如何正确的组装。——按 13位片偏移 从小到大排序组装起来。
![](https://i-blog.csdnimg.cn/blog_migrate/d223a2d00f14f42ead638dae79356634.png)
你怎么保证你收集到最后一个了? ——“更多分片”是1挨个组装,直到拿到“更多分片”是0就代表收集完了。
如果丢包了,你怎么保证你收全了? ?——13位片偏移 从小到大排序组装起来,中间丢包时:每个报文的偏移量+自身长度=下一个报文偏移量,如果不等就是少了丢包了。开头丢包时:第一个报文片偏移不是0,就说明开头丢了。 结尾丢包时:。最后一个报文的“更多分片”不是0就说明结尾丢了。
(3)分片对UDP和TCP有影响吗?
当然有影响,增加丢包概率,但是 tcp有可靠性 影响不大,udp影响很大 ip分片会直接影响到UDP
二.网段划分(重要)
1.IP地址构成
IP地址分为两个部分
, 网络号和主机号(IP的构成是 ip=目的网络+目的主机
)
网络号:
保证相互连接的两个网段具有不同的标识
;
主机号:
同一网段内
,
主机之间具有相同的网络号
,
但是必须有不同的主机号
;
例子:
FF:FF:FF:FF 类似于学号: 202019040108
目的网络 目的主机 院系班 学生序号
IP在路由的时候,在路上的时候,先根据目的网络进行路由,找到目标网络之后,然后再根据目的主机的主机号,进行数据转发!
![](https://i-blog.csdnimg.cn/blog_migrate/b8cb54b9680fb2ec11bd0c42b3581384.png)
●
不同的子网其实就是把网络号相同的主机放到一起.
●
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号,
就可以保证在相互连接的网络中
,
每台主机的
IP
地址都不相同
.
那么问题来了
,
手动管理子网内的
IP,
是一个相当麻烦的事情
.
●
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配
IP
地址
,
避免了手动管理
IP
的不便
.
●
一般的路由器都带有DHCP功能
.
因此路由器也可以看做一个
DHCP
服务器
.
2.网段划分
(1)介绍
曾经一定有角色已经将我们全球的IP进行过地址划分
历史产物:过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示(该图出自[TCPIP])。
![](https://i-blog.csdnimg.cn/blog_migrate/bd14fe7714aa601058be077a03aa4610.png)
●
A类
0.0.0.0
到
127.255.255.255
●
B类
128.0.0.0
到
191.255.255.255
●
C类
192.0.0.0
到
223.255.255.255
●
D类
224.0.0.0
到
239.255.255.255
●
E类
240.0.0.0
到
247.255.255.255
随着
Internet
的飞速发展
,
这种划分方案的局限性很快显现出来
,
大多数组织都申请
B
类网络地址
,
导致
B
类地址很快就
分配完了
,
而
A
类却浪费了大量地址
;
●
例如,
申请了一个
B
类地址
,
理论上一个子网内能允许
6
万
5
千多个主机(2^16)
. A
类地址的子网内的主机数更多
.
●
然而实际网络架设中,
不会存在一个子网内有这么多的情况
.
因此大量的
IP
地址都被浪费掉了
.
现代方案:针对这种情况提出了新的划分方案
,
称为
CIDR(Classless Interdomain Routing):
●
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
●
子网掩码也是一个32
位的正整数
.
通常用一串
"0"
来结尾
;
●
将IP
地址和子网掩码进行
"
按位与
"
操作
,
得到的结果就是网络号(
例如1111100前面的1与运算得到网络号,后面0清空主机号
)
;
●
网络号和主机号的划分与这个IP
地址是
A
类、
B
类还是
C
类无关
例子:
![](https://i-blog.csdnimg.cn/blog_migrate/5cefc5fb8d02a19e96b3f9f9961b36fa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bf4934fbc1abe9a8fab2cff936a6a64c.png)
可见
,IP
地址与子网掩码做与运算可以得到网络号
,
主机号从全
0
到全
1
就是子网的地址范围
;
IP
地址和子网掩码还有一种更简洁的表示方法
,
例如
140.252.20.68/24,
表示
IP
地址为
140.252.20.68,
子网掩码的高24位是
1,
也就是
255.255.255.0
(2)为什么要网段划分?
![](https://i-blog.csdnimg.cn/blog_migrate/11cb558ced9f43e8e30f1b4acb44b9cc.png)
以学校为例,想通过学号找到经管学院的一个人很简单,直接看学号前四位找到对应的经管专业,即排除了其他专业,再看后四位找到班级和个人序号。
发送数据的本质:就是先要找到目标机器(目标网络+目标主机)
——>找的本质就是排除的过程!!
——>子网划分,一次排除一大批的子网
——>为什么要网段划分?便于查找——查找目标主机的效率提高!
特殊的
IP
地址
将
IP
地址中的主机地址全部设为
0,
就成为了网络号
,
代表这个局域网
;
将
IP
地址中的主机地址全部设为
1,
就成为了广播地址
,
用于给同一个链路中相互连接的所有主机发送数据包;
127.*
的
IP
地址用于本机环回
(loop back)
测试
,
通常是
127.0.0.1
![](https://i-blog.csdnimg.cn/blog_migrate/1361d33da0f8c762e7cffc33c2f2adfb.png)
IP
地址的数量限制
我们知道
, IP
地址
(IPv4)
是一个
4
字节
32
位的正整数
.
那么一共只有
2
的
32
次方 个
IP
地址
,
大概是
43
亿左右
.
而
TCP/IP
协议规定
,
每个主机都需要有一个
IP
地址
.
这意味着
,
一共只有
43
亿台主机能接入网络么
?
实际上
,
由于一些特殊的
IP
地址的存在
,
数量远不足
43
亿
;
另外
IP
地址并非是按照主机台数来配置的
,
而是每一个网卡
都需要配置一个或多个
IP
地址
.
CIDR
在一定程度上缓解了
IP
地址不够用的问题
(
提高了利用率
,
减少了浪费
,
但是
IP
地址的绝对上限并没有增加
),
仍然
不是很够用
.
这时候有三种方式来解决
:
动态分配
IP
地址
:
只给接入网络的设备分配
IP
地址
.
因此同一个
MAC
地址的设备
,
每次接入互联网中
,
得到的IP
地址不一定是相同的
;
NAT
技术
(
后面会重点介绍
);
IPv6: IPv6
并不是
IPv4
的简单升级版
.
这是互不相干的两个协议
,
彼此并不兼容
; IPv6
用
16
字节
128
位来表示一个IP
地址
;
但是目前
IPv6
还没有普及
;
3.私有IP地址和公网IP地址
(1)介绍
如果一个组织内部组建局域网,IP
地址只用于局域网内的通信
,
而不直接连到
Internet
上
,理论上使用任意的IP
地址都可以,
但是
RFC 1918
规定了用于组建局域网的私有
IP
地址
10.*,
前
8
位是网络号
,
共
16,777,216
个地址
172.16.
到
172.31.
,
前
12
位是网络号
,
共
1,048,576
个地址
192.168.*,
前
16
位是网络号
,
共
65,536
个地址
包含在这个范围中的, 都成为私有IP(私有IP不能出现在公网上,只能在私网中组建局域网), 其余的则称为全局IP(或公网IP);
家用路由器:除了进行IP报文转发之外,构建子网! !
你的主机想上网,连上路由器后不是直接和公网(广域网)通信,而是把消息发给运营商。手机欠费运营商不让上网了,但还能打通10086。
因为你欠费时,运营商把你发来的数据包丢弃了,但是你仍可以给运营商发消息。
(2)NAT技术——大大缓解IP不足的创举
局域网中的数据,发送到公网,是需要不断替换源IP来完成的--
例子过程:运营商构建一个局域网-私网,你想刷视频,主机的192.168.1.201 和 家庭路由器的LAN口IP 192.168.1.1在一个局域网,则可以发送请求到家庭路由器,发送后家庭路由器会把 你主机的src源IP “201” 替换成WAN口IP “10.1.1.2”,然后家庭路由器把这个请求发给运营商路由器,运营商路由器再把 家庭路由器的src源IP “10.1.1.2” 替换成WAN口IP “122.77.241.4” ,最后发给某音服务器,让它处理你的请求。这就是不断的进行 NAT转换
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
4.路由
在复杂的网络结构中
,
找出一条通往终点的路线
;
路由的过程
,
就是这样一跳一跳
(Hop by Hop) "
问路
"
的过程.每一跳相邻路由器要在同一局域网内,同一局域网内才能通信
所谓
"
一跳
"
就是数据链路层中的一个区间
.
具体在以太网中指从源
MAC
地址到目的
MAC
地址之间的帧传输区间
.
IP
数据包的传输过程也和问路一样
.
●
当IP
数据包
,
到达路由器时
,
路由器会先查看目的
IP;
●
路由器决定这个数据包是能直接发送给目标主机,
还是需要发送给下一个路由器
;
●
依次反复,
一直到达目标
IP
地址
;
那么如何判定当前这个数据包该发送到哪里呢
?
这个就依靠每个节点内部维护一个路由表
;
[
唐僧问路例子
2
]
●
路由表可以使用route命令查看
●
如果目的IP
命中了路由表
,
就直接转发即可
;
●
路由表中的最后一行,
主要由下一跳地址和发送接口两部分组成
,
当目的地址与路由表中其它行都不匹配时,
就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下
:
Destination:子网网络号,直接连接的网络的IP地址(172 .28.64.0)。 Gateway:网关—缺省的默认路由器。
Genmask:子网掩码 Flags:U-条目有效,G-是路由器。 Iface:网络接口。(接发数据)
●
这台主机有两个网络接口,
一个网络接口连到
192.168.10.0/24
网络
,
另一个网络接口连到
192.168.56.0/24
网络
;
●
路由表的Destination
是目的网络地址
,Genmask
是子网掩码
,Gateway
是下一跳地址
,Iface
是发送接口,Flags
中的
U
标志表示此条目有效
(
可以禁用某些 条目
),G
标志表示此条目的下一跳地址是某个路由器的地址,
没有
G
标志的条目表示目的网络地址是与本机接口直接相连的网络
,
不必经路由器转发
;
转发过程例
1:
如果要发送的数据包的目的地址是
192.168.56.3
●
跟第一行的子网掩码做与运算得 到192.168.56.0,
与第一行的目的网络地址不符
●
再跟第二行的子网掩码做与运算得 到192.168.56.0,
正是第二行的目的网络地址
,
因此从
eth1
接口发送出去;
●
由于192.168.56.0/24
正 是与
eth1
接口直接相连的网络
,
因此可以直接发到目的主机
,
不需要经路由器转
发
;
转发过程例
2:
如果要发送的数据包的目的地址是
202.10.1.2
●
依次和路由表前几项进行对比,
发现都不匹配
;
●
按缺省路由条目,
从
eth0
接口发出去
,
发往
192.168.10.1
路由器
;
●
由192.168.10.1
路由器根据它的路由表决定下一跳地址
;
路由表生成算法
(
选学
)
路由表可以由网络管理员手动维护
(
静态路由
),
也可以通过一些算法自动生成
(
动态路由
).
请同学们课后自己调研一些相关的生成算法
,
例如距离向量算法
, LS
算法
, Dijkstra
算法等
.