网络层协议

网络协议层

IP地址:用于在网络中唯一标识主机

1、IP地址分类

1、按照接收者分为四类:单播地址(unicast address)、多播或组播地址(multicast address、广播地址(broadcast address)、任播(anycast)

  • 单播(unicast)地址:连接接收者是某一个单一的主机
  • 组播(multicast)地址:连接接收方是一组注册过的多个主机,细分为两类

    1. 任意源组播(ASM any-source):接收者主机加入组播组后可接收到任意源发送到该组的数据。为了提高安全性,可以在路由器上配置针对组播源的过滤策略,允许或禁止来自某些组播源的报文通过。最终从接收者角度看,数据是经过筛选的。
    2. 特定源组播(SSM source-specific):接收者主机在加入组播组时,可以指定只接收哪些源的数据。加入组播组后,主机只会收到指定源发送到该组的数据。SSM模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。
  • 广播(broadcast)地址:连接发送给同一网络中的所有主机(无差别的接受)

  • 任播(anycast addresses):任播地址是多个设备共同拥有的,源设备发送数据包给任播地址时,路由器会将其发送给其中的一台设备,通常是距离最近的一个

2、子网络:网络的进一步细分

  • 子网地址:将网络进一步细分,是将主机编码部分的若干位分配到网络部分作为子网地址

  • 子网掩码(Subnet Masks):用于给边界路由器指出子网编号与主机编号的分界位置(主要实现方法是:通过IP地址的二进制表示与掩码的二进制表示做按位与运算(&)得到的结果为子网络的网络编号)IPv4和IPv6都用”/n”来表示掩码,”n”为掩码的位数

  • 变长子网掩码(VLSM variable-length subnet masks):同一个网络编号使用不同长度的掩码来使得不同的子网络连接不同数量的主机量

  • 子网络的广播地址(Broadcast Address):子网络编号+标识主机编号的位数都为1的组合就是该子网的广播地址

3、IP路由:主机收到IP数据包,先检查IP地址是否是自己的接口IP或者自己所在网络的组播或广播地址,如果是则直接交给IP包中封装的上层协议,如果不是自己的接口IP,则分为两种情况,如果主机IP层设置作为路由器则转发出去,否则数据包将被丢弃

  • 路由表(Forwarding Table):缓存在本地的转发表

    路由条目包含的信息:

    目的网络ID(Destination):32位(或者128位)目的IP & 掩码的结果,目的网络编码
    掩码(Mask):子网掩码,用于与目的IP做”&”运算得到目的网络的地址
    下一跳(Next-hop):数据包即将到达的下一个路由器
    接口(Interface):将数据包发送到下一跳的出站接口IP地址

  • IP路由行为(IP Forwarding Actions):最长前缀匹配算法
    网络层协议_第1张图片
    D^m(j)=d(j),D是目标IP,m(j)为掩码,j为掩码的长度,d(j)为目标网络ID,选择匹配的掩码最长的那一条目路由(j值最大的)

4、IP分片和重组

1、IP分片

  • IPv4允许在原发送主机和中间任何经过的路由器处被分片
  • IPv6只允许在原发送方主机处被分片

2、IP重组

  • IPv4和IPv6都只能在到达目的地处被重组,原因在于:同一IP的碎片可以选择不同的路径到达目的地,这样可以提高传输效率
  • 一个IP数据报的任何一个分片首先到达时,IP层就会启动一个重组计时器(为了防止接收方缓存被用尽),重组计时器的超时时间一般位30s或60s,收到任何一个分片时即使器就开始计时,且收到新的分片也不会被重置,当重组计时器超时数据报还没有被重组完成,则会丢弃掉所有收到的碎片并发送ICMPv4超时消息告知发送方

2、IPv4:32位(网络编号+主机编号)唯一标识网络中的主机(通常使用十进制表示:128.42.5.24)

1、IPv4分类地址:按照网络编号与主机编号的长度划分为5类

  • A类地址: 单播地址 网络编号占用前1个字节,主机编号占用后三个字节,且最高位为0(范围为0.0.0.0~127.255.255.255)
  • B类地址: 单播地址 网络编号占用前2个字节,主机编号占用后两个字节,且最高两位为10(范围为128.0.0.0~191.255.255.255)
  • C类地址: 单播地址 网络编号占用前3个字节,主机编号占用后一个字节,且最高三位为110(范围为192.0.0.0~223.255.255.255)
  • D类地址: 组播地址 最高四位为1110,剩下位没有限制(范围为224.0.0.0~239.255.255.255)
  • E类地址: 预留地址,最高四位为1111,剩下位没限制(用于以后的网络维护管理协会使用)

由于网络发展迅速导致分类地址总单播地址的数量严重不足,因此有了无类域间路由

2、无类域间路由(CIDR Classless Inter-Domain Routing):是一种ISP分配新地址的方法,通过8~30位可变掩码来区分网络编号部分和主机编号部分,而不单纯像A、B、C那样直接用8,16,24固定掩码长度

3、聚合路由(Aggregation):将多个分散的IP通过掩码聚合成一个主干IP,用来减少路由表的个数

4、特殊用途的IPv4地址

  • 用于内网的IP(不会出现在公共网络上的IP) 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
  • 网络主机回环地址 127.0.0.0/8(eg 本地主机回环127.0.0.1)
  • 用于IPv6转换为IPv4的中继地址 192.88.99.0/24(任意源地址)
  • IPv4多播地址240.0.0.0/4
  • 本地广播地址(受限制的)255.255.255.255/32

5、IPv4数据包格式分为IPv4头部部分和负载数据部分

IPv4数据报格式
网络层协议_第2张图片

  • DF位位1表示数据报不允许分片,DF位为表示数据报允许分片

  • M位为1表示数据报后面还包含更多片段,M位为0表示数据报后面没有片段了

  • 检查和算法

  • ECN显示拥塞通知标识:Explicit Congestion Notification 发生拥塞的路由器对经过路由器的数据包进行标记以此来通知TCP两端网络拥塞状况,用于上层协议处理网络拥塞

  • DSField差分服务:将数据报分为多个类型,并告诉经过的路由器怎么处理数据报
    网络层协议_第3张图片
    网络层协议_第4张图片

  • Options拓展头部
    网络层协议_第5张图片

6、IPv4数据包碎片(fragmentation):

IPv4可以在发送源被碎片化也可以在传送过程中被中间路由器碎片化,碎片只能在目的地重组(允许碎片通过不同的路径到达目的地),且碎片的大小(除了最后一个碎片)必须是8字节的倍数(因为Offset的单位是8字节),且通过IPv4头中的ID号来判断碎片是否为同一个数据报的,通过M位来判断数据报是否还有其他碎片

规定的所有使用IPv4数据报的链路必须满足最小MTU为576字节


3、IPv6:用128位标识网络中的主机

(IPv6通常用16进制表示:5f05:2000:80ad:5800:58:800:2023:1d71,如果中间四位未0可以省略(::102:f001也可以在中间使用Ipv4表示::1.2.240.1 相当与0000:0000:0102:f001)

1、Ipv6地址按照范围空间分类:

  • 本地节点地址(local-node):只允许在同一台主机上交流使用
  • 本地链路地址(local-link):只允许处于同一个子网络范围内的主机间交流使用 ,前缀 fe80::
  • 本地网路地址(site-local):只用于组播,所有在这个网址的主机交流使用
  • 全球地址(global):全网使用

大多数主机在同一网络接口上使用多个不同范围类型的地址

2、IPv6头部格式

网络层协议_第6张图片

3、IPv6拓展头:采用链式结构

网络层协议_第7张图片
网络层协议_第8张图片
- Routing 路由拓展选项头:相当于IPv4中的路由拓展(列出要经过的路由IP地址)
网络层协议_第9张图片
- Fragment 分段拓展选项头:用于IPv6包分段,
这里写图片描述
M位设为0表示这是同一数据包的最后一个碎片,M位设为1表示后面还有碎片

规定的所有使用IPv6数据报的链路必须满足最小MTU为1280字节,IPv6数据报只能在发送源被碎片化不能被中间路由器碎片化,只能在目的地被重组,且碎片大小为8字节的倍数

  • Hop-to-Hop逐跳拓展选项头和Destination目的选项头:这两个选项头都是TLV格式的封装携带者其他类型的选项头

    Hop-to-Hop:每个经过的路由器都必须处理的选项头
    Destination:只有目的IP主机需要处理的选项头
    

    网络层协议_第10张图片
    网络层协议_第11张图片

4、IPv6特殊用途地址

  • ::1/128:本机回环地址
  • ::ffff:0:0/96 IPv4映射地址(只用于内部主机,不用在分组头部)
  • 2001::/32 Teredo地址
  • 2002::/16 6to4隧道中继的6to4地址
  • fc00::/7 唯一的本地单播地址,用于构建内部网络,不用于Internet上
  • fe80::/10 链路本地单播地址
  • ff00::/8 IPv6组播地址,仅作为目的IP地址使用

4、IPv4与IPv6之间相互转化的方法

1、双栈协议(dual stack):网络节点能同时支持IPv4和IPv6就叫实现了双栈协议

2、隧道技术(Tunneling):在一个协议中封装另一个协议的放发

3、IPv4转化为IPv6的方法:

1、IPv4嵌入IPv6中

  • 根据不同的前缀长度选择不同的嵌入格式,u位必须为0,且后缀用0填充至128位
    网络层协议_第12张图片
  • 自动隧道技术:支持这种技术的节点同时支持IPv4和IPv6

4、通过IPv4网络隧道传输IPv6的技术(用于从IPv4到IPv6的过渡机制)

1、Teredo隧道技术:将IPv6数据报封装在IPv4/UDP数据包内用于在只支持IPv4网络中传输及通过NAT

  • Teredo客户机是实现了Teredo隧道接口的IPv4/IPv6主机,在经过资格认证之后,接口会被分配一个特定的以2001::/32为前缀的Teredo地址
  • Teredo服务器用于帮助Teredo封装的IPv6数据包建立直接通道以穿过NAT
  • Teredo中继器(relay)用于两端不能直接连接时,两端都将数据发送到中继器,由中继器提供转发(如果大量客户使用中继器,则中继器处理资源会的消耗比较大,应尽量避免使用中继器)
    网络层协议_第13张图片
    网络层协议_第14张图片

5、Mobile IP:移动IP,依赖与家乡代理服务器

1、移动IP的基本模型:双向隧道


  • 移动的手机等设备称为移动节点(MN)
  • 与之通信的主机设备称为通信节点(CN)
  • MN会被赋予一个有家乡网络的网络前缀的IP地址称为家乡地址(HoA)
  • 当移动设备被移动到另一个网络时会被分配一个地址叫做转交地址(CoA)
  • 家乡代理(HA)一种特殊类型的路由器,部署在网络设置中
  • HA的HoA与CoA之间的关联成为MN绑定
    网络层协议_第15张图片

当MN处于自己的家乡网络时,不需要通过HA直接用HoA与外界通讯
当MN移动到外界连接到一个新网络时,会接受新网络给予分配的CoA地址并向自己的HA发送一个绑定更新信息(绑定CoA与HoA的联系),收到HA的绑定确认信息。绑定后所有的信息通过HA作为路由来转发,并使用一个双向的IPv6分组隧道,这些消息都是通过IPsec的封装安全有效负载来保护,防止伪造绑定更新欺骗

  • 路由优化:为了优化双向隧道带来的路由效率差的问题,允许MN将当前CoA通知相应的CN,允许它们执行无须HA协助的路由

  • 6、IP地址的分配机构

    网络层协议_第16张图片


    7、个人和企业能申请到的IP地址

    1、单个供应商/单个网络/单个地址

    ISP只为用户提供了一个IP地址,用户通常需要拥有家庭局域网(LAN)或无限局域网(WLAN),并使用一台路由器或者主机作为路由器连接到Internet。路由器使用DHCP为家庭用户提供自动的内网地址分配,并执行NAT将内网IP和端口映射为唯一外网IP和端口号
    网络层协议_第17张图片

    2、单个供应商/多个网络/多个地址

    对于需要提供Internet服务的企业来说,需要拥有一个固定的外网IP地址来作为Server的地址,需要内部网络来供员工工作,因此需要构建多个子网络,内网NAT路由器中设置了防火墙,过滤不允许进入的入站范围确保企业内部数据的安全性
    网络层协议_第18张图片

    3、多个供应商/多个网络/多个地址(多宿主)

    • 采用多宿主计算级网络时,server应该尽可能的采用非聚合IP,以便达到网络负载均衡避免一段网络过于拥塞造成丢包(Internet路由采用最长匹配前缀算法)。但服务商更多的是希望提供聚合IP,因为聚合IP可以减少服务商路由器中路由表的条目数量
      网络层协议_第19张图片

    • 多宿主计算机的入站和出站地址控制

      强主机模型(strong host model):发送或接收的单播通信必须与通信传输所经的网络接口相关联,分为强主机发送行为和强主机接收行为
      网络层协议_第20张图片

      弱主机模型(weak host model):发送或接收的单播通信不须与通信传输所经的网络接口相关联,分为弱主机发送行为和弱主机接收行为
      网络层协议_第21张图片


    8、系统配置:DHCP和自动配置


    9、防火墙

    1、包过滤防火墙:一个互联网路由器,能够丢弃符合(或者不符合)特定条件的数据包。

    网络层协议_第22张图片
    - 过滤器或访问控制列表:用来设置规定丢弃(或转发)数据包的标准,简单的过滤器包括网络层报头或传输层报头中各个部分的范围比较(如IP地址或选项等)。通常情况下过滤器会全力阻拦来自外网的恶意流量,但不会限制从内网到外网的流量
    - 无状态过滤器和有状态过滤器:无状态过滤器:单独处理每一个数据报;有状态的过滤器:能够通过关联已经或者即将到来的数据包来推断流或者数据包的信息(数据报分段)
    - ACL(Access Control Lists)访问控制列表:列出了什么类型的 数据包需要被丢弃或转发的基本政策
    - 在配置一个NAT路由器时,网络管理员通常配置一个或多个ACL。每个ACL包含一个规则列表,每个规则通常包含模式匹配条件(pattern-matching criteria,通常允许规则表达网络层或传输层中的包字段值(例如源和目标IP,端口号,方向等))和对应的动作(action)
    网络层协议_第23张图片

    2、代理防火墙:一台运行一个或多个应用层网关(ALG)的主机,该主机拥有多个网络接口能够在应用层中继两个连接之间的特定类型的流量(通常不像路由器那样做IP层的转发)

    网络层协议_第24张图片

    • 代理防火墙相比包过滤防火墙更安全,但是缺乏灵活性,必须为每个传输层服务设置一个代理,任何要使用新服务必须安装一个相应的代理,并通过该代理来操作发起连接
    • HTTP代理防火墙(HTTP proxy firewallz):web代理,只用于HTTP或HTTPS协议(web服务)
    • SOCKS防火墙:用于web之外的服务,为使用SOCKS代理,应用程序在开发时必须添加SOCKS代理支持功能,同时通过配置应用程序能够获知带的位置继器版本,配置完成,客户端使用SOCKS协议请求代理进行网络连接,也可选择性地进行DNS查找

    10、网络地址转换NAT

    为了解决IPv4地址日渐枯竭的问题,NAT允许在互联网的不同地方重复使用特定的相同IP地址(内网IP)。其主要方法就是重写一个方向传输数据包的源IP地址和另一个方向传输数据包的目的IP地址
    网络层协议_第25张图片
    - 提供使用的私有内部IP地址范围:10.0.0.0/8;172.16.0.0/12;192.168.0.0/16

    1、传统的NAT:包括基本NAT和NAPT

    • 基本NAT:只执行IP地址的重写,端口号保持不变,本质上就是将私有地址改写为一个公有地址,(联网的主机数只能小于等于公有IP的个数,基本NAT无助于减少需要使用的IP地址的数量

    • NAPT:使用传输层标识符(TCP和UDP的端口号,ICMP的查询标识符)来确定一个特定的数据包到底和内网中的哪台主机关联(极大的减少了IPv4地址的需求),如果查询不到端口映射的条目则数据包将会被NAT丢弃
      网络层协议_第26张图片

    • NAT会话(session):NAT创建的一个内部状态用于记住当前正在处理的一个新连接(状态包括NAT映射)
    • NAT映射(mapping):客户端原端口号和IP与之对应的外部端口号和IP组成的条目

    2、NAT与TCP

    • 当NAT内部客户端发送SYN包时会在NAT生成NAPT条目(记录端口与内部IP和端口号的对应关系),并开启一个连接计时器,如果在连接计时器超时前没有收到ACK,则该NAT会话将被删除
    • 当收到服务器的SYN+ACK回复时,NAT会转发数据报,清楚连接计时器,同时开启一个会话计时器(超时时间按小时计算),每次收到任意一边的数据包时会话计时器时间会被重置,如果会话计时器超时,NAT可能会向内部主机发送一个探测数据包,如果收到内部主机的ACK则重置会话超时器,如没有收到响应(在关闭计时器超时前)或则收到RST数据报,则删除会话
    • 当最后一个FIN的ACK发送后,NAT会主动删除这个连接的NAT会话
    • Peer-to-Peer同步连接:两端同时发送SYN,同步开启连接时,如果外网端先到
      达NAT,外网发送的SYN包将被丢弃,如果在6秒内内网SYN没有到达NAT并开启连接会话,NAT将会发用一个错误信息给外网主机
      网络层协议_第27张图片

    3、NAT与UDP

    由于UDP没有连接状态,所以对于NAT会话的删除需要采用另外的计量方法

    • 映射计时器:(要求超时时间为2分钟以上,推荐为5分钟)当内部主机向外部发送数据时会刷新映射计时器,如果计时器超时,则删除该NAT会话
      网络层协议_第28张图片
      由于UDP分段时,除了第一个分片有UDP头部,其他分片都不含有UDP头部(UDP头部中包含端口号信息),NAT不能正确处理不含端口号的数据包,因此UDP分片不能被NAT正确处理,应该尽量避免UDP分段。

    4、NAT与ICMP

    ICMP包分为两类:

    • 1.错误信息:当数据包传输途中出现错误路由器会发送一个错误信息数据包给发送者,通过NAT时,通过端口映射该写信息报中的IP

    • 2.查询信息:内网发出查询ICMP时会有一个查询号(QueryID),可以将查询号作为端口号来进行映射

    5、NAT与隧道数据包

    隧道数据包需要NAT转发时,NAT不仅要修改IP头和传输头,还需要修改负载数据中的封装协议的关于端口号的类容(如Teredo隧道包,需修改IPv4头中的IP,UDP头中的端口号,以及负载数据中IPv6头中的IP)

    6、地址和端口转换行为与过滤行为

    网络层协议_第29张图片
    网络层协议_第30张图片

    7、位于NAT之后的服务器

    • 端口映射(port mapping)又叫端口转发(port forwarding):NAT通过入站数据包的端口号来确定转发的内部主机IP
      位于NAT之后的服务器,需要采用服务器的内部地址和提供服务的端口号来静态配置NAT,然后通过端口转发来提供寻址(端口转发时一个始终存在的静态NAT映射)

    8、NAT回环(loopback)

    允许同处于内部的两台主机之间通过映射的外部IP和端口号交流
    网络层协议_第31张图片

    9、SPNAT(Service Provider NAT)/CGN(carrier-grade NAT)/LSN(large-scale NAT)

    服务商提供的NAT,将用户都分配内网IP,减轻IPv4地址的分配空间不足的压力

    10、NAT穿越(NAT traversal):解决内部主机与外部主机的Peer-to-Peer通讯

    • 针孔(Pinholes):隔着NAT的主机建立起来的NAT映射,使得两边特定应用程序(IP+端口号)的数据包能够通过NAT映射发送给对方,这种NAT映射就叫做针孔
    • 打洞技术(Hole Punching):一种让两个隔着NAT的主机通过针孔建立连接交流的技术。其实现主要是:两端客户端通过主动与公网上的已知的集中服务器建立连接来建立自己的NAT映射,这样集中服务器就能够知道两边客户端的NAT公用IP和分配给客户端的端口号信息,然后集中服务器将两边的NAT转换后的IP和端口号发送给对方,让两边自己建立连接(这种连接必须是NAT使用终端无关映射才可以使用)
    • 单边自地址修复UNSAF(UNilateral Self-Address Fixing):应用层连接交流通过NAT时使用的IP地址的更改叫做地址修复,应用程序在没有NAT的协助的情况下修复它的地址的行为叫单边地址修复
      网络层协议_第32张图片

    1、STUN(NAT会话穿越工具:适用于一端在内网中,另一端在外网中的Peer-to-Peer通信

    STUNN是一个相对简单的客户机/服务器协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器
    之后的主机之间创建通信
    网络层协议_第33张图片

    • STUN协议使用UDP、TCP、或者结合TLS的TCP来作为传输层,TCP和UDP使用的端口号为3478,TCP/TLS端口号为3479
    • STUN协议事务分为两种类型:请求/相应事务、标志事务(标志事务不需要相应)
      网络层协议_第34张图片
    • STUN一般封装在UDP负载数据中通过UDP/IPv4传输
    • STUN协议定义了一个简单的keep-alive探测机制,可以保证NAT会话不超时

    2、TURN(NAT中继穿越):适用于两端在不同的NAT之后的Peer-to-Peer通信

    需要一个TURN中继器在NAT两端传递转发数据
    网络层协议_第35张图片
    - TURN采用了STUN报文形式,其中报文类型时一个分配请求
    - TURN缺点在于运维TURN中继服务器的投入很大,为了满足传输数据量的需求,中继设备的内存必须足够大,因此在其他直接连接手段都失败的情况下使用

    3、ICE(交互式连接建立)

    是一种使用STUN和TURNd的选择机制,致力于在通信各端之间建立一条最有效的通道:等直连就直连,必要时使用STUN协议,再不行就用TURN
    在实际开发中,如果想构建Peer-to-Peer应用程序,应该选择现有平台的APPI,或者实现了ICE、STUN、TURN的第三方库


    你可能感兴趣的:(tcp\ip)