飞道的博客

计网学习笔记十四.网络层(中)

339人阅读  评论(0)

目录

DHCP协议(主机如何获取IP地址)

硬编码,静态配置

动态主机配置协议-DHCP: Dynamic Host Configuration Protocol

网络地址转换(NAT)

为什么要用NAT?

实现

NAT穿透问题

互联网控制报文协议(ICMP)

例外情况(不发送ICMP的情况)

ICMP报文的格式

ICMP的应用举例:Traceroute

IPv6

IPv6数据报格式

其他改变 vs IPv4

IPv6地址表示形式

IPv6基本地址类型

IPv4向IPv6过渡


DHCP协议(主机如何获取IP地址)

一个主机如何获得IP地址?

硬编码,静态配置

默认网关:当IP分组要离开当前子网时,就把此分组传到网关,由网关决定下一步;这个子网中的其他主机也必须配置默认网关是这个地址。

如果子网还有另一个路由器,那可以配置默认网关地址为另一个路由地址,总之默认网关是路由器与当前子网相连的地址。

配置DNS服务器,这之前学过

动态主机配置协议-DHCP: Dynamic Host Configuration Protocol

DHCP是使用最广泛的动态获取IP地址协议:

  • 从服务器动态获取: IP地址 、 子网掩码 、 默认网关地址 、 DNS服务器名称与IP地址(不光能获取IP)
  • 即插即用,只要主机能运行DHCP协议,网络中配置了DHCP服务器,主机连上网就可以使用
  • 允许地址重用!如果主机关机后,租用的IP地址就会还回去,DHCP可以把这个IP给其他主机使用
  • 支持移动用户加入网络, 支持在用地址续租

过程:

  • 新主机要广播,利用子网的广播地址,因为它不知道是否存在DHCP服务器
  • 如果DHCP有多台服务器,也会通过广播响应主机
  • 主机请求IP,请求报文
  • DHCP 确认报文

DHCP discover

  • src : 0.0.0.0, 68,源主机地址0.0.0.0,之前讲过它能在本网范围表示主机,68是DHCP规定的客户端端口号
  • dest.: 255.255.255.255,67,目标地址是本网的广播地址,端口号是67
  • yiaddr: 0.0.0.0,your ip address缩写,目前不清楚所以是0.0.0.0
  • transaction ID: 654,指定一个事务ID
  • 这个报文广播后,本网所有主机都会收到,但只有DHCP主机做出响应

DHCP offer

  • 如果DHCPserver愿意分配IP,就发送offer报文
  • src: 223.1.2.5, 67,源主机地址
  • dest: 255.255.255.255, 68,目标地址
  • yiaddr: 223.1.2.4,我给你分配的IP地址是223.1.2.4
  • transaction ID: 654 lifetime: 3600 secs

DHCP request(利用刚分配的IP发送一次请求)

  • src: 0.0.0.0, 68
  • dest:: 255.255.255.255, 67,为什么这次还是广播?因为如果本网有多个DHCP 服务器,会告知其他服务器,主机已经有了一个IP,其他服务器就会收回自己给新主机分配的IP
  • yiaddr: 223.1.2.4 ,上次分配的IP
  • transaction ID: 655 lifetime: 3600 secs

DHCP ACK(确认后,主机就可以使用这个IP,真正完成IP绑定)

  • src: 223.1.2.5, 67
  • dest: 255.255.255.255, 68
  • yiaddr: 223.1.2.4,实际上报文中不止有IP,还有子网掩码等等
  • transaction ID: 655 lifetime: 3600 secs

DHCP是应用层协议,使用UDP,IP,  DHCP服务器内建在路由器中。

DHCP服务器构造 ACK报文  包括分配给客户的 IP地址、子网掩码 、默认网关、DNS 服务器地址

 

网络地址转换(NAT)

从DHCP获取的IP地址从哪来?从ISP服务商,又从哪里来,ABCDE类地址其实使用殆尽,大部分主机用的是私有IP地址,私有IP不能够直接在互联网上使用,所以需要把私有IP转换为公有IP

右边子网内的主机号都一样,数据报经过路由器,会改变包内的源IP地址和端口号

为什么要用NAT?

实现

依靠NAT转换表

演示过程:

支持数量:

  • NAT靠端口号给子网的主机进行,发到外网的数据报会改变端口号。端口号有6w多个,标识16-bit端口号字段: 可以同时支持60,000多并行连接!

存在争议:

  • 路由器应该只处理第3层功能,意思是NAT嵌入到了路由器中,把已经封装好的IP数据报,拿出来又给改了 ,路由器属于第三层网络
  • 违背端到端通信原则,端口号是传输层使用,其它层不应该修改端口号,导致传输层开发者必须考虑NAT,比如P2P应用
  • 地址短缺问题应该由IPv6来解决

NAT穿透问题

其实路由器也相当于是个主机,他有公有IP,有端口,他把自己的端口与内网其他主机的私有ip一一对应。

  • 方案1:在nat上配置内网服务器和路由端口的关系,建立转发表
  • 方案2:路由能够运行UPnP协议,自动获取NAT的出口IP,然后自动增删转发表,自动分配内网服务器地址和路由器里端口的关系。
  • 方案3:内网主机与中继相连,外网客户端也与中继 相连,通过中继通信。但中继怎么把数据报发到内网主机的呢?没讲

       

互联网控制报文协议(ICMP)

互联网控制报文协议 ICMP (Internet Control Message Protocol)支持主机或路由器,这协议两个作用

  •  差错(或异常)报告
  •  网络探询

对应两类ICMP 报文:

1.差错报告报文(5种)

  •  目的不可达,如果报文到不了路由器、目的主机、或者端口,会给源主机一个ICMP包
  •  源抑制(Source Quench),如果因为路由器缓存满了,把包丢弃了,告诉源主机不要发太快,但实际没有这样做
  •  超时/超期,ttl超时(一个数据报能经过的路由器数量,减到0就不能再继续发送),如果ttl超时,路由器会告诉原主机
  •  参数问题,如果路由器在转发数据报发现报上头参数有问题,就丢弃并告诉源主机
  •  重定向 (Redirect),当路由器收到一个数据报、路由器认为这个报不应该由自己转发,应该是其他路由器转发,就告诉源主机重定向到其他路由,就是数据报选错了转发路线

2.网络探询报文(2组)(探测网络情况)

  •  回声(Echo)请求与应答报文(Reply) ,如Ping 命令就是用ICMP协议
  • 时间戳请求与应答报文

下图对应了上面说的两种报文及各种分类:

例外情况(不发送ICMP的情况)

几种不发送 ICMP差错报告报文的特殊情况:

  •  对ICMP差错报告报文不再发送 ICMP差错报告报文,ICMP差错报文出过除夕问题就不会再管了
  •  除第1个IP数据报分片外,对所有后续分片均不发送ICMP差错 报告报文
  •  对所有多播IP数据报均不发送 ICMP差错报告报文( IP多播是实现数据一对多通信的模式。从一个源点传送到多个目的地,数据仅仅拷贝一份。这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份。)
  • 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的IP数据报不发送 ICMP 差错报告报文

几种 ICMP 报文已不再使用

  •  信息请求与应答报文
  • 子网掩码请求和应答报文
  • 路由器询问和通告报文

ICMP报文的格式

ICMP不是单独的协议,他的报文是被封装到IP数据部分中。  它的部分由下图组成,前四个字节代表是类型、代码、校验和,接下来四个字节取决于ICMP类型,后面是ICMP数据,即ICMP头部是8个字节

我们知道,当IP数据报出错后,路由器会丢弃那个出错的IP报,并发送ICMP报文,被丢弃的IP出错报,会把它的IP头部和数据内容的前八个字节放入ICMP报文,方便源主机判断出错情况。

如果出错的数据报是UDP,那IP内容的前8个字节正好是UDP的头部,记录了源主机端口等信息;如果出错的数据报是TCP,那IP内容的前8个字节虽然不是完整的TCP头,但也有重要信息。

以上出错信息再加上ICMP本身的头部8字节就组成了 IP的报内容即ICMP报文,再加上IP头部,就作为IP包发送。

ICMP的应用举例:Traceroute

Traceroute探测源主机数据报经过哪些路由器才能到达目的主机。

这个应用挺有意思,利用了ICMP的type和code代表不同情况:

  • 发送的数据报TTL从1开始依次递增,比如发TTL=1,收到了ICMP type=11 code=0,代表TTL超时,但这也证明了到达了第一个路由器
  • 一直递增TTL发送,通过TTL数量,能知道有多少路由器
  • 直到ICMP type=3 code=3 代表目标端口不可到达,因为数据报中的目标端口是目标主机肯定不会使用的,即没有程序运行在目标端口,所以出现这种类型,就代表数据报到了目的主机,而TTL值就是路由器数量

IPv6

之前的内容讲的都是IPv4。别搞混了

  • 基本首部是固定40字节,没有IPV4的选项部分可变字段,但加了扩展首部,作用差不多。路由器转发时通常只处理基本首部,不会出来扩展首部
  • 载荷=(扩展首部+数据)

IPv6数据报格式

  • 4个bit版本号
  • 8个bit优先级,ipv6独有,优先级(priority): 标识数据报的优先级
  • 流标签(flow Label):标识同一“流”中的数据报。目的IPV6根据不同流标签提供不同服务,但怎么实现仍在讨论中
  • 载荷长度:顾名思义
  • 下一个首部(next header): 标识下一个选项首部或上层协议首部(如TCP首部。  如果报中有扩展首部,则这个字段值就指向第一个扩展首部;并且每个扩展扩展首部中都有这个字段,指向下一个扩展首部。如果是最后一个扩展首部,他的next header会指向TCP(数据报所封装的TCP段)的第一个首部;如果报中没有扩展首部,则这个字段直接指向TCP首部。
  • 跳步限制:网络中能够经过的路由器数,跟IPv4的TTL差不多,每经过一个路由器-1,减到0就丢弃
  • 源地址:128位,比IPv4扩展了很多地址

其他改变 vs IPv4

  • 校验和(checksum): 彻底移除,以减少每跳处理 时间
  • 选项(options): 允许,但是从基本首部移出,定义 多个选项首部,通过“下一个首部”字段指示
  • ICMPv6: 新版ICMP ,1. 附加报文类型,e.g. “Packet Too Big(分组太大,超过mtu路由器会丢弃报文,然后告诉元源主机)”  2.多播组管理功能

IPv6地址表示形式

IPv6,多到可以为地球上每个沙粒分配一个IP

  • 一般形式:用冒号分割,8个16进制数,一个冒号16位
  • 压缩形式:连续多个0,用两个::  (冒号)表示,但冒号不能连续多个,因为两个冒号本身就是多个0,没规定是多少0
  • IPv4-嵌入形式:若前80bit都是0,后16bit都是1,则把剩下的32位可以用IPv4的形式表示,IPv4格式是32位
  • 地址前缀:不再使用子网掩码的概念。全部用CIDR 斜杠形式 多少位是网络号,表示网络范围
  • URLs:冒号容易有歧义,在url表示用中括号括起来IPv6地址

IPv6基本地址类型

IPv4向IPv6过渡

IPv4和IPv6共存的方法:把IPv6的数据封装到v4载荷上,突然感觉这技术思路也很简单,跟平常代码封装类差不多,思路都是想通的。

刚开始传送IPv6数据报,第一个路由器是能处理IPv6的,将v6包封装到v4,后面的路由器允许只具备处理IPv4的能力,然后最后的路由器需要能处理IPv6,把数据拿出。


转载:https://blog.csdn.net/u014203449/article/details/116791102
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场