【网络协议】网络协议系列二 - 集线器/网桥/交换机/路由器

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

一、新建Java项目并部署

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

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

1.1. 服务端(Java)

  1. 新建空项目

  2. 工程命名(工程名其实就是工程根目录文件夹名称)

  3. 新建模块(一个工程是由多个模块组成的)



  4. 在刚刚创建的模块src下新建一个java类(src是存放模块代码的)

  5. 运行

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

1.2. JavaWeb

  1. 添加Web框架支持,完成后会在模块中出现一个web文件夹


  2. 新建一个测试网页

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

1.3. 启动tomcat

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

  1. 编辑配置

  2. 添加tomcat服务

  3. 配置tomcat


  4. 运行(使用debug)

1.4. 访问资源

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

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

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

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

1.5. 登录

简单的登录界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!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后面直接拼接路径,就是根据项目所在服务器找对应资源。

1.6. servlet配置

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



1.6.1. 创建请求类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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模拟网络连接。

3.1. 网线直连

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

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

3.2. 同轴电缆

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

3.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发现不是自己的数据,就丢弃
  • 反复…

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

3.4. 网桥(Bridge)

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

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

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

3.5. 交换机(Switch)

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

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

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

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

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

3.6. 路由器(Router)

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

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

路由器的特点:

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

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

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


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

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

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