• 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交付给链路层
    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)
    {
    	// 给每一个报文添加上报头,都是拷贝同一个报头
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    网段划分

  • 相关阅读:
    八股文之jdk源码分析
    Java异常及处理方式
    纷享销客数字化营销能力(三):全渠道获客
    体育场馆智慧系统核心参数是什么?
    Linux 安装mysql5.7版本并连接本地navicat
    Docker之nacos集群部署(详细教你搭建)
    HTML5期末考核大作业、HTML个人主页界面设计源码
    阿里在职5年,一个女测试工师的坎坷之路
    Spring Boot多线程详解
    子进程变成孤儿进程
  • 原文地址:https://blog.csdn.net/m0_61567378/article/details/126731430