【1】网络协议基础知识
- 1、互联网
- 2、为什么要学习网络协议
- 3、学习中需要搭建的环境
- 4、客户端-服务器
- [5、Java 的跨平台原理](#5、Java 的跨平台原理)
- 6、C/C++的跨平台原理
- 7、一个简单的SpringBoot项目
-
- [(1) pom.xml](#(1) pom.xml)
- [(2) application.yml](#(2) application.yml)
- [(3) NetworkStudyApp.java](#(3) NetworkStudyApp.java)
- [(4) SwaggerConfig.java](#(4) SwaggerConfig.java)
- [(5) HelloWorldController.java](#(5) HelloWorldController.java)
- 8、什么是协议
- 9、网络互连模型
- 10、客户端传数据到服务器端
- 11、网络分层
- 12、计算机之间的通信基础
- 13、计算机之间的连接方式
-
- [(1) 网线直连](#(1) 网线直连)
-
- [① 使用交叉线连接两台计算机](#① 使用交叉线连接两台计算机)
- [② 设置两台计算机的IP地址](#② 设置两台计算机的IP地址)
- [③ ping 测试是否连通](#③ ping 测试是否连通)
- [④ 使用仿真发数据包测试是否连通](#④ 使用仿真发数据包测试是否连通)
- [⑤ ARP 广播协议](#⑤ ARP 广播协议)
- [(2) 同轴电缆(Coaxial)](#(2) 同轴电缆(Coaxial))
- [(3) 集线器(Hub)](#(3) 集线器(Hub))
-
- [① 三台计算机,一台集线器](#① 三台计算机,一台集线器)
- [② 计算机1向计算机2发数据](#② 计算机1向计算机2发数据)
- [③ 集线器"没有智商"](#③ 集线器“没有智商”)
- [(4) 网桥(Bridge)](#(4) 网桥(Bridge))
-
- [① 设备搭建](#① 设备搭建)
- [② 计算机1给计算机0发数据](#② 计算机1给计算机0发数据)
- [(5) 交换机(Switch)](#(5) 交换机(Switch))
-
- [① 设备搭建](#① 设备搭建)
- [② 计算机1给计算机0发数据](#② 计算机1给计算机0发数据)
- [(6) 路由器(Router)](#(6) 路由器(Router))
-
- [① 网桥、交换机等连接的设备必须在同一网段](#① 网桥、交换机等连接的设备必须在同一网段)
- [② 交换机跨网段传输数据](#② 交换机跨网段传输数据)
-
- [🍀 【A】搭建设备](#🍀 【A】搭建设备)
- [🍀 【B】设置网关的IP地址和设备的网关地址](#🍀 【B】设置网关的IP地址和设备的网关地址)
- 🍀【C】传输数据
1、互联网
🖊 互联网的出现,彻底改变了人们的生活方式,足不出户就可以购物、聊天、看电影、买车票、上班等
❓ 思考:数据是如何从一个设备传递到另一个设备的?
🖊 这一切都是由网络协议来规定的。没有网络协议,就没有今天的互联网。
2、为什么要学习网络协议
📕 互联网、移动互联网、物联网,都离不开网络协议
🖊 最熟悉的网络协议:HTTP
🖊 为了满足各种需求,产生了各式各样的网络协议(HTTPS、SMTP、MQTT、RTMP 等)
🖊 不同的网络协议有不同的应用场景
🍀 HTTP :H yperT ext T ransfer Protocol:超文本传输协议
📕 随着物联网、音视频、直播等领域的发展,企业提高对开发人员网络基本功的要求,经常问网络协议的面试题
🖊 TCP和UDP的区别?说一下它们的报文格式?
🖊 TCP的流量控制和和拥塞控制?TCP如何实现可靠性传输?
🖊 为什么连接是3次握手,关闭是4次挥手?
🖊 7层模型与4层模型的区别?每一层的作用是什么?
🖊 交换机与路由器的区别?
🖊 ...
3、学习中需要搭建的环境
📕 客户端-服务器
开发环境
🖊 客户端:浏览器(HTML+CSS+JS)
🖊 服务器:Java
📕 网络抓包
🖊 抓包工具(Fiddler、Wireshark)
📕 模拟环境
4、客户端-服务器
🖊 服务器软件(Tomcat)监听端口,端口(如 5200)和某个项目绑定
🖊 客户端通过端口和指定的项目交互
5、Java 的跨平台原理
📕 JVM(Java Virtual Machine):Java 虚拟机
📕 Java 的跨平台:一次编译,到处运行
🖊 编译生成跟平台无关的字节码文件(class 文件)
🖊 由对应平台的 JVM 把字节码解析为机器指令(010101)
📕 如果代码有语法错误,将编译失败,就不会生成字节码文件
🖊 那就不会去运行一个 JVM 程序。最后导致 Java 程序运行失败
6、C/C++的跨平台原理
📕 使用平台相关的编译器生成对应平台的可执行文件
🖊 JS 是解释型语言,由对应平台的浏览器执行JS代码
7、一个简单的SpringBoot项目
(1) pom.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/>
</parent>
<groupId>com.guoqing</groupId>
<artifactId>network-study</artifactId>
<version>1.0.0</version>
<properties>
<springfox-swagger.version>3.0.0</springfox-swagger.version>
<swagger-models-version>1.6.2</swagger-models-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
(2) application.yml
yml
server:
port: 5200
spring:
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
springfox:
documentation:
enabled: true # 是否启用Swagger功能
open-api:
enabled: true # 是否启用Swagger的open-api
swagger-ui:
enabled: true # 是否启用Swagger的WebUI
(3) NetworkStudyApp.java
java
@SpringBootApplication
public class NetworkStudyApp {
public static void main(String[] args) {
SpringApplication.run(NetworkStudyApp.class, args);
System.out.println("服务启动成功✌");
System.out.println("✌Swagger地址:http://localhost:5200/swagger-ui/index.html");
}
}
(4) SwaggerConfig.java
java
@Configuration
public class SwaggerConfig {
@Bean
public Docket docket(Environment env) {
return new Docket(DocumentationType.SWAGGER_2)
.ignoredParameterTypes(HttpSession.class,
HttpServletResponse.class,
HttpServletRequest.class) // 忽略参数
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("学习网络")
.description("原万事顺心")
.contact(new Contact("张国庆", null, "3465764450@qq.com"))
.version("1.0")
.build();
}
}
(5) HelloWorldController.java
java
@Api(tags = "网络协议学习")
@RestController
@RequestMapping("/hello/world")
public class HelloWorldController {
@ApiOperation(value = "模拟登录", notes = "模拟登录")
@PostMapping("/login")
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "用户名"),
@ApiImplicitParam(name = "password", value = "密码")
})
public String login(@RequestParam(defaultValue = "张思睿") String username,
@RequestParam(defaultValue = "zgq666") String password) {
if ("张思睿".equals(username) && "zgq666".equals(password))
return "张思睿 登录成功🍀";
return username + " 登录失败😟";
}
}
8、什么是协议
🖊 协议是一个约定
🖊 网络协议约定客户端可以发什么数据到服务器,服务器可以返回什么数据到客户端,约定数据格式等
9、网络互连模型
📕 为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 在 1985 年制定了网络互连模型
🖊 OSI 参考模型(Open System Interconnect Reference Model) ,具有 7 层结构【国际标准】
10、客户端传数据到服务器端
11、网络分层
12、计算机之间的通信基础
📕 需要得知对方的 IP 地址
📕 最终是根据 MAC 地址(网卡地址)输送数据到网卡,被网卡接收
🖊 如果网卡发现数据的目标 MAC 地址是自己,就会将数据传递给上一层进行处理
🖊 如果网卡发现数据的目标 MAC 地址不是自己,就会将数据丢弃,不会传递给上一层进行处理
13、计算机之间的连接方式
(1) 网线直连
🌼 通过交叉线连接(不是直通线)
👇 使用思科模拟器(Cisco Packet Tracer)模拟
① 使用交叉线连接两台计算机
② 设置两台计算机的IP地址
③ ping 测试是否连通
④ 使用仿真发数据包测试是否连通
⑤ ARP 广播协议
🖊 ARP 协议是广播
🖊 广播只在同一网段进行
🖊 广播的目标MAC地址是 FFFF.FFFF.FFFF,表示同一网段的设备的网卡都会收到广播信息
🖊 ARP 是有缓存的
(2) 同轴电缆(Coaxial)
🖊 多台计算机互联
🖌 半双工通信( 同一时间只能一个设备向另一个设备发数据 )全双工通信:同一时间,A设备可以向B设备发数据,B设备也可以向A设备发数据
🖌 容易冲突
🖌 不安全
🖌 中间断了,则整个瘫痪
🖌 同轴电缆"没有智商"(会向所有的设备发广播)
(3) 集线器(Hub)
🖌 半双工通信
🖌 容易冲突
🖌 不安全
🖌 根同轴电缆一样:没有智商(会向所有的设备发广播)
👇 使用思科模拟器(Cisco Packet Tracer)模拟
① 三台计算机,一台集线器
② 计算机1向计算机2发数据
③ 集线器"没有智商"
(4) 网桥(Bridge)
🖌 能够通过自学习得知每个接口那侧的 MAC 地址
🖌 从而起到隔绝冲突域的作用
🖊 MAC地址表
网桥端口 | MAC地址 |
---|---|
LEFT | 计算机6的MAC地址 |
RIGHT | 计算机2的MAC地址 |
LEFT | 计算机7的MAC地址 |
🖊 当网桥完全知道其每个端口那侧的所有设备的MAC地址的时候,每个接口那侧就是一个冲突域
🖊 当网桥知道目标地址是在接口的某一侧(如 LEFT)的时候,网桥就不会把数据发到 RIGHT
🖊 不同的冲突域的设备之间可以同时发数据
🖊 网桥只有2个接口,只能隔绝2个冲突域
🖊 同一冲突域内若有很多设备的话,这些设备之间是半双工通信
🍀 思科模拟器测试
① 设备搭建
② 计算机1给计算机0发数据
👆 计算机1发包给集线器0,集线器"没有智商",会把包广播给计算机0和网桥0
👆 网桥已经记录了计算0和计算1的MAC地址,若计算机0和计算机1再次互相发包,网桥不会把包发给它右侧端口的设备
(5) 交换机(Switch)
🖊 相当于接口更多的网桥
🖊 全双工通信
🖊 比集线器安全(集线器"没有智商",数据包会到处发)
🖊 接口多(直接连设备,无需集线器)
❓ 思考:全球所有的设备都用交换机连接会是什么情况?
🖌全球的设备都必须在同一个网段,进而IP地址不够用(交换机连接的设备必须在同一网段)
🖌第一次ARP广播获得MAC地址的时候会广播给全球所有的设备(广播风暴)
🍀 思科模拟器测试
① 设备搭建
② 计算机1给计算机0发数据
(6) 路由器(Router)
📕 网线直连、同轴电缆、集线器、网桥、交换机
🖊连接的设备必须在同一网段
🖊连接的设备处在同一广播域
📕 路由器
🖊可以在不同网段之间转发数据
🖊隔绝广播域
🌼主机发数据之前,首先会判断目标主机的IP地址跟自己是否在同一网段❓🖊 在同一网段:ARP获取MAC地址、通过交换机\集线器传递数据
🖊 不在同一网段:通过路由器转发数据,通过路由器的网关(Gateway)转发
① 网桥、交换机等连接的设备必须在同一网段
② 交换机跨网段传输数据
🍀 【A】搭建设备
🍀 【B】设置网关的IP地址和设备的网关地址
🍀【C】传输数据
🖊 ARP广播拿到网关的MAC地址
🖊 不同网段的设备连接需要使用路由器