Lesson13 IP协议

  •  IP:   提供一种能力,将数据从A主机送到B主机的能力,但不一定会成功
  • 主机 : 配有 IP 地址 , 但是不进行路由控制的设备 ;
  • 路由器: 即配有 IP 地址 , 又能进行路由控制 ;
  • 节点 : 主机和路由器的统称;

协议头格式 

如何封装和解包: 定长报头 +  自描述字段

如何交付(分用) : 8位协议(udp或tcp)

第一层 

  •  4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
  • 4位头部长度(header length):
    • 4为首部长度虽然是4个bit位,但是单位是字节
    • 0000->1111 => 0 -> 15,即范围是0 -> 60字节
    • 报头的范围: [20,60]
      • x * 4 = 20 推出 x = 5->0101
      • x * 4 = 60 推出 x = 15->1111
  • 8位服务类型(Type Of Service):
    • 3位优先权字段(已经弃用),
    • 4位TOS字段(a.最小延时, b.最大吞吐量, c.最高可靠性, d.最小成本)
    • 1位保留字段(必须置为0)
  •  16位总长度(total length): IP数据报整体占多少个字节

第三层

  • 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  • 8位协议: 表示上层协议的类型 (udp或者tcp)
  • 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
  • 32位源地址和32位目标地址: 表示发送端和接收端.

第二层

 分片问题

  • 网络层的下层链路层由于物理特征的原因,一般无法发生太大的数据
  • 这时发送端的网络层就会把数据进行分片然后发送,而接收端的网络层就会进行组装

将一个比较大的ip报文,拆分成为多个小的满足条件的报文,

分片的行为是网络做的,同样组装的行为也必须由对方的网络层来做 

  •  网络向上交付也必须是一个完整的报文,
  • IP分片和组装的行为,TCP是不知道的,不关心的

如何实现分片 

  • 16位标识: IP报文序号
  • 3位标志
    • 第一位 保留 (保留的意思是现在不用, 但是还没想好说不定以后要用到).
    • 第二位置为 1表示禁止分片 , 这时候如果报文长度超过MTU, IP模块就会丢弃报文.
    • 第三位表示 "更多分片" , 如果分片了的话,最后一个分片置为1, 其他是0(结束标记)
  • 13位片偏移: 是分片相对于原始IP报文开始处偏移(确认位置)

 区分分片并确认收全->提供组装方案

 

  1. 分片行为不是主流
    1. 在网络层分片和组装中,丢包是有概率的,分片会增加丢包的概率
  2. 识别报文与报文的不同
    1. 不同报文的16位标识不同,这就能区分报文和报文之间的不同,
  3. 识别报文是否被分片
    1. 如果更多分片标志位是1,就表明它被分片了
    2. 如果我就是最后一个分片,但这个更多分片标志位就是0,无法区分是否被分片了
      但是最后一个分片的13位片偏移,一定不为0,能区分是否被分片了
      if(报文->更多分片 & 0x1) return 分片的
      else if(报文->片偏移 > 0) return 分片的
      else return 独立的报文
  4. 识别那些分片是开始,中间,结尾
    1. 开始: 更多分片1,片偏移0
    2. 中间: 更多分片1,片偏移不是0
    3. 结尾: 更多分片0,片偏移不是0
  5. 识别任何一个分片丢失
    1. 通过16位标识,确定这个报文的所有分片,并将其放在一起
    2. 然后按照片偏移进行升序排列

      偏移量 + 自身大小 = 下一个报文的偏移量
    3. 扫描整个报文如果不匹配,中间就一定会有丢失的,
      如果成功计算到结尾,就一定收取完整了(组装时也是这样做的)

  •  分片之前,一定是一个独立的ip报文
  • 分片之后,每一个分片都要有ip报文,
  • 为了支持未来的组装,每一个分片都必须有ip报文

 网段划分(重要)

ip = 网络号+主机号

  • 网络号: 保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
通过 合理设置 主机号和网络号 , 就可以保证在相互连接的网络中 , 每台主机的 IP 地址都不相同 .
那么问题来了 , 手动管理子网内的 IP, 是一个相当麻烦的事情 .
  •  有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
  • 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.

过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示(该图出 自[TCPIP]) 

  • 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千多个主机. A类地址的子网内的主机数更多.
  • 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.

针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):  

  • 引入一个额外的 子网掩码 (subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
  • 将IP地址和子网掩码进行 " 按位与 " 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

  •  可以给不同的路由器配置不同位数的子网掩码,就能看到不同的网络号
  • 目的IP & 当前路由器的子网掩码 = 该报文要去的目的网络
  • 又因为不同的路由器一定至少要级联2个网络,每一个网络的网络号可能是不同的
    每一个路由器都要给自己直接链接的网络配置对应的子网掩码

特殊的IP地址

  • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
  • 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
  • 127.*的IP地址用于 本机环回(loop back)测试 ,通常是127.0.0.1

IP地址的数量限制

  • 我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 232次方个IP地址, 大概是43亿左右.
  • TCP/IP 协议规定, 每个主机都需要有一个IP地址. 且还有一些特殊的IP地址的存在, 数量远不足43亿;
  • 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡 都需要配置一个或多个IP地址.
  • CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用.

这时候有三种方式来解决

  • 动态分配IP地址 : 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
  • NAT技术 (后面会重点介绍);
  • IPv6 : IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表 示一个IP地址; 但是目前IPv6还没有普及;

私有IP地址和公网IP地址

  •  路由器天然的会构建区域网(子网),内网IP,
  • 家用路由器:
    • 对内: 面对自己构建的子网
    • 对外:自己本身也是别人构建子网的一个主机
  • 所有路由器一定要有两套地址:
    • 对内: Lan口IP,局域网ip(私有ip)
    • 对外:WAN口IP,自己所在上级子网给自己分配的ip(公有ip)
  • 私有网络对应的IP是局部的,可以在不同的子网中重复出现->IP不足问题就大大缓解了

 缓解IP不足->NAT技术

路由器要做的一个事情:

  • 将报文中的源IP替换成为路由器的WAN口IP
  • 每经过一个运行商的内网路由器,都要做这个工作(公网路由器不做) 
  •  目的IP地址是不变的,源IP地址在不同的内网,通过不同层级的网络节点中转发(替换),
    这种技术就叫做: NAT技术

路由 

  •  IP报文,被千里送到主机C的入口路由器,接下来需要进行交付给目标主机: 封装MAC报头,所以就必须知道主机C的MAC地址
  •  IP提供的是转发的策略,想要解决设备转发的具体功能,需要交给数据链路层解决

数据链路层

1.以太网帧格式->数据帧格式 

  • 源地址和目的地址是指 网卡 硬件地址 (也叫 MAC地址 ), 长度是48位,是在网卡出厂时固化的;
  • 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
  • 帧末尾是 CRC校验码 ->标识主机 唯一性 的方案
认识 MAC 地址
  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
    在网卡出厂时就确定了, 不能修改.
  • mac地址通常是 唯一 的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)

对比理解MAC地址和IP地址

  • IP地址描述的是 路途总体 的 起点 和 终点;
  • MAC地址描述的是路途上的 每一个区间 的起点和终点;

2.重谈局域网通信原理 

  •  局域网中的主机是越少越好,且发送数据帧的时候,数据帧越短越好
    这样就能有效的减少数据之间的碰撞
  • 碰撞避免算法->发送的主机会休息随机时间,然后,在重新发送
  • 局域网攻击原理.....

认识MTU

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,
    ARP数据包的长度不够46字节,要在后面补填充位; 
  • 最大值1500称以太网的最大传输单元(MTU), 不同的网络类型 不同的MTU ;
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
  • 不同的数据链路层 标准的 MTU是不同的 ;

 3.汇总到整体的通信流程汇总,发现问题--添补细节

  •  在网络转发的`过程中,目的IP不变的,mac帧报头要变

MSSMTU的关系

  • TCP的单个数据报的 最大消息长度 , 称为MSS(Max Segment Size);
  •  MTU的最大字节为1500 = IP
  • IP有效载荷 = 1500 - IP报头(20) = TCP + 数据 = 1480
  • 数据 = 1480 - TCP报头的长度(20) = 1460,即MSS不能大于1460

查看硬件地址和MTU 

ARP协议(地址解析协议)

  •  如果只知道目标主机的IP地址,而不知道对方的MAC地址,就无法封装MAC帧
  • 在一个网段中,通过目标IP,得知对方MAC地址的方式叫做->ARP协议(地址解析协议)

ARP数据报的格式 

  •  硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址;
  • 硬件地址长度对于以太网地址6字节;
  • 协议地址长度对于和IP地址4字节;
  • op字段为1表示ARP请求,op字段为2表示ARP应答

模拟一次ARP过程

前提是知道对方的IP地址 

  •  HA会给在这局域网中所有的主机都发送ARP请求(全广播)
  • 每一主机拿到这个请求,都会先看自己的IP地址是否匹配目的IP地址,都会处理,并向上交付
  • 不匹配就直接丢弃,匹配就发送ARP应答给对应主机

  •  HD这台主机会给HA主机发送ARP应答,在APR应答中就包括了HD自己的MAC地址
  •  当然在这个局域网中其他的主机都会收到这个应答,但是不会处理,会直接丢弃

 问题一: 如何理解上诉过程发生的两次丢弃

  • 一次是在arp层丢弃的,一次是在底层mac层丢弃的

问题二: ,是不是每一次发送数据都要发送一个arp请求和一个arp应答

  • 不是,arp请求成功之后,请求方会暂时将IP :  MAC地址的映射暂时保存下来

问题三: 除了在目标最终的子网中进行arp,其他地方会不会也发生arp呢 

  • ,arp过程会在网络中可能的所有路径中出现

小结

  • 任何主机可能之前向目标主机发起过ARP请求,同时,未来一定会受到对应的ARP应答

  • 任何一台主机,也有可能被别人发起ARP请求

  • 在局域网中:任何一台主机受到ARP的时候,可能是一个应答,也可能是一个请求 

 arp伪装

DNS(Domain Name System)

  • TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
  • 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名IP地址的关系.

最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的 

  • 如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
  • 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.

这样就太麻烦了, 于是产生了DNS系统

  • 一个组织的系统管理机构, 维护系统内的每个主机的IP主机名的对应关系.
  • 如果新计算机接入网络, 将这个信息注册到数据库中;
  • 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
遗留问题: 浏览器中输入url后,发生的事情

NAT的转换表

  • 其实在进行源地址替换的过程中,可能不一定只替换原IP,必要的时候,源端口也要被替换
  • 路由器在NAT转换的过程中,除了单纯的替换,还会为我们根据报文请求的四源组
    为我们构建一个映射关系
  • 源IP表示唯一的一台主机,源端口表示该主机上唯一的一个进程
    源IP+源端口表示唯一的一个进程 -- 自己在自己的内网中的唯一性
  • 无论从内向外,还是从外向内,都能在各自的网络中表示唯一性,
    所以这个映射关系是:互为KEY值的!!
  •  如果我们从来没有访问过外网,外网能够直接访问内网吗? 理论上不能
    但是有很多基于NAT原理的软件,能够帮助我们进行从外网访问内网 -- 内网穿透

正向代理服务器

  •  正向代理是双向的,即请求和应答都会通过这个代理服务器

 反向代理服务器

  •  反向代理是单向的,且一般用于公司大型机房中,主要为了提高服务器的利用率,
  • 将大量的请求通过代理服务器平均分配给所有主机,以提高效率

 访问外网 - fq

 

  • 在国内有的服务器是可以直接访问外网的,这种代理叫做正向代理
  • 把要访问的IP(真实IP)用另一个IP(代理服务器IP)嵌套一层,并加密处理
  • 从国内发送给运营商,运营商拿到这个报文,一看IP是国内的IP(代理服务器IP)就通过了
    (运营商没有密钥无法解密,就无法看到我们真实想访问的IP)
  • 代理服务器拿到这个报文,进行解密然后根据IP发送给国外的服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值