网络原理知识

上次,我们说过基于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。

相关推荐
辉视广播对讲17 小时前
医院IPTV,让医疗服务更有温度
网络·人工智能
xqqxqxxq17 小时前
Java AI智能P图工具技术笔记
java·人工智能·笔记
Tim风声(网络工程师)17 小时前
光功率计中的红光(光衰测试设备)的使用
运维·网络
谷雨不太卷17 小时前
进程的状态码
java·前端·算法
顾温17 小时前
default——C#/C++
java·c++·c#
空中海17 小时前
02 ArkTS 语言与工程规范
java·前端·spring
楚国的小隐士17 小时前
在AI时代,如何从0接手一个项目?
java·ai·大模型·编程·ai编程·自闭症·自闭症谱系障碍·神经多样性
yaki_ya17 小时前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
刃神太酷啦17 小时前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode
亚历克斯神17 小时前
Java 25 模式匹配增强:让代码更简洁优雅
java·spring·微服务