对于开发人员而言,从复杂的问题中找寻规律是基本的能力,亦如抽象。如果单一抽象仍不能较好诠释问题,那还可以从分层的角度来定义问题。分层能使我们暂时从最旁枝末节的点抽身出来,拥有更高的视野,视其全貌。网络环境复杂度不言而喻,所以分层也就成了公认选择。
1. 协议层级
上图中两种分层方式,左边的五层结构可以看成是实践派的做法,右边的七层结构可以堪称是学术派的研究。不谈优劣,只谈适应不适应。目前主流使用的是五层结构,因为它更加适应于具体开发过程。毕竟分层是为了解耦,解耦必然带来性能降低及复杂度增加,所以取个权衡值才是最实在的。
那么对左边封层方式,逐层简要介绍如下:
1.1 Application 应用层
顾名思义,主要由应用、以及应用之间通信协议构成。典型应用有浏览器、邮件、文件服务等,与之对应的则分别是HTTP、SMTP、FTP等协议。该层主要有如下两个要素:
- 访问形式: 域名,如 www.baidu.com
- 信息单元: message,或称为消息
1.1.1 Domain name system(DNS)
前文中提到过,每个可联网设备在网络中真正唯一的标识符是其网卡上的MAC地址,其他的只是为了便于访问而存在的高可读性字段。类似于中国公民,其身份证号码在国境内是唯一的,但数字可读性差,所以还需要建立起姓名等映射关系便于访问。同样的,域名相当于真正要访问MAC地址的高可读性映射,只是绑定关系让其变得有意义。而建立这种绑定关系的,就是域名系统DNS。
DNS中域名对应的直接映射并非MAC地址,而是一串称为IP地址的数字。
IP Address
茫茫人海,只知道身份证号码和姓名来找一个人是十分低效甚至无法达成的,这时候,逐层的具体地址就派上了大用场。同样的,为了更便捷有效地管理网络上各式各样数量巨大的联网设备,IP协议按类似省市县的分层形式制订了子网系统。
以IPv4(Version 4)为例,每个IP地址共32位,除去不同类型起始码,其余主要由网络号和主机号构成,对应“A省B市”的结构:
1.1.2 Port端口
通常应用是以进程的形式存在,单个主机上会有多个进程同时运行。IP地址虽然标示了当前主机号,但还不能标示到具体进程。因此不同主机上的进程如需通讯,还必须通过额外字段标明进程,这个字段就是Port端口。
Port是一个16位数字,通常和IP地址同时使用。随着互联网的发展,部分Port(0~1024)已被某些知名服务占用,如80/8080等。通过测试某些端口是否有响应,即可测试对应服务是否存在。
1.2 Transport 传输层
传输层负责在应用间传递message,即服务于应用层。与应用层两要素相比,不同之处在于:
- 访问形式:端口,8080
- 信息单元:segment
既然是在应用间传递信息,就必然要标明应用本身。而在一个host上,port是绑定到进程的,因此只需要通过port口进行标注即可。主流传输协议有TCP和UDP两种,具体将在单独章节介绍。
1.3 Network 网络层
网络层负责在主机间移动segment,即服务于传输层。与传输层两要素相比,不同之处在于:
- 访问形式:IP地址,如 192.168.128.10
- 信息单元:datagram
因为是在主机间传递信息,那么自然标识符也只需要精确到IP本身即可。从硬件上讲,一个主机通常一至多个网卡,各自有不同IP地址,但均和主机本身绑定。网络层送出的信息中指明对端IP,传入的信息中也可拆分出具体Port,随后传送到具体应用解析即可。
1.4 Link 链路层
前文提到,主机间的链路可能需要多个结点(如Switch、Router甚至ISP)的参与,要想把一条datagram成功送达对端主机,也绝非易事,因此专门分出一个链路层来完成链路的形成、维护、断开等工作。链路层服务于网络层,要素区别在于:
- 访问形式:IP地址,如192.168.128.10
- 信息单元:frame
注意到这里的信息单元并非datagram,也就是说,链路层的信息与datagram除去header,其实还有可能内容本身也不相同。因为链路由不同有形无形的硬件链路构成,每一段链路的传输率、最大传输单元MTU等也各自不同,所有大于链路最大传输单元的datagram要想顺利传输,就必须切分成合适的frame,传输完成后,再重新组装。
有人可能会问,一直说MAC地址是唯一标识,怎么到了链路层还没用上,别急,这就来了。
1.4.1 MAC Address
MAC地址是由网卡生产商生产时固化进网卡的,为保证其唯一性,MAC地址中有一段是不同生产商申请到的代号。
上一篇中提到一个设备,叫做Switch交换机,也叫网桥,是MAC地址的集成器。要记住,IP地址是人为地为设备分配一个标识符,以便区隔管理,典型的如DHCP动态内存分配就印证了这个道理。因此网络中一定存在一张IP地址和MAC地址的映射表,从而使得信息能够真正抵达对应的网卡。而通常,这个任务就交给了交换机。
1.5 Physical 物理层
物理层是最基础的一层,它的职责只需要负责完好地传输每一个bit即可。有了链路层精确定位到的两个MAC主机,剩下的就交给硬件材料、协议等来完成了。如前所述,不会过多关注到底层的硬件细枝,因此如有兴趣,可自行拓展阅读。
2. packet封装
前半部分对网络中各个职能划分了层级,为了更加形象地展开剩下的packet封装内容,要先讲个快递的通用流程。
快递相信大部分人都收过,贡献我自己的一张,并大致分层如下:
-
应用层
卖家将货物装箱,贴上快递单,上写发货人、收货人地址等联系方式。
对应的Message同样封装好内容后,即送出。
-
传输层
分公司收到封装好的包裹,按照地址,查询下一站,并送出至相应分拨中心。
对应的Segment中包含源和目的IP:Port,及其他如称重等辅助校验信息。
-
网络层
分拨中心则负责决策将货物送往另一分拨中心,这一层偏向寻找递送的最优途径。
网络层对应的同样是为了给datagram找寻到送达的最优途径,最优通常意味着最快,但不意味着所经过的路径本身最短。
-
链路层
确定具体对接分拨中心后,将进一步确定使用何种交通工具送达,并重组货物结构(如集装箱化)以便于运输。
在网络层中确定路径后,链路层将负责重组收到的所有datagram,以便适应不同链路的最大传输单元大小。
-
物理层
确定交通工具后,交给货运负责人员即可。
3. 小结
归根结底,各层协议的定义只是为了更好地完成层级化后的本职工作,生活中也一样,能真正地干好自己的本职工作,其实本身就是对别人最大的尊重。当然也必须清晰地意识到,每一次层级的增多,再带来更大兼容性的同时,往往意味着更大的沟通成本,如应用层对端可能只希望传输一个字符,实际上却需要传输一堆额外的各层头信息。