目录
一. 网络互连
1. 局域网
2. 广域网
二. 网络通信基础
1. IP 地址
2. 端口号
3. 网络协议
4. 协议分层
5. TCP/IP 五层网络模型 (简述)
6. 网络数据传输的基本流程
一. 网络互连
1. 局域网
局域网是局部组建的一种网络。其实可以理解成一定区域内的网络通信,局域网内的主机之间能方便的进行网络通信,又称为内网。例如在一个网吧内的所有机器进行通信,学校机房里的所有机器进行通信。需要注意的是:局域网和局域网之间在没有连接的情况下,是不能进行通信的。
交换机:是用来组建局域网的,但是不能跨局域网。
路由器:我们熟悉的 WiFi 就是一个无线路由器,路由器本质上就是把两个或者多个交换机连接起来。
局域网组建网络的方式也有很多种:
2. 广域网
通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
二. 网络通信基础
1. IP 地址
IP地址主要用于标识网络主机,其他网络设备(如路由器)的网络地址,简而言之,IP地址用于定位主机的网络地址,标识了网络上设备所在的位置。
将网络通信类比为 “发送快递” ,IP 地址就表示购买客户的收货地址,有了 IP 地址才可以将包裹送到目的地。
格式:IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:
2. 端口号
在网络通信中,IP 地址用于标识主机网络地址,端口号可以标识主机中发送数据,接收数据的进程。简而言之,端口号用于定位主机中的进程(标识了一个具体的应用程序)。
依然将网络通信类比为 “发送快递” ,不仅需要购买客户的收货地址(IP 地址),还应该有收货人的信息,也就是端口号了。
格式:端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
注意:两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个不同的端口号。(一个进程启动后,系统会随机分配一个未被使用的端口号,也可以自己设定。在程序代码中,进行网络编程时,需要绑定端口号(收发数据的端口)来发送,接受数据)
现在有了 IP地址和端口号,就可以准确定位到网络中一个主机上的进程了, 但依然存在问题,网络通信是基于二进制数据来进行传输的,那么要如何做到发送方和接受方都能够理解对方的传递意思呢?
在网络通信中的数据类型是有很多种的,例如:文本,图片,视频等,并且同一类型的数据,格式也可能不一样,如发送一个文本字符串:“你好”,如何标识发送的数据是文本类型,及文本的编码格式呢?这就需要协议来解决问题了,用协议来规定双方的数据格式。
3. 网络协议
协议是网络通信中最核心的概念,理解为:通信双方约定,商量好数据是以什么样的格式来进行传输的,有了这个约定,才能让网络通信中双方相互理解对方的含义。(发送方以这个约定的格式来发送数据,接受方按照这个格式来进行解析)
协议最终体现为在网络上传输的数据包的格式。
知名协议的默认端口:上文说过系统端口号范围:0~65535,其中:0 ~ 1023为知名端口号,这些端口是预留给服务器程序绑定广泛使用的应用层协议的。所以一般自己设置端口都设置在 1023 ~ 65535 这个范围。
4. 协议分层
网络通信是一个比较复杂的事情,需求场景复杂,实现功能也就复杂。如果这个协议,太复杂了,学习成本,使用成本部,理解成本,维护成本也就会非常高。因此,采取的措施就是针对这个复杂的大协议,拆分成若干个相对简单的小协议,每个协议都负责一部分功能。随着把协议拆分成一些小的协议,就会发现在某些协议之间,起到的功能和作用是类似的,因此就再针对这些小协议,进行 “分层” ,把功能类似的协议放到同一层。
协议分层的好处:
1. 降低了学习和维护成本。
2. 灵活的针对这里的某一层协议进行替代。
在当前的互联网中,协议分层主要有两种风格,但实际上也可以算是一种。
1. OSI 七层网络模型:一般是教科书上,实际上并不多见。所以这里也不多介绍。
2. TCP/IP 五层(四层)网络模型,这个也算是 OSI 网络模型简化的实现方式,是在实际组建网络常见的实现模型。
5. TCP/IP 五层网络模型 (简述)
TCP/IP 是 OSI 的简化实现方式:
在TCP/IP 协议中,主要分为,应用层,传输层,网络层,数据链路层,物理层。越往下,越接近硬件设备,越往上,也就越接近用户。在这个网络分层,上层协议要调用下层协议,下层协议要给上层协议提供服务。
这里先对每一层进行一个简单介绍,后续会针对性的对每一层进行讲解。
还是将这个过程类比为 “网购寄快递”。
物理层:在类比事例中,把物理层类比为修路,因为只有在交通路程完整的情况下,才可以进行运输,相当于是一个准备条件。因此,物理层就是约定了网络通信中基础的硬件设备是啥样,例如通信使用的网线,网口等设备,这个我们在生活中也就有所体会:所使用的网线,网口都是相同规格的。
数据链路层:在类比事例中,把数据链路层类比为:广州到汕头的快递运输,可以是广州-惠州-汕头,也可以是广州-厦门-汕头等多条路径,而每一条路径途经的每一个地点就是一个节点,而两个节点之间有很多种运输方式:货运,火车等。因此,数据链路层也就主要负责相邻两个节点之间,具体要怎么进行传输。这里的节点指的是连入网的主机,交换机,路由器等,传输也就是在这些相邻节点之间进行的,传输方式可以是有线传输,无线传输等。
也就是要考虑下图中每一对连接起来的相邻两个节点之间是要通过什么方式去通信。
网络层:网络层主要负责的就是路径的规划,判断哪条路径是最合适的。例如数据链路层中的类比事例中,广州到汕头的快递,可以是广州-惠州-汕头,也可以是广州-厦门-汕头等多条路径。要注意,在网络通信中,两个节点之间的传输路径是有很多个选择的!
传输层:传输层在上述类比事例中,表示的就是广州到汕头,是站在商家的角度的,不关心快递的运输过程,而只关心起点和终点,这个过程也就是传输层做的工作。
应用层: 应用程序,描述了传输的数据,用户要怎么来进行使用。
一般也可以称为 TCP/IP 四层模型(不算物理层)。
一般而言,直接和我们打交道的只有应用层,应用层是需要通过我们写的应用程序去实现,传输层和网络层都是基于操作系统内核来实现的,数据链路层和物理层是基于硬件和驱动程序来实现的。(驱动程序,是和硬件设备关联的,每个硬件厂商都会提供对应的驱动程序,操作系统内核通过驱动程序来控制硬件)
6. 网络数据传输的基本流程
这里只是大概了解,后续文章会针对网络原理进行详细介绍。
基础五元组:一次通信中,基础的五元组:源IP,目的IP,源端口,目的端口,协议类型。
(站在协议分层的背景下来理解) 以 QQ 为例,A 给 B 发送一个 hello
发送方:用户在输入框在输入 hello 这个字符串,qq 这个应用程序就把这个字符串,构造成一个应用层数据报。
1. 应用层:这里假设一个应用层协议的格式:发送方qq号;发送时间;接收方qq号;消息内容(应用层数据,数据格式,这里不同的应用程序都是不一样的,这里只是假设。)
此时就会根据应用层协议来构造出应用层数据报,本质上是一个遵守了约定格式的字符串。
程序要调用操作系统的API,把这个应用层数据报,交给传输层。
2. 传输层(进入操作系统内核): 在传输层中,就要把得到的应用层数据报,构造成传输层数据报,传输层使用到的协议中,最知名的就是 TCP 和 UDP,(TCP和UDP的报头结构不一样,报头不同,支持的功能和特性也就不同)比如此处使用的是 UDP,就需要构造出 UDP数据报(在应用层数据的基础上,加个 UDP 报头)
此时,这就是另一个特定格式的字符串了(具体细节后续就进行讲解),此处就像字符串的拼接,把前面的报头跟后面的数据拼到一起。此处的 UDP报头,暂时可以理解为一个 “标签”,通过标签来表示出当前的这个消息要怎么进行传输。在传输层中就会涉及到通信中的源端口和目的端口了。
然后传输层再把这个 UDP数据报,交给网络层。
3. 网络层:网络层中最知名的协议就是 IP协议。IP协议就要基于上述数据,打包成一个 IP数据报。
这里,也是另一个特定格式的字符串,包含了另一组信息,其中最核心的就是:源IP 和 目的IP。网络层数据报准备好了之后,就需要进一步交给数据链路层。
4.数据链路层:数据链路层中最知名的协议,被称为 “以太网” ,所以同样是基于上述数据,打包成一个 “以太网数据帧” 。
接下来这个数据继续往下传输,交给物理层。
5. 物理层:在物理层中,就把上述二进制的数据转换成 电信号/光信号 进行传输发送,此时就真正把数据给发送出去了。
封装:上述的这个流程,是发送过程,是从应用层到物理层,层层加码,这个过程称为 “封装” 。
接收方:此处省略了中间的转发过程,只考虑 B的接受。
1. 物理层:网卡接收的是电信号和光信号,把这个电信号和光信号转换回二进制的数据。转换回的这个二进制数据,其实也就是一个 以太网数据帧 了。因此把这个数据交给数据链路层。
2. 数据链路层:数据链路层就需要解析并去掉帧头和帧尾,取出中间的载荷,得到网络层数据报,并交给上层的网络层(IP协议)。(以太网数据帧帧头里会有记录,这个载荷是不是一个 IP数据报)
3. 网络层: 网络层的 IP协议会对传来的数据进行解析,解析出 IP报头并取出载荷,也就得到了传输层数据报,并交给上一层传输层。(IP报头里会记录,载荷是 TCP 还是 UDP)
4. 传输层:UDP对得到的数据再次进行解析,解析出 UDP报头并取出载荷,再把这个载荷交给对应的应用层程序。(UDP报头中有一个重要的字段:目的端口,目的端口是和一个具体的应用程序联系起来的,因此就可以根据这个端口来把数据交给对应的应用程序了。)
5. 应用层: 这里指的就是 qq程序了,qq 就会根据对应的应用层协议来对传来的数据报进行解析,并显示到界面上。
分用:这一个过程,就是接收的过程,对传来的数据进行一步一步的解析,从下到上,这个过程就称为 “分用” 。
从上述的这个发送信息,接受信息的流程来看,我们也就可以理解协议存在的意义了,协议可以让通信双方以相同的方式去解析理解数据,才保证了网络通信的准确性。也就是发送方使用什么协议,接收方就得使用什么样的协议。
例如:QQ邮箱和网易邮箱是属于不同的应用程序,但是它们却可以进行相互发送和接受,也就意味着它们遵守着相同的应用层协议(其余四层也是一样的)。
在网络协议的分层中,上层协议要调用下层协议(上层协议把数据交给下层协议,继续封装),下层协议要给上层协议提供支持(下层协议解析好数据,交给上层)。要注意协议之间不能跨层交互,只有相邻的两层之间才可以进行交互。