目录
1. 网络互连
1.1 局域网LAN
1.2 广域网WAN
2 网络通信基础
2.1 IP地址
2.2 端口号
2.3 网络协议
3. 五元组
4. 协议分层
4.1 OSI 七层网络模型
4.2 TCP/IP 五层(或四层)网络模型
4.3 网络设备所在分层(经典笔试题)
5. 网络数据传输的基本流程
5.1 发送方的工作(封装)
5.2 接收方的工作(分用)
1. 网络互连
随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。
网络互连:将多台计算机连接在一起,完成数据共享。实现跨主机通信。咱们未来工作很可能是成为后端开发工程师,就是写服务器.和客户端通信,肯定会涉及到网络。
数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以划分为局域网和广域网。
1.1 局域网LAN
局域网,即 Local Area Network,简称LAN。Local 即标识了局域网是本地,局部组建的一种私有网络。(把几个电脑,通过路由器,连接到一起)
局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。
局域网组建网络的方式有很多种:
基于网线直连,基于集线器组建(一根网线,岔出来两根),基于交换机组建(组建局域网,但是不能跨局域网),基于交换机和路由器组建。
路由器:wifi本质上就是个无线路由器,路由器本质上就是把两个局域网给连起来.
现在也有带路由功能(三层转发)交换机也是很多很常见的,交换机和路由器之间的界限越来越模糊。
光猫算是路由器,路由器/交换机都是有电口(插网线的),也有光口的(插光纤的)。光纤、网线等都是传输信号的介质。
1.2 广域网WAN
广域网,即 Wide Area Network,简称WAN。
通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
如果有北、中、南等分公司,甚至海外分公司,把这些分公司以专线方式连接起来,即称为“广域 网”。
如果属于全球化的公共型广域网,则称为互联网(又称公网,外网),属于广域网的一个子集。
有时在不严格的环境下说的广域网,其实是指互联网。
所谓 "局域网" 和 "广域网" 只是一个相对的概念(没有明确的界线)。比如,我们有 "天朝特色" 的广域网,也可以看 做一个比较大的局域网。
2 网络通信基础
网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据。
那么,在组建的网络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使用IP地址来标识。
2.1 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:127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1本机环回。
- 主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
- 在Windows系统中,打开cmd窗口中,输入ipconfig命令,可以显示你设备的IP地址(IPv4或IPv6地址旁边的行)。
2.2 端口号
端口号用于描述某个具体的应用程序。区分一个主机上不同的程序。端口号也是一个整数,2个字节,相对较小的数字。0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
同一个主机上两个不同的进程(跑起来的应用程序),不能绑定同一个端口号。即一个端口号只能被一个程序绑定,但一个进程可以绑定多个端口号。
类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)。在实际的通信过程中,IP和端口往往是"一对"。
2.3 网络协议
协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。
所谓的协议,就是通信双方进行的一种约定,发送方约好了我发的数据是啥样的,接收方按照这个固定的格式来进行解析。
协议(protocol)最终体现为在网络上传输的数据包的格式。
为什么需要协议?就好比见网友,彼此协商胸口插支玫瑰花见面,这就是一种提前的约定,也可以称之为协议。
计算机之间的传输媒介是光信号和电信号。通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。
- 计算机生产厂商有很多;
- 计算机操作系统,也有很多;
- 计算机网络硬件设备,还是有很多;
- 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来,约定一个共同的标准,大家都来遵守,这就是 网络协议;
知名协议的默认端口
系统端口号范围为 0 ~ 65535,其中:0 ~ 1023 为知名端口号(0 一般不使用),这些端口预留给服务端程序绑定广泛使用的应用层协议,如:
- 22端口:预留给SSH服务器绑定SSH协议
- 21端口:预留给FTP服务器绑定FTP协议
- 23端口:预留给Telnet服务器绑定Telnet协议
- 80端口:预留给HTTP服务器绑定HTTP协议
- 443端口:预留给HTTPS服务器绑定HTTPS协议
3. 五元组
- 源IP:标识源主机
- 源端口号:标识源主机中该次通信发送数据的进程
- 目的IP:标识目的主机
- 目的端口号:标识目的主机中该次通信接收数据的进程
- 协议类型:标识发送进程和接收进程双方约定的数据格式
五元组在网络通信中的作用,类似于发送快递:
可以在cmd中,输入 netstat -ano 查看网络数据传输中的五元组信息:
如果需要过滤(一般是通过端口号或进程PID过滤),可以使用 netstat -ano | findstr 过滤字符串
4. 协议分层
网络协议整体的规模很大,整体实现就很复杂,更好的解决方式就是把一个大的复杂的协议,拆成多个小的更简单的协议,每个协议负责一部分工作(负责一部分功能,化繁为简)。
但某些小协议之间,起到的功能和作用是类似,针对这些按照协议的功能/作用,再进行"分类"("分层")。这就好比代码拆分出很多类,有些类功能差不多,就可以放到同一个包里。构成了“协议栈”
分类并约定了不同层次之间的调用关系:"上层协议,调用下层协议","下层协议,给上层协议提供支持"。
协议分层优点:
- 每层协议不需要理解其它层协议的细节,降低了学习和维护成本(更好的做到了封装)
- 把对应层的协议替换成其他协议不会对整体产生影响(更好的解耦合)
当前互联网世界,协议分层有两种风格:OSI 七层网络模型(没有被实现),TCP/IP 五层(或四层)网络模型。
4.1 OSI 七层网络模型
OSI 七层模型既复杂又不实用,存在于教科书中,并没有被实现出来。
4.2 TCP/IP 五层(或四层)网络模型
TCP/IP 是 OSI 简化的实现方式。其中物理层是属于纯硬件层的,与程序员关系不大,所以也可以认为是 TCP/IP 是四层网络模型。
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
简单版本理解:
- 应用层:应用程序相关的,描述了传输的数据,用户要怎么使用等。
- 传输层:只关注数据传输起点和终点,不关注过程,端到端之间的传输。
- 网络层:主要负责数据传输路径的选择,走哪条路划算。路径规划
- 数据链层:主要负责相邻两个节点(主机、路由器等设备)之间,具体是怎么传输的。比如是通过网线、光纤、还是wifi等方式。
- 物理层:约定网络通信中基础硬件设备是什么样的规格的。比如像通信使用的网线,网口等设备是什么样的规格的。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。即上层协议要调用下层协议,下层协议给上层协议提供服务。越往下的,越接近硬件设备越往上,就越接近用户。
详细版本解读:
- 应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远 程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
- 传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发 送到目标主机。
- 网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表 的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线 上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
- 物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的 同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。 物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
- 整个的网络协议中,协议分成了很多层。
- 上层协议要调用下层协议(上层协议把数据交给下层,继续封装)。下层协议要给上层协议提供支持(下层协议解析好数据,交给上层)。
- 这里的这几层协议之间是有明确的层级关系的,只有相邻的两层之间才能进行交互(不能跨层交互)。
- 应用层是应用程序实现的(程序猿自己写的代码相关的),所以直接和咱们打交道的其实是应用层。下面四层都是现成的,只是需要知道是怎么工作的就行了,不需要你实现一个传输层协议,(但是经常会涉及到,实现一个应用层协议),后续重点讲解应用层和传输层。
4.3 网络设备所在分层(经典笔试题)
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;整个一台主机,五层都会涉及到。
- 对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
- 对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
- 对于集线器,它只实现了物理层;
交换机的作用,是针对路由器的端口进行扩展。路由器上的端口可能是有限。
集线器的作用,是在物理层,把网线一分为二。两条线是冲突的,同一时刻只能一个方向传输数据。(不常用)
注意这里说的是传统意义上的交换机和路由器,也称为二层交换机(工作在TCP/IP五层模型的下两层)、三层路由器(工作在TCP/IP五层模型的下三层)。
随着现在网络设备技术的不断发展,也出现了很多3层或4层交换机,4层路由器。以下说的网络设备都是传统意义上的交换机和路由器。
5. 网络数据传输的基本流程
站在协议分层的背景下来理解。以QQ为例,用户A给用户B发送一个hello。
此处网络数据传输的单位我们都以报来命名,不做区分。
5.1 发送方的工作(封装)
应用层
用户A在输入框中输入hello字符串,qq应用程序就把 字符串,给构造成一个 应用层数据报。这里我们不清楚qq的 应用层协议具体的数据格式,每个应用程序都不一定一样(自定义的),应用层协议,往往是根据具体的场景,具体的需要,由程序员自主决定的。假设应用层协议的格式为:发送方qq号;发送时间;接收方qq号;消息内容
所谓的"应用层数据报"本质上就是一个遵守了约定格式的字符串(字符串拼接)。程序要调用操作系统的api,把这个应用层数据,交给传输层。
传输层
进入系统内核了,在传输层中要把上述应用层数据,构造成 传输层的数据报。传输层使用到最知名的协议UDP或TCP。此处以UDP协议为例,就需要构造出 UDP数据报(在应用层数据基础上,加个UDP报头,“字符串拼接”)所谓的"报头"就是一个"标签",通过标签表示当前要把这个消息怎样进行传输。 传输层的协议报头包含了源端口和目的端口。
UDP报头是一个特定格式的字符串(二进制数据),此处就像字符串拼接一样,把报头和后面的数据(载荷(payload))拼到一起。UDP数据报 = UDP报头 + 数据载荷(Payload,也就是完整的应用层数据)然后传输层就把这个UDP数据报,交给网络层。
网络层
传输层使用到最知名的协议IР协议。基于上述数据,打包成一个 IP数据报。
IP报头也是一个字符串,包含了另外一组信息(最核心的信息, 源IP和目的IP)然后网络层数据报准备好,还需要进一步的交给数据链路层。
数据链路层
数据链路层最知名的协议,叫做"以太网”,基于上述数据,还要打包成一个 "以太网数据帧"以太网帧头中包含最重要的信息是,源mac地址和目的mac地址mac地址,也是用来描述一个设备在网络上的地址的,主要关心的是两个相邻节点的数据传输。
然后数据链路层以太网数据帧准备好,继续往下传输,交给物理层。
物理层
把上述数据,转换成二进制的数据(一串0101),通过电信号/光信号进行传输,此时就真正的把数据给发送出去了。
上述过程,从应用层到物理层,层层加码。这个过程称为"封装”(这个封装不是面向对象的封装)
数据发送出去之后,就会经过一系列的交换机和路由器进行转发,A和B一般来说不是直接网线连接的,中间还要经过很多的交换机/路由器设备进行转发。
当数据到达B这边之后,B就要针对上述数据进行"分用"(针对上述数据报进行层层的解析)。
5.2 接收方的工作(分用)
此处只考虑B的接收(省略中间的转发过程)
物理层
网卡接收到的是光信号和电信号,是在物理层。
把这个光电信号转换回二进制的数据。转换回的这个数据,其实是一个以太网数据帧。把这个数据交给数据链路层中解析。
数据链路层
数据链路层以太网协议对这个数据进行解析,去掉帧头和帧尾,取出载荷(IP数据报),交给上层网络层。
以太网数据帧帧头里有记录,这个载荷是不是一个IP数据报。
网络层
网络层(IP协议)对这个数据进行解析,解析出IP报头,取出载荷(UDP数据报),交给上层传输层。
IP报头里会记录,载荷是UDP还是 TCP协议的数据报。
传输层
传输层(UDP协议)再对这个数据进行解析,解析出UDP报头,取出载荷(应用层数据报),交给上层对应的应用层程序。
UDP报头里有一个重要的字段"目的端口”,目的端口是一个具体的应用程序关联在一起的,因此就可以根据这个端口把数据交给应用程序。
应用层
应用层qq应用程序,就会针对应用层协议也进行解析,显示到界面上。
上述从下到上层层解析,这个过程称为"分用"。
数据报在网络中还会经历一定的转发过程。物理层传输给下一个节点:
- 如果是交换机的话:交换机先分用数据解析到数据链路层,更新以太网数据帧的帧头里的地址,然后再重新封装并进行转发。
- 如果是路由器的话:路由器先分用数据到网络层,拿到IP地址后,进行下一阶段的路径规划,然后重新往下封装并进行转发。
好啦Y(^o^)Y,本节内容到此就结束了。下一篇内容一定会火速更新!!!
后续还会持续更新网络通信方面的内容,还请大家多多关注本博主,第一时间获取新鲜的知识。
如果觉得文章不错,还请一键三连哟!