网路是怎样连接的(十一) 初探IP协议

思考重点

  • 封包是如何找到下一个端节点的
  • IP地址在封包转发中扮演的角色
  • MAC地址在封包转发中扮演的角色
  • IP协议会为封包加上那些头部

核心知识

网路层实现的目的

网路层,主要负责跨区段主机之间的通信,所谓跨区段就是指电脑之间不是直接的连接,而是透过多个路由器、交换机或中继器等端节点相连。该章我们主要探讨IP封包如何进行转发,以及它与MAC之间的关系

网路层与传输层对比

  • 传输层提供进程与进程之间的相互连线服务
  • 网路层提供不同主机之间端到端的通讯服务

网路层目的在於解决两个重要问题,分别是如何依据IP地址进行互相通讯,以及如何透过路由控制决定下一步该往哪里走

IP地址提供一个类似於门牌号码的功能,使得通讯有确切的目标。试想某天我们想从H市到Z市旅游,虽然路途遥远,但还好H市到Z市之间存在许多休息站。首先我们需要确认Z市的地址,并规划每经过一个休息站後要选择哪条路到达下一个休息站。这就好比查阅路由表然後将封包转发出去,并将封包送达目标端节点

在数据链路层的乙太网路协定中,处於同一个网域的主机可以透过查找对方MAC地址进行直接的通讯,但是传输层与网路层只关注目标主机的IP地址,中间的封包路线实际上怎麽转发,其实是由MAC地址决定

这就导致的一个问题,既然相邻的路由器们可以透过MAC地址找到对方,那麽透过路由表得到的指定IP地址该如何判断是属於哪台路由器?因此IP协议还需要ARP协议(Address Resolution Protocol)将路由表查找结果转换成MAC地址,然後在下交给数据链路层以及物理层进行传输

从上图可以看到数据链路层的关注重点在於封包下一步该发给哪台相邻路由器,也就是说从的MAC地址表中挑选出适当的输出端口。例如途中的R5路由器跳转到R7的这个过程。相反的,网路层只需要知道我的IP位置以及对方的IP位置这样就可以了。其实从本质上来看,整个流程的起始点相当於发送方MAC地址,终点相当於接收方MAC地址

数据链路层与网路层之间存在者互补关系,就好比老板与秘书之间的关系。老板决定本月的公司营运方向,秘书掌握老板行程後安排这个月必须要开的会。先抓住大方向,在决定要如何落地实践

IP协议的连接特性

网路或通讯可以依照资料传送的方法来进行分类,就是常见的面向连接非面向连接。通讯前发送方与接收方主机需要先建立连接操作的称为面向连接,如TCP协议需要进行握手才能开始收发操作。相反的不需要双方主机互相确认即可传送资料的称为非面向连接操作,例如UDP与IP协议

至於为甚麽IP协议是非面向连接的,我们试着从反向思考,如果IP协议是面向连接操作的会怎样?我们指定传输层使用TCP协议,它是一个面向连接的协议,也就是说在建立连线与断开连线都要进行握手操作,同样也假设IP协议会进行类似的握手操作

先说结论,这会导致三大问题

  1. 效率不佳
  2. 分工模糊
  3. 复杂性

首先谈谈效率问题,假若TCP发起SYN连线请求还需要IP协议先确认对方主机是否有连线,那不是多浪费时间吗?而且就算IP协议真的确认对方主机准备好进行连线了,那不是和TCP在三次握手要做的事重复了吗

软件层面,需要多在网路层编写一套负责确认双方通讯的API,什麽时候算是建立连线成功、双方握手的机制、甚麽时候将数据上缴给传输层等等,喔对了,还要修改一下IP头部,增加几个flag等等。原本这些判断机制都由TCP包办了,这样做不仅没有得到实质的效率提升,还使得网路分层更加模糊,每一层应该要做他最擅长的事才对

所以最好的方法就是IP协议只负责发送,尽可能的将封包传送到目标主机,但不保证封包会到达,TCP借助IP协议实现的功能,在传送封包的服务上又对封包的丢失、顺序错误、逾时等问题提供可靠的的解决方法,确保接收方能正确地收到封包消息

封包的跳转

IP协议的实现目的就是要将封包发送给特定IP的端节点。途中封包会经过交换机、路由器最後到达目的地端节点。其中路由器与交换机不会实现所有的TCP/IP协议,交换机是根据乙太网工作的设备,而路由器因为需要执行路由控制所以包含了数据链路层与网路层

从上图中可以看出当发送端的封包到达交换机时,交换机会透过内建的一组MAC地址表查找封包头部对应的输出端口,然後把封包发送给路由器,整个过程不会修改原封包的MAC头部

紧接着封包到达路由器,首先路由器会舍去掉MAC头部,然後依据封包IP头部透过路由表决定下一次跳转的IP地址,但由於相邻路由器之间是靠MAC地址识别对方,所以网路层会使用ARP协议将查表得到的IP地址转换为MAC地址,再由路由器的MAC地址表决定输出端口,如此一来经过无数次跳转便可以到达目标端节点

整个封包收发流程是由TCP委托IP协议进行发送开始的,IP协议会分别为封包添加IP头部MAC头部,然後再委托数据链路层的网卡将封包转换成电信号,最後透过实体的网路线路发送出去

容易搞混的IP头部
在整个封包转发的过程,封包中的IP头部是不会改变的,只有MAC头部会不断因为跳转而改变,另外透过路由表查找到的IP地址是为了转换成MAC地址,来进行相邻节点之间的跳转,并不会将该IP地址填入IP头部

IP头部

版本

IP头部版本资讯,占用4个bits。若是使用IPv4则填入4,IPv6则填入6

头部长度

IP头部长度,占用4个bits的长度,计算单位为4个bytes(上图中的一列长度)。例如一个完整且包含选项的IP封包长度为4 * 6 = 24bytes

差异式服务编码点与明示壅塞通知

DSCP栏位用来进行品质控制,长度为6个bits。ECN栏位是用来通知网路壅塞的栏位,长度为2个bits。早期IP协议将将这两个栏位,总计共8个bits定义成TOS(Type of Service),代表IP的服务的品质,通常包含封包的优先级、最低延迟、最大吞吐量等参数

封包长度

表示连同IP头部与资料的总长,通常代表的就是整个IP封包的长度,单位为byte,占用16个bits,所以可传输的最大封包长度为65535bytes

识别码

用於识别封包的序号,若是IP进行封包分割时,同一个资料拥有相同的ID编号,长度为16个bits

标志位

长度为三个bits,但只使用其中两个bits,分别代表是否允许封包分割以及判断当前封包是否为分割包

分段偏移

表示当前被分割的封包资料内容是从完整的IP封包的第几个位元组开始的,占13个bytes

存活时间

表示封包可以经过路由器数量,每经过一台路由器TTL就会减1,若变成0封包就会被丢弃。由8bits组成,所以可以允许2的8次方也就是256次封包跳转

协议

表示封包到达目的地後要将封包中的数据交给上层应用的哪个协议,常见的像TCP: 17, UDP: 06, ICMP: 01等,长度为8个bits

头部检查码

用来检查IP封包头部在传输过程中是否发生改变,占用长度为16个bits

发送方IP

发送方的IP地址,占用长度为32个bits

接收方IP

接收方的IP地址,占用长度为32个bits

选项

通常在进行测试以及debug时才会使用,占用长度可自行调整

填充

用来将IP头部长度调整成32bits的倍数,会在比特位填入0,占用长度不一

IP封包中最重要的是接收方IP地址,它是由应用程序调用DNS解析器後,将返回值传入给IP协议的

使用ARP协定

当路由器接收到封包後,会将IP头部中的接收方IP地址与自己的路由表进行比对,决定下一次跳转的装置IP地址,不过我们都知道相邻装置之间必须透过MAC地址才能进行沟通,ARP协议实现的目的就是查询代表该IP地址装置的MAC地址

一般来说IP地址与MAC的对应关系会储存在一个内存空间中,我们称之为ARP表,里面储存位於同一个区域网路中IP地址与MAC地址的对应关系,经过查表後IP协议将该地址当成新的MAC头部,然後透过MAC表决定该发给哪台相邻路由器

但假如ARP表中无法找到指定IP地址时,我们就需要使用ARP查询功能。ARP会使用ARP请求与回应来取得MAC地址,它会对位於同一个区域网路中的所有设备进行广播,当设备IP地址与请求封包的IP地址相同时,该设备就会以MAC地址作为响应回传

不过若是连ARP查找功能都无法取得指定MAC地址的话,代表有可能这个区域网路内不存在该设备,亦者是从路由表有误,这将导致这个封包被遗弃

由此我们得知IP协议会为封包加上两种头部消息,分别是IP头部与MAC头部,IP头部只有发送方才会设置,之後的路由跳转仅需要为封包更改MAC头部即可

只有IPv4可以使用ARP协议,IPv6则是使用ICMPv6来取代ARP

ARP表

每一次的ARP查询都会更新一次ARP表,其实我们使用ARP查询的目的是尽可能减少使用ARP查询,毕竟向周遭设备进行广播会一定程度上对网路造成负担。另外ARP查询不仅可以为发送请求主机更新ARP表,回应方也会依据ARP请求中的发送方MAC地址更新自己的ARP表

在cmd中执行arp -a指定可以查看本机端的ARP表,经过ARP查询新增的映射关系称为动类型,透过手动配置的映射关系称为静态类型,不过若是一直使用ARP表也会出现问题,若IP地址发生变动就会发生错误,因此每隔一段时间ARP表中的动态类型表项就会被删除,待重新发起ARP查询时补全

其实只要安装相应的作业系统,电脑也可以当成路由器使用

MAC头部

MAC地址长度为48bits也就是6个bytes,通常用6个两两一组的hex数字表示,使用'-'或':'进行分割都可以

E0-D5-5E-20-D9-30
或是
E0:D5:5E:20:D9:30

最後我们来看看MAC头部包含的内容,你可以把它想像成乙太网的通行证

接收方MAC地址
相邻目标端节点的MAC地址,占用长度为48个bits

发送方MAC地址
发送源端节点的MAC地址,占用长度为48个bits

乙太类型
使用的协议类型,一般TCP/IP常用0800以及0806

  • 000-05DC: IEEE 802.3
  • 0800: IP协议
  • 0806: ARP协议
  • 86DD: IPv6协议

<<:  Day 47. build a ios app in unity

>>:  「ASP.NET 具有潜在危险 request.form 的值」...有无危险实例可参

【Day 07】C 的输入输出函式

输入输出函式(printf、scanf)是 C 语言中非常重要、也很常用到的函式。如果要用到这两个函...

.NET Core第18天_InputTagHelper的使用

InputTagHelper: 是针对原生HTML 的封装 新增InputController.cs...

Day3 WordPress 架设 - 寻找最适合我们的 WordPress 架站平台

首先我们要找一个地方架设 WordPress 作为内容管理系统 (CMS)。 因为是开发阶段,暂时不...

WebPack安装与打包教学

Webpack安装说明 以前传统开发,我们会用到许多大大小小的Js/Css/img,通常是各自存放在...

是 POC 还是 RC? | 用 C# 实作 Windows 剪贴簿管理工具

前言 在 macOS 我使用 Clipy 来管理我的剪贴簿,它不但可以储存你所复制过的东西还可以自订...