网络协议一:基本概念
学习中需要搭建的环境
- 客户端-服务器开发环境
- 客户端:浏览器(HTML+CSS+JS)
- 服务器:Java
- 网络抓包
- 浏览器(Chrome、Firefox)、Fiddler、Wireshark
- 模拟工具
- Xshell(只有Windows版)、Packet Tracer(注册地址)、GNS3
语言的跨平台原理
1.C/C++的跨平台原理
- 原理:使用平台相关的编译器生成对应平台的可执行文件
2.Java的跨平台原理
- java的跨平台:一次编译,到处运行
- 编译生成跟平台无关的字节码文件(class文件)
- 由对应平台的JVM解析字节码为机器指令(010101)
- JVM(Java Virtual Machine):Java虚拟机
- 如果代码有语法错误,将编译失败,并不会生成字节码文件
- 那就不会去运行一个JVM程序。最后导致 程序运行失败
- 注意:
- C/C++编译之后直接可以生成平台对应的可执行文件
- Java编译之后(*.class)不是可执行文件,是字节码文件
- C/C++不同系统需要多次编译,Java不同系统只需要编译一次。
- 对应平台要运行java编译的字节码文件必须安装JVM,而且要启动运行起来
服务器的搭建
1.必装工具
- JDK: https://www.oracle.com/java/technologies/javase-downloads.html
- 需要配置Path、JAVA_HOME
- Tomcat:https://tomcat.apache.org
- InteliJ IDEA Ultimate:https://www.jetbrains.com/idea/download/
2.客服端、服务器概念
- 服务器就是一台计算机,这台计算机对CPU和内存要求比较高
- 服务器有很多端口,每个端口对应一个服务器软件
- 一个服务器软件下面可以部署n个java项目(比如:qq、微信等应用的后台)
- Tomcat:
- java中的服务器软件,免费开源
- Tomcat这个软件也是由java开发的,因此要运行这个Tomcat软件必须通过JVM
- 因此要想搭建一个服务器步骤如下:
- 在一台计算机上安装、启动一个JVM用来加载执行Tomcat
- 然后在该机器上安装服务器软件Tomcat
- 把开发人员编写的java代码部署到这个服务器软件Tomcat中
- Tomcat就可以执行这个java代码
- 客户端请求服务器的过程
- 客户端发送请求到服务器
- 服务器根据请求的端口找到对应的服务器软件Tomcat
- Tomcat根据请求信息去找到对应的java代码,执行java代码并返回结果给客户端
3.开发环境配置
- 安装工具前先在F盘目录新建一个Dev目录,在该目录下新建一个Java文件夹
- 下载和安装JDK(8、13):安装到Java目录下
- JDK是什么?
- Oracle以74亿美元收购sun公司的Java,因此Orcal是Java的官方
- Oracle会提供一个叫JDK的东西,JDK中包含一个叫JRE的东西
- JRE即Java Runtime Environment,Java运行环境
- 有了JRE就相当于有了JVM
- 因此只要电脑上安装了JDK,就相当于有了JVM环境
- 安装JDK步骤
- 详见java博客
- 注意:需要配置Path、JAVA_HOME
- JDK是什么?
- 下载和安装IDEA (破解版本),安装到Java目录下
- 安装Tomcat
- 直接解压到文件夹即可,解压到Java目录下
- 启动:打开bin文件,找到startup.bat,双击即可,默认占用的是8080端口
- 此时就可以访问了:
http://127.0.0.1:8080/docs
- 上面访问的是Tomcat安装目录下的webapps文件夹下的docs文件中的资源
4.搭建Java服务器开发环境
- IDEA新建项目
- 打开IDEA->New Project->左边选择Empty Project->next->Project name:设置项目名称(NetWork),设置项目路径(也可以在Java目录下新建一个文件夹存放F:\Java\Codes\NetWork)->Finish
- 此时弹出Project Structure窗口,选择Project Setting ->Modules->点击左上角的加号“+”->New Module->弹出一个窗口,选择Java,Module SDK中选择为JDK8->next->Module name:自定义模块名称(01_HelloWorld)->点击Finish->点击OK
- 项目文件列表
- 01_HelloWorld文件夹下有个src文件夹,内部专门用于写Java源码
- External Libraries:该文件夹下存放整个项目依赖的库,目前有一个JDK8的库(1.8)
- 初始化代码
- 右击src->New->Java Class->Main->回车,新建一个Main类
- 在该类中新增一个main函数,写测试代码,右击选择运行(Run)执行测试代码
- 新增web服务器模块
- 右击01_HelloWorld点击Add Framework Support…,勾选Web Application点击OK
- 此时生成一个与src平级的web文件夹
- 这个web文件夹就是给客户端提供的资源
- 在这个文件夹中新增html、css、img等文件夹分别编写相应的web代码
- 为当前项目添加Tomcat服务(Java项目要部署在服务器软件中)
- 点击IDEA工具绿色小锤标识右边的框,选择Edit Configurations…
- 点击左上角的加号“+”->选择Tomcat Server下的Local->为Tomcat依赖命名(Tomcat9)->点击Configure…选择Tomcat解压的本地路径(F:\Java\apache-tomcat-9.0.34)
- 点击Deployment(部署)点击右边的加号“+”,选择Artifact…(打包)
- 设置Application context:中的路径(/hello),这个路径的作用是用来区别当前Tomcat下的哪一个项目。一个Tomcat下可以部署n个Java项目,为了区别访问哪一个项目因此这里用路径指定
- 点击OK即可
- 此时点击右上角的虫子图标(断点调试),则启动Tomcat,并将当前的Java项目部署到Tomcat中;然后浏览器自动打开
http://localhost:8080/hello/
显示的网页是web文件夹下的index.jsp内容,即该路径访问的是web文件夹下的所有资源,默认寻找index的文件 - 可以在web下新建一个test.html,编写测试代码,然后点击甲壳虫,选择Redeploy(重新部署:因为是Java项目代码发生了改变,因此需要重启Tomcat服务,只需要重新部署Java代码即可),浏览器访问:
http://localhost:8080/hello/test.html
,就可以看到编写的测试代码 - 同理可以在web文件夹下新建html、css、img文件夹(右击web->new->Directory),存放不同的资源用于浏览器访问
-
在html文件夹下新建一个login.html文件,编写登录代码:
<form action="/hello/login" method="get"> <div>用户名<input name="username"></div> <div>密码<input name="password"></div> <button type="submit">登录</button> </form>
-
- 接收客户端发送过来的登录请求参数
- 如果Java项目需要接收客户端的参数需要依赖一个Servlet这个技术
- Servlet这个库在Tomcat中,需要在项目中添加依赖库
- 点击右上角倒数第三个图标(Project Structure…)->点击Modules->01_HelloWorld->Dependencies->点击加号“+”选择Library->选择Tomcat9.0.34->add Selected->点击OK即可; 此时项目文件目录的External Libraries文件夹下面就会多一个Tomcat9.0.34库
- 在src文件目录下,右击new->java Class->com.zh.servlet.LoginServlet,回车即可
- LoginServlet是类名
- com.zh.servlet:是包名,也是命名空间,每个点代表文件目录的节点,三层文件夹,com文件夹下的zh文件夹下的servlet文件夹下的LoginServlet类
- 包名是用来区分具有相同类名的类,包名的约定俗成:公司的域名反过来写
-
在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.常见的网络模型
- 为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 在 1985 年制定了网络互连模型
- OSI 参考模型(Open System Interconnect Reference Model),具有 7 层结构
- TCP/IP协议模型是实际使用中的模型
- 有些研究机构为了方便研究把它分为了五层
2.网络数据传输的过程
- 注意:数据从应用层开始传输,每层加协议头,但是链路层两头都加
计算机之间的通信
计算机之间的通信基础
- 需要得知对方的IP地址
- 最终是根据MAC地址(网卡地址),输送数据到网卡,被网卡接收
- 如果网卡发现数据的目标MAC地址是自己,就会将数据传递给上一层进行处理
- 如果网卡发现数据的目标MAC地址不是自己,就会将数据丢弃,不会传递给上一层进行处理
- 即:两台计算机之间通信不仅需要IP地址,还需要MAC地址,MAC地址就是网卡的地址,被放在数据包中传递
- 问题:只知道对方PC的IP的情况下如何才能拿到对方的MAC地址呢?
- PC机1先通过ARP协议(协议数据中包含目标PC的IP地址)向当前网段的所有PC发送广播,当目标PC2接收到广播发现协议中的IP地址是自己时,将自己的MAC地址发送给源PC,然后源PC1在通过目标PC2的IP地址、MAC地址进行ICMP协议进行数据传输
- ARP协议是有缓存的,会缓存MAC地址,下次发送数据直接通过IP地址、MAC地址进行ICMP协议进行数据传输
网络模拟工具PacketTracer
- 该工具是一个网络模拟工具
- 该工具必须先注册官网(密码:12**zhonG)
- 利用该工具可以配置n台电脑、路由器、各种网线等元件,搭建一个模拟的网络系统,然后进行模拟通信
- 注意:
- 每个元器件要设置参数,否则不能使用,比如:拉了2台PC,然后用交叉线连接,然后需要给这2台PC分别设置IP地址,然后使用任何一台PC来ping另外一台的IP地址,可以发现ping通
- 该软件是英文版可以汉化,汉化包在百度云盘中
计算机之间的连接方式
- 用网线直连
- 即两台PC用一根交叉线直接相连
- 缺点:网线直连无法解决多台PC之间的相互连接
- 同轴电缆(Coaxial)
- 可以实现多台PC之间的相互连接
- 缺点:
- 半双工通信:同一时刻只能往一个方向发送数据,即A向B发送数据的同时,B不能向A发送数据
- 容易冲突:由于同一时刻只能单向发送数据,如果其他PC也发送此时会冲突
- 不安全:PC1发送数据时会同时发送到该网段的所有PC
- 中间断了,整个都瘫了
- 集线器(Hub)
- 集线器这个设备可以同时连接n台电脑
- 缺点:
- 半双工通信
- 容易冲突
- 不安全
- 跟同轴电缆一样:没有智商
- 相比同轴电缆电缆的优点:一个PC断开不影响其他PC之间通信,不会瘫痪
- 疑问:如果一个集线器连接了n(n>1000)个PC,那么任何一个设备发送一条消息,就要分别传递到剩余的n-1台PC上,这样发送一条数要占用很长的时间,这段时间其他设备是不能发送的。因此设备越多效率越低。如何解决这个问题呢?—-网桥
- 网桥(Bridge)
- 能够通过自学习得知每个接口那侧的MAC地址
- 从而起到隔绝冲突域的作用
- 网桥只有两个接口,分别接2个集线器,即网桥专门用来连接集线器的
- 自学习原理:
- 网桥内部有个接口MAC地址表
- 当PC1第一次传输数据时首先还是会进行ARP广播,此时网桥会记录PC1的MAC地址。当目标PC2通过ARP响应时,集线器也会记录PC1的MAC地址。这样集线器中就记录了2个PC的MAC地址。照此下去,当某个PC发送数据时,通过集线器时,如果集线器已经知道目标的MAC地址不再另一侧,那么就会直接截断不会向另一侧传送
- 注意:理解网桥是理解交换机的前提
- 能够通过自学习得知每个接口那侧的MAC地址
- 交换机(switch)
- 相当于接口更多的网桥
- 全双工通信:同一时刻可以相互发送数据
- 思考
- 全球所有的设备都用交换机连接会是什么情况?
- 答:如果全球PC都在一个网段,那么交换机学习前的ARP广播阶段,一台PC第一次与另一台PC进行发送数据,首先仍然是ARP广播,此时仍然需要发送给全球所有的PC,如果每台PC都这样的话就会形成广播风暴,那么任然存在效率问题
- 此时路由器的作用得以体现
- 路由器(Router)
- 网线直连、同轴电缆、集线器、网桥、交换机特点:
- 连接的设备必须在同一网段
- 连接的设备处在同一广播域
- 路由器
- 可以在不同网段之间转发数据
- 隔绝广播域
- 路由器注意点:
- 同一个网段形成广播域,但是路由器是隔断广播域的,那么ARP广播获取MAC地址就无效,那么一个网段的PC向另一个网段的PC发送数据时,如何才能获取到目的PC的MAC地址呢?
- 解决办法:PC1发数据之前会判断目标PC2的IP地址是否跟源PC1在同一个网段
- 在同一个网段:使用ARP广播来获取MAC地址
- 不在同一个网段:通过路由器转发数据,路由器的每个接口都提供一个叫网关的东西,本质是用网关之间传输数据
- 路由器的出现实现了n个局域网能够相互通信,从而形成互联网
- 网线直连、同轴电缆、集线器、网桥、交换机特点:
通过路由器转发数据原理
- 如果一个数据要跨网段传输,这条数据先到达该网段对应的路由器接口的网关,然后路由器根据这个网关数据携带的目的IP地址,找到目的IP地址对应的网关,由目的网关传输给目的网段
- 如果有2个网段(192.168.3、192.168.4)中间有个路由器连接,那么每个网段都对应一个网关
- 网关相互传递的2个前提条件:每个网段对应的网关也必须设置IP地址(比如192.168.3.1、192.168.4.1),以确保这个网关的IP地址与其连接的网段在同一局域网;这个网段的所有PC都必须设置网关地址
- 这也就解释了买完家庭路由器之后,需要配置路由器的网关,通常是:192.168.1.1;每台电脑IP地址设置的地方都有一个网关地址设置
- 注意:跨网段发送数据时,首先也需要通过发送ARP广播获取该网段网关的MAC地址,然后下次才正式通过ICMP协议发送数据
- 仔细看下图:
- 场景:计算机2(下面用A代替)向计算机5(下面用B代替)发送数据.网关1(192.168.3.1),网关2(192.168.4.1)
- A先发送ARP广播获取网关1的MAC的地址
- A通过ICMP协议发送数据给网关1
- 路由器拿到网关1的数据携带的目的IP地址,转到网关2
- 网关2首先发送ARP广播给B以及其他PC,获取B的MAC地址
- 网关2通过ICMP协议发送数据给B
- A向B发送一条跨网数据流程完成