【1】网络协议基础概念

1、互联网

🖊 互联网的出现,彻底改变了人们的生活方式,足不出户就可以购物、聊天、看电影、买车票、上班等
在这里插入图片描述

❓ 思考:数据是如何从一个设备传递到另一个设备的?
🖊 这一切都是由网络协议来规定的。没有网络协议,就没有今天的互联网。

2、为什么要学习网络协议

📕 互联网、移动互联网、物联网,都离不开网络协议
🖊 最熟悉的网络协议:HTTP
🖊 为了满足各种需求,产生了各式各样的网络协议(HTTPS、SMTP、MQTT、RTMP 等)
🖊 不同的网络协议有不同的应用场景

🍀 HTTPHyperText Transfer Protocol:超文本传输协议

📕 随着物联网、音视频、直播等领域的发展,企业提高对开发人员网络基本功的要求,经常问网络协议的面试题
🖊 TCP和UDP的区别?说一下它们的报文格式?
🖊 TCP的流量控制和和拥塞控制?TCP如何实现可靠性传输?
🖊 为什么连接是3次握手,关闭是4次挥手?
🖊 7层模型与4层模型的区别?每一层的作用是什么?
🖊 交换机与路由器的区别?
🖊 …

3、学习中需要搭建的环境

📕 客户端-服务器开发环境
🖊 客户端:浏览器(HTML+CSS+JS)
🖊 服务器:Java

📕 网络抓包
🖊 浏览器(ChromeFirefox
🖊 抓包工具(Fiddler、Wireshark)

📕 模拟环境
🖊 xshellpacket-tracergns3

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 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

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

@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

@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

@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地址

在这里插入图片描述

🖊 不同网段的设备连接需要使用路由器

相关推荐

  1. 网络】SCTP协议概念

    2024-03-29 21:42:01       31 阅读
  2. 网络中的一些基本概念1

    2024-03-29 21:42:01       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 21:42:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 21:42:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 21:42:01       82 阅读
  4. Python语言-面向对象

    2024-03-29 21:42:01       91 阅读

热门阅读

  1. 数据关联_3.7

    2024-03-29 21:42:01       39 阅读
  2. 基于Python的高考志愿辅助填报系统

    2024-03-29 21:42:01       40 阅读
  3. Spring

    Spring

    2024-03-29 21:42:01      44 阅读
  4. dockerfile编写

    2024-03-29 21:42:01       36 阅读
  5. 008_function_convention_in_Matlab中的函数约定

    2024-03-29 21:42:01       33 阅读
  6. linux三剑客之grep

    2024-03-29 21:42:01       47 阅读
  7. mysql5.7安装

    2024-03-29 21:42:01       38 阅读
  8. LeetCode 704 二分查找

    2024-03-29 21:42:01       37 阅读
  9. mybatis-plus的使用

    2024-03-29 21:42:01       44 阅读
  10. MyLisp项目日志:函数

    2024-03-29 21:42:01       34 阅读