IP协议

一、IP协议概述

相比之前讲的ARP协议,IP协议无论对于普通用户还是对于工程师而言,大家都要熟悉得多。例如,我们在很多电影和电视剧里面,总能看到以下这些场面:

 

场面1:

警方要抓一个全球通缉犯的时候,所有人围绕在作战室神情紧张的凝视着墙面上巨大的屏幕,技术侦查组的警员快速的敲打着键盘,随时准备大干一场。这个时候警员突然起来手一指:IP追踪到了,就在xxx区yyy街zzz号。警长:兄弟们,抓活的!

 

场面2:

电影主角被黑道老大胁迫干坏事,黑道老大为了无死角监控到电影主角的执行情况,让手下的黑客攻破街道的监视器,控制别人的电动汽车,然后通过远程屏幕观察主角。

 

(以上图片来源相关影视剧)

 

这些场景大量出现各种美剧、韩剧、国产剧里面,例如《神盾局》《天蝎》《速度与激情》《幽灵》等等。当然,毕竟作为一个科幻/犯罪片,不加入这些场面,确实不好意思说自己是一部高科技的警匪/反恐/犯罪类型片。

 

但是,作为一名网络/安全工程师,当影片中提到IP地址,总会比普通用户要更加的敏感,例如经常不小心发现若干哭笑不得的bug,举例:

 

bug1:阿sir,IP地址追踪到了,是192.168.1.200

bug2:长官,IP地址追踪到了,是202.256.138.111

bug3:老大,IP地址追踪到了,是100.168.8.10.5

(注:童鞋们,学完整个IP章节内容之后,记得回来找bug)

 

无论如何,经过这些影视剧和各路媒体的熏陶,最普通的民众也知道以下这些常识=>

IP就是一张身份证,存在于电脑、手机、监控摄像头、汽车等任何需要联网的设备上面;

IP是可以被追踪到和定位的,无论是网上发帖造谣生事或通过黑客技术攻击别人,所做的事情都会基于IP和其他ID信息被服务器记录下来,然后"阿sir"就可以追踪并抓到你

 

当然,作为工程师,我们不仅仅要懂常识,更需要掌握这些专业的内容=>

IP协议的原理是什么?

IP协议和IP地址到底是什么关系?

IP协议在有什么字段?

 


 

二、IP协议原理

IP协议(Internet Protocol,互联网协议),是TCP/IP协议栈中最核心的协议之一,通过IP地址,保证了联网设备的唯一性,实现了网络通信的面向无连接和不可靠的传输功能。

如上图所示,当多台接入互联网的电脑访问同一台服务器时,服务器如何区分不同电脑的请求,并准确的将资源返回?

 

众所周知,只要给每个设备加上"身份证",并且在通信的时候,将"身份证"嵌入到数据包里面,则整个往返过程可以准确无误

 

以PC1访问服务器为例,PC1的地址是12.1.8.66,Server的地址是8.8.4.4,整个通信过程是这样的:

①PC1在请求数据包里面封装源目IP地址,并将带有IP地址的数据包发送到互联网;

 

②互联网有大量的网络通信设备(例如路由器),路由器根据数据包的IP地址查找路由表(地图),然后以接力棒的方式逐跳转发直到目标服务器;

 

③服务器收到请求数据后,将源目IP地址翻转,并封装回应数据包发送到互联网。

 

上述这个IP通信过程,跟我们日常快递收寄件的流程是几乎类似的:

 

①寄快递的时候,需要先写快递单,快递单要求写入寄件方和收件方的姓名和联系信息(电话号码、地址),写完之后,再将快递单贴在包裹上面

 

②物流公司(或快递员)根据包裹的寄件地址,通过物流平台(飞机、长途货车、卡车)将包裹在省市中传输,直到收件方的城市。

 

③收快递的时候,快递员根据包裹收件地址,找到对应的街道或小区,然后通过电话联系并交付到我们手里。

 

在这里,快递单相当于IP地址、快递包裹相当于数据包,物流公司/快递员相当于路由器/交换机

 

小结:经过上面这个案例,我们需要更明确这些知识点:

 

①IP协议提供了IP地址,并将源目IP地址夹带在通信数据包里面,为路由器指明通信方向;

 

②IP协议只能指明数据包的源目通信方即"这是谁的送给谁的",但不能保证数据包一定能到达对方,数据是否会被丢弃以及丢弃之后如何处理。所以,上面才有这句:"IP协议提供面向无连接不可靠传输功能"。那么,如果出现丢包且需要重传时,谁来解决呢?这就需要TCP/IP协议栈另外一个"半壁江山"来实现,大家肯定猜到了:TCP协议能解决以上这些IP协议不能实现的功能。

 

当然,IP协议不仅仅只有"快递单"功能,它还能防止数据包环路、为数据打上重要或不重要等标签实现流量控制、能验证数据包是否损坏、能实现数据包分片和组装功能;而要深入学习这些功能,必须掌握IP头部的封装格式。

 


 

三、IP协议头部

上面提到的"快递单"即IP头部到底长得怎么样,我们可以通过抓包的方式来更加直观的认识,这里以我的电脑 Ping 谷歌DNS服务器为例子(我的电脑地址为192.168.199.152,谷歌服务器地址为8.8.8.8。)=>

开启Wireshark软件,采用过滤器:host 192.168.199.152 && host 8.8.8.8,这个过滤器的作用是只抓取199.152和8.8的数据包,其他数据包不抓取。

②打开命令终端,执行下面指令:

jayking:~ jaykingchen$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=44 time=24.525 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=26.729 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=24.414 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=26.530 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=44 time=130.592 ms
^C
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 24.414/46.558/130.592/42.028 ms

 

③观察Wireshark抓取到的数据包,下面是完整的通信过程:

【IP协议字段解读】

Version(版本号):标识IP协议的版本,目前V4版本地址已经枯竭,V6慢慢成为主流。

Header Length(头部长度):默认为20字节,最大为60字节。

Differentiated Services Field (服务区分符):用于为不同的IP数据包定义不同的服务质量,一般应用在QoS技术中。

Total Length (总长度):标识IP头部加上上层数据的数据包大小,IP包总长度最大为65535个字节。

Identification (标识符):用来实现IP分片的重组,标识分片属于哪个进程,不同进程通过不同ID区分。

Flags(标志符):用来确认是否还有IP分片或是否能执行分片。

Fragment offset (分片偏移量):用于标识IP分片的位置,实现IP分片的重组。

Time to live (生存时间):标识IP数据包还能生存多久,根据操作系统不同,TTL默认值不同,每经过一个三层设备如路由器的处理,则TTL减去1,当TTL=0时,则此数据包被丢弃。

Protocol (协议号):标识IP协议上层应用。当上层协议为ICMP时,协议号为1,TCP协议号为6,UDP的协议号为17。

Header checksum (头部校验):用于检验IP数据包是否完整或被修改,若校验失败则丢弃数据包。

Source(源IP地址):标识发送者IP地址,占用32bit。

Destination (目的IP地址):标识接收者IP地址,占用32bit。

 

我们可以看到IP头部默认有12个字段(后续会提到特殊字段),为了方便记忆,可以总结为7个核心知识点:

a.Source和Destination即IP源目地址字段,是IP协议最核心的字段;

b.Id+Flags+FO三个字段可以实现IP数据分片和重组;

c.Total Length和Header Length标记IP头部和上层数据的边界;

d.TTL生存时间字段可以实现通信防环;

e.DSCP服务区分符可以实现流量控制;

f.Checksum字段可以数据包完整性校验;

g.Protocol字段标记上层应用;

 

源目IP地址原理上面已经讲过,下面我们来对其他字段进行解读=>

 

 

【length长度字段解读】

长度字段在大部分协议里面都会出现,例如IP、TCP、UDP协议,功能都是为了"划分界限":哪里是头部,哪里是数据。

 

如上图所示,通过Header Length我们知道IP协议的头部是20字节(默认是20字节,最长可以是60个字节),Total Length这里标明是100个字节,所以剩下的数据部分则是80字节。

 

划清了头部和数据的界限之后,又有什么用呢?

 

当收到数据包之后,无论是电脑/手机还是其他联网设备,网卡模块会对数据包进行拆分、修改IP头部信息、重新进行数据封装等操作,如果没有"这条线",那就可能会"越界",一旦"越界",则数据包内容可能损坏=>

当没有长度字段或长度字段标识错误时,网卡在进行拆分的时候,错误的把数据部分划分到头部里面,这样的话,右边的数据部分就不完整,接收方最终收到的就是一个损坏的数据包。

 

好比大家用浏览器下载一个word文档,如果这个文档本来有80字节大小,现在word只能打开后面的60字节,那肯定是无法打开的。

 

 

【TTL生存时间字段解读】

TTL(Time to live)即生存时间,用于标识IP数据包"还能存活多久",这个生存值在发送方发送数据时便设置好了。不同电脑/操作系统的初始TTL是不同的,例如上图,便是我的Mac电脑发出的,默认值是64,其他一些系统是128或255。由于TTL值占用8个bit位,所以最大值是255(二进制11111111)。

 

IP数据包每经过一个路由器或三层设备,TTL便会被减去1,而当TTL=0的时候,则代表此数据包"死亡",此时路由器便会向源发送者返回一个"TTL Exceed"的ICMP报错包

 

上图中,如果我的电脑到目标服务器超过了64跳,则这个数据包会中途被丢弃,无法到达目标地。

 

TTL值除了标识IP数据包的生存值之外,另外一个特别重要的功能便是"防止数据包环路",简称为"防环"。很多时候,由于工程师的疏忽,或者网络拓扑结构的复杂性,会出现一些有bug的网络环境,例如=>

上面便是一个经典的"环路拓扑",当电脑将数据包发送到互联网时,由于网络设备之间存在环路(Loop),所以数据包一直在里面绕起来,而不是发送到最右边的服务器。

 

如果没有TTL,则这个数据包会一直存在于链路中,这样不仅占用网络带宽,并且浪费设备的处理器资源。若有大量的数据包存在网络中,则会拖垮其他人的正常通信。

 

而当IP数据包加入了TTL值之后,即便网络拓扑存在环路设计,当数据包被转发到TTL为0的时候,网络设备也可以直接丢弃,以此解决环路带来的危害

 

(注明:TTL仍然是一种"被动式"解决环路的做法,真正要解决环路,还需要从网络设计和协议设计的角度切入)

 

 

【DSCP字段解读】

虽然我们经常听到"互联网上人人平等",但从互联网设计之初,就已经不是平等的,可以从IP头部这里的DSCP字段就可以看出来。

 

DSCP(Differentiated Services Field) 即服务区分符,用于为不同的IP数据包定义不同的服务质量。DSCP的前身叫做TOS(Type of Service,服务类型)。不管是TOS还是DSCP,它们都是QoS服务质量里面的技术实现。

 

由于QoS这个技术的复杂性,这里我们只简单了解下DSCP这个字段大概的功能。

如上图所示,当PC1和PC2两个用户同时访问互联网时,由于数据包采用不同的DSCP值,不同的值代表了不同的优先级,例如这里的AF11和EF,可以看成一个是普通等级,一个是VIP等级,此时VIP等级自然要优先被转发。

 

应用场景:在企业网中,网络运维人员可以为核心数据流采用高优先级的DSCP值,为其他普通的例如BT下载流量采用最普通的优先级。在运营商网络里,可以根据客户购买的不同专线服务,采用不同的DSCP值

 

 

【Checksum字段解读】

 

checksum校验字段跟长度字段类似,存在于很多协议里面,用于实现数据完整性校验。

 

不同协议采用的方法有差异,例如IP协议的checksum值只校验IP头部,不包括数据部分,而TCP和UDP的校验则包括数据部分。

 

上图中,PC1发送IP数据包(含checksum1)给PC2,PC2拆开IP头部,然后进行校验计算(checksum2),若校验没问题则接收并处理,若检验有问题则丢弃。注意,这里采用的是校验算法,不是简单的相同对比。

 

 

【Protocol字段解读】

无论是IT协议的Protocol字段,还是Ethernet以太网协议里面的Type字段,又或者是TCP/UDP协议里面的Port字段,这些字段的功能都是用于标识上层协议或应用。例如,ICMP协议号为1,TCP协议号为6,UDP的协议号为17

 

对于很多初学者来而,虽然知道了哪些协议号对应哪些上层应用,毕竟只要背熟了就好,但是我们还需要更深入的思考?例如,在IP协议里面加入协议号标识传输层协议,意义何在?

通过上面这张图我们可以看到,若PC1 PING PC2,则此时会采用ICMP协议,而ICMP协议对应的协议号是1。当PC2收到这个数据包时,拆开IP头部,则会看到协议号,根据协议号调用对应的上层协议或应用来进行上层数据处理。

 

以这里例子来看,若PC2采用TCP或UDP来解开ICMP数据包,则无法正常解析,好比用word程序要打开一部mp4电影,肯定会有故障。而如果这里PC2根据协议号为1,调用ICMP协议来处理ICMP数据包,则可以正常解读并返回回应包。

 

所以,协议号(Protocol)、端口号(Port)、类型值(Type)这些的功能都是:标记上层协议/应用,告诉接收方,有正确的协议/应用来打开这个数据,功能相当于电脑文件的后缀名,告诉电脑用哪些应用程序来打开对应的文件。

 

小结:通过Wireshark我们抓取了IP协议头部字段,并对头部里面大部分的字段进行了解读,包括IP源目地址、长度字段、TTL值、DSCP值、协议号等,IP分片相关字段我们在后续章节再讨论。

 


 

四、IP协议总结

①IP地址是一张接入互联网的身份证,存在于电脑、手机、摄像头、汽车等任何需要联网的设备;

②互联网通信里数据包会被嵌入IP源目地址,类似快递收发过程中的"快递单",通过IP地址的唯一性,保证了正常的通信。

③IP协议不仅只有IP地址这个寻址功能,它还能防止数据包环路、实现流量控制、能验证数据包完整性、能实现数据包分片和组装。

④本章节中,我们通过Wireshark抓取真实网络数据包(我的电脑访问谷歌DNS服务器),并且拆分IP头部字段来进行解构。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值