网络原理知识

上次,我们说过基于socket api的两种网络编程方式------UDP与TCP,重点是:

1.读写数据通过Socket,通过Socket内置的InputStream与OutputStream(读写的基本单位是字节)

2.当前在编写客户端服务器的时候,是需要约定请求/响应之间的分隔符的

3.服务器这边accept得到的socket对象,记得及时关闭

4.要处理多个客户端,需要搭配多线程/线程池

补充一下网络编程的内容。

IO多路复用

基于第四条,如果客户进一步增加,此时多线程/线程池会产生大量的线程,之前提到,线程不是越多越好,太多了反而影响进程执行效率,于是,操作系统中内置了IO多路复用------本质上就是一个线程同时负责处理多个客户端的请求。

正如三个人一起买东西吃,A想吃蛋炒饭,B想吃面,C想吃煎饼,现在有三个方案:

(1)A一个人去买饭,先买蛋炒饭,再买面,最后买煎饼(单个线程,处理多个请求,过于复杂)

(2)三个人一起出动分别买三样食物(多线程,效率提高的同时,系统开销也很大)

(3)A一个人买,先来到蛋炒饭摊那里叫老板做蛋炒饭,一会来拿,然后来到面馆,叫老板做面,一会来拿,然后去煎饼摊,重复这样的操作,等三者谁先做好,就依次拿谁的食物,只用了一份等待的时间,同时等待三个任务的完成。(多个客户端,就是多个小摊的老板,每个客户端,绝大多数时间是沉默的,工作线程只需要等待,等到客户端发来数据,线程再来处理就可以了,多个客户端同时发数据的概率较小,即使出现了这样的情况,启用其他的线程也可以)

IO多路复用是当前开发服务器的主流的核心技术,操作系统内置的,只需要调用api即可。Java也通过了NIO来封装了IO多路复用。

网络原理

网络初识中,认识网络的协议栈TCP/IP分成五层,应用层、传输层、网络层、数据链路层、物理层(这五层也是面试常考内容)。而应用层是程序员打交道最多的层次,与应用程序直接相关,程序员写的代码,只要是涉及到网络通信的,都可以视为应用层的一部分。

当然应用层中涉及到的网络通信协议,很多也是程序员自己定制的。

自定义协议的方式

具体如何自定义协议呢?

这里分成两个阶段:第一,根据需求,明确传输哪些信息;第二,约定好信息组织的格式。

1.根据需求明确传输信息
2.约定好信息组织的格式

有很多种方式。

(1)行文本的方式,但比较土,20年前的方式。

上述只是举个例子,实际约定的时候,是有很多变数的,自定义协议,你根据自己的需求来制定,只要客户端与服务器都按照这同一套规则进行构造与解析数据即可,但如果是很多人一起搞客户端与服务器,需要这些人商量好。

(2)通过xml格式来约定请求和响应的数据

同HTML一样,xml是成对的键值对结构,到时候在前端基础时会学到HTML。

xml标签的内容是可以自定义的,这一点与HTML不同。

优点是可读性好,缺点是冗余信息过多,在网络传输中,会消耗过多的带宽(服务器中最贵的部分,价格高于CPU)。

(3)json(当下最流行的网络数据格式组织的方案)

他用另外一种简便的方式表示了键值对。

优点是可读性好,且消耗的带宽比xml更少,缺点是仍然存在冗余信息。

(4)protobuf

基于二进制的格式对数据进行压缩,不涉及到冗余信息了,但带宽消耗最少的同时,可读性也变差了,因为二进制文件我们也看不懂。在性能要求高的场景就需要使用,如果性能要求不高,还是更建议使用json。

综上来做个总结:

HTTP协议(重点)

应用层这里,除了自定义协议之外,也有大佬们搞好的协议了,http协议就是其中一种,http协议是当前web开发中最核心的协议,使用网站,都会用到http,即使在招聘要求上,都会看到很多公司明确给出对这个的熟练掌握,与数据结构与算法一样,工作后也需要。Spring就是围绕http展开的。

这里的https就是在http的基础上加了一个安全层。

HTTP是一问一答模式的协议,即客户端发一个请求,服务器就返回一个响应,请求和响应是一一对应的。

正如浏览器打开网页的场景或手机app加载数据的场景,就是典型的一问一答场景。

抓包工具

抓包工具能够获取到网络的数据包,将详细的格式解析出来。

抓包工具就相当于代理。

在你电脑上所有的网络通信,都会先发给这个抓包程序,抓包程序再把数据转发给服务器。

fiddler(专门抓HTTP的抓包工具)

官网上下载不了,那么推荐到搜狗下载那里下载,不然弹出什么广告什么的就很麻烦了。

下载好安装了之后:

当你成功进来了之后,进行一些操作时,比如从百度上搜索东西,点一下这些按钮

点击左页面的内容,你就会看到右图的信息(快捷键crtl+a选中所有,自己可以删除)

点这个是将二进制的内容进行解析。

后续要学习的就是这些内容都表达什么意思。

最后看一下我的页面吧,我先点击左边的蓝色部分,再点的inspector,然后点的两个Raw。

相关推荐
希望永不加班2 小时前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式
flushmeteor2 小时前
java的动态代理和字节码生成技术
java·动态代理·代理·字节码生成
eggwyw2 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
0xDevNull2 小时前
MySQL 别名(Alias)指南:从入门到避坑
java·数据库·sql
lv__pf2 小时前
springboot原理
java·spring boot·后端
java1234_小锋2 小时前
Java高频面试题:什么是可重入锁?
java·开发语言
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【22】Agent 并行工具执行与超时 / 协作式取消实战
java·人工智能·spring
段小二3 小时前
服务一重启全丢了——Spring AI Alibaba Agent 三层持久化完整方案
java·后端
段小二3 小时前
Agent 自动把机票改错了,推理完全正确——这才是真正的风险
java·后端