IP基础(1)

文章目录

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分片不是大部分情况

  1. 为什么要分片

    数据链路层一次可以往网络里面发送的数据大小是有限制MTU:1500字节

  2. 网络层向数据链路层传输有大小限制,如果IP报文过大,如何处理呢?

    IP报文过大,就要就行分片

  3. 为什么要在网络层就行分片

    因为分开的报文,都要添加ip报头,只有网络层才能够添加IP报头,有报头才能够在网络里面传送
    ,因为链路层无法得知网络层的任何细节,实现了解耦

  4. 那么谁来组转呢

    所以报文必须有组转细节,谁分片谁组装,对端的网络层ip协议来进行组装,分片的过程传输层不知道,也不需要知道 ,在我们这边的网络层进行分片,到对端的网络层进行组装,传输层就没法感知到发送的报文被分片了

  5. 分片就真的好吗?

    万一丢失了一个怎么办?可能会提高丢包的风险
    组装失败,对端整个报文全部丢弃,对端一个都收不到,就相当于丢包了,对于TCP来说可以重传
    对于UDP来说,就丢失了,

  6. 如果我不想分片,谁说了算

    传输层决定,什么时候发,怎么发,发多少的问题,TCP控制自己的单个报文大小1480,就不用分片了
    UDP没有发送缓冲区,就没有办法了

  7. 如何组合呢

    我们把相同标识符放在一起,按偏移量进行升序排序,进行组合

  8. 我怎么知道有没有报文丢失呢?

    最开始丢了,中间丢了,最后的丢了
    排列在一起,片偏移的0没了,最开始的丢了
    从第一个报文的偏移量+有效长度=下一个报文的偏移量,以此类推,就可以找到,中间丢失的情况
    报文的最后一个标志位为0,代表最后的没丢

  9. 接收方,如何得知报文时独立的,还是一个分片的

    正常报文直接向上交付,分片报文要进行组合排序
    未经过分片的报文,13位片偏移=0,3位标志位的标志设置位0
    其他的都是经过分片的报文 ,就放到一个容器里面进行整合,再向上交付

分片的原理

假如传输层给网络层发送了1500个字节

  • 对于网络层来说1500就是有效载荷大小
  • 网络层加上自己的报头20字节,总共1520个字节,超过了1500字节,就要进行分片
  • MTU=1500字节,1500=1480+20(ip的报头,传到链路层中,每个报文的有效载荷最大只能是1480
    伪代码
  • 将每个分片好的1500交付给链路层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)
{
// 给每一个报文添加上报头,都是拷贝同一个报头
}

网段划分


IP基础(1)
http://example.com/2022/09/07/IP基础(1)/
作者
Zevin
发布于
2022年9月7日
许可协议