目录
网络的发展史
独立模式:
独立模式,顾名思义就是计算机之前是相互独立的,假设有三个终端A,B,C分别持有客户数据,现有三个不同的业务a,b,c分别用到A,B,C 那么现在如果有一个人处理业务a时,需要处理业务b,那就需要移动到终端B的电脑前进行工作,其余人只能等他处理完成之后才开始工作,所以都处于等待状态。
网络互联:
如果以独立模式工作的话,随着时代发展以及业务不断增加,效率会变得很低。所以我们需要一种可以完成计算机之间可以相互通讯,共享软件和数据的模式,那么网络互联就应运而生。它就是将多台计算机连接在一起,完成数据共享。
数据共享的本质就是通过网络进行传输数据,即计算机之前通过网络传输数据,也称为网络通讯,而根据网络互联的规模不同,可以划分为局域网和广域网
局域网:
局域网(Local Area NetWork),简称LAN。
Local就是说明了局域网是本地,局部组建的一种私有化的网络
局域网内的主机之间能方便的进行网络通讯,也被称为内网;如果一个区域的局域网和另一个迂区域内的局域网之间没有通过某种方式进行连接,那么他们之间是无法进行通讯的。
如果要组建一个局域网的话,方式有很多种:
- 基于网线直连:就是多个主机之间用网线进行连接
- 基于集线器组建:通过一个集线器将多根网线集中在一起,再分别连接不同主机
- 基于交换机组建 :交换机与集线器最后实现的功能是一样的 都可以将多个主机之间通过网线进行连接,但是他们内部的工作原理却大相径庭(后面会补充)
-
- 基于交换机和路由器进行组建:两个不同的局域网(用交换机进行搭建的)用两根网线将路由器与交换机进行连接,就可以实现两个局域网之间的通讯
广域网:
广域网(Wide Area NetWork),简称WAN。
广域网就是通过多个局域网之间进行连接,在物理上组成了很大范围的局域网,就形成了广域网,内部的局域网都是它的子网
图示:
如果属于全球化的公共型广域网,就称为互联网(公网,外网),属于广域网的一个子集
网络通讯基础
之前通过网线组成的不管是局域网还是广域网,其目的就是进行数据共享,也就是网络数据传输,具体一点的话就是不同应用(进程)间的数据传输,那我们是怎么判断数据从哪一台主机哪一个程序(进程)传输到另一台主机上的程序(进程)?所以我们需要有一个类似于我们每一个身份证一样的唯一标识来确定一个具体的主机。
IP地址:
概念:
IP地址可以理解为计算机的身份证,它主要用于标识网络主机,其他网络设备(路由器之类的)的网络地址。IP地址用于定位主机的网络地址,比如送快递一样,需要知道对方的收获地址才能送达。
格式:
IP地址是一个32位的二进制数据,通常被分割为4个“8位二进制数据”(也就是4个字节),example:01100100.00000100.00000101.00000110
通常用“点分十进制”的方式来表示,即a.b.c.d的形式(a,b,c,d都是0~255之间的十进制整数)exp:127.0.0.1(如果要在本机上访问你的电脑,都是这个IP)
端口号:
概念:
在网络通讯中,IP主要是表示主机的网络地址,但是你发送或者接收网络数据的是一个具体的应用程序,比如你QQ或者微信跟别人聊天,那么接受或者发送数据的程序就是QQ和微信这两个进程,而端口号(port)就是用来定位这个具体的进程的。所以端口号就是用于定位主机中的进程。再拿送快递举例,你知道对方的收获地址(IP),还需要知道具体的收获人(Port)
格式:
端口号(Port)是一个0~65535范围的数字,
例如mysql的默认端口是3306,tomcat的默认端口是8080等等
网络协议
认识协议:
引出:
我们现在知道了接收或者发送端的IP和Port,但是有一个问题,网络通讯是基于二进制0/1数据来进行传输的,比如我要发送一个“你好” 在网络通讯中常用UTF-8编码 而“你好”的UTF-8码是“E4 BD A0 E5 A5 BD”,转成二进制就是“ 11100100 10111101 10100000 11100101 10100101 10111101” ,那我们盖如何区分发送的是“你好”这个文本,还是转成二进制的数据;网络通讯的数据类型有很多种:图片,视频,文本等,所以基于网络数据传输,需要用一个固定的协议来规定双方的数据格式。
概念:
网络协议是网络通讯(网络数据传输)经过的所有网络设备都必须共同遵守的一组约定或者规则,如怎么建立连接,怎么相互识别等。就好比以前的特工碰头,只有说出正确的暗号(协议)才可以进一步深入交流。只有遵守这个约定,计算机之间才可以进行相互通讯交流,我数据怎么发送给你,你就怎么去解析这个数据,才可以拿到正确的结果
协议(Protocol)最终体现在网络传输数据的数据包的格式(等后面讲到套接字(Socket)的方法会对这个理解更深入)
作用:
计算机之间的传输媒介是光信号和电信号。通过“频率”和“强落”来表示0和1这样的二进制信息,想要传递各种不同的信息,就需要约定好双方的数据格式。但是:
- 计算机的生厂商有很多(Apple,Microsoft...);
- 计算机的操作系统也有很多(Windows,MacOs,Linux);
- 计算机的网络硬件设备也有很多;
网络协议的功能就是一个约定,让大家生产的时候都按照我这个协议去生产,这样就可以实现不同厂商之间生产的计算机可以进行通讯了
五元组:
概念:
在TCP/IP网络协议中,用五元组来标识一个网络通讯;
- 源IP:标识源主机(发送端的主机)
- 源Port:标识源主机中该次通讯发送数据的进程(就是具体是哪个“应用”(这里可以简单理解为QQ或者微信之类的客户端)发送了数据)
- 目的IP:标识目的主机(同上)
- 目的Port:标识目的主机中该次通讯接收数据的进程(同上)
- 协议号:标识发送进程和接收进程双方约定的数据格式
如图:
五元组在网络通讯中的作用,也可以类比成发送快递:
- 目的IP:收件人地址:盐城师范学院
- 目的Port:收件人:赵QQ
- 源IP:寄件人地址:深圳市XXX
- 源Port:寄件人:李四
- 协议:顺丰快递
查看:
可以打开自己的Terminal(终端),输入 netstat -ano (如果是mac电脑的话就输入 netstat -an就行了)来查看网络数据传输中的五元组信息:
举第一行为例:
- 源 IP:192.168.2.107
- 源端口:50332
- 目标 IP:183.240.139.242
- 目标端口:20010
- 协议类型:TCP
如果需要filter(一般通过Port或者PID过滤),可以用 netstat -an | findstr 过滤字符串
协议分层
引出:
网络通讯是非常复杂的,如果需要设计一个协议,完成网络通讯中的方方面面,那这个协议就会很负责而且庞大,所以我们就可以将这个协议进行拆分:把大的协议拆成许多小的,功能单一的协议,拆分完之后,小的协议的数量就会巨多,这时候我们就把这些小的协议进行归类处理也就是分层:
- 只有相邻两层协议之间才可以进行交互
- 上层协议可以调用下层协议
- 下层协议可以给上层建筑协议提供服务
- 协议之间的交互不可以跨层进行
分层的作用:
为什么要分层:
分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵守这个规范来对接。
在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类(使用方,使用服务):
- 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可
- 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可
这样方便更好拓展与维护:
OSI七层模型:
OSI:
英文名是:Open System Interconnection 即 开放系统互联
- OSI七层网络模型是一个逻辑上的定义和规范:就是把网络从逻辑上分为了7层;
- OSI七层模型是一种框架性的设计方法,其主要的功能就是帮助了不同类型的主机实现数据传输;
OSI模型划分为以下七层:
从图中可以看出,OSI的模型还是比较复杂的而且也不是很实用:所以OSI模型最后没有被实际应用。
在实际组建网络的时候,只是以OSI七层模型设计中的部分分层,即TCP/IP五层(或者四层)模型来实现
TCP/IP五层(或者四层)模型:
概念:
TCP/IP只是一组协议的代名词,它还包括了许多其他的协议,组成了TCP/IP协议簇。
它的五层或者四层协议,只是从不同的视角去看,引发了说法上的不同
TCP/IP:
相对于OSI七层模型,TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 应用层:负责应用程序间进行沟通(通过应用程序满足网络通讯等需求)。如简单的电子邮件传输(SMTP),文件传输协议(FIP),网络远程访问协议(Telnet)等。之后会讲到的网络编程主要就是针对应用层面的。
- 传输层:负责两台主机之间的数据传输。不考虑中间过程,只考虑中间和起点(五元组中的源/目的IP/Port)。如传输控制协议TCP能确保数据可靠的从源主机传输到目标主机。
- 网络层:负责地址管理和路由选择(组建局域网,进行网络数据包的转发)。就是规定两个任意设备之间如何进行通讯(不仅仅是相邻设备,中间可以隔着许多设备或者路由器),主要考虑中间过程是怎么样的。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式来规划出两台主机之间的数据传输路线(路由);路由器(Router)就是工作在网络层。
- 数据链路层:负责设备之间的数据帧的传送和识别(对路由器接口的扩展,不需要考虑组网的问题)。简单来说就是规定两个相邻设备之间是如何进行传输数据的(比如通过网线/交换机连接的电脑);例如网卡设备的驱动,数据的帧同步(就是说从网线上检测到什么信号算是新帧的开始),冲突检测(如果检测到冲突就自动重发),数据校验等。有以太网,令牌环网,无线LAN等标准。交换机(Switch)就是工作在数据链路层。
- 物理层:负责光/电信号的传递方式。这层协议主要就是约定了这些硬件设施要符合的要求是怎么样的;比如现在以太网通用的网线,早期以太网采用的同轴电缆(现在主要用于有线电视),光缆,现在的WIFI使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率,传输距离,抗干扰性等。上面组建局域网时提过的集线器(Hub)就是工作在物理层上面。
由于物理层对我们编程人员来说考虑的比较少,所以也经常称为TCP/IP四层模型。
对于上面的五层协议,我也可以用一个送快递的简单的例子帮助去理解:
- 物理层:可以理解为送快递过程中所铺的路
- 数据链路层:就是送快递过程中的中转站,快递员只需要把快递送到对应的中转站就行了
- 网络层:送快递过程中,快递公司给规划的运输路线
- 传输层:就是手机应用给快递公司发送的买家和卖家信息,只管起点和终点
- 应用层:就是我们拿到快递过后该怎么去使用它
网络设备所在的分层:
- 主机:它的操作系统内核实现了从传输层到物理层的内容。
- 路由器:实现了从网络层到物理层
- 交换机:实现了从数据链路层到物理层
- 集线器:只是实现了物理层
这里说的只是传统意义上的路由器和交换机,也被称为二层交换机(工作在TCP/IP协议的下两层),三层路由器。随着设备发展,现在也出现了三层,四层交换机,四层路由器。
网络分层对应:
概念:
网络数据传输时,经过不同的网络节点(主机,路由器)时,网络分层需要对应,以下为同一个网段内的两台主机进行文件传输:
封装和分用:
- 不同协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。
- 应用层数据通过协议栈发送到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。
- 首部信息中包含一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥削相应到首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理
基本流程:
现在假设我通过QQ这个应用程序发送一个“hello”给对方:
封装:
1,应用程序获取到用户的输入,构造成一个应用层的数据包(一般是“结构化数据”,类似于结构体或者对象一样,有很多不同的属性),这个应用层数据包就会遵守应用层协议(可以是开发人员自己定义的);现在假设是这样的协议格式:发送者的QQ号,接受者的QQ,消息的时间,消息正文:1234567,7654321,2024-11-22 23:24,hello
发送数据的时候,把结构化数据转换成字符串/二进制bit流(网络传输本质就是0101这样的二进制数据)这个操作也叫序列化;接受数据的时候,把字符串/二进制bit流转换为结构化数据,这个操作叫反序列化;(网络传输的数据,本质都是“字符串”或者”二进制bit流“);
2,应用层调用传输层提供的API(socket api),把数据交给传输层。传输层拿到数据后,构造“传输层数据包”,传输层的协议主要是两个:TCP和UDP。(以TCP为例):
TCP数据包:TCP报头(header)+TCP载荷(payload) header:TCP功能相关的属性(属性有很多,后面会介绍);payload:应用层数据包;
3,传输层构造好数据之后,继续调用网络层的API,把传输层的数据包交给网络层,网络层继续进行处理,网络层最主要的协议:IP协议。IP协议继续对上述数据包进行加工:加上IP报头:
IP数据包:IP报头+IP载荷(整个传输层的数据包) IP报头:也包含了很多信息:源IP/目的IP...
4,IP协议继续调用数据链路层的API,把IP数据包交给数据链路层;数据链路层中,核心协议,“以太网”,这个协议也会在网络层的数据包基础上进一步加工:
以太网数据帧:帧头+载荷+帧尾 网络传输的基本术语:段(segment):TCP用段;报(Datagram):UDP用的;包(packet):IP用的;帧(frame):数据链路层:以太网数据帧
其实不管是IP协议还是TCP协议,它们都不关心载荷的具体内容是什么,它们只需要把自己协议所包含的数据放进去就行。协议类型,其实不只是一份数据,这里面包含了很多层,IP报头就会记录当前传输层使用的是哪一个协议;传输层报头中,也会记录应用层使用了哪一个协议(准确来说是数据交给哪个具体的程序);数据链路层报头中也会记录网络层使用哪一个协议等等。
5,以太网将这样的数据交给硬件设备(网卡),它会把上述的二进制数据,最终以 光信号/电信号/电磁波信号 传播出去。
以上5步就是所谓的封装(从上到下数据都要不断的加工),那么分用就是封装的逆向工程了(从下到上依次解析)
分用:
1,数据传输到接受方的网卡(光电信号),网卡把光电信号还原成二进制0101,然后把二进制数据交给上层数据链路层
物理层数据是怎么来的和数据链路层直接相关的。
2,数据链路层通过“以太网”协议进行解析,把报头和报尾取出来,剩下载荷,载网上传递给网络层
以太网的帧头(header)中就有专门的属性,描述了网络层使用哪一个协议;1,通过网线/光纤来的数据 数据链路层是通过“以太网”协议进行解析;2,通过WIFI来的数据,数据链路层是通过“802.11”协议进行解析;(这两个协议的本质是一样的,只是封住分用的帧头帧尾不一样,数据格式不一样,功能稍微有点小差异。)
3,网络层拿到下面传递上来的数据,按照IP协议的格式进行解析,再把载荷数据交给传输层
IP报头有专门属性,描述传输层使用哪个协议
4,传输层拿到数据后,按照TCP协议来解析,再把载荷交给应用层
传输层报头中,通过目的Port,将数据交给指定应用程序
5,QQ应用程序(应用层),解析应用层数据,拿到关键信息,给用户展示到页面上
它是通过开发人员自己给定的协议格式来进行解析
总结:
通过以上步骤,那我们就成功的通过网络传输了相应的数据。
补充一下:其实在传输中间的过程中,也是设计到封装和分用的,如果是在一个由交换机和路由器组建的局域网中进行两个设备之间数据的互传,那么主机的数据封装完通过网卡发送给交换机的时候,交换机会进行物理层和数据链路层进行解析,交换机会解析帧头的信息(如目的MAC地址),根据内部的MAC地址表,决定将该帧转发到哪个端口。解析之后,重新构造出新的以太网数据帧,传递给下一个目标设备。
主机的数据是通过路由器传输的话,路由器收到之后,物理层,数据链路层,网络层解析,重新构造出新的网络数据包,构造出以太数据帧,构造出二进制数据,进行转发。(防火墙/网关这些设备就可以封装分用到传输层;集线器/网线延长器这些就是在物理层的,上面有提到过,只需要了解一下即可)