目录
动态主机配置协议-DHCP: Dynamic Host Configuration Protocol
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