前言:
学习网络是计算机的必修课,理解网络的深层原理,可以有助于我们提高日常开发能力。
认识网络:
⽹络互连:
随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同⼯作来完成业务,就有了⽹络互连。
⽹络互连:将多台计算机连接在⼀起,完成数据共享。
数据共享本质是⽹络数据传输,即计算机之间通过⽹络来传输数据,也称为⽹络通信。 根据⽹络互连的规模不同,可以划分为局域⽹和⼴域⽹。
局域网LAN:
局域⽹,即 Local Area Network,简称LAN。Local 即标识了局域⽹是本地,局部组建的⼀种私有⽹络。局域⽹内的主机之间能⽅便的进⾏⽹络通信,⼜称为内⽹;局域⽹和局域⽹之间在没有连接的情况下,是⽆法通信的。
局域⽹组建⽹络的⽅式有很多种
(1)基于⽹线直连
(2)基于集线器组建
(3)基于交换机组建
(4)基于交换机和路由器组建
广域网WAN:
⼴域⽹,即 Wide Area Network,简称WAN。通过路由器,将多个局域⽹连接起来,在物理上组成很⼤范围的⽹络,就形成了⼴域⽹。⼴域⽹内部的局域⽹都属于其⼦⽹。
⽹络通信基础:
⽹络互连的⽬的是进⾏⽹络通信,也即是⽹络数据传输,更具体⼀点,是⽹络主机中的不同进程间,基于⽹络传输数据。
那么,在组建的⽹络中,如何判断到底是
从哪台主机,将数据传输到那台主机
呢?这就需要使⽤IP地址来标识。
IP地址
概念
IP地址主要⽤于标识⽹络主机、其他⽹络设备(如路由器)的⽹络地址。简单说,IP地址⽤于定位主机的⽹络地址。
就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。
格式
IP地址是⼀个32位的⼆进制数,通常被分割为4个“8位⼆进制数”(也就是4个字节),如:
01100100.00000100.00000101.00000110。
通常⽤“点分⼗进制”的⽅式来表⽰,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的⼗进制整数)。
如:100.4.5.6。
端⼝号
概念
在⽹络通信中,IP地址⽤于标识主机⽹络地址,端⼝号可以标识主机中发送数据、接收数据的进程。
简单说:端⼝号⽤于定位主机中的进程。
类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货⼈(端⼝号)。
格式
端⼝号是0~65535范围的数字,在⽹络通信中,进程可以通过绑定⼀个端⼝号,来发送及接收⽹络数据。
综上:
IP是用来区分不同主机的,端口号是用来区分同一台主机上不同的进程的
。
为了更加网络通信的具体内容,例如如何区分你发送过来的是一个txt格式的文本文件,还是mp4格式的视频等等之类的?
接下来,引入网络通信的相关协议:
认识协议:
协议,⽹络协议的简称,⽹络协议是⽹络通信(即⽹络数据传输)经过的所有⽹络设备都必须共同遵从的⼀组约定、规则。如怎么样建⽴连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
协议(protocol)最终体现为在⽹络上传输的数据包的格式。
如何让这些不同⼚商之间⽣产的计算机能够相互顺畅的通信?
就需要有⼈站出来,约定⼀个共同的标准,⼤家都来遵守,这就是 ⽹络协议;
协议分层:
将网络通信一个大协议分成好几个小的协议,而且每个小协议负责一个问题。
只有相邻的协议之间才能进行交互,也就是上层协议,调用下层协议。下层协议给上层协议提供服务。
协议分层带来的好处:
类似于⾯向接⼝编程:定义好两层间的接⼝规范,让双⽅遵循这个规范来对接。
在代码中,类似于定义好⼀个接⼝,⼀⽅为接⼝的实现类(提供⽅,提供服务),⼀⽅为接⼝的使⽤类(使⽤⽅,使⽤服务):
1.对于使⽤⽅来说,并不关⼼提供⽅是如何实现的,只需要使⽤接⼝即可
2.对于提供⽅来说,利⽤封装的特性,隐藏了实现的细节,只需要开放接⼝即可。
分层模型:
OSI七层模型:
即Open System Interconnection,开放系统互连,
OSI 七层⽹络模型是⼀个逻辑上的定义和规范:把⽹络从逻辑上分为了7层。
OSI 七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传输。
OSI 七层模型既复杂⼜不实⽤:所以 OSI 七层模型没有落地、实现。
实际组建⽹络时,只是以 OSI 七层模型设计中的部分分层,也即是以下 TCP/IP 五层(或四层)模型来实现。
TCP/IP五层(或四层)模型:
TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求。
1.应⽤层:负责应⽤程序间沟通,如简单电⼦邮件传输(SMTP)、⽂件传输协议(FTP)、⽹络远程访问协议(Telnet)等。我们的⽹络编程主要就是针对应⽤层。
2.传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到⽬标主机。
3.⽹络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识⼀台主机,并通过路由表的⽅式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)⼯作在⽹路层。
4.数据链路层:负责设备之间的数据帧的传送和识别。例如⽹卡设备的驱动、帧同步(就是说从⽹线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就⾃动重发)、数据差错校验等⼯作。有以太⽹、令牌环⽹,⽆线LAN等标准。交换机(Switch)⼯作在数据链路层。
5.物理层:负责光/电信号的传递⽅式。⽐如现在以太⽹通⽤的⽹线(双绞 线)、早期以太⽹采⽤的的同轴电缆(现在主要⽤于有线电视)、光纤,现在的wifi⽆线⽹使⽤电磁波等都属于物理层的概念。物理层的能⼒决定了最⼤传输速率、传输距离、抗⼲扰性等。集线器(Hub)⼯作在物理层。
对于⼀台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
1.对于⼀台路由器,它实现了从⽹络层到物理层,也即是TCP/IP五层模型的下三层;
2.对于⼀台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
3.对于集线器,它只实现了物理层;
当我们发送一份数据信息给服务器时,数据传输顺序是:
应用层——传输层——网络层——数据链路层——物理层;
服务器接收数据的顺序是:
物理层——数据链路层——网络层——传输层——应用层;
接下来为了更加深刻理解数据在网络通信中的整体过程,将以更具体的发送QQ消息为例:
1、用户在连天框中输入要发送的内容,点击发送按钮,此时内容会被QQ这样的程序构造成"
应用层数据包"的形式发送。
应用层的网络协议就描述了该数据包的构造,此处应用层数协议往往是开发QQ程序员自行定义的。
例如:
2、QQ这样的程序就会调用系统提供的API(传输层给应用提供的API),操作系统会提供类似于"发送数据"这样的API,然后应用程序会将上述组织好的"应用层数据包"作为参数传进来,于是应用层数据包就到了系统内核中,进入到传输层的代码中。
此时传输层会把上述"应用层数据包"进一步进行封装,封装成"传输层数据包"。
由于传输层有多多种协议,其中主要的两个就是UDP和TCP。
假设此处使用UDP协议:
3、传输层将数据封装好之后,就会调用网络层提供的API进一步进行封装。
网络层也有很多协议,最主要的就是IPV4协议(简称IP协议),IP协议就拿到上述的传输层数据包封装成"网络层数据包"。
4、网络层继续调用数据链路层提供的API,把数据交给数据链路层处理,数据链路层常见的协议是"以太网"(平时插网线进行上网):
5、上述得到的数据就会交给物理层(硬件设备)
网卡会针对上述的二进制数据进行真正的传输操作,将二进制序列转化为电信号、光信号等等。
接收方接收到的信号,就是上述过程的反向操作。
中间的过程可能会经过路由器和交换机,分别针对传输过来的数据封装分用: