这里写目录标题
- IP协议
-
- 基本概念
- 协议头格式
- 网段划分
- 特殊的ip地址
- 私网ip地址和公网ip地址
- ip地址的数量限制
- 路由
IP协议
IP协议:其实就是TCP/IP协议中对于网络层的一个协议(注意IP协议是TCP/IP协议族中最为核心的协议,因为对于上层的数据,都会以IP数据报的格式进行传输)。
基本概念
由于IP协议是网络层的协议,那么我们首先了解一下网络层主要是解决什么问题的:
1.网络层:主要任务是实现网络互连,进而实现数据包在各网络之间的传输。
- 如果对于一个小型网络而言,它只是实现其内部通信,那么只需要实现这个自己所在网络中的数据链路层和物理层即可。(因为在同一个网络中的主机并不需要网络层去选择路线进行转发数据)
- 对于一个大型网络而言,它包含有很多小型网络,而对于这不同小型网络上的主机在进行数据传输的时候,就必须由网络层进行路由划分,选择合适的路径将数据报转发给目的主机。
如上图:对于不同网络的主机B和主机C进行通信,会将数据经过多个路由器进行转发,最后到达目的主机。
路由器作用:目前在上图的作用是链接的不同的网络,对网络层的要传输的数据报进行解析,从而给其寻找路径(寻找通向目的主机的道路)和转发数据。
2.要实现网络层的这些任务,要解决的问题有哪些?(这些问题我们会在下面一一解答)
- 网络层向上层提供的是什么服务。
- 网络中的寻址问题。
- 路由选择问题。
通过上面的网络层主要的任务和解决的问题,我们可以看到,对于IP协议,它主要任务是负责地址管理和路由选择。
注意:在学习的时候我们经常会了解到IP协议提供的是不可靠,无连接的数据包传输服务。
其实是这样的:
- 不可靠:IP协议不能保证IP数据包能成功的到达目的地。(由于IP协议仅提供最好的传输服务,所以对于一些数据报出现传输错误的时候,它有一个最简单的处理方式,就是丢弃该报文,但是这可以理解为IP协议的默认处理方式,但是如果它的上层协议为TCP协议(我们知道TCP协议提供的是可靠的,有连接的服务),那么对于IP协议此时对出错的数据包会进行对应的挽救措施,所以对于可靠服务还是不可靠服务取决于上层的规定。
- 无连接:IP协议并不维护任何关于后续数据报的状态信息。(在IP协议中,每个数据报的处理都是相互独立的。也就是说,IP协议对数据报的的接收顺序可以不按照发送顺序进行,也就是对于同一个主机向另一个主机发送数据,而在网络层的这些IP数据包,会选择不同的路径进行传输)
协议头格式
如下图:
如图,我们可以看到一个IP协议的数据包头部格式(其中横向表示的是32个比特位,从左到右是0~31,这样安排的原因是,对于在TCP/IP首部中的所有二进制整数都是按照大端字节序的传输方式(首先是0 ~ 7bit,接下来是8 ~ 15bit依次往后),所以也叫做网络字节序(大端))。
大概上面这些部分,每个部分所代表的内容如下:
- 4位版本号:用于表示协议的版本。(也叫ipv4)
- 4位首部长度:用4个bit位去表示IP首部的长度,由于4个比特位最大代表的数字为15,所以首部最长有60个字节。(以4字节为单位,而4比特位最大表示15,然后*4,所以首部最长有60个字节)
- 8位服务类型:占有8bit位,其中分布如下:
①3bit位的优先权子字段。(现在已经丢弃)
②4bit位的TOS子字段。(分别表示:最小时延、最大吞吐量、最高可靠性、最小费用)
注意:这4位只能置其中的1bit位。(因为这四者是相互冲突的,而对于不同的应用而言,会对不同的数据传输时不同方面要求是不同的,例如:FTP文件传时协议要求的是有最大吞吐量,其的TOS值中将最大吞吐量的位置置为1,其余为0。 如果这4个bit位全为0,那么只指该服务为一般服务。)
③1bit位的保留。(为了以后扩展用,但是必须制位0位)
- 16位总长度:总长度字段代表的是IP数据报的总长(报头+数据),其中根据首部长度和总长度,我们就可以知道这个IP数据报中内容的其实位置和长度。由于总长度为16为,所以能表示的数据报的最大长度为2的16次方,也就是64k。(非常重要,因为如果一个数据报很少,所以需要填充一些数据以达到最小的长度,如果这个时候没有总长度字段,我们就无法知道那些需要传输的数据是多少,此时就不会将填充字段误以为是数据进行接收)
- 16位标识:唯一标识该主机发送的数据,用于数据被分片后在接收端进行重组的时候,标识当前的分片属于哪个原始报文,相同的原始报文的分片具有相同的分片标识。
链路层的MTU:为最大传输单元,限制一个数据帧在网络中的传输大小。(如果IP层有一个数据报要传递,而且数据的长度要比链路层的MTU还要大,那么该数据报在IP层要进行分片处理,把数据报分成若干片,这样每片小于MTU就可以进行传输)
- 3位标志:其中每个bit位的作用如下:
①第一个bit位保留。(现在不用,为以后扩展留用)
②第二个bit位表示禁止分片。(此时如果数据报的长度超过MTU,那么IP模块就会丢弃该数据报)
③第三个bit位表示"更多分片"。(如果分片了的话,最后一个分片置为1,其他置0。也就类似一个结束标志)
- 13位片偏移:是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原始报文中处在哪个位置。并且他是以8字节为单位的(因为13位最大表示的数据为8192,而一个原始数据报的大小为64k,是81928得到的),意思为实际偏移字节数是这个值8得到的。因此除了最后一个报文外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
- 8位生存时间TTL:数据报可以经过的最多路由器的数量,它指定了数据报的生存时间。TTL的初始值一般是由源主机给定,一旦经过一个路由器,该值就会-1,当该值为0时,数据报就会被丢弃,并发送ICMP报文(告诉其报文传输失败)通知源主机。
- 8位传输层协议:用于表示上层协议。(由于数据在传输到对方的时候,会进行数据分用,也就是要选择一个传输层的协议去解析数据,而此时源端与目的端的传输层协议必须一致,所以该字段可以让目的端知道用什么协议进行解析)
- 16位首部校验和:校验数据是否一致。(使用CRC来进行校验,来鉴别头部是否损坏)
- 32位源ip地址和32位目的端ip地址:用于表示通信的两端主机。
- 0~40字节选项数据:记录一些信息,大多是对于路径了,时间了一些的信息。(但是使用很少,并且并不是所有的主机和路由器都支持)
网段划分
我们知道,ipv4地址是一个uint32_t类型的数据,那么它对应的IP地址数量大概有42亿9千多万个,所以其实IP地址是不够的,而我们是如何设置IP地址才能让每台主机的IP地址不重复呢?
答:为了解决这样的问题,所以也就出现了分网络进行地址管理,一个网络中的主机能够被分配到的IP地址都会具有相同的网络号,这个时候,只要每个网络的网络号不同,那么就可以将网络地址简单管理了。
1.IP地址的组成:网络号+主机号。(其实也是网络中唯一标识一台主机)
其中:
- 网络号:保证相互连接的两个网段具有不同的标识。(一个网络分配的IP地址中网络号是相同的)
- 主机号:同一网段内,主机之间具有相同的网络号,但是各自的主机号不可相同。(是一台主机在该网络中的标识)
①:通过合理的设置主机号与网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。
②:IP地址占用4个字节,32个bit位,并且采用点分十进制表示。
2.DHCP技术
①:由于手动管理IP地址,是一件非常麻烦的事情,所以推出了DHCP技术。
②:DHCP技术是一种动态分配IP地址的技术,能够自动的给一个网络中新增加的主机分配IP地址,避免了手动管理IP地址带来的不便。(而一般的路由器都会带有DHCP功能,因此路由器也可被称作DHCP服务器)
3.早期网段划分
早期的网段划分中,将所有的IP地址分为五类,如下图所示:
其中:
- A类IP地址:网络号占1个字节并且网络号最高一位固定为0,主机号占3个字节。(所以对于A类IP地址,它表示的网络号很少,但是每个网络中对应的主机号量很大,适合用于组建超大型网络)
①:A类IP地址的网络号范围:0~127。
②:A类IP地址的每个网络中最多有255255255个主机。(由于是点十分表示方法,所以每个字节对应一个段,而一个字节所表示的最大数量就是255)
③:A类IP地址的范围为:0.0.0.0 ~ 127.255.255.255。
- B类IP地址:网络号占2个字节并且网络号最高两位固定为10,主机号占用2个字节。(用于组建一些中型网络)
①:B类IP地址的网络号范围:128.0 ~ 191.255。
②:B类IP地址的每个网络中最多有255*255个主机。
③:B类IP地址的范围为:128.0.0.0 ~ 191.255.255.255。
- C类IP地址:网络号占3个字节并且网络号最高三位固定为110,主机号占用1个字节。(用于组建小型网络)
①:C类IP地址的网络号范围:192.0 ~ 223.255。
②:C类IP地址的每个网络中最多有255个主机。
③:C类IP地址的范围为:192.0.0.0 ~ 223.255.255.255。
- D类IP地址:多播地址,最高四位固定为1110。
- E类IP地址:保留地址,最高五位固定为11110。
(由于能分配给网络中主机的IP地址只有A类、B类和C类,所以对于D类和E类就不做过多了解)
4.由于现代的网络发展速度飞快,大多数组织基本上都申请B类网络,所以导致B类网络地址很快就被分配完了,而A类却浪费了大量地址(由于A类中每个网络号对应的的主机号的数量实在太大了,而对于一个网络而言,他一般情况下是不会存在有这么多的主机号的)。所以针对这样的情况,引入了一个新的划分方案CIDR方案。
①:CIDR方案中提出引入一个新的字段-----子网掩码。
②:子网掩码:是一个uint32_t类型的数据(也就是和IP地址一样,使用的是4个字节,并且表示方法也是以点分十进制表示),但是其中的数据是由连续的二进制1组成。
特点如下:
- 引入一个额外的子网来区分网络号和主机号。
- 子网掩码通常以二进制连续的0来结尾。
- 将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号。
- 网络号与主机号的划分与这个IP地址是A类、B类还是C类无关。
这样不管是A类、B类还是C类IP地址,都可以在IP地址下去划分子网,这样就大大减少了IP地址的浪费。
如下例子:
①例子1:IP地址与子网掩码相与就可以得到网络号,并且在该子网中,主机号占有一个字节,所以子网范围如上所示。
②例子2:IP地址与子网掩码与得到网络号,但是在该子网中,它的最后一个子节的二进制是"1111 0000"(只看最后一位的原因是子网掩码前三个子节的十进制都是255,二进制表示为"1111 1111",这个数与任何数就等于与它与的哪个数),而IP地址的最后一个子节的68表示的二进制是"0100 0100",所以与下来之后是"0100 0000"对应的十进制也就是64,这样就可以得到其网络号是多少,然后由于子网掩码最后的bit位为0的位置有4个,最大数量表示为15,所以子网地址的范围如上所示。
由上面可以了解到,对于子网,也就是取IP地址的一个主机号的几位固定为子网(所以对于网络号所占子节对应的子网掩码所占子节的位置,子网掩码在该范围所占有的bit位全为1),然后在该子网下去划分主机号,这样就可以避免像A类网络那样,每个网络中的主机号庞大。
例如有一个公司申请了一个C类网络192.168.2.0/24(其中/24表示的是子网掩码,从高到底,24个bit位为1,8个bit位为0),这时候要将网络平均划分为4个子网。
则划分的方式为:由于是C类网络,主机号占8个bit位,取最高的两个bit位用来划分,因为2个bit位最大可以表示4个数字(00/01/11/10),而此时这写子网的掩码就为"255.255.255.192"(因为最后一个字节的最高两位已经被占用了),所以每个子网中所含有主机号的数量为剩下的6个bit位所能表示的最大数量。
特殊的ip地址
1.对于可以分配的A类、B类和C类中。
IP地址是由网络号和主机号组成,但是在特定的范围内,并不是每个主机号都可以分配给网络中的主机,其中会有两个特殊的IP地址。
- 一个IP地址中主机号所占bit位全为"0"的地址不能分配给网络中的主机,因为该地址是网络地址,不能分配给主机或者路由器的各接口。(网络地址,作为该网络的唯一标识)
- 一个IP地址中主机号所占bit位全为"1"的地址也不能分配给网络中的主机,因为该地址为该网络的广播地址,将数据发送给局域网的广播地址,而广播地址也就顾名思义,该数据会发送给该局域网中的每个主机。(是udp协议相较于tcp协议多出的一个功能,就是局域网广播)
2.特殊的IP地址:
- 0.0.0.0:用于识别本机上的全部IP地址,也代表这个局域网。(通常用于服务器的绑定监听地址)
- 255.255.255.255:全网广播地址,用于DCHP请求的时候目标主机地址。(原理是因为一个主机连接到一个网络中,会给路由器发送DHCP请求,要求路由器给字节分配IP地址,但是对于网络通信,这个主机必须知道目的端的IP地址,而新连接的主机并不知道,所以此时发送广播数据,只要是在其链路上的路由器接收到后,都会认为这个请求是发送给自己的,然后就给其分配ip地址)
- 127.*:该段的IP地址用于本机环回测试(loop back test),而一般情况下通常是127.0.0.1(该环回地址最为经典)
环回地址:主机向自身发送通信的一个特殊地址。为同一台设备上运行的TCP/IP应用程序和服务之间相互通信提供了一条捷径。通过ping换回地址,可以测试本机上的TCP/IP配置。
私网ip地址和公网ip地址
1.一个组织内部组建局域网,但是IP地址仅限于局域网之间的通信,而不是连接到Internet网上,所以在该局域网中,这些IP地址就是私网IP地址,理论上使用任何IP地址都可以但是不可以与公网IP地址重复,所以RFC1918文档规定:
- 10.*,前8位是网络号。(1个大型私网网段)
- 172.16.* ~ 172.31.* :前12位是网络号。(16个中型私网网段)
- 192.168.*:前16位是网络号。(256个小型私网网段)
包含在这个范围中的,都是私网IP,其余则是全局IP(也称公网IP)。
2.如下图:
- 一个路由器可以配置两个IP地址,分别为LAN口IP地址(子网IP地址)和WAN口IP地址(公网IP地址)。
- 而对于一个路由器而言,连接LAN口IP地址的主机,都是从属于这个路由器的子网中的主机。
- 对于不同路由器而言,它们的子网IP通常都是一样,几乎都是192.168.1.1,但是子网内的主机IP地址不可相同,而组网之间,其内部的主机IP地址是可以相同的。
①:子网内主机IP地址不可相同:主要是为了区分子网内部的不同主机,因为对于一个子网来说,连接它的就是主机,而该主机的网络号都相同,如果说此时主机号也相同,那么就无法进行区分了。(就如上图所示的,同一个子网内部, 不同的主机网络号相同,主机号必然不会相同)
②:组网之间,其内部的IP地址是可以相同的:因为一个路由器会配置两个IP地址,而如果说一个网络中的主机与另一个网络中的主机要进行通信时,当数据传输到路由器上时,路由器发现这是与外网的通信,就会转换IP地址,将源端IP地址转换成自己的公网IP地址(逐级替换成WAN口IP地址),然后进行网络通信。(这也就是NAT技术)所以在不同的网络间进行通信的时候,其实都是其公网IP地址间的通信,那么这样对于不同的局域网(组网)来说,它们的私网内的IP地址是可以相同的。
ip地址的数量限制
上面我们知道,IP地址的是一个4字节的32位的正整数(也就是uint32_t类型),它所能代表的最大IP地址的数量不到43亿,而TCP/IP规定,每台主机都必须有一个IP地址。(实际上,因为有一些特殊IP地址的存在,即便是这些可以被表示出来的IP地址,有的也不能被用到实际的主机IP地址中。并且当前的路由结构没有层次结构,属于平面型结构,每个网络都需要一个路由表目。所以随着网络的发展,一个具有多个网络的网站就必须分配多个C类地址)
1.CIDR(无类别的域间路由选择,其实也就是提出了子网掩码)在一定程度上缓解了IP地址不够用的问题,但是它只是停留在对原有数量的IP地址进行更高的利用,但是原有的数量是没有变化的,所以仍然是不够用的。
2.针对以上的问题,给出了三个解决方案:
- 动态分配IP地址:只给接入网路的设备分配IP地址,因此同一个MAC地址设备,每次接入到互联网中,得到的IP地址不一定是相同的。
- NAT技术;(下面会将)
- IPv6:虽然说IPv6相较于IPv4来说,地址数量大大提升,但是他并不是简单的IPv4的升级版,这两个协议可以说是互不相干,彼此并不兼容。IPv6使用的是16字节128位来表示一个地址,但是现在还没有普及。
3.NAT技术:
这个技术在很大程度上解决了IP地址不够用的情况,主要是通过将IP地址进行重复使用。(这里的重复使用并不会违反网络中的IP地址不可重复的这个规定)
1.在上面我们了解到,对于一个局域网来说,他是有一个私网IP地址和一个公网IP地址。(其实就是私网IP地址用于局域网内部的通信,而公网IP地址用于不同局域网间的通信)
2.对于私网IP地址来说,它只用于局域网内部的不同主机间的通信,而在不同的局域网中的主机进行通信的时候,它们的通信其实就不是两台主机间的通信,而是其公网IP地址间的通信。所以说,对于不同的私网而言,它们内部的IP地址是可以重复的。(全局IP要求必须唯一,而私有IP不需要,在不同的局域网中出现相同的私有IP是完全不影响的,所以这也就大大减少了IP地址的使用,利用重复使用IP地址,可以缓解因IP地址数量不足带来的不利)
3.IP转换技术:将私网IP转换为公网IP进行数据通信。(不同网络间主机的通信)
如下图:
假设客户端A要和服务器进行通信,此时客户端A将数据发送出去,被自己所在网络的路由器接收,路由器接收后,发现该目标IP地址是外网的,所以就会将自己的公网IP地址换上去,成为源端IP地址,然后发送给服务器。大概过程如下:
- NAT路由器将源端IP地址10.0.0.10转换为202.244.174.37;
- NAT路由器收到外部数据时,又会把目标IP从202.244.174.37替换回10.0.0.10;
- 在NAT路由器内部,有一张自动生成的,用于地址转换的表;
- 而当10.0.0.10的客户端A第一次向163.221.120.9的服务器发送数据的时候,这时候就会在表中生成映射关系(这种映射关系就是从发送主机到接收主机的)。
其中:对于每个私网的主机而言,它们在与外网的主机进行通信的时候,它们的路由器在进行转发的时候,会给其安排一个不同于其他主机的端口号,这样会防止同一个私网中的不同主机请求相同的外网的主机时出现的数据混淆,如下图:
其中:客户端A和客户端B同时请求服务器,在NAT路由表中的转换表在进行转换的时候,会对不同的主机转换成不同的端口号进行。
4.NAT技术的缺陷
因为NAT技术非常依赖这个转换表,所以:
- 无法从NAT外部向服务器建立连接;
- 转换表的生成与销毁都有额外开销;
- 通信过程中,一旦NAT出现异常,那么所有的TCP连接都会断开;
- 私网间的主机无法之间通信;(还是要通过NAT先发送个服务器,然后服务器通过识别,再发送回来,私网之间的通信和外网之间的通信模式相同)
5.NAT和代理服务器
①代理服务器:其实就是一个中间商的作用,客户端向代理服务器发送请求,代理服务器将请求转发给客户端真正要请求的哪个服务器,而服务器在对请求进行响应,将响应数据发送给代理服务器,然后代理服务器将响应再转发给客户端。(通常用于(广域网中代理,比如去看外网的一些资源)和负载均衡(局域网中代理))
其实代理服务器的做法和NAT技术的做法是相类似的,一般的路由器都配备有NAT设备的功能,其局域网下的主机在请求外网的服务器时,都会在路由器中的NAT设备下进行中转。
②:两者如此类似,那么到底有什么区别呢?
- 目的不同:
①:NAT设备是网络基础的设备之一,主要目的是为了解决IP地址不够的问题。
②:代理服务器是像软件类似的东西,主要是为了满足人们对外网的信息以及网速的要求,主要是贴合具体应用。
- 工作地点不同:NAT技术主要工作在网络层,代理服务器主要工作在应用层。
- 使用范围不同:NAT一般是在路由器等局域网接口使用,而代理服务器使用比较广泛,对于局域网、广域网都不在话下。
- 存在位置不同:NAT一般集成在防火墙、路由器等硬件设备上,而代理服务器是一个软件,通常在服务器上。
③:正向代理和反向代理
- 正向代理:用于请求和转发。
- 反向代理:往往作为一个缓存。
路由
在大型网络中,两台主机之间的通信是要经过很多个不同的路由器进行转发,才能到达对端进行通信的。(因为网络是一个复杂的星型网络结构)
所以其实一台主机发送的数据从源端主机通往对端主机是经过很多路由器进行转发的,如下图:
如图,当主机A与主机B进行通信的时候,会经过路由器A、B、C、D四个路由器进行转发最终到达主机B。(这样的过程也被称为"跳")
而这些路由器是如何知道主机B在哪里,然后如何安排一个路线呢?
1.路由表
①:每一台节点设备上都配备有一个路由表(是在每一个网段中都有,每个节点都有),这个路由表中目的地址、网络掩码、标识路由加入IP路由表的优先级、路由开销、输出接口和下一跳IP地址这些信息。(这些信息的存在,使得IP数据包在网络中能够精准的找到目的地址)
②:IP数据包到达一个路由表的时候,会经历怎样的操作
一个路由器在拿到IP数据包时,会取出其目标的IP地址,然后在自己的路由表中进行查看,找到合适的"下一跳"后,然后转发给"下一跳",然后继续类似的操作。
具体操作如下:
- 首先,源端主机将自己的IP地址与子网掩码相与,就可以得到自己的所在网络地址。
- 源端主机将目的端IP地址与自己的子网掩码进行相与,就可以得到目的网络地址。
- 然后进行比较,如果相同,则目的主机就是本网络中,如果不相同,则就会"跳到下一个主机"然后进行如上操作。
- 如果所有的路由表项都没有。
- 则将数据转发给自己的网关设备。(网关数据其实就是路由器,也就是当前这个目的端IP地址不是该网络中的,所以他就不知道给谁发送,所以就给路由器了,路由器连接的网络更大些,它或许知道)
如下图:
如上图,就是不同网络间主机的通信情况。
2.例题
如图,为一个路由表:
其中:
- 这台主机有两个网络,一个网络接口连到192.168.10.0/24网络,另一个网络连接到192.168.56.0/24网络。
- 上面的英文所代表的依次为:
①:Destination表示目的网路地址。
②:Gateway表示子网掩码。
③:Genmask表示下一跳地址。
④:Iflags表示发送接口。
⑤:Flags中U标志表示此条目有效,G表示此目的条目下一条的地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
例如:如果发送的数据包目的地址是192.168.56.3
此时操作如下:
- 首先和第一行的子网掩码进行相与,得到192.168.56.0,与其目的网络地址不相同。
- 然后依次往下,当到第二行的时候与其子网掩码进行相与,得到的IP地址刚好就是其目的网络IP地址,因此该数据包从eth1转发出去。
- 并且因为192.168.56.0/24刚好就与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;(因为路由器是连接不同的网络的,连接的不同局域网而eth1是该网络中的一个子网,所以之间进行转发即可)
如果上例中,一致执行到了最后一行都没有找到合适的IP地址,那么证明该目的主机就不再该网络中,所以这个时候就要去找路由器(该网络的默认网关)进行转发了。