目录
[TCP/IP 五层(或四层)模型](#TCP/IP 五层(或四层)模型)
网络发展史
**独立模式:**计算机之间相互独立
随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。
**网络互连:**将多台计算机连接在一起,完成数据共享。
数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以划分为局域网和广域网。
**局域网:**即 Local Area Network,简称 LAN。Local 即标识了局域网是本地,局部组建的一种私有网络。
局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。
局域网组建网络的方式有很多种:
(1)基于网线直连
(2)基于集线器组建
(3)基于路由器组建
把两个设备连到同一个路由器上,就在同一个局域网中了
(4)基于交换机和路由器组建
交换机:可以视为是 "对路由器的接口进行了扩展",类似于插座
**广域网:**即 Wide Area Network,简称 WAN。
通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。全世界最大的广域网:"因特网"(The Internet)
网络发展:单机时代 => 局域网时代 => 广域网时代 => 移动互联网时代
网络通信基础
网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据。
在组建的网络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使用 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 范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
之前学过的 JDBC,包含的 URL 是这样一串字符:
jdbc:mysql://127.0.0.1/3306/java113?characterEncoding=utf8
127.0.0.1 就是 IP 地址
3306 就是端口号
问题:
网络通信传输的数据类型可能有多种:图片,视频,文本等。同一个类型的数据,格式可能也不同,如发送一个文本字符串 "你好!",如何标识发送的数据是文本类型,及文本的编码格式呢?
基于网络数据传输,需要使用协议来规定双方的数据格式。
认识协议
协议:
网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。简单地说:网络协议就是通信双方对于发送 / 接受数据格式的约定,我的数据怎么发,你收到就要怎么解析
如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。协议(protocol)最终体现为在网络上传输的数据包的格式。
五元组
进行一次网络通信,涉及到的五个关键的信息
在TCP / IP协议中,用五元组来标识一个网络通信:
-
源IP:标识源主机
-
源端口号:标识源主机中该次通信发送数据的进程
-
目的IP:标识目的主机
-
目的端口号:标识目的主机中该次通信接收数据的进程
-
协议号:标识发送进程和接收进程双方约定的数据格式

在 cmd 中,输入 netstat -ano 可以查看网络数据传输中的五元组信息
如果需要过滤(一般是通过端口号或进程 PID 过滤),可以使用 netstat -ano | findstr 过滤字符串
协议分层
前置知识:
-
网络通信是非常复杂的,如果我们设计一个协议,要完成网络通信中方方面面的问题,势必会使这个协议非常复杂,非常庞大。
-
所以就会把一个大的协议,拆成若干个小的,功能单一的协议
-
拆完之后,小的协议太多了,甚至有几十上百个,于是又把这些小的协议归类
-
归类后,又对不同种类的协议进行分层,要求只有相邻两层协议之间可以进行交互;上层协议可以调用下层协议;下层协议可以给上层提供服务(协议之间的交互,不能夸层进行)
案例:

这个例子的协议只有两层,实际的网络通信会更加复杂,需要分更多的层次
分层的作用
为什么需要网络协议的分层?
- 上层协议,不需要了解下层协议的细节(封装)
对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可
对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可
^
上述案例中,打电话的人会说话就行了,不需要理解电话机的工作原理
- 分层之后,可以灵活的替换其中的某一层,替换后对整体的工作过程影响很小(解耦)
OSI七层模型
OSI:即 Open System Interconnection,开放系统互连
OSI 七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了 7 层。OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
OSI七层模型划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
OSI 七层模型既复杂又不实用,所以OSl七层模型没有落地、实现,只是存在于教科书上。实际组建网络时,只是以 OSI 七层模型设计中的部分分层,即 TCP / IP 五层(或四层)模型来实现
TCP/IP 五层(或四层)模型
**应用层:**拿到数据之后如何使用
**传输层:**也是完成两个任意设备之间的通信。不考虑中间过程,只考虑起点和终点
**网络层:**完成两个任意设备之间的通信。这两个设备之间可能隔着很多的交换机和路由器;通信过程中需要考虑通讯的中间过程是怎样的。网络层传输是基于数据链路层的
**数据链路层:**完成两个相邻的设备之间的通信。通过网线,把电脑连到路由器/交换机上,电脑和路由器/交换机就是相邻节点/设备。数据链路层是基于物理层的
**物理层:**物理层规定了网络通信中的一些硬件设施要符合的要求,物理层的协议,就是约定这些硬件设施要符合的要求是怎样的。比如网线、wifi、光纤(光猫)等。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
例如,电商买东西:
我则关心东西拿到之后,要如何使用 -> 应用层
卖家只要关心,收件人信息 -> 传输层
物流公司则关心,包裹怎样路径传输的 -> 网络层
快递小哥/货车司机,考虑的是相邻节点 -> 数据链路层
很多时候会把数据链路层和物理层看做一个整体,所以也可以称为 TCP/IP 四层模型

应用程序:程序员写代码主要就是工作在应用层,应用层是和程序员打交道最多的层次
操作系统:传输层和网络层都是操作系统内核实现的。写代码的时候,最多就是调用传输层给应用层的接口
上述的分层体系也叫 TCP/IP 协议栈(类似于调用栈)
网络设备所在分层
**主机:**工作过程涉及到从物理层 -> 应用层
主机需要通过应用程序满足网络通信的需求
**路由器:**工作过程涉及到从物理层 -> 网络层
路由器要组建局域网,进行网络数据包的转发
**交换机:**工作过程涉及到从物理层 -> 数据链路层
交换机只是对路由器接口的扩展,不需要考虑组网的问题
**集线器:**只实现了物理层
真实的路由器和交换机功能更丰富
现代的交换机,很多都有路由器的功能,路由器也可以开启特殊的模式 (mesh),就可以起到"交换机" 的效果
网络数据通信的基本流程
谈到网络传输的 "基本数据单位",涉及到多个术语
网络数据包/帧/报/段
段(segment) TCP 中使用的术语
报(Datagram) UDP 中使用的术语
包(packet) IP 中使用的术语
帧(frame) 数据链路层中使用的术语(以太网数据帧)
这里对这几个术语不做严格区分(混着用),日常工作中一般也不会明确区分这些概念
案例:通过 qq 发送 hello 给朋友
封装
1. 应用程序获取到用户输入,会构造一个应用层的数据包
假设协议格式:发送者的qq号,接受者的qq,消息的时间,消息正文
示例数据:1234567,7654321,2024-11-02 12:00:00,hello
1)这个应用层数据包会遵守应用层协议(一般开发这个程序的程序员自己定义的协议)
2)应用层数据包往往是 "结构化数据"(类似 C 的结构体,有很多属性)
3)网络传输的数据,本质上都是 "字符串" 或 "二进制的 bit 流"
4)字符串也是二进制 bit 流,本质上就是 01 这样的数据
- 网线:电信号,高低电平表示 01
- 光纤:光信号,高频光/低频光表示 01
- wifi:电磁波(光信号),高频/低频电磁波表示 01
5)发送数据的时候,会把结构化数据转成 字符串/二进制 bit 流(序列化);接收数据的时候,会把 字符串/二进制 bit 流 解析为 结构化数据(反序列化)
**2.**应用程序调用传输层提供的接口(socket API),把数据交给传输层,传输层拿到数据之后,构造出 "传输层数据包"
传输层的协议,主要是两个:TCP、UDP
假设使用 TCP 协议:
1)TCP 协议会在应用层数据包的基础上,拼上一个TCP报头
2)TCP数据包 = TCP 报头(header) + TCP 载荷(payload)
TCP 报头:TCP功能相关的属性,包含了五元组中的源端囗和目的端囗
TCP 载荷:应用层数据包(TCP协议不关心载荷内容,只关心传输)
**3.**传输层构造好数据之后,继续调用网络层的 api,把传输层的数据包交给网络层继续进行处理
网络层最主要的协议:IP 协议
1)IP 协议继续对 TCP 数据包进行加工(拼上IP报头)
2)IP数据包 = IP报头 + IP载荷
IP报头:IP 功能相关的属性,包含了五元组中的源 IP 和目的 IP
IP载荷:整个传输层的数据包(IP 协议不关心载荷内容,只关心传输)
**4.**IP 协议继续调用数据链路层的 api,把 IP 数据包交给数据链路层数据链路层中
数据链路层的核心协议:"以太网"
1)以太网这个协议,也会在网络层数据包的基础上进一步加工
2)以太网数据帧 = 帧头 + 载荷 + 帧尾
**5.**以太网继续把以太网数据帧交给硬件设备(网卡),网卡会把上述二进制数据,最终以光信号/电信号/电磁波信号传播出去
五元组的协议类型在这个过程中的体现:
协议类型,不是只有一份数据,有很多层
其中 IP 报头里会记录当前的传输层使用的是哪个协议
传输层报头中,也会记录应用层使用哪个协议(准确的说是数据交给哪个应用程序)
数据链路层报头中也会记录网络层使用哪个协议
发送数据的时候,数据从应用程序逐层往下进行传递,每传递一层都由当前这层的协议进行报文的加工,主要的工作,就是拼上一个报头。按照这样的思路依次进行,最终到达数据链路层,才真正由网卡把这个二进制数据以光电信号的形式给它传输出去,这样的过程我们称之为 "封装"(和面向对象的封装,不是一个封装)
分用
数据到达接收方主机,逐层进行解析
**1.**数据(光电信号)到达接收方的网卡,网卡把光电信号还原成二进制数据(01)后,把二进制数据交给上层数据链路层
物理层数据信号的来源,决定了数据链路层要使用哪个协议
网线/光纤 来的数据,数据链路层 => 以太网;wifi 来的数据,数据链路层 => 802.11协议
**2.**数据链路层按照以太网协议进行解析,把报头和报尾取出来,剩下的载荷,往上传递给网络层

以太网的帧头中有专门的属性,描述了网络层要使用哪个协议
**3.**网络层拿到这个数据之后,按照 IP 协议的格式解析,再把载荷数据交给传输层

IP 报头中也有专门的属性,描述了传输层要使用哪个协议
**4.**传输层拿到数据之后,按照 TCP 协议进行解析,取出载荷,交给应用层

传输层报头中,通过目的端囗号,告知数据应该交给哪个应用程序
**5.**QQ应用程序解析应用层数据,拿到关键信息,展示到界面上,并给出提示

不同的应用程序,使用不同的应用层协议解析
传输的中间过程中,也是涉及到封装分用的
**交换机:**只需要封装分用到数据链路层即可
主机的数据传输到交换机,交换机收到之后,物理层解析,数据链路层解析(没有网络层了),然后重新构造出新的以太网数据帧,发给下一个设备。数据链路层中,得到的以太网数据帧的帧头的信息就足以支持交换机进行下一步工作了
交换机是工作在数据链路层的(二层转发)
路由器: 只需要封装分用到网络层
主机的数据传输到路由器.路由器收到之后,物理层,数据链路层,网络层解析(没有传输层)。解析完毕后,重新构造出新的网络数据包,构造出以太网数据帧,构造出二进制数据,然后进行转发
路由器是工作在网络层的(三层转发)
是否有设备工作在传输层?(了解)
有,比如防火墙、网关,都是封装分用到传输层的
也有设备,是只工作在物理层的
例如,集线器、网线延长线