网络协议的意义
单台主机内部的设备之间需要发送和接收消息,那么和相隔很远的两台主机之间发送消息有什么区别呢?两台主机通过网络发送消息,相当于两个网卡设备之间进行通信,最大的区别在于距离变长了。而距离变长带来的结果就是:
1. 会面临数据包丢包的问题
2. 需要解决目标主机的定位问题
3. 如何保证经过无数台设备转发,数据仍能准确被接收
为了解决这些问题,就有了协议,协议本质上就是一种约定,两套主机约定好一定的数据格式,这样能保证不同厂商生产的计算机也能顺畅地通信,并且网络通信的分层协议各层能够处理丢包、定位的问题。网络协议的范围非常广泛,从硬件到软件,能保证不同的机器都能无障碍地接入互联网:厂商要想让机器接入互联网就要遵守协议。
网络的层状结构
在网络通信的过程中,为了保证把数据可靠地从一台主机送到另一台主机,并且另一台主机能对数据作相应的处理,我们需要:
1. 保证把数据交给下一跳主机
2. 进行路径选择,定位目标主机
3. 如果报文出现错误或丢失怎么办
4. 如何使用送达的数据
这些问题都需要有协议来解决,所以协议是很多的,为了更好地编码实现协议,就对协议进行了分层,我们把网络看作是层状结构。
为了方便理解协议分层的好处,我们举一个现实生活中的例子,我们在和亲人打电话的时候,并不是直接和对方沟通,而是我们电话把我们的声音发送到对方的电话,再由对方的电话发出声音让对方听到。这个事件实际上也可以分为两层:语言层和通信设备层,语言层由汉语协议保证顺利交流,通信设备层由电话协议保证能够正常通信。那和外国友人打电话呢?语言层的协议切换为英语协议,但通信设备层并不需要修改协议,这实际上把各层的协议进行了解耦合,每层只需要专注于解决一件事情,并且都能够认为是同层的协议在进行直接通信。
我们最常用的TCP/IP五层协议模型中,数据链路层协议保证把数据送到下一跳主机,网络层协议解决转发过程中的路径选择和确认目标定位问题,传输层解决报文出现错误或丢包的问题,应用层负责对接收到的数据进行处理,而物理层则负责光电信号的传递方式。
网络协议与系统
现在我们已经知道网络协议是分层的,那么各层协议与一台主机具体是什么关系呢?
网络协议应用层就在计算机的用户层,传输层和网络层协议位于操作系统的内核中,众所周知,用户想要访问计算机的硬件通常必须调用操作系统提供的接口,操作系统调用驱动程序来使用底层硬件,而数据链路层在计算机的驱动程序层。因为如果用户想进行网络通信,就必须访问网卡,所以自顶向下过程中贯穿了网络协议栈的每一层,这保证了用户会使用协议。
再进一步,主机A向主机B发送数据时,首先由主机B的网卡接收到数据,然后要想把数据送到主机B的用户层,就需要自底向上贯穿网络协议栈的每一层。
计算机在进行网络通信的过程中可能会受到很多报文,为了对这些报文进行管理,就需要有对应的数据结构,把对报文的管理转化为对数据结构的增删查改
网络传输的基本流程
大家网购的时候有没有注意过,我们收到的快递不止是买的东西,上面还有一张快递单,上面有寄件人、收件人、物品信息等等内容。这能保证快递公司在运货的过程中始终知道收件人的地址,并且由于上面写的信息双方都看得懂,收件人也能知道寄件人的地址,这实际上也是一种协议。
类似的,数据在传输的过程中,数据报文也不止有内容,而是报头加内容,那么报头实际上是什么样的呢?
可以看到,所谓的报头其实就是结构体字段,操作系统内协议的源码相同,则双方主机都能识别结构体字段,这就相当于双方共同遵守一个约定,这就是协议。
下图是TCP/IP数据的封装和解包流程,封装过程:在应用层把数据发送到发送缓冲区,交付到传输层后添加TCP报头,继续向下交付到网络层,添加IP报头,继续向下交付到数据链路层,添加以太网包头。解包过程:逐层读取到报头后,把剩下的有效载荷交付给上一层。
因此在进行封装时,一定要考虑之后对方解包的过程,每一层的协议都需要解决以下两个问题:
1. 如何将报文中的报头和有效载荷进行分离
2. 如何将自己的有效载荷交付给上层的协议