IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:
一是解决互联网问题,实现大规模、异构网络的互联互通;
二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
IP是整个TCP/IP协议族的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层,对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网等各种技术来传送。
为了能适应异构网络,IP强调适应性、简洁性和可操作性,并在可靠性做了一定的牺牲。IP不保证分组的交付时限和可靠性,所传送分组有可能出现丢失、重复、延迟或乱序等问题。
要先理解的基本概念:
主机: 配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称;
4位版本号(version): 指定IP协议的版本, 一个是ipv4版本,一个是ipv6版本;
4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数,4bit表示最大的数字是15, 因此IP头部最大长度是60字节(固定的20字节+40字节的选项)
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段和1位保留字段(必须置为0).
– 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个。对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。
16位总长度(total length): IP数据报整体占多少个字节(ip头部+上层数据),IP包总长度最大为65535个字节。
16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的(即同一个报文的每个片段都有相同的标识id);
3位标志字段(flags):
–第一位保留,
–第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文,
–第三位表示"更多分片", 如果分片了的话,最后一个分片置为1, 其他是0,类似于一个结束标记;
13位片偏移(framegament offset): 是每个分片相对于原始IP报文开始处的偏移(即该字段指出分段数据在源数据报中的相对位置)。其实就是在标识当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值 * 8 得到的, 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
–13个比特位最大能表示的数字是2^13 = 8192数值
片偏移 = 13位数值* 8,最大不超过ip报文的数据长度2^13* 2^3=2 ^16
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数(计数器), 一般是64. 每次经过一个路由, TTL-1, 一直减到0还没到达, 那么就丢弃了,这个字段主要是用来防止出现路由循环(实现通信防环)。
–例子:已知路由器会将数据包以接力(一站一站)的形式逐条传递,很多时候,由于工程师的疏忽,或者因为网络拓扑结构的复杂性,会出现一些Bug环境:由于网络设备之间存在的环路”Loop“,所以数据包一直里面饶起来,而不是发送到该发送过去的服务器上。
如果没有TTL,那么这个数据包将会一直存在于链路中,这样不仅占用网络带宽,并且浪费设备的处理器资源,严重的时候将会拖垮其他人的正常通信。
所以,当IP数据包加入TTL值之后,即便网络拓扑存在环路设计,当数据包被转发到TTL为0的时候,网络设备也可以直接丢弃,以此解决环路带来的危害。
8位协议: 标识IP协议上层协议。当上层协议为ICMP时,协议号为1,TCP协议号为6,UDP的协议号为17。
16位头部校验和: 使用CRC进行校验, 用于检验IP头部(不同于tcp/udp还要检测数据)是否完整或被修改,若校验失败则丢弃数据包。
32位源地址: 标识发送者IP地址,占用32bit
32位目标地址:标识接收者IP地址,占用32bit
IP地址分为两个部分:网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。
传统五类划分
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类:
A类:
高1位固定为0,后面7位为网络号,24位为主机号
00000000 00000000 00000000 00000000 =》 0.0.0.0
01111111 11111111 11111111 11111111 =》 127.255.255.255
网络号的范围: 0~127 ;意味着总共划分出来128个子网
A类表示的ip地址范围0.0.0.0 ~ 127.255.255.255
每一个A类的子网,能够拥有品大2^ 24次方个ip地址
B类
高两位固定为10,后面14位表示网络号,16位表示主机号
网络号范围: 10 000000 00000000 ~ 1011111 11111111 =》128.0 ~ 191.255
主机号范围: 0~ 2^16
ip地址范围128.0.0.0 ~ 191.255.255.255
C类
高三位固定为110,后面21位表示网络号, 8位表示主机号
网络号范围11000000 00000000 00000000 ~ 11011111 11111111 111111111
192.0.0 ~ 223.255.255
主机号范围: 0~2^8,也就是意味着每一个C类 子网当中有256个ip地址
ip地址范围: 192.0.0.0 ~ 223.255.255.255
D类
高4位固定,28位多播组号
ip地址范围: 224.0.0.0到239.255.255.255
E类
高5位固定, 27位留用
ip地址范围: 240.0.0.0到247.255.255.255
但是随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了(就算是申请最小的C类地址,也有256个主机,但是对于一些小工作室或者公司来说,也可能有多余的浪费)。
新的划分方案CIDR(Classless Interdomain Routing)
针对这种情况提出了新的划分方案, 称为CIDR:
子网掩码的意义:
1.最大主机号=子网掩码取反
2.网络号= 子网掩码& IP地址
举例 :
IP地址: 172.16.99.129
netmask : 255.255.255.0
两者按位与&操作
得到网络号: 172.16.99.0 则最大主机号 : 255 (0~255 )
IP地址范围为:172.16.99.0~172.16.99.255
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有一种更简洁的表示方法,例如 172.16.99.129/24,表示IP地址为 172.16.99.129, 子网掩码的高24位是1,也就是255.255.255.0。
这样划分便解决了刚才的分配问题,即提高了利用率, 减少了浪费。
我们知道, IP地址(IPv4)是一个4字节32位的正整数, 那么一共只有 2的32次方 个IP地址, 大概是42亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.
这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.
而CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
三个私网网段:
10.* . * . * , 前8位是网络号,共16,777,216个地址
IP地址范围: 10.0.0.0 ~ 10.255.255.255
172.16.* .* ~ 172.31. * .* , 前12位是网络号,共1,048,576个地址
IP地址范围: 172.16.0.0 ~ 172.31.255.255
192.168.* . * ,前16位是网络号,共65,536个地址
IP地址范围:192.168.0.0 ~ 192.168.255.255
包含在这些范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
但是可能有疑惑?
本身ip地址都不够用了,还要划分出三个段的不让访问互联网的IP地址。
当然,这样规定是有别的本意:
1.让这三个段的ip地址可以进行复用;不管是个人还是企业还是国家,都可以不用申请就直接使用;
2.这些ip可以组建子网,而我们将这种子网称之为私网。对应的互联网称之为公网;
3.这个私网当中的ip之间,不影响网络通信,换句话说,私网的当中的机器之间可以互相通信,但是不能访问互联网;
4.要是想要访问互联网就要由路由器的NAT技术转换成可以上网的公网IP才行.
NAT技术背景
NAT技术
NAT技术是当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
具体的例子:
注意:
NAT技术的特点:
1.网络被划分为私网和公网, NAT网关设置到私网到公网的路由出口位置,双方的流量都是需要经过NAT网关的;
2.网络访问只能从私网一端发起,公网是无法访问到私网的主机的(没有映射表的)
3.NAT网关对于请求而言,是替换源IP地址,对于应答而言,是替换目的IP地址
4.NAT网关对于双方都是透明的,双方在网络传输过程当中是无感知的;
5.NAT网关为了实现双向翻译功能,需要在NAT服务器当中维护一张映射表,把替换的信息一一记录下来 ;
如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候就用NAPT解决这个问题了. 使用IP+port
来建立这个关联关系(端口映射).
NAPT技术不仅实现了多对一,且相较于NAT技术的一对一,减少了公网IP的映射数量,解决的IP地址不够用的问题。理论上一个公网ip便可以可以替换2^ 16次方65536个私网IP.
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接(第一次发送数据)时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。
总结:
1.私网和NAT可以是多对一的关系,通过端口来进行标识
2、NAPT服务器当中的公网ip,最大可以映射2^16 (端口)
3. NAPT也是一个动态NAT,可以维护多个公网ip
4.NAPT很好的解决了ip地址不够用的问题; 即NAT协议和DHCP协议成功挽救了快要枯竭的ipv4版本的ip地址
NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
NAT和代理服务器()
那么NAT和代理服务器的区别有哪些呢?
代理服务器是一种应用比较广的技术.
互联网是由许多个网络连接所形成的大型网络。如果要在互联网中传送IP信息包,除了确保网络上每个设备都有一个唯一的IP地址之外,网络之间还必须有传送的机制,才能将IP信息包通过一个个的网络传送到目的地。
首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网(局域网技术)会将该数据包转发给本子网的网关进行路由。网关(路由器)是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。而完成这个路由协议的物理设备就是路由器,路由器扮演着交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。此种传送机制称为IP路由(路由选择)。
这里是根据网络当中的数据存在的五元组信息(源IP地址,目的IP地址,源端口,目的端口,协议)中的目的IP地址来进行选择的,当IP数据包, 到达路由器时, 路由器会先查看目的IP;路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
反复套娃, 直到到达目标IP地址;
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;
举两个例子来了解路由选择
转发过程例1:
如果要发送的数据包的目的地址是192.16.122.3跟第一行的子网掩码做与运算得到192.16.122.0,与第一行的目的网络地址不符,接着再跟第二行的子网掩码做与运算得 到192.16.122.0,正是第二行的目的网络地址,因此从对应的eth1接口发送出去;由于192.16.122.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
转发过程例2:
如果要发送的数据包的目的地址是202.10.1.2依次和路由表前几项进行对比, 发现都不匹配;就按缺省路由条目(default), 从eth0接口发出去, 发往gateway路由器;由gateway路由器根据它的路由表决定下一跳地址,要是它的路由表里也没有,那就继续发往缺省路由,如此往复,在每一个路由设备上进行比对,之后进行传输,直到TTL耗尽被丢弃,或者递达到目标主机;
网络层的主要工作是定义网络地址、区分网段、子网内MAC寻址(ARP协议)、对于不同子网的数据包进行路由。
且注意:
1.网络层的ip协议不负责数据有序或者可靠到达对端(这些都是依靠传输层)!
2.网络层的ip协议只负责数据的源端和目的端(五元组中的原地址和目的地址)!