IP的认识

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

  1. IP就是一张身份证,存在于电脑、手机、监控摄像头、汽车等任何需要联网的设备上面;
  2. IP是可以被追踪到和定位的,无论是网上发帖造谣生事或通过黑客技术攻击别人,所做的事情都会基于IP和其他ID信息被服务器记录下来,然后“阿sir”就可以追踪并抓到你

IP协议原理

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

https://z3.ax1x.com/2021/07/12/WFBnYQ.png

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

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

https://z3.ax1x.com/2021/07/12/WFBs0K.png https://z3.ax1x.com/2021/07/12/WFBckD.png

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

  1. PC1在请求数据包里面封装源目IP地址,并将带有IP地址的数据包发送到互联网;
  2. 互联网有大量的网络通信设备(例如路由器),路由器根据数据包的IP地址查找路由表(地图),然后以接力棒的方式逐跳转发直到目标服务器;
  3. 服务器收到请求数据后,将源目IP地址翻转,并封装回应数据包发送到互联网。

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

  1. 寄快递的时候,需要先写快递单,快递单要求写入寄件方和收件方的姓名和联系信息(电话号码、地址),写完之后,再将快递单贴在包裹上面
  2. 物流公司(或快递员)根据包裹的寄件地址,通过物流平台(飞机、长途货车、卡车)将包裹在省市中传输,直到收件方的城市。
  3. 收快递的时候,快递员根据包裹收件地址,找到对应的街道或小区,然后通过电话联系并交付到我们手里。

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

[title-plane title=”小结”]

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

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

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

[/title-plane]

IP协议结构

  • 在TCP/IP协议中,使用IP协议传输数据的包被称为IP数据包,毎个数据包都包含IP协议规定的内容。
  • IP协议规定的这些内容被称为IP数据报文( IP Datagram)或者IP数据报。
  • IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有I数据报必须具有的。
  • 在首部的固定部分的后面是一些可选字段,其长度是可变的。
https://z3.ax1x.com/2021/07/12/WFyk9g.png

字段的说明:

  1. 版本:占4位,表示IP协议的版本,通信双方使用的IP协议版本必须一致,目前广泛使用的IP协议版本号为4,即IPV4。
  2. 首部长度:占4位,指出数据报首部长度
  3. 区分服务:占8位,在区分服务时这个字段才会起作用,实际上没有用过
  4. 总长度:占16位首部和数据之和,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节,但是受数据链路层协议的影响总长度不能超过最大传送单位MTU为1500字节
  5. 标识:占16位,用来标识数据报每产生—个数据报,其值就加1。当数据报的长度超过网络的MTU,必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报
  6. 标志:占3位,目前只有后两位有意义。表示该IP数据报是否允许分片和是否是最后的一片。最低一位记为MF,如果MF=1,表示后面还有分段;如果MF=0表示这已经是某个数据报的最后一个分段。中间一位记为DF,当DF=1时,表示不允许分段DF=0表示允许分段
  7. 片偏移:占13位,标记该分片在原报文中的相对位置。以8个字节为偏移单位,除了最后一个分片,其他分片的偏移值都是8字节的整数倍。
  8. 生存时间(TTL):占8位,表示数据报在网络中的寿命。每经过一个路由器,则TTL减1,当TTL值为0时,就丢弃这个数据报。设置TTL是为了防止数据报在网络中无限制地循环转发
  9. 协议:占8位,标识此IP数据报在传输层所采用的协议类型。区分IP协议的上层协议。ICMP为1、TCP为6、UDP为17。
  10. 首部校验和:占16位,检验IP数据报的报头部分,保证首部数据的完整性。数据报毎经过一个路由器,路由器都要重新计算一下报头检验和,不检验数据部分可减少计算的工作量。
  11. 源地址:占32位,表示数据报的源IP地址。数据报发送者的IP地址。
  12. 目的地址:占32位,表示数据报的目的IP地址。数据报接收者的IP地址,用于校验发送是否正确
  13. 选项:可变长的可选信息,最多包含40字节。支持各种选项,提供扩展余地,用来支持排错、测量以及安全措施。

IP数据报头部解读

https://z3.ax1x.com/2021/07/12/WFggbR.png

【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。

[title-plane title=”小结”]

我们可以看到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字段标记上层应用;

[/title-plane]

字段详细讲解

【length长度字段解读】

https://z3.ax1x.com/2021/07/12/WFRF6e.png

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

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

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

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

https://z3.ax1x.com/2021/07/12/WFRTHA.png

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

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

【片偏移字段解读】

[start-plane type=”1″]例:一数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。[/start-plane]

固定首部长度为20字节,因此每数据报片的数据部分长度不能超过1400字节。于是分为3个数据报片,其数据部分的长分别为1400,1400和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修有关字段的值。图414给出分片后得出的结果(请注意片偏移的数值)。

https://z3.ax1x.com/2021/07/12/WF4kCt.png[title-plane title=”分析”]

首先明确 偏移量以8个字节为偏移单位。

字节0~1399是第一个1400字节,该片首字节是字节00/8=0,故偏移量为0;

字节1400~2799是第二个1400字节,该片首字节是字节1400,1400/8=175,故偏移量为175;

字节2800~3799是最后的1000字节,该片首字节是字节2800,2800/8=350,故偏移量为350;

[/title-plane]

 

【TTL生存时间字段解读】

https://z3.ax1x.com/2021/07/12/WFWnb9.png https://z3.ax1x.com/2021/07/12/WFWGvD.png

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

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

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

【Checksum字段解读】

https://z3.ax1x.com/2021/07/12/WFf4wd.png

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

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

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

【Protocol字段解读】

https://z3.ax1x.com/2021/07/12/WFhnt1.png

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

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

https://z3.ax1x.com/2021/07/12/WFhufx.png

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

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

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

参考博文:

https://zhuanlan.zhihu.com/p/29287795