网络的迅速发展普及了计算的使用,网路由一开始的独立模式(计算机之间相互独立)到局域网(局域网内的主机之间能方便的进行网络通信)再到现在的广域网(通过路由器将多个局域网连接起来,在物理上组成很大范围的网络),很大程度的提升了网络通信,实现了数据传输,那么数据是如何在不同主机(计算机)之间实现传输的呢?
IP地址
IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址,简而言之,IP地址用于定位主机的网络地址;例如我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。
IP地址解决了网络通信时,定位网络主机的问题,但是还在一个问题,传输到目的主机之后,由哪个进程(即应用程序)来接收这个数据呢?这时就需要端口号来标识。
端口号
在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程,简而言之,端口号用于定位主机中的进程;例如发送快递时,不光需要指定的收货地址(IP地址),还需要指定收货人(端口号)。
端口号可以定位到主机中的进程,网络传输的数据类型可能有很多种,不同类型的数据其格式也不相同,那目的主机如何识别源主机传输的数据呢?这就需要使用到协议了。
协议
协议也叫网络协议,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵守的一组约定和规则,协议最终体现为在网络上传输的数据包的格式;这个协议控制了网络数据传输过程中建立连接、相互识别的问题。
协议分层
网络通信是一个比较复杂的事情,需求场景复杂了,实现功能也会比较复杂,如果一个协议太复杂,学习成本、使用成本、维护成本都会非常高,因此协议采取了分层协议的做法(即针对一个复杂的大协议拆分成若干个相对简单的小协议)。
协议分层的好处
一个复杂的大协议拆分成若干个简单的小协议,大大降低了学习成本、使用成本、维护成本;
可以灵活的针对一些小协议进行替换(有一些不同的小协议,诸多功能相似,此时可以灵活的替换掉相似的小协议);
分层最大的好处类似于面向接口编程时,使用者不需要知道接口的内部实现细节,只需在使用时实现相应接口即可。
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议;TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
应用层:应用程序,描述了传输的数据,负责应用程序间沟通;
传输层:负责两台主机之间的数据传输,端与端之间的传输,如TCP和UDP协议;
网络层:负责地址管理和路由的选择,如IP协议;
数据链路层:负责设备之间的数据帧的传送和识别;
物理层:负责光/电信号的传递方式,如以太网;
物理层属于硬件层面,考虑的较少,因此很多时候也称为TCP/IP四层模型。
网络数据传输过程示例
假设A在2023.1.1 12:00的时间给B发送了一条微信消息,消息内容是“在干嘛?”,那么这样一条消息是如何传输到B的设备上的呢?我们以发送方和接受方的过程来演示。
发送方
应用层
假设一个应用层协议的格式为一个字符串:发送方微信号 +发送时间 +接受方微信号 +消息内容
此时应用层会生成一个“应用层数据报”(本质上就是一个遵守了约定格式的字符串),程序要调用操作系统的api,把这个应用层数据交给传输层
传输层(操作系统内核)
在传输层中,就要把上述应用层数据构造成传输层的数据报,传输层中用到的协议最知名的就是UDP/TCP,假设此处使用的是UDP,就需要构造出UDP数据报(在应用层数据基础上加个UDP报头),传输层就把这个UDP数据报交给网络层
这里加报头是为了描述源端口和目的端口的信息!!!
网络层(操作系统内核)
最知名的协议是IP协议,IP协议要基于上述数据,打包成一个IP数据报,网络层数据准备好,还需要进一步的交给数据链路层
IP报头最核心的信息是源IP和目的IP!!!
数据链路层
最知名的协议是“以太网”,基于上述数据,还要打包成一个“以太网数据帧”,然后这个数据继续往下传输,交给物理层
物理层
把上述二进制的数据转换成电信号/光信号,此时就真正的把数据发送出去了
上述过程中,从应用层到物理层,层层加码,这个过程称为“封装”
接受方
物理层
网卡接受到的是光信号/电信号在物理层,物理层将这个信号转换成二进制数据,转回的数据是一个以太网数据帧,把这个数据交给数据链路层解析
数据链路层
数据链路层需要去掉帧头帧尾,取出中间的载荷交给上层的网络层(IP协议),以太网会记录这个载荷是不是一个IP数据报
网络层
IP协议会针对这里进行解析,解析出IP报头,取出IP协议的载荷,把这里得到的传输层数据报交给上层传输层,IP报头里会记录载荷是UDP还是TCP协议
传输层
UDP再进行解析,取出报头,取出载荷,再把这个载荷交给对应的应用层程序,UDP报头里有一个重要的字段“目的端口”,因此就可以把这个端口来把数据交给应用程序了
应用层
此时应用程序是微信,微信就会针对应用层协议进行解析,现实到界面上
上述,从物理层到应用层,层层解析的过程称为“分用”
总结:
整个网络协议中,协议分成很多层,上层协议要调用下层协议(上层协议把数据交给下层,继续封装),下层协议要给上层协议提供支持(下层协议解析好数据交给上层)。