IP最大的意义,在于路径选择
绪论
IP=网络号+主机号
比如我们去天安门,首先要先是到北京对应的网络号,到了北京后,再在里面找到天安门对应的号码
先找对方的所在网络的网络号,再找它在这个网络里面的子网络号
TCP vs IP 各自解决什么问题
a. 决策问题vs 执行问题
b. IP提供了一种能力, 较大概率将数据从A主机跨网络传送给主机B的能力
IP层不提供可靠性机制
基本概念
主机
:配有ip地址,也会进行路由控制(端到端)
路由器
:配有ip地址,进行路由控制(路上的点到点)
节点
:主机和路由器的统称
数据段
:数据流,一段一段数据进行ip到达
IP报头
如何分离与封装 ,如何向上交付
标准长度20字节
4位首部长度
:和TCP 的4位首部长度一样
16位总长度
:报文总大小,用来解决TCP粘包问题,进行分离报头和有效载荷,只针对自己的报文,不对分片负责
8位协议
:交付给上层的什么协议(TCP或UDP),这个是我们来填充的,应用层填充的,用来解决分用问题,向上交付
16位首部校验和
:路上传输的时候,保证数据的准确性
32位源IP
:从哪里来
32位目的IP
:到哪里去,交付给谁
4位版本
:基本都是IPV4
8位服务类型
:3位优先权字段(弃用了),1位保留字段(必须为0),4为TOS字段,分别表示,最小迟延,最大吞吐量,最高可靠性,最小成本,只能选其一,比如ssh,最小延迟比较重要,中间路由器都能看到
8位生存时间TTL
:每经过一个路由器,TTL-1,减到0,就不再被转发,在网络里面传输,等了好久没有达到,这个报文就丢弃了,避免网络资源浪费
16位标识
:如果没有分片,不同的报文,标识符是不一样的,如果分了片,标识符是一样的,(相同标识符代表的是同一个报文)
13位片偏移
:报文的有效载荷在原始报文的原始报文中有效载荷中的偏移量,就可以进行组合,自己偏移量+报文长度就是下一个片偏移量的开始
3位标志
:
1位保留
(还没用,或者还没想好怎么用),1位标志禁止分片
(如果被设置为1,假如上层给链路层1800byte>1500byte,也不会被分片,就丢弃了),1位标志更多报文
(分片后后面还有报文),1代表后面还有报文,0代表最后一个报文
IP分片
IP分片不是大部分情况
-
为什么要分片
数据链路层一次可以往网络里面发送的数据大小是有限制MTU:1500字节
-
网络层向数据链路层传输有大小限制,如果IP报文过大,如何处理呢?
IP报文过大,就要就行分片
-
为什么要在网络层就行分片
因为分开的报文,都要添加ip报头,只有网络层才能够添加IP报头,有报头才能够在网络里面传送
,因为链路层无法得知网络层的任何细节,实现了解耦 -
那么谁来组转呢
所以报文必须有组转细节,谁分片谁组装,对端的网络层ip协议来进行组装,分片的过程传输层不知道,也不需要知道 ,在我们这边的网络层进行分片,到对端的网络层进行组装,传输层就没法感知到发送的报文被分片了
-
分片就真的好吗?
万一丢失了一个怎么办?可能会提高丢包的风险
组装失败,对端整个报文全部丢弃,对端一个都收不到,就相当于丢包了,对于TCP来说可以重传
对于UDP来说,就丢失了, -
如果我不想分片,谁说了算
传输层决定,什么时候发,怎么发,发多少的问题,
TCP
控制自己的单个报文大小1480,就不用分片了
UDP没有发送缓冲区,就没有办法了 -
如何组合呢
我们把相同标识符放在一起,按偏移量进行升序排序,进行组合
-
我怎么知道有没有报文丢失呢?
最开始丢了,中间丢了,最后的丢了
排列在一起,片偏移的0没了,最开始的丢了
从第一个报文的偏移量+有效长度=下一个报文的偏移量,以此类推,就可以找到,中间丢失的情况
报文的最后一个标志位为0,代表最后的没丢 -
接收方,如何得知报文时独立的,还是一个分片的
正常报文直接向上交付,分片报文要进行组合排序
未经过分片的报文,13位片偏移=0,3位标志位的标志设置位0
其他的都是经过分片的报文 ,就放到一个容器里面进行整合,再向上交付
分片的原理
假如传输层给网络层发送了1500个字节
- 对于网络层来说1500就是有效载荷大小
- 网络层加上自己的报头20字节,总共1520个字节,超过了1500字节,就要进行分片
- MTU=1500字节,1500=1480+20(ip的报头,传到链路层中,每个报文的有效载荷最大只能是1480
伪代码- 将每个分片好的1500交付给链路层
X=1500;//传输层发送给链路层的大小1500
vector<int> res;//这里面存储,数据分片后每一块的字节
while(X>=1480)
{
new=1480;
res.push(new);
X-=1480;
}
if(X)
{
res.push(X);
}
for(auto e:res)
{
// 给每一个报文添加上报头,都是拷贝同一个报头
}