引入:
IP协议主要解决什么问题呢?
IP协议提供一种将数据从主机A 发送到 主机B的能力。(有能力不一定能做到,比如小明很聪明,可以考100分,但是他也不是每次搜能考100分,可靠性由传输层来解决)
IP协议基本概念
主机 : 配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点 : 主机和路由器的统称。
IP协议头格式
1. 如何封装和解包呢?
定长报头+自描述字段(4位首部长度)
2. 如何交付?(如何确定交付的协议)
8位协议:标识UDP还是TCP
4位版本:
确定是IPv6还是IPv4
4位首部长度
8位服务类型(Type Of Service):
16位总长度(total length):
16位标识(id):
3位标志:
13位分片偏移(framegament offset):
8位生存时间(Time To Live, TTL):
8位协议:
16位头部校验和:
32位源地址和32位目标地址:
表示发送端和接收端.
选项字段(不定长, 最多40字节):
分片:
链路层因为其物理特性的原因,一般不会一次性转发太大的数据==>也就是说:
链路层有一次可以转发到网络中的报文大小的限制,一般是1500(MTU),所以网络层需要将一个较大的ip报文拆分成多个小的,符合条件的报文,这就是分片。
分片的行为是网络层完成的,上层的传输层和应用层并不知道,(这在一定程度上埋下隐患),同样组装的行为也必须由对方的网络层完成。
为什么呢?
原因可以分为2个:
1 、 对方给自己的是一个完整的TCP报文,那我自己上传输层交付时也必须是一个完整TCP报文;
2 、 协议具有一致性,IP协议负责分片和组装不会影响其他层的服务。
分片决定了网络层IP协议具有3种能力
1. 具有区分不同报文的能力 ----16位标识符
2. 具有判断报文是不是分片的能力 ----“更多分片”
3. 异常处理 ---- 任何一个分片丢失,都可以识别出来
怎么做到分片的呢?
3位标志中有一位是保留的,第2位为1时表示禁止分片,如果报文长度超过MTC,IP就会丢弃报文。第3位 表示 “ 更多分片 ” ,如果分片了的化,最后一个分片置为 0, 其他是 1,类似一个结束标记。
认识偏移量
开始: 更多分片 1 ,片偏移 = 0
结尾: 更多分片 0 ,片偏移 ≠ 0
中间: 更多分片 1 ,片偏移 ≠ 0
中间那么多的分片,如何确定所有分片都收到了呢?
根据偏移量进行升序排序,结合偏移量+自身大小=下一个报文的偏移量,通过扫描整个报文,来进行判断,如果不匹配,则说明报文出现了丢失,需要重新发送,如果成功遍历到结尾,则表明收取到了完整的报文。
分片之前,报文一定是一个完整的报文,分片之后,每一个分片也有单独的IP报头
下面简单分析一下分片过程
假设MTC=1500
原本的整个报文数据大小是 3000 ,(注意: IP报文=IP报头+有效载荷)
第一步,先分一个1500的数据块,直接拿走原本的报头(实际可能更复杂哈) ,
剩下的1500的数据并不是可以直接就成为一个分片,还要添加报头信息(20字节)为了支持未来的组装,每一个分片都必须有IP报头,所有分割1480的大小,再添加20字节的报头,最后一个分片包含20字节的报头和20字节的有效载荷。
我们再来分析一下这三个报文
报文编号 | 1 | 2 | 3 |
16位标识 | 1234 | 1234 | 1234 |
3位标志“更多分片” | 1 | 1 | 0 |
13位片偏移 | 0 | 1500 | 2980 |
总长度 | 1500 | 1500 | 40 |
分片的坏处
之前我们提到在网络层进行分片和组装,上层是不知道的,同时,我们也应该有这个常识:
丢包是有概率的,分包会增加报文个数,在一定程度上增加了丢包的概率。,要彻底解决丢包问题,还得依靠 传输层。当然这也决定了分片不是主流。
网段划分
有一种技术叫做 DHCP , 能够自动的给子网内新增主机节点分配 IP 地址 , 避免了手动管理 IP 的不便 . 一般的路由器都带有DHCP 功能 . 因此路由器也可以看做一个 DHCP 服务器 .
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 |