在TCP/IP协议族中,两大重要协议就是传输层的TCP协议和网络层的IP协议。本文主要讲网络层的IP协议以及其余相关协议。git
IP协议做为TCP/IP协议中最重要协议之一,理解和掌握IP协议相关知识点,在实际项目工做中,能起到指导性做用。github
分类地址即将32位IP地址划分红两个固定长度的块,每一个块表明不一样的含义。其中一个称为网络地址,用来标明主机所接入的网络,该网络地址在全球惟一的;另外一个称为主机号,标识接入前面网络地址的主机。从这种两级的IP地址结构能够看出,IP地址在互联网上都是惟一的。常见的分类地址就是A类、B类、C类。算法
在B类地址中,网络号占16位,即两个字节,前两位固定,那么可分配的网络号数为214(由于网络号后面14位不管如何取值,都不会出现全零和全1的情况,因此不须要减2。但实际上128.0.0.0网络地址是不指派的,因此网络地址总数应该是214-1。那么主机号数共216-2。缓存
C类地址与B类地址相似,因此网络地址总数为224-1,主机数为28-2。网络
D类地址经常使用于多播,即一对多通讯。post
经过IP数据报的格式能够知道IP数据报具备什么功能。 性能
版本:长度共4位,指定IP协议的版本,例如IPv4(版本号为4)和IPv6(版本号为6),通讯双方使用的IP协议版本必须一致。测试
首部长度:长度共4位,由于首部存在可变部分,因此首部长度=固定部分(20字节)+可变部分长度。由于固定部分长度20个字节,全部首部长度最小值为5(由于首部长度字段 所表示数的单位是32位字长,即4个字节。20个字节等于数5,即0101)。当首部长度4位为最大值全为1时,即十进制的15,那么能够表示首都最大长度为60字节。当首部长度不是4个字节的整数倍时,须要用填充字段进行填充。this
区分服务:用来得到更好的服务,通常状况下不使用。3d
总长度:长度为16位,单位为字节,表示整个数据报的长度,即总长度=首部长度+数据部分长度。总长度最大值为216-1=65535个字节。
标识:长度共16位,IP软件在存储器维持一个计时器,每发送一个数据,计时器就增1,并将该值赋值给 标志 字段。标志字段主要为了IP数据报在须要分片时,会复制到每一个数据片的标志字段,各个数据片在接收后可以正确组装成原来的数据报。
标志:共3位,目前只有两位有意义。最低位记为“MF”,即MF=1表示后面还有分片,MF=0,后面没有分片。中间位记为“DF”,即DF=1不容许分片。DF=0容许分片。
片偏移:共13位,单位为8字节。较长的IP数据报进行分片后,片偏移表示该分片距离原数据报起始位置的偏移量。为分片从新组装成数据报提供有力保证。
生存时间:共8位,该数据报在网络的寿命,经常使用TTL表示。表示该数据报在网络可以转发多少次,一个路由器转发一次,该值就减1,直到为0就丢失该数据报。因此,最多能够转发255次。
协议:共8位,指出该数据报携带的数据携带何种数据,以让目的主机IP层知道如何将数据部分上交给什么协议处理。例如TCP、UDP协议。经常使用的协议和对应协议字段的值:
首部检验和:共16位,只校对首部,不校对数据。在发送端,将首部划分为许多16位字的序列,并将校验和置0,而后对全部序列进行反码算术运算求和,求和结果取反码写入到检验和中。接收端,操做与发送端相似,但不把检验和置0,若是取放码后结果为0,则保留该数据报,不为0则表示出错,丢弃该数据报。
二进制反码算术求和:从低位到高位逐列进行运算:0+0=0;0+1=1;1+1=0,进1,若是最高进1,则在最后的结果加1便可。
知道了IP数据报的格式,那么数据报是如何从发送端经过路由器到达接收端的呢?那就要了解路由表转发算法了。
那么在第二步中,如何将目的IP地址转换成硬件地址呢?那就涉及到ARP协议,具体看下一节。
在实际网络数据链路中传递数据帧,使用的仍是硬件地址,所以须要经过ARP将IP地址解析出在数据链路层使用的硬件地址。
每台主机都设有ARP高速缓存,存有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,该映射表是动态更新的。由于IP地址32位,而硬件地址是48位,常常的转换计算操做是很是的耗性能,因此经过高速缓存来存储IP地址和硬件地址的映射关系。同时因为主机常常添加和移除,因此须要动态更新映射表。映射地址项在映射表中都有生存时间,超过了生存时间就会被剔除。
那么ARP是如何经过IP地址找到对应的硬件地址呢?
若是主机H1要向主机H2发送IP数据报,那么会先在ARP高速缓存查找是否有H2主机的IP地址,若是有,就找到H2主机的硬件地址,而后把硬件地址写入到MAC帧便可,发送出去。若是在高速缓存中找不到H2主机的IP地址,那么H1主机就须要向局域网广播一个ARP请求分组,请求分组会携带有H2主机的IP地址。局域网内的全部主机都会收到该广播,并将请求分组的IP地址和本身的IP地址比较,若是一致则回复ARP响应分组,告知H1z主机,本身的硬件地址。H1主机收到H2的答复后,就会写入到高速缓存中,后续须要向H2主机发送数据就直接从映射表查找便可,有效下降通讯量。
那,要是H2主机不在H1主机的局域网中怎么办?
ARP是解决同一个局域网内全部主机和路由器的IP地址与硬件地址解析问题。若是局域网内不存在H2主机,即ARP没法在本地局域网解析出H2的硬件地址,那么就查找本地局域网的一个路由器R1。路由器R1会在另外一个相连局域网A经过ARP查找H2主机,若是找不到,则会在A局域网查找另一个路由器R3,进行ARP查询。
那若是主机H2已经没有接入互联网了,或者在路由表转发分组出错时,怎么办?那么就须要ICMP(网际控制报文协议)。
ICMP容许在主机或路由器报告差错状况和提供有关异常的状况报告。ICMP报文是装在IP数据报中,做为IP数据报的数据部分。如图所示:
ICMP报文有ICMP差错报告报文和ICMP询问报文两种。
下面表格是常见几种ICMP报文类型:
至于ICMP的数据部分,在差错报告报文,具备同一个格式,取原有的数据报数据字段的前8个字节(对TCPh和UDP协议来讲,能够获取到端口号)。
例如咱们经常使用的PING就是ICMP的应用实例,用来测试两台主机的连通性。
在IP地址小结的介绍中,IP地址分为网络地址和主机号两级结构。两级划分IP地址会存在如下问题:
IP地址空间利用率有时很低:一个A类地址网络能够链接主机数超过1000万台,B类超过6万台。对主机数需求不大的单位又不肯申请C类,形成大量IP地址浪费。
路由表变得太大:给每个物理网络分配一个网络地址,会致使路由器的路由表的项目数愈来愈多,从而致使网络性能降低。
两级IP地址不够灵活:一个单位在新的地点新建一个网络,是没法当即接入互联网的,须要向管理机构申请新的网络地址。
为此,经过将两级IP地址划分为三级地址来解决上述问题。这种作法叫作划分子网或者子网寻址或者子网路由选择。
所谓划分子网就是从主机号中借若干位做为子网号,这样就行三级结构:
同个子网内的全部主机,网络号也是相同,子网内的主机对外通信须要将数据报发给路由器,再由路由器统一发送到其余网络。其余主机发送到本子网的主机也须要通过路由器。也就是说,划分子网是单位内部的事,对外仍是表现为一个网络。
那么,当外部数据达到路由器,路由器如何转发给子网呢?从IP数据报首部是没法判断出网络是否划分子网的,因此须要子网掩码来协助。子网掩码是用来计算子网的网络地址。假如子网掩码为255.255.255.0,IP地址为145.13.3.10,将子网掩码和IP地址逐位与(AND),获得145.130.3.0就是子网网络地址。
使用子网掩码的好处是不管有没有划分子网,经过和IP地址按位与,能够快速得出网络地址,进行分组转发。若是划分子网,那么使用子网掩码就能够计算子网络地址,没有划分,方便路由器在路由表中查找下一跳。因此如今网络规定必须使用子网掩码。
构造超网也就是无分类编址(CIDR),划分子网能在必定程度缓解IP地址不够用的问题,可是还不够,所以出现了无分类域间路由选择(CIDR)。CIDR具备如下两大特色:
消除传统分类地址和子网划分,成为无分类的两级编址,记法为:
更熟悉的记法是斜线记法:
随着互联网的发展,IPv4分配的IP地址基本耗尽。新版IPv6是采用具备更大的地址空间来解决IP地址不够用的问题。 在IPv4中将数据协议单元PDU称为数据报,而在IPv6称为分组。IPv6相对IPv4具备如下特色:
IPv6更多信息参阅GitHub文档资源吧。