- 博客(19)
- 收藏
- 关注
原创 HTTP协议内容以及HTTPS加密方式
HTTP 协议是被我们广泛使用的应用层协议,我们平时使用浏览器时,就可以都看到浏览器网址前面有一个 **http://** 表示我们使用的是 HTTP 协议。目前 HTTP 协议大多是基于 TCP 协议实现的,只有最新的少部分版本是基于 UDP 实现。本文会通过 **Fiddler** 抓包来简单介绍 HTTP 协议内容,并介绍 HTTPS 的加密方式
2023-06-07 18:00:43
1633
原创 通过 IP 协议报头了解 IP 协议
4 位表示4 个比特位,所以这个版本号的范围在 0 ~ 15,目前的 IP 协议只有两个版本0100和0110,即IP V4和IP V6。这里只是先简单的提一下,之后会详细的说这两者的区别。
2023-04-28 16:28:27
277
原创 TCP的滑动窗口等提速机制
例如,A 在一次发送 上述 1 ~ 4000 的这四条数据后,如果 B 收到了 1 ~ 3000 这三条,并且 B 对这些数据的应答只传回了 针对2001 ~ 3000 的这一条,其余的都发生了丢失, 那A在收到针对2001 ~ 3000的应答之后,就认为 B 收到了 2001 ~ 3000 以及其之前的所有数据。如果数据丢失了,
2023-04-23 16:02:32
672
原创 网络编程套接字和 socket
在实际的客户端、服务器交互中,服务器计算响应是我们主要实现的部分,这里只是介绍 soket API,所以不对服务器功能进行设计,直接使用最简单的回显服务。传输层协议中,最主要的就是 TCP 和 UDP,这两个协议存在很大的差异,因此两组协议提供的 soket API 也存在很大的差异,这里我会通过两个简单的。中的方法解析数据报中的数据,再对这些数据进行各种操作。是一种广义的文件,相当于操作系统对网卡一类的硬件进行的扩充,我们对 socket 文件进行操作,实际上就是在对网卡等硬件设备进行操作,
2023-04-22 09:16:20
106
原创 TCP协议的确认应答及三次握手和四次挥手
UDP:无连接、不可靠传输、面相数据报传输、全双工。TCP:有链接、可靠传输、面相字节流、全双工。有无连接:客户端和服务器之间需不需要先建立连接再进行数据传输。是否为可靠传输:指数据的发送方能否感知到接收方是否接收到数据,不可靠传输不能感知,可靠传输能感知。面相数据报传输和面相字节流传输:指数据在传输层中是封装成数据报的形式传输还是以字节流的形式传输,全双工:指数据的传输是双向的。
2023-03-18 16:06:48
339
原创 多线程编程CAS与CAS中的ABA问题
这其中,第一次扣款时,CAS读取原数据值为100,与现有值100相等,进行交换,将0交换到余额中,第二次扣款时的CAS本来应该将原数据100与0比较,发现不相等,就放弃交换,但在这当中,发生了一次100的入账,导致第二次CAS将后来的100与原有的100进行比较,发现相等,于是再次将0交换到余额中,导致张三被多扣了100块钱,这就是ABA问题。这样看可能不太好理解。通过判断内存中的值是否与原有值相等,来判断变量是否被改变过,如果被改变了,那么就不进行修改,如果没有被修改过,就执行交换操作。
2023-03-10 17:51:36
103
原创 线程安全问题的原因及常用解决方法
这个问题是由于编译器的优化导致的。当线程A高频率的读取内存中的同一个数据,并且每次读取到的数据都是一样的,编译器就会将读内存操作优化成 读寄存器操作,因为读取寄存器中的数据要比读取内存中的数据快很多,这时,如果线程B修改了这个数据,线程A由于是在寄存器中读取这个数据,就会识别不到内存中的数据修改,那么这个修改对于线程A来说就是无效的。
2023-03-02 19:14:31
328
原创 Linux操作系统中的进程、线程
• 线程是操作系统执行调度的基本单位。每一个线程可以执行一个任务(一段代码)。• 进程和线程是包含关系,进程包含线程。我们可以用工厂和生产线来理解进程和线程。为了提高生产效率,我们有两种方法:1.增设工厂:增设工厂,多个工厂同时工作,工作效率就提高了,这就相当于创建多个进程,多个进程同时执行,执行速度自然比一个进程单独执行要快。2. 在工厂内部增加生产线:多条生产线当然要比一条生产线工作效率高,这就相当于创建多条线程。
2023-02-25 13:23:15
800
原创 希尔、快速、归并、堆排序
对于上述四种排序方式,稳定的排序方式是归并排序,空间复杂度由低到高为希尔O(1),堆排O(1),快排(视情况)O(logn~n),归并O(n),时间复杂度归并和堆排都在O(n*logn),快排视情况而定,如果不进行优化时间复杂度在O(n*longn~n^2),一般来说快排都是会进行优化的,希尔排序的时间复杂度在数据有序时为O(n),其余情况视分组而定,一般在O(n^1.3~n^1.5)之间。
2023-01-30 18:34:20
382
原创 简单介绍集合与数据结构中的栈
在这个栈中,按照a,b,c,d这个顺序存入了这四个数据,把数据存入栈中的操作叫做压栈,最先入栈的数据被压在了栈底,最后入的数据的位置叫做栈顶,从栈中删除数据或者取出数据时,是将栈顶的元素直接弹出,这样就形成了栈的先入后出的特殊性质。栈是用来存储数据的一种特殊的线性表,最特殊的一个性质是,先入栈的数据后出栈,后入的数据先出。用到的这些push、peek、pop等方法都可以通过创建对应类型的变量来接收返回值,也可以直接“.sout”来进行打印。栈的创建和一些常用的方法可以参考以下代码。
2023-01-19 21:01:27
48
原创 树和二叉树的基本结构与性质
树形数据结构是一种非线性的数据结构,把它叫做树,是因为这种数据结构的形态很像一颗倒着的树。树和链表类似,通过节点来存放数据,用不同的方法来表示树,节点的域也会有所不同。
2023-01-04 19:51:37
96
原创 抽象类和接口
子类继承父类后,会继承父类中非private修饰的属性和方法等等,并且可以通过重写父类中的方法来实现多态,我们在调用这些多态的方法时,会优先调用对应的子类的重写方法,这样父类中的这个方法是怎么实现的、有什么功能就已经不重要了。重写方法就是,在子类中写一个与父类中的某个方法的方法名、参数类型、参数个数、都相同的方法,但是方法的具体实现一般是不同的,重写的方法的返回值类型在一般情况下与父类的方法也是一样的,但也有特殊情况,列如协变类型。这时,一个子类就不能去继承使用多个类中的方法和属性,于是就有了接口。
2022-12-26 20:32:25
45
原创 顺序表和链表不同点
可如果是在顺序表的其他位置进行增删,因为必须要保证物理地址上的连续,并且用下标来标记和查找数据,一个数据的增删就需要整体挪动其他数据的位置,会比较的麻烦。而链表物理上的不连续就会导致数据查找比较麻烦,因为想要知道一个节点存放的数据,就必须要通过上一个节点存放的地址来找到这个节点,这样要查找随机位置的数据时,就需要遍历链表。
2022-12-19 11:41:15
114
原创 简述时间复杂度和空间复杂度
通过简单的计算,我们可以得到在这段代码执行的次数,最初 i , j 的两个for循环一共执行了N * N次,k 的 for 循环执行了2 * N次,最后while循环执行了10次,即程序总共执行了N ^ 2 + 2* N + 10;我们可以很明显的看见,当N越来越大时,后面加上的常数和低阶项的影响就会越来越小,而计算程序的时间复杂度时,我们并不是需要一个很精准的数值,只要得到一个大概的执行次数就可以了。
2022-12-10 20:21:37
373
原创 Java 数组的简单介绍
如果我们传参的是一个数组,即func (array); 这时,array这个数组名叫做引用,它里面存放的就是 array 这个数组的首元素的地址。二维数组是特殊的一维数组,数组名存放两个一维数组的地址。
2022-12-08 18:06:57
182
1
原创 简述C语言中,float类型的数据在内存中的存放
float类型在内存中的存放则是按照IEEE(电气和电子工程协会) 754的国际标准进行的。根据该标准,任意一个浮点型的数据可以表示成(-1) ^ S * M * 2 ^ E。
2022-12-02 19:52:11
451
2
原创 简单的扫雷代码设计
要设计扫雷,首先要有一个棋盘,根据需要来设置棋盘大小,我设置的是9 x 9的棋盘,为了防止排查最外围坐标时,周围一圈的坐标需要反复判定是否超出棋盘范围,可以给棋盘加上两行两列。棋盘准备两个,一个用来存储随机生成的雷的位置,有雷的位置初始化为字符‘1’,没有雷就初始化为‘0’,另一个可以初始化成 ‘ * ’ 来展示给玩家。
2022-11-28 15:24:11
507
原创 简单的三子棋代码设计
既然要输入坐标,当然就要判断坐标的合法性,如果玩家输入的坐标超出了我们的棋盘,就要提示玩家输入错误,重新输入,如果该位置已经被下过了,也要有对应的提示。电脑随机下棋就是要随机生成一个坐标,坐标的值自然也要合法,通过rand()% 3,就可以得到0~2的数字,再判定下这个位置是否被下过就完成了电脑下棋的步骤。三子棋是一种玩法简单的棋类游戏,对战双方在3x3的棋盘上轮流下棋,先将自己的三颗棋子连成一线的玩家获胜,当棋盘下满还没有玩家获胜,则为平局。printf("输入错误,请重新下棋\n");
2022-11-27 12:17:37
300
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人