您现在的位置是:首页 >其他 >网络通信原理网站首页其他
网络通信原理
1.网络通信基础
😄网络通信的目的是网络数据传输,是主机的不同进程间,基于网络实现的数据传输。那么,首先我们应该先弄清楚的是,网络中有这么多的主机,究竟是那两台主机之间在进行通信呢?这就需要能够表示网络中每一台身份的信息;同时,每台主机上又有很多个进程,这些进程都需要和外界主机通信,这就需要能够有表示主机具体进程信息的标记。这就有了下边的IP地址和端口号port。
1.1 IP地址
😄像我们上面所说的,进行通信的主机之间该如何确定各自的具体网络地址信息呢?这就体现出了IP地址的作用。IP地址用于标识网络主机和网络设备(像路由器、交换机)在网络中具体的位置,简单来说,主机的网络IP信息就像每个人的身份证信息,通过这个IP能够在网络中具体定位某台主机的位置。
😄IP地址在内存中是以一个32位的二进制数进行存储的,我们通常把这个二进制数分割成4个8位2进制数,同时,通常采用”点分十进制“的方法来表示,例如:
- 4个8位二进制表示的ip地址: 01101001.10100101.00101011.00000110
- 转换点分十进制表示:105.165.43.6
1.2 端口号
😄上面的ip地址可以帮助我们在网络中找到通信的主机信息,那么通信的主机上可能有多个进程与外界进行着通信,我们怎样具体确定该主机具体与目标主机的那个进程进行通信呢?这个时候就体现出端口号的作用了。
😄在网络通信中,端口号可以主机中进行通信的具体进程。它是一个0~65535范围内的一个数字,每个进行通信的进程都绑定了一个用于通信的端口号,通信的发起者可以通过主机ip信息在网络中具体定位到这台主机,接着就可以通过端口号找到进行通信的线程,这样就打通了不同主机不同线程之间的通信桥梁啦!
ps:我们之前在学习MySQL以及Tomcat已经用到了这个端口号了,例如MySQL的3306,Tomcat的8080端口号等等…
2. 通信协议
2.1 协议简介
😄有了上面的ip地址和端口号,我们能够在网络中找到具体的主机信息并与选定的进行之间进行通信,那么现在问题又来了,网络通信是基于0/1二进制数据来进行的,计算机之间的通信内容是一堆二进制数据,那么就存在不同的通信数据格式,计算机在通信时怎样告知对方发送数据的具体格式呢?这就体现出了通信协议的作用,即网络数据传输,需要有事先的协议来规定双方的通信格式。
2.1 协议分层
😄网络通信协议被分成了好几个层次,这大大提高了通信过程之间的适配性。这些分层的作用类似于面向接口如JSBC编程等,为接口的使用者和开发者提供了不可言喻的妙处,例如:
- 对于使用方来说,不必关心每一层协议的内容具体是怎么实现的,只需要调用具体的接口信息来完成通信工作即可
- 同样,对于开发方来说,能够隐藏实现的细节信息,只对外提供接口信息即可
😄下面我们主要来了解一下TCP/IP协议模型。
TCP/IP五层协议模型
😄先来看一张TCP/IP通信协议模型的镇楼图:
- TCP将上面这张图片中的应用层、表示层和会话层统称为应用层协议
😄这么多层的协议,那么每一层的具体作用是什么呢?下面我们一层一层来看:
物理层
物理层主要指的是对网络通信中的硬件设备的协议约定,像网卡/网线等等,能够确保主机和网络设备之间都是相互匹配的。主要负责光电信号的传递。
- 这一层和我们程序猿的关系不是很密切,因此,有时候我们也说TCP/IP四层通信协议模型,这也是正确的。我们主要看接下来的四层通信协议模型。
数据链路层
负责相邻设备间数据帧(下面会提到)的传送和识别,简单来说就是完成网络中相邻的两个设备之间的通信,是具有相对局部特性的协议。可以看下下面这张图:
网络层
负责地址的管理和路由的选择。简单来说就是负责点和点之间的通信,规划处两台通信主机线路上这两个点之间的的一条通信线路,主要关注数据的传输过程
传输层
负责两台主机间的数据传输,简单来说就是负责端和端之间的通信,并且它主要两台通信主机的通信结果,而不具体的去关注通信的过程
应用层
主要负责和程序间的沟通,简单说就是传输的这个数据具体是干啥用的。这个层次与我们程序猿的关系十分密切,包含着通过网络传输的数据的具体内容。
3. 封装和分用
😄这是我们这篇文章要总结的最重要的内容。值得注意的是,这里的封装和Java中我们所说的封装并没有太大的关系。再不同的协议层,对数据包有不同的称谓,在传输层叫做“段”,在网络层叫做“报”,在链路层叫做“桢”。当应用层协议通过协议栈发送到网络上时,每一层协议都要加上一个数据首部,这个过程就叫做对传输数据的”封装“。当数据被封装成“桢”最后传输到目的主机后,主机中的每层协议再对传输的封装后的数据进行“割头“解析,这个过程就称为”分用“。下面我们举个栗子来梳理下封装传输和分用解析的数据传输过程:
我们以两台主机之间通过微信发送消息内容为例,先来看一下数据封装的过程:
- 首先,程序根据用户输入的消息内容将数据构造成一个应用层的协议报文。将这个报文信息交给操作系统内核中的传输层。
* 传输层拿到应用层协议构造的报文后,基于当前使用的传输层协议(此处我们以TCP传输协议为例),构造出一个传输层的协议报文,然后将报文交给网络层。
* 网络层拿到传输层封装后的协议报文后,会继续根据当前使用的网络层协议(此处我们以IP协议为例)再次对该协议报文进行封装,把TCP协议数据报构造成IP协议数据报,然后将这个数据报传递给数据链路层。
* 数据链路层拿到网络层的数据报后,继续根据当前数据链路层的协议对IP数据报进行封装,然后将这个数据报传递给对应的物理层。
到这里,发送数据的主机发送的数据内容就已经被接收数据的主机拿到了。不过这个数据内容还需要经过解析即分用后才能够真正拿到,接下来我们来看接收数据的主机中数据分用的过程:
- 物理层感知到了一组高低的电平,它将这些点评信息翻译成0/1的二进制数据组成的以太网数据帧,然后将这个数据帧(数据链路层数据报)交给数据链路层。
- 数据链路层根据对应的链路层协议对数据帧进行解析,去掉帧头和桢尾,拿到IP数据报,然后将IP(网络层)数据报交给网络层。
- 网络层拿到IP数据报后,依据网络层协议(别忘了这里我们使用IP协议举例)对该数据报进行解析,拿到TCP(传输层)协议报交给传输层。
- 传输层拿到协议包报后再根据传输层协议对数据进行解析,拿到应用层协议报,将该协议报传递给应用层。
- 应用层拿到应用层协议报后进行最后一次解析,将数据报中包含的真正的消息内容向窗口上进行展示.
到这里,就完成了发送数据的主机对数据的封装和接收数据的主机对数据分用过程,完整地完成了两台主机间的通信过程。如果上边过程的图片看起来凌乱的话,可以看下面这张完成的通信过程图: