目录
今日良言:守得月开见月明,静待花开终有时
一、地址管理
前面介绍了传输层的两个重要协议,接下来介绍一下网络层的代表:IP协议
首先来看一下IP协议格式:
接下来,详细介绍一下报头结构:
4位版本号:这里的取值只有两个4 和 6 4表示IPv4 6表示IPv6 这里介绍IPv4版本
4位首部长度:描述了IP报头多长(IP报头是变长的),报头中有一个是选项部分,是变长的,可有可无的,此处的单位也是4字节.
8位服务类型(TOS):说是8位,实际上只有4位有效,这4位中,只有一位可以是1,其它的都是0,4位就表示IP协议的四种形态/四种工作模式. 4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个 .
16位总长度(字节数):描述了一个IP数据报的长度(报头+载荷),减去前面的首部长度,得到的就是一个完整的TCP/UDP数据报的长度.
16为总长度是不是就意味着一个IP数据报的最大长度是64Kb?
确实有这样的限制,但是,IP协议自身就支持对包的拆分和组装,一个IP数据报携带的载荷数据太长了,超过了64Kb,就会在网络层针对数据进行拆分,把一个数据拆成多个IP数据报,再分别进行发送. 接收方接收到后,再进行组装.
此处说是64kb,但是实际上,IP协议拆包不一定就是按照64kb为单位进行拆包,实际的往往更小(取决于数据链路层的情况)
上面这三个子弹都是辅助拆包/组包的.
16位标识:同一个数据报拆分成的多个包的标识一样.
3位标志:结束标志.
13位片偏移:标识了多个包的先后顺序.
8位生存时间(TTL):一个数据报在网络上能够传输的最大时间.
这个时间的单位不是秒,而是次数.一个数据报构造出来,会有一个初始TTL数值比如(32 64 128...),这个报每次经过一个路由器转发,TTL-1. 如果TTL减到0,还没有到达目标,那么就认为这个包永远也到达不了了,就可以丢弃了.
8位协议:描述了当前载荷部分内容是属于哪个协议的(TCP/UDP).
16位首部检验和:只针对首部进行检验,因为载荷有自己的校验和.
接下来是IP协议中最重要的部分!!!.
此处看到的IP地址都是32位整数,但是日常看到的则是一串数字.比如:192.168.192.1
这是因为,使用了三个 . 把32位,4个字节的数字给分割开,分成4个部分,每个部分分别使用0-255十进制整数表示,这个方法就叫做"点分十进制".
ip地址,我们期望每个设备都不相同,但是IPv4 32位数字,只能表示42亿90千万个数字,用这些数字表示全世界所有的上网设备,IP地址显然是不够用的.
那么如何解决IP地址不够用呢?主要有以下办法:
1).动态分配IP地址.
原则上是将一个IP地址分配给多个设备,哪个设备上网,哪个设备就使用.此时就可以省下一批IP地址了.但是这个方法并没有从根本上增加IP地址,只是提高了IP地址的利用率.
2)NAT 网络地址转换
本质上就是使用一个IP地址代表一批设备.也能够大大提高IP地址的利用率,具体的设备使用端口号来进行区分.
以下图为例.多个设备经过同一个路由器去访问同一个服务器.
上述过程,只要IP数据报是经过运营商路由器转发给服务器,服务器看到的源IP都是一样的.
如果是多个设备同时访问一个服务器,服务器的响应就会先发给路由器,路由器根据这些设备不同的端口来进行区分,决定发给哪个设备.
在NAT背景下,就把IP地址分成了两大类:
1).内网IP(私有IP)
内网IP:10.* 172.16*-172.31.* 192.168.*
2).外网IP(公网IP)
除了上述内网IP,其他的都是公网IP.
NAT要求,公网IP必须是唯一的,私有IP可以在不同局域网下重复出现.
如果某个内网中的设备想要访问公网的设备.就需要对应的NAT设备(路由器),把IP地址进行映射,从而完成网络访问.
反之,公网设备无法直接访问内网的设备,不同局域网内的内网的设备没法互相访问.
NAT机制能够有效的解决IP地址不够用的问题,但是带来的副作用是使网络环境更复杂了.
3)IPv6
IPv6从根本上解决了解决了IP地址不够用的问题.
IPv6使用16字节(128位 42亿*42亿*42亿*42亿)表示IP地址
虽然IPv6看起来好像非常美好,但是实际上,当前互联网世界,仍然是以NAT+IPv4+动态分配来进行网络组建的,真正使用IPv6的地方非常少.
IPv6不仅贵,而且与IPv4不兼容,如果想要支持IPv6就需要更换路由器等网络设备.世界上有一个地方,IPv6的普及程度非常高,差不多已经80%,那就是我国.
接下来介绍一下,IP协议的地址管理.
先来介绍一下两个名词:网络号和主机号.
网络号 : 标识网段 ,保证相互连接的两个网段具有不同的标识;主机号 : 标识主机 ,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
把一个IP地址,分成了两个部分,一个部分叫做网络号,一个叫做主机号.
比如:192.168.0.10 网络号是192.168.0 主机号是10.
同一个局域网中的设备,网络号是相同的,主机号都是不同的.
那么,为什么要划分网络号和主机号呢?
就是为了组网.
一个IP地址,如何划分网络号和主机号呢?
这里引入一个单独概念:子网掩码.
网络号不一定就是前三个字节,可以动态变化,此处的255.255.255.0 就是子网掩码.
255.255.255.0 用32位来表示:
11111111 11111111 11111111 00000000
左侧的部分都是1 右侧的部分都是0
1的部分就描述了IP有多少位是网络号.
对于家用设备来说,子网掩码最常见的就是:255.255.255.0
介绍几个特殊的IP地址:
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;比如:192.168.0.255 使用UDP往这个地址上发送数据,整个局域网所有设备都能收到.127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
二、路由选择
这也是IP协议一个非常重要的功能,路由原则非常复杂,比TCP要复杂的多,这里只简单介绍一下:
路由选择就是规划路径,相当于平常出行使用地图导航.
由于网络环境非常复杂,任何一个节点(路由器)都是无法感知到网络环境的全貌的.
一个路由器最多只认识它周围的设备,进行一个比较长的路径的转发,就需要边转发边问.
路由选择核心思路:问路.
每个路由器都会保存一定的周围设备的信息,称为路由表.
每次有一个IP数据报经过路由器,就需要匹配路由表,看看接下来该如何走,如果路由表上有匹配的项,直接按照要求走即可,如果没有匹配的项,路由器会提供一个默认的路径,大体方向是不会错的,于是继续沿着这个方向继续走继续问.
每经过一个路由器,TTL - 1 ,如果减到0了,还没有到,说明这个包永远也不会到了,此时就会被丢弃.
上述过程都是从简说明路由选择,实际的路由选择会复杂的多,但这里就不做详细介绍了.