网络协议一:基本概念

学习中需要搭建的环境

  1. 客户端-服务器开发环境
    1. 客户端:浏览器(HTML+CSS+JS)
    2. 服务器:Java
  2. 网络抓包
    1. 浏览器(Chrome、Firefox)、Fiddler、Wireshark
  3. 模拟工具
    1. Xshell(只有Windows版)、Packet Tracer(注册地址)、GNS3

语言的跨平台原理

1.C/C++的跨平台原理

  1. 原理:使用平台相关的编译器生成对应平台的可执行文件 图1

2.Java的跨平台原理

图1

  1. java的跨平台:一次编译,到处运行
    1. 编译生成跟平台无关的字节码文件(class文件)
    2. 由对应平台的JVM解析字节码为机器指令(010101)
  2. JVM(Java Virtual Machine):Java虚拟机
  3. 如果代码有语法错误,将编译失败,并不会生成字节码文件
    1. 那就不会去运行一个JVM程序。最后导致 程序运行失败
  4. 注意:
    1. C/C++编译之后直接可以生成平台对应的可执行文件
    2. Java编译之后(*.class)不是可执行文件,是字节码文件
    3. C/C++不同系统需要多次编译,Java不同系统只需要编译一次。
    4. 对应平台要运行java编译的字节码文件必须安装JVM,而且要启动运行起来

服务器的搭建

1.必装工具

  1. JDK: https://www.oracle.com/java/technologies/javase-downloads.html
    1. 需要配置Path、JAVA_HOME
  2. Tomcat:https://tomcat.apache.org
  3. InteliJ IDEA Ultimate:https://www.jetbrains.com/idea/download/

2.客服端、服务器概念

  1. 服务器就是一台计算机,这台计算机对CPU和内存要求比较高
  2. 服务器有很多端口,每个端口对应一个服务器软件
  3. 一个服务器软件下面可以部署n个java项目(比如:qq、微信等应用的后台)
  4. Tomcat:
    1. java中的服务器软件,免费开源
    2. Tomcat这个软件也是由java开发的,因此要运行这个Tomcat软件必须通过JVM
  5. 因此要想搭建一个服务器步骤如下:
    1. 在一台计算机上安装、启动一个JVM用来加载执行Tomcat
    2. 然后在该机器上安装服务器软件Tomcat
    3. 把开发人员编写的java代码部署到这个服务器软件Tomcat中
    4. Tomcat就可以执行这个java代码
  6. 客户端请求服务器的过程
    1. 客户端发送请求到服务器
    2. 服务器根据请求的端口找到对应的服务器软件Tomcat
    3. Tomcat根据请求信息去找到对应的java代码,执行java代码并返回结果给客户端

图1

3.开发环境配置

  1. 安装工具前先在F盘目录新建一个Dev目录,在该目录下新建一个Java文件夹
  2. 下载和安装JDK(8、13):安装到Java目录下
    1. JDK是什么?
      1. Oracle以74亿美元收购sun公司的Java,因此Orcal是Java的官方
      2. Oracle会提供一个叫JDK的东西,JDK中包含一个叫JRE的东西
      3. JRE即Java Runtime Environment,Java运行环境
      4. 有了JRE就相当于有了JVM
      5. 因此只要电脑上安装了JDK,就相当于有了JVM环境
    2. 安装JDK步骤
      1. 详见java博客
      2. 注意:需要配置Path、JAVA_HOME
  3. 下载和安装IDEA (破解版本),安装到Java目录下
  4. 安装Tomcat
    1. 直接解压到文件夹即可,解压到Java目录下
    2. 启动:打开bin文件,找到startup.bat,双击即可,默认占用的是8080端口
    3. 此时就可以访问了:http://127.0.0.1:8080/docs
    4. 上面访问的是Tomcat安装目录下的webapps文件夹下的docs文件中的资源

4.搭建Java服务器开发环境

  1. IDEA新建项目
    1. 打开IDEA->New Project->左边选择Empty Project->next->Project name:设置项目名称(NetWork),设置项目路径(也可以在Java目录下新建一个文件夹存放F:\Java\Codes\NetWork)->Finish
    2. 此时弹出Project Structure窗口,选择Project Setting ->Modules->点击左上角的加号“+”->New Module->弹出一个窗口,选择Java,Module SDK中选择为JDK8->next->Module name:自定义模块名称(01_HelloWorld)->点击Finish->点击OK
    3. 项目文件列表
      1. 01_HelloWorld文件夹下有个src文件夹,内部专门用于写Java源码
      2. External Libraries:该文件夹下存放整个项目依赖的库,目前有一个JDK8的库(1.8)
  2. 初始化代码
    1. 右击src->New->Java Class->Main->回车,新建一个Main类
    2. 在该类中新增一个main函数,写测试代码,右击选择运行(Run)执行测试代码
  3. 新增web服务器模块
    1. 右击01_HelloWorld点击Add Framework Support…,勾选Web Application点击OK
    2. 此时生成一个与src平级的web文件夹
    3. 这个web文件夹就是给客户端提供的资源
    4. 在这个文件夹中新增html、css、img等文件夹分别编写相应的web代码
  4. 为当前项目添加Tomcat服务(Java项目要部署在服务器软件中)
    1. 点击IDEA工具绿色小锤标识右边的框,选择Edit Configurations…
    2. 点击左上角的加号“+”->选择Tomcat Server下的Local->为Tomcat依赖命名(Tomcat9)->点击Configure…选择Tomcat解压的本地路径(F:\Java\apache-tomcat-9.0.34)
    3. 点击Deployment(部署)点击右边的加号“+”,选择Artifact…(打包)
    4. 设置Application context:中的路径(/hello),这个路径的作用是用来区别当前Tomcat下的哪一个项目。一个Tomcat下可以部署n个Java项目,为了区别访问哪一个项目因此这里用路径指定
    5. 点击OK即可
    6. 此时点击右上角的虫子图标(断点调试),则启动Tomcat,并将当前的Java项目部署到Tomcat中;然后浏览器自动打开http://localhost:8080/hello/显示的网页是web文件夹下的index.jsp内容,即该路径访问的是web文件夹下的所有资源,默认寻找index的文件
    7. 可以在web下新建一个test.html,编写测试代码,然后点击甲壳虫,选择Redeploy(重新部署:因为是Java项目代码发生了改变,因此需要重启Tomcat服务,只需要重新部署Java代码即可),浏览器访问:http://localhost:8080/hello/test.html,就可以看到编写的测试代码
    8. 同理可以在web文件夹下新建html、css、img文件夹(右击web->new->Directory),存放不同的资源用于浏览器访问
      1. 在html文件夹下新建一个login.html文件,编写登录代码:

         <form action="/hello/login" method="get">
             <div>用户名<input name="username"></div>
             <div>密码<input name="password"></div>
             <button type="submit">登录</button>
         </form>
        
  5. 接收客户端发送过来的登录请求参数
    1. 如果Java项目需要接收客户端的参数需要依赖一个Servlet这个技术
    2. Servlet这个库在Tomcat中,需要在项目中添加依赖库
    3. 点击右上角倒数第三个图标(Project Structure…)->点击Modules->01_HelloWorld->Dependencies->点击加号“+”选择Library->选择Tomcat9.0.34->add Selected->点击OK即可; 此时项目文件目录的External Libraries文件夹下面就会多一个Tomcat9.0.34库
    4. 在src文件目录下,右击new->java Class->com.zh.servlet.LoginServlet,回车即可
      1. LoginServlet是类名
      2. com.zh.servlet:是包名,也是命名空间,每个点代表文件目录的节点,三层文件夹,com文件夹下的zh文件夹下的servlet文件夹下的LoginServlet类
      3. 包名是用来区分具有相同类名的类,包名的约定俗成:公司的域名反过来写
    5. 在LoginServlet类中编写接收客户端代码:

       /*
       处理登录请求
       1. 继承HttpServlet,才能处理http请求
       2. 使用@WebServlet,说明它要处理的请求路径
       * */
       @WebServlet("/login")
       public class LoginServlet extends HttpServlet {
           //处理get请求
           @Override
           protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               System.out.println("------doget-----------");
               //统一函数处理
               doPost(req,resp);
           }
           //处理post请求
           /**
            * HttpServletRequest req: 请求,用来获取客户端发送的数据
            * HttpServletResponse resp:响应,用来给客户端返回数据
            * */
           @Override
           protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               System.out.println("-------dopost---------");
               //获取客户端发送的数据(请求参数)
               String username = req.getParameter("username");
               String password = req.getParameter("password");
               System.out.println(username + "---" + password);
              
               //2. 判断
               if("123".equals(username) && "456".equals(password)){
                   System.out.println("登录成功");
                   resp.getWriter().write("Login Success!");
               }else {
                   System.out.println("登录失败");
                   resp.getWriter().write("Login Error!");
               }
           }
       }
      

网络互连模型

1.常见的网络模型

图1

  1. 为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 在 1985 年制定了网络互连模型
    1. OSI 参考模型(Open System Interconnect Reference Model),具有 7 层结构
  2. TCP/IP协议模型是实际使用中的模型
  3. 有些研究机构为了方便研究把它分为了五层

2.网络数据传输的过程

图1

  1. 注意:数据从应用层开始传输,每层加协议头,但是链路层两头都加

计算机之间的通信

计算机之间的通信基础

  1. 需要得知对方的IP地址
  2. 最终是根据MAC地址(网卡地址),输送数据到网卡,被网卡接收
    1. 如果网卡发现数据的目标MAC地址是自己,就会将数据传递给上一层进行处理
    2. 如果网卡发现数据的目标MAC地址不是自己,就会将数据丢弃,不会传递给上一层进行处理
  3. 即:两台计算机之间通信不仅需要IP地址,还需要MAC地址,MAC地址就是网卡的地址,被放在数据包中传递
  4. 问题:只知道对方PC的IP的情况下如何才能拿到对方的MAC地址呢?
    1. PC机1先通过ARP协议(协议数据中包含目标PC的IP地址)向当前网段的所有PC发送广播,当目标PC2接收到广播发现协议中的IP地址是自己时,将自己的MAC地址发送给源PC,然后源PC1在通过目标PC2的IP地址、MAC地址进行ICMP协议进行数据传输
    2. ARP协议是有缓存的,会缓存MAC地址,下次发送数据直接通过IP地址、MAC地址进行ICMP协议进行数据传输

网络模拟工具PacketTracer

  1. 该工具是一个网络模拟工具
  2. 该工具必须先注册官网(密码:12**zhonG)
  3. 利用该工具可以配置n台电脑、路由器、各种网线等元件,搭建一个模拟的网络系统,然后进行模拟通信
  4. 注意:
    1. 每个元器件要设置参数,否则不能使用,比如:拉了2台PC,然后用交叉线连接,然后需要给这2台PC分别设置IP地址,然后使用任何一台PC来ping另外一台的IP地址,可以发现ping通
    2. 该软件是英文版可以汉化,汉化包在百度云盘中

计算机之间的连接方式

  1. 用网线直连
    1. 即两台PC用一根交叉线直接相连
    2. 缺点:网线直连无法解决多台PC之间的相互连接
  2. 同轴电缆(Coaxial)
    1. 可以实现多台PC之间的相互连接
    2. 缺点:
      1. 半双工通信:同一时刻只能往一个方向发送数据,即A向B发送数据的同时,B不能向A发送数据
      2. 容易冲突:由于同一时刻只能单向发送数据,如果其他PC也发送此时会冲突
      3. 不安全:PC1发送数据时会同时发送到该网段的所有PC
      4. 中间断了,整个都瘫了
  3. 集线器(Hub)
    1. 集线器这个设备可以同时连接n台电脑
    2. 缺点:
      1. 半双工通信
      2. 容易冲突
      3. 不安全
      4. 跟同轴电缆一样:没有智商
    3. 相比同轴电缆电缆的优点:一个PC断开不影响其他PC之间通信,不会瘫痪
    4. 疑问:如果一个集线器连接了n(n>1000)个PC,那么任何一个设备发送一条消息,就要分别传递到剩余的n-1台PC上,这样发送一条数要占用很长的时间,这段时间其他设备是不能发送的。因此设备越多效率越低。如何解决这个问题呢?—-网桥
  4. 网桥(Bridge)
    1. 能够通过自学习得知每个接口那侧的MAC地址
      1. 从而起到隔绝冲突域的作用
    2. 网桥只有两个接口,分别接2个集线器,即网桥专门用来连接集线器的
    3. 自学习原理:
      1. 网桥内部有个接口MAC地址表
      2. 当PC1第一次传输数据时首先还是会进行ARP广播,此时网桥会记录PC1的MAC地址。当目标PC2通过ARP响应时,集线器也会记录PC1的MAC地址。这样集线器中就记录了2个PC的MAC地址。照此下去,当某个PC发送数据时,通过集线器时,如果集线器已经知道目标的MAC地址不再另一侧,那么就会直接截断不会向另一侧传送
    4. 注意:理解网桥是理解交换机的前提
  5. 交换机(switch)
    1. 相当于接口更多的网桥
    2. 全双工通信:同一时刻可以相互发送数据
    3. 思考
      1. 全球所有的设备都用交换机连接会是什么情况?
      2. 答:如果全球PC都在一个网段,那么交换机学习前的ARP广播阶段,一台PC第一次与另一台PC进行发送数据,首先仍然是ARP广播,此时仍然需要发送给全球所有的PC,如果每台PC都这样的话就会形成广播风暴,那么任然存在效率问题
      3. 此时路由器的作用得以体现
  6. 路由器(Router)
    1. 网线直连、同轴电缆、集线器、网桥、交换机特点:
      1. 连接的设备必须在同一网段
      2. 连接的设备处在同一广播域
    2. 路由器
      1. 可以在不同网段之间转发数据
      2. 隔绝广播域
    3. 路由器注意点:
      1. 同一个网段形成广播域,但是路由器是隔断广播域的,那么ARP广播获取MAC地址就无效,那么一个网段的PC向另一个网段的PC发送数据时,如何才能获取到目的PC的MAC地址呢?
      2. 解决办法:PC1发数据之前会判断目标PC2的IP地址是否跟源PC1在同一个网段
        1. 在同一个网段:使用ARP广播来获取MAC地址
        2. 不在同一个网段:通过路由器转发数据,路由器的每个接口都提供一个叫网关的东西,本质是用网关之间传输数据
    4. 路由器的出现实现了n个局域网能够相互通信,从而形成互联网

图1

图1

通过路由器转发数据原理
  1. 如果一个数据要跨网段传输,这条数据先到达该网段对应的路由器接口的网关,然后路由器根据这个网关数据携带的目的IP地址,找到目的IP地址对应的网关,由目的网关传输给目的网段
  2. 如果有2个网段(192.168.3、192.168.4)中间有个路由器连接,那么每个网段都对应一个网关
  3. 网关相互传递的2个前提条件:每个网段对应的网关也必须设置IP地址(比如192.168.3.1、192.168.4.1),以确保这个网关的IP地址与其连接的网段在同一局域网;这个网段的所有PC都必须设置网关地址
  4. 这也就解释了买完家庭路由器之后,需要配置路由器的网关,通常是:192.168.1.1;每台电脑IP地址设置的地方都有一个网关地址设置
  5. 注意:跨网段发送数据时,首先也需要通过发送ARP广播获取该网段网关的MAC地址,然后下次才正式通过ICMP协议发送数据
  6. 仔细看下图:

图1

  1. 场景:计算机2(下面用A代替)向计算机5(下面用B代替)发送数据.网关1(192.168.3.1),网关2(192.168.4.1)
  2. A先发送ARP广播获取网关1的MAC的地址
  3. A通过ICMP协议发送数据给网关1
  4. 路由器拿到网关1的数据携带的目的IP地址,转到网关2
  5. 网关2首先发送ARP广播给B以及其他PC,获取B的MAC地址
  6. 网关2通过ICMP协议发送数据给B
  7. A向B发送一条跨网数据流程完成
Table of Contents