找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程程(ಥ_ಥ)-CSDN博客
所属专栏:JavaEE
目录
前言:
网络的发展历程
网络通信基础
IP地址
端口号
网络协议
网络通信的流程
前言:
我们现在所处的世界,是一个互联网的世界,每天我们打开手机,进入不同的应用程序大都是需要联网才能操作的。例如,微信、浏览器等。而我们后续在开发一个程序时,肯定也是需要支持网络的,即进行网络编程,因此我们避免不了与网络打交道,而想要学习网络编程就得需要了解一些基本网络知识。那我们今天就来学习网络的基础知识。
网络的发展历程
计算机最初问世时,主要应用于军事、工业等领域。网络在出现之初,同样也在军事与工业等领域发挥作用。后来,人们逐渐发现这些技术对日常生活的帮助极大,于是它们在日常家用领域慢慢流行起来。
起初,计算机出现的目的主要是进行大量简单运算,例如在二战期间截取法西斯同盟的信息。之后,计算机在处理更复杂的计算时也非常迅速,计算结果存储在计算机中。然而,在一些领域如航空事业中,由于计算结果数量庞大,多个计算机设备的计算结果分别存储在各自设备中。如果要将这些数据集中起来,需要逐个查询,十分浪费时间。因此,对计算机通信和资源共享的需求变得很大,网线的概念由此产生。通过物理连接,多台计算机设备可以进行通信,实现资源共享,这也就是所谓的局域网,这标志着从单机时代发展到了局域网时代。虽然网线可以让多台机器进行网络通信,但如果设备过多,会因网线相互连接而导致结构复杂,且设备之间的接口也会严重不足。后来,集线器被发明出来,它相当于一个接收和发送信息的中间容器。发送信息的设备将信息通过网线传入集线器,再由集线器广播(告诉在集线器内的所有设备)到与之相连的各个设备中。但由于集线器是半双工的,同一时刻只能有一个设备传输信息,这就会严重影响信息传输的正确性与效率,所以它被交换机所取代。随着局域网的扩大,越来越多的局域网之间也需要进行通信,即多个局域网之间进行通信,组成一个更大的局域网(或广域网),此时就需要用到路由器。路由器可以将多个范围小的局域网组成一个范围较大的局域网(或广域网),在这个更大范围的局域网中,不同计算机设备之间可以进行网络通信。再后来,由于家用计算机的普及,人们对于计算机的需要与使用也是越来越多,而由于计算机的体积过于庞大,不方便携带,因此也就出现了手机,即现在的移动互联网时代。
上面就是计算机网络的整个发展脉络。
简要概括一下就是下面这样:
单机时代(独立运行)——> 局域网时代 ——> 广域网时代 ——> 移动互联网时代。
网络通信基础
下面再来了解一些网络通信的基础。
IP地址
我们在网上购物时,会填写一个收货地址,这样当卖家才能正确的发货并且送到正确的地方。计算机在通信时,也是一样的,每台计算机在网络中都会有一个地址,这个地址标识着计算机所处的位置(虽然是虚拟的),这样不同的设备在进行通信时,才能正确发送与接收消息。
IP地址和我们真实的地址是不一样的,IP地址是随机的,准确的来说是当该设备尝试连接网络时,动态主机配置协议(DHCP)就会从空闲的IP中随机分配 IP 地址给请求IP的机器使用。这里的分配方式和线程池是类似的,也是有一个空闲的 IP池。
IP地址是有两种,一种是IPV4,另一种是IPV6。
IPV4 的格式 是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:
01100100.00000100.00000101.00000110。
通常用“点分十进制”的方式来表示,即a.b.c.d的形式(a,b,c,d都是0~255之间的十进制整数))。
如:100.4.5.6。
IPV6 的格式 是采用冒号十六进制表示法。它将 128 位地址分为 8 个 16 位的部分,每个部分用 4 位十六进制数表示,并且各部分之间用冒号(:)分隔。
IPV6 是对 IPV4 的一个扩展,随着互联网的发展,越来越多的联网设备,那也就需要为每个联网设备分配一个IP地址,而IPV4所能分配的个数是有限的,因此就产生了 IPV6。
我们也可以在 命令行(cmd) 中查看本机现在的IP地址:
使用 IPconfig 命令即可(不区分大小写)
端口号
还是用网上购物来举例说明,当快递公司将包裹送到快递站之后,假设快递站的工作人员是直接联系买家。那么他就是直接通过电话或者短信来联系我们,这里的手机号码就是端口号。当一台机器给另一台机器传输信息时,这个数据已经到了另一台机器上面,而这台机器上面肯定是有多个联网的应用程序,那怎么知道具体是给那个应用呢?就得通过端口号来区分不同的应用程序。准确来说,是这个应用程序所对应的进程。
端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
网络协议
当一台机器知道了另一台机器的 IP地址与端口号,那是不是就可以直接通信了呢?理论上是这样的,就像 小明知道了小红的地址之后与电话之后,就可以与小红进行交流了。但如果此时小红在忙,而是她的好闺蜜,小丽(只会说英文)接的电话,而小明又恰好不会说英文,然后小明就直接挂掉电话了,经此事之后,小明就和小红约定双方的电话不能被别人接听。同样网络通信中,如果发送消息的这方所做的数据封装与接收消息这方所做的数据解析不一样,那么两个机器就根本不能通信。就像用记事本打开二进制文件一样,会出现乱码的情况,这就是因为编码与解码的方式不同,最终解码出来的数据就不是预期的结果。因此在网络通信中,需要制定一份网络通信协议,来确保传输封装数据时,与得到解析数据时,拿到的数据是一样的。
因为网络通信的过程太过复杂,如果使用一套完整的协议,那肯定会使这份协议变得特别复杂,因此针对这种情况,制定协议的大佬们也是采用了常见的编程设计原则:高内聚、低耦合的方式。将一个大的协议分成很多个较小的协议,在此基础上根据一系列规则对这些协议进行分层处理。
分层的好处:
1、封装
对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可。
对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
2、解耦
当某一层被替换时,几乎不会影响到整体的使用。
分层之后,最终形成了OSI七层模型。但因为OSI 七层模型既复杂又不实用,所以 OSI 七层模型只存在于教科书中。 实际组建网络时,只是以 OSI 七层模型设计中的部分分层,也就是以下 TCP/IP 五层(或四层)模型来 实现。从上到下分别是以下五层:应用层,传输层,网络层,数据链路层,物理层。对于存在上一层的层次来讲,它会为上一层提供服务,对于存在下一次的层次来讲,它会调用下一层的接口来为自己服务。而对于四层来说,是把数据链路层与物理层看作是一层了,因为这两层都偏向于硬件了。
我们还是拿网上购物来举例。
应用层:关注的是"应用"方面,也就是东西买了之后,该怎么使用的问题;
传输层:关注的是"通信双方",即发货人与收货人;
网络层:关注的是"传输途径",即通信双方采用什么样的方式进行传输,顺丰、邮政等;
数据链路层:关注的是"相邻节点之间传输",从北京到天津之间是采用高铁,还是飞机等方式;节点是指路由器、交换机等设备
物理层:关注的是"硬件设备",即使用网线、光纤、WiFi等方式
不同设备的工作过程所涉及的层次:
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
对于集线器,它只实现了物理层。
现在的路由器与交换机可能也会不是上面的情况了(可能一台路由器也可以达到主机的程度),但是这里指的是一般情况。
在TCP/IP协议中,用五元组来标识一个网络通信:源IP、源端口、目的IP、目的端口、协议号(协议的类型,使用的是哪种协议)
网络通信的流程
应用层 ——> 传输层 :在应用层就会将传输的数据给序列化。传输层主要是构造TCP数据报,要传输的数据就是核心数据,被称为 TCP载荷,后面的就是 IP数据报、以太网数据报,这些同样是报头 + 载荷 + 报尾(只有以太网数据报才有)
要注意的是:应用层也会对用户要传输的数据进行一次封装,只是我们这里假设
封装就是对要传输的数据进行包装的过程,类似于网上买东西时的需要将东西给包装好在通过快递邮寄到我们手里。而分用就是封装的反过程,也就是拆快递包裹拿到具体东西的过程。
另一个机器通过网卡拿到了一组二进制的数据,然后再将这些数据给到上层数据链路层,按照报头信息来解析再交给上一次,直至达到应用层为止。
好啦!本期 初始JavaEE篇 —— 初始网络编程:基础的网络知识 的学习之旅就到此结束啦!我们下一期再一起学习吧!