02-📝计算机网络核心知识|【搭建调试环境、新建Java项目、计算机通信基础、计算机连接方式、集线器/网桥/交换机/路由器】

1,069 阅读19分钟

一、前言

本系列文章旨在复习计算机网络核心知识,进一步夯实基础,为以后 参与物联网、音视频、直播、即时通讯等领域的项目做一定的知识储备。

文章列表:

本文假设你具备HTML+CSS+JS+Java基础(知道基本语法及如何使用即可)。

二、搭建调试环境

要想真正了解网络之间数据如何传输?协议的约束条件?就需要一套能够发起网络请求和处理请求的环境。

1. 客户端

使用浏览器即可(会基本的HTML+CSS+JS即可)。

2. 服务端

以Java为例。

2.1 必装工具

运行Tomcat

Windows:/tomcat-package/bin/startup.bat

Mac或Linux:/tomcat-package/bin/startup.sh

2.2 Java的跨平台原理

JVM(Java Virtual Machine):Java虚拟机。

Java跨平台:一次编译,到处运行。

  • 编译生成和平台无关的字节码文件(class文件)
  • 由对应平台的JVM解析字节码为机器指令(010101)
  • 如果代码有语法错误,将编译失败,并不会生成字节码文件(失败后不会运行JVM程序,最终导致Java程序运行失败)

2.3 C/C++的跨平台原理

C/C++的跨平台:使用平台相关的编译器生成对应平台的可执行文件。

扩展:C++的是C Plus Plus的简写。

2.4 客户端和服务器交互

客户端发送网络请求给服务器,服务器使用Tomcat软件监听客户端发送的请求(含端口号),然后执行对应的Java代码把结果返给客户端。而字节码文件需要JVM运行环境才能正常运行(Tomcat本身也是Java编写的)。

3. 网络抓包工具

浏览器(ChromeFirefox)、FiddlerWiresharkCharles

4. 模拟网络工具

用来模拟网络环境(交换机、路由器之间的切换)。

Xshell(只有Windows版本)、Packet Tracer注册地址)、GNS3

三、新建Java项目并部署

我们自己搭建一个简单的登录页面和服务,以此了解客户端和服务端之间的数据交互流程。

提示:路径、类名、资源名尽量不要出现中文或者特殊字符。

1. 服务端(Java)

  1. 新建空项目
  2. 工程命名(工程名其实就是工程根目录文件夹名称)
  3. 新建模块(一个工程是由多个模块组成的)
  4. 在刚刚创建的模块src下新建一个java类(src是存放模块代码的)
  5. 运行

上面的配置只是单机运行,并没有任何客户端交互,我们可以建立一个JavaWeb服务器让HTML页面和服务器进行交互。

2. JavaWeb

  1. 添加Web框架支持,完成后会在模块中出现一个web文件夹
  2. 新建一个测试网页

要想通过浏览器直接访问网页,需要启动Tomcat并把项目部署到上面。

3. 启动tomcat

虽然可以直接在外面启动tomcat,但不是很方便。我们可以把tomcat集成到IDEA中,跟随项目启动和部署非常便捷。

  1. 编辑配置
  2. 添加tomcat服务
  3. 配置tomcat
  4. 运行(使用debug)

4. 访问资源

  1. 运行成功后IDEA会自动打开网址http://localhost:8080/hello/hello就是刚才上面配置的路径,默认访问index.htm/index.html/index.jsp其中一个。

也可以指定要访问的完整资源名。例如访问test.html

  1. 如果web文件夹有变更,变更后不需要重启服务,只需要重新部署即可。

建议到配置文件中修该按钮默认事件为部署

5. 登录

简单的登录界面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/hello">
    <div>用户名<input name="username"></div>
    <div>密码<input name="password"></div>
    <button type="submit">登录</button>
</form>
</body>
</html>

信息提交给服务器后,服务器如何处理呢?需要使用servlet,而tomcat有对应的库:jsp-apiservlet-api,把这两个库加入到项目中即可。

action后面直接拼接路径,就是根据项目所在服务器找对应资源。

6. servlet配置

由于已经在IDEA中集成了tomcat,只需要把tomcat的库添加到项目依赖。

6.1. 创建请求类


package com.idbeny.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
 * 处理登录请求
 * 1.继承HttpServlet(处理HTTP请求)
 * 2.使用WebServlet(处理的请求路径)
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    /**
     * @param HttpServletRequest req 请求:用来获取客户端发送的数据
     * @param HttpServletResponse resp 响应:用来给客户端返回数据
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.获取客户端发送的数据(请求参数)
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        // 2.登录业务判断
        if ("idbeny".equals(username) && "123456".equals(password)) {
            // 登录成功
            resp.getWriter().write("Login Success");
        } else {
            // 登录失败
            resp.getWriter().write("Login Failure");
        }
    }
}
  1. 修改login.html中的actionaction="/hello/login"
  2. 重新部署后并提交表单后输出doGet,并且页面地址显示http://localhost:8080/hello/login?username=idbeny&password=123456,内容显示Login Success
  3. 修改method="post",重新部署后并提交表单后输出doPost,并且页面地址显示http://localhost:8080/hello/login,页面内容显示Login Success。表单参数可以通过浏览器的开发者工具看到。

Java中的包类似于C++中的命名空间。

四、计算机之间通信基础

计算机通信需要得知对方的IP地址,但最终是根据MAC地址(网卡地址),输送数据到网卡,被网卡接收。

  • 如果网卡发现数据的目标MAC地址是自己,就会将数据传递给上一层进行处理(例如Java虚拟机)
  • 如果网卡发现数据的目标MAC地址不是自己,就会将数据丢弃,不会传递给上一层进行处理

五、计算机之间的连接方式

可以通过Cisco Packet Tracer模拟网络连接。

1. 网线直连

两台计算机之间最简单的连接方式就是网线直连(交叉线)。

模拟通信的时候,会使用到ICMP、ARP协议。ping使用的是ICMP协议,ARP协议其实就是一个广播(ARP是有缓存的),让同一个网段中的指定IP响应当前计算机的网卡地址(广播找MAC地址)。

2. 同轴电缆

很早之前用的是半双工通信方式,特点是非常容易冲突(冲突域),不安全,只要断了全域瘫痪。因为一台设备在发送数据的时候,另一台设备只能接收数据,不能发送数据。现在基本上都是全双工通信,在接收数据的同时也可以发送数据。

3. 集线器(Hub)

采用的也是半双工通信,所以特点和同轴电缆一样,但仅仅比同轴电缆多一个优点:如果一台设备出现问题不会影响其他设备。

通过模拟通信看到,计算机0给计算机2发送数据的步骤如下:

  • 计算机0发送数据给计算机2
  • 首先发送ARP给集线器0,由集线器0转送ARP给连接设备(计算机1和计算机2),找寻IP对应的MAC地址
  • 计算机1发现不是自己,就丢弃
  • 计算机2发现要找的是自己(通过IP识别),然后把MAC地址等信息通过ARP发送给集线器0
  • 集线器0又把数据转送给了其他的连接设备(计算机0和计算机1),
  • 计算机0接收到数据后(MAC地址)开始使用ICMP传输
  • 计算机1发现不是自己的数据,就丢弃
  • 反复...

总结: 集线器和同轴电缆都是没有智商的,只要有设备发数据,就把数据转给其他所有已连接设备,设备越多效率越低。

4. 网桥(Bridge)

网桥连接的是同一个网段的计算机。

网桥能够通过自学习得知每个接口那侧的MAC地址,从而起到隔绝冲突域的作用(变成两个冲突域)

  • 计算机0发送数据给计算机4,ARP结束后网桥0就会记录计算机0和计算机4的MAC地址,下次如果网桥左边的设备发送数据给计算机0时,网桥就会优先找右边的设备
  • 如果计算机0发送给计算机1,由于集线器没有智商,也会发送给网桥0。网桥记录计算机0的MAC地址,并继续向下转发。下次网桥左边的设备发送数据给计算机1时,集线器0把数据转发给网桥0时,网桥发现已经记录的MAC地址对应的设备在左侧,就不会继续向下转发数据

5. 交换机(Switch)

网桥虽然解决了隔绝冲突域的问题。但同一个冲突域,还是不能互相同时收发数据。交换机的出现解决了该问题。

  • 交换机相当于集线器和网桥的集合
  • 全双工通信
  • 比集线器安全(不会因为抓包而拦截数据)

首次发送数据时,还是会ARP广播所有设备,因为此时交换机还不知道源和目标的MAC地址。

思考:全球所有的设备都用交换机连接会是什么情况?

意味着都在同一个网段。首先产生的第一个问题就是IP地址不够用,其次如果使用ARP时,全球所有的设备都会收到该消息(广播风暴)。路由器的出现就是解决这个问题的。

6. 路由器(Router)

网线直连、同轴电缆、集线器、网桥、交换机的共同特点:

  • 连接的设备必须在同一个网段
  • 连接的设备处在同一个广播域

路由器的特点:

  • 可以在不同网段之间转发数据
  • 隔绝广播域

主机发数据之前,首先会判断目标主机的IP地址和它是否在同一个网段:

  • 在同一个网段 通过交换机/集线器传递数据
  • 不在同一个网段 通过路由器转发数据(网关)

交换机0和交换机1处于不同的网段,要想让不同网段之间通信,就需要在两个交换机之间增加一个路由器。

  • 计算机4发送数据给计算机7时,先把发送ARP找到对应IP地址/网关
  • 网关把数据转发给另一个网关(计算机7IP段的网关),找到计算机7后,再反向把MAC地址给到计算机4,此时即可开始数据传输

路由器是解决不同网段之间通信的,不要试图在同一个网段使用路由器(应该使用交换机)。

专题系列文章

1. 前知识

2. 基于OC语言探索iOS底层原理

3. 基于Swift语言探索iOS底层原理

关于函数枚举可选项结构体闭包属性方法swift多态原理StringArrayDictionary引用计数MetaData等Swift基本语法和相关的底层原理文章有如下几篇:

4. C++核心语法

5. Vue全家桶

6. 音视频技术核心知识

7. 计算机网络核心知识

其它底层原理专题

1. 底层原理相关专题

2. iOS相关专题

3. webApp相关专题

4. 跨平台开发方案相关专题

5. 阶段性总结:Native、WebApp、跨平台开发三种方案性能比较

6. Android、HarmonyOS页面渲染专题

7. 小程序页面渲染专题