- 博客(42)
- 收藏
- 关注
原创 【Git】标签管理
tag 很好的解决这个问题,因为 tag一定要给一个让人容易记住,且有意义的名字。也可以通过在末尾额外指定commit id 的方式, 来给历史修改版本打上标签。例如,在项目发布某个版本的时候,针对最后⼀次 commit 起一个。命令可以让最新一次的提交打上对应的标签名。若想把当前所有标签都进行推送, 可以使用。这样的标签,来标识里程碑的意义。命令可以查看当前所拥有的标签名。要想查看标签的描述, 需要通过。可以把指定的标签推送到远程仓库。命令, 来给标签打上描述。命令, 来进行删除标签。
2025-05-21 08:38:54
133
原创 【Git】远程操作
因此, 多个人协作的方式,譬如说甲在自己的电脑上改了文件A,乙也在他的电脑上改了文件A,这时,只需把各自的修改推送给对方,就可以互相看到对方的修改了。.gitignore 也排除了,因此可以添加一条例外规则, 在想排除的文件名前加“!可以简单理解为,每个人的电脑上都是一个完整的版本库,这样在工作时,就不需要联网。还有些时候, 编写了忽略规则为“.*”, 排除所有“.”开头的隐藏文件,文件,然后把要忽略的文件 名填进去,Git 就会自动忽略这些文件了。了,因为版本库就在自己的电脑上。是要被添加的,可以用。
2025-05-20 14:56:38
354
原创 【Git】分支管理
合并时,需要将dev1分支合并到master分支, 但在合并时, git没办法自己知道到底是保留master分支的修改, 还是dev1分支的修改, 因此就会出现合并冲突,报错。在dev上commit的内容, 不会在master分支上体现, 这是因为commit操作会新增一个提交版本, 并导致HEAD指向的dev分支, 指向最新的这个提交版本。现在bug修复了, 但dev2没有开发完, 要接着开发,切换到dev2, 会发现dev2修改的内容不见了, 这是因为内容都存到了stash中, 现在要用。
2025-05-19 12:44:32
627
原创 【Git】基本操作
如果有⼀天发现之前的工作出现了很大的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。参数,可以将暂存区的内容退回为指定的版本内容, 再指定HEAD, 表示退回到当前版本(如果是HEAD^就是上一个版本, HEAD^^就是上两个版本......)在初始化本地仓库后, 需要新增两个配置项, 一个是name, 一个是email, 这两个是必须要配置的, 如果不配置, 可能让版本库功能失效, 需要通过。命令, 不但可以删除工作区中的对应内容, 还可以同时将工作区中的变动提交至暂存区。
2025-05-18 11:11:27
751
1
原创 【MyBatis操作数据库】基础操作
指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置。我们在上⾯查询时发现, 有⼏个字段是没有赋值的, 只有Java对象属性和数据库字段⼀模⼀样时, 才会进⾏赋值,需要更改。但是这样的话, 只能查找id=4 的数据, 所以SQL语句中的id值不能写成固定数值,需要变为动态的数值。指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的。
2025-05-17 11:12:06
695
原创 【Redis】持久化
Redis给内存中当前存储的数据拍个照片,生成一个文件,存储在硬盘中,后续Redis一旦重启了(内存中数据就没了),就可以根据刚才的快照,把内存中的数据恢复回来。插入一个新数据时,Redis会把数据同时写入到内存和硬盘中,查询数据时直接从内存读取,硬盘中的数据只在Redis重启时,用来恢复内存中的数据,执行save时,Redis会全力以赴的进行“快照生成”的操作,此时就会阻塞Redis的其他客户端的命令,可能导致严重发后果,因此,父进程有一个aof_rewite_buf缓冲区,专门放fork后收到的数据。
2025-03-02 11:04:38
952
原创 【MyBatis操作数据库】XML配置
由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些 SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击。这是因为#{} 会根据参数类型判断是否拼接引号,如果参数类型为String, 就会加上 引号,如果不想加上引号,就要使用${}SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的。:是和mapper接⼝中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法,:是返回的数据类型,也就是开头我们定义的实体类。
2024-11-13 09:45:00
898
原创 【MyBatis操作数据库】基础操作
指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置。我们在上⾯查询时发现, 有⼏个字段是没有赋值的, 只有Java对象属性和数据库字段⼀模⼀样时, 才会进⾏赋值,需要更改。但是这样的话, 只能查找id=4 的数据, 所以SQL语句中的id值不能写成固定数值,需要变为动态的数值。指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的。
2024-11-11 07:30:00
1190
原创 【Spring IoC&DI】路径扫描,DI依赖注入
spring在帮我们管理对象时,它一般会走构造方法,而代码中有两个构造方法,它不知道使用哪个,因此它使用了默认的无参构造方法,这样一来UserService就为null值,报错了。在这里,UserService这个对象交给了Spring进行管理,然后通过@Autowired注入给UserController这个使用方,这就是。2.@Autowired是spring框架提供的注解,@Resource是jdk提供的注解。但需要注意的是,如果有了带参的构造方法,那么默认提供的无参构造方法就不存在了。
2024-11-06 08:00:00
1460
原创 【Spring IoC&DI】IoC容器,IoC注解,Bean的使用
不再是使用方对象创建并依赖对象,而是把依赖对象注入当前对象中,依赖对象的控制权不再由当前类控制,这样即便再怎么改都不会影响当前类。但如果放了多个对象,在main函数中的语句就是不正确的,因为spring不知道要拿哪个对象,这会报错,所以我们要根据名称去拿。这样一来,在该代码中,就无法通过方法原本的名称“userinfo”去获取了,只能根据Bean注解指定的name来获取。通用程序的实现代码,类的创建顺序是反的,如果想改tire需要连同之前的一起改,很麻烦。,也就是说Spring是一个“控制反转”的容器。
2024-11-04 09:00:00
807
原创 【SpringMVC】获取cookie/session,获取Header,响应
但实际开发中,很多情况要知道请求之间的关系,这时候就要使用cookie和session去完成,让互联网有一定的记忆能力。特性:通过HttpSession对象获取到Session,获取方式简单,但只能拿到Session,获取不到别的。如果需要获取到多个cookie,需要在该注解中增加多个与之相符的参数,即“一个参数对应一个cookie”特性:限定了参数中必须有注解的值,如果没有,这个请求连进都进不来,不会走到服务器中。(默认情况下,客户端和服务器之间的这次通信,和下次通信之间没有直接联系)
2024-10-31 07:45:00
686
原创 【SpringMVC】传递json,获取url参数,上传文件
但如果使用这样的方式,如果只传了一个参数,就会报404错误,虽然PathVariable的源码中,也有一个boolean类型的required方法默认为true,但当我们设置required属性为false时,也发生了404报错。一种轻量级数据交互格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,其本质上是字符串,负责在不同的语言中数据传递与交换。这段url末尾的“1”就是RequestMapping注解中大括号内的articleId,这是一个变量。这样的类,可以用于转化成json数据。
2024-10-30 07:30:00
654
原创 【SpringMVC】web服务器,访问失败的问题,SpringMVC,建立连接,请求
配置环境后,附带的maven包中的代码有成百上千行,如果没有给我们写的代码打标记,这相当于Spring要一次阅读所有的代码,这对于Spring的负担很大,因此它会直接不看,并产生状态码报错。这个注解表示参数绑定,当发送信息时,默认会把“zhangsan,lisi,wangwu”封装成一个数组,因此使用数组接收是OK的,但使用list就不行了,所以我们需要把数组转换为list。可以理解为一个分发器,用于决定对视图发来的请求,用哪一个模型进行处理,以及处理完后需要跳转回哪一个视图,即用来连接视图与模型。
2024-10-28 07:30:00
1622
原创 【多线程】多线程(12):多线程环境下使用哈希表
ConcurrentHashMap进行了“化整为零”,不会在一次操作中进行所有的数据搬运,而是一次只搬运一部分(创建新空间的同时,也保留旧空间),此时后续的每次操作都会触发一部分key的搬运,最终把所有的key都搬运完成。//Hashtable的加锁,就是直接给put,get等方法加上synchronized,就是给this加锁,整个哈希表对象就是一把锁,任何一个针对这个哈希表的操作都会触发锁竞争。哈希表有一个size(链表大小)这样的变量,针对像修改size这样的操作,直接借助CAS完成,不会加锁。
2024-10-12 07:30:00
917
原创 【多线程】多线程(11):ABA问题,JUC的常见类
synchronized是关键字(底层通过JVM的c++代码实现),ReentrantLock是标准库提供的类,通过java代码实现。传入参数:true,可以令ReentrantLock以公平锁的形式运行,不传入参数则以非公平锁的形式体现。线程改变了一个数值,但又修改回去了,看上去跟没变一样,但实际上已经有改过了的痕迹,可能引发一些bug。ReentrantLock提供了公平锁的实现,默认是非公平的,但在参数中可以调整成公平的。前面的锁都是发现锁被别人占用了,就阻塞等待,直到加上锁为止。
2024-10-11 09:30:00
638
原创 【多线程】多线程(10):常见锁策略,锁原理,CAS
意味着没有其他代码穿插到这两个代码之间执行,此时可以安全地修改变量中的内容:将寄存器2的值(oldvalue+1)交换(赋值)到value中。刚开始使用synchronized加锁,首先锁会处于“偏向锁”状态,遇到线程之间的锁竞争,升级到“轻量级锁”2.比较内存和寄存器1中的值,是否相等,若不相等,则无事发生,若相等,就交换内存和寄存器2的值。比较内存和cpu寄存器中的内容,如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容)进一步统计竞争出现的频次,达到一定的激烈程度之后,升级到“重量级锁”
2024-10-10 08:15:00
775
原创 【多线程】多线程(9):线程池
线程池的工作过程典型的“生产者消费者模型”,使用时通过例如“submit”这样的方法,把要执行的任务设定到线程池中,线程池内部的工作线程负责执行这些任务。线程池,就是把线程提前从系统中申请好,放到一个地方,后面需要使用线程时,直接从这个地方来取,而不是从系统中重新申请。,一种常见的设计模式,在创建类的实例时使用,由于构造方法有“坑”的,通过工厂设计模式来填坑。某个线程池初始情况下可能有M个线程,当发现线程不够用时,会自动增加线程个数。最初引入线程,就是因为进程太重了,频繁创建销毁线程,开销较大。
2024-10-09 09:30:00
521
原创 【JVM】垃圾回收机制
哪些对象要释放,这是一个随机的过程,很可能要释放的多个内存不是连续的,虽然把内存释放掉,但整体这些空闲空间并没有连在一起(是离散的),后续申请内存时很可能申请不了(申请的内存一定是连续的)换句话说,老师(JVM)手中有一个所有学生(对象)的总名单,针对当前教室(内存空间)内的学生(对象)进行点名操作,被点到的回答到(可以被访问),没有回答到的,就是缺课(不可被访问,垃圾)同理,b置null,该对象的“引用计数器”-1,变成了“0”,该对象的引用指数器变为0了,可以作为垃圾被回收了。
2024-10-08 09:15:00
2186
原创 【JVM】内存区域划分,类加载的过程,.class文件的格式
最终需要得到一个类对象,而这需要内存来存放,因此需要分配内存空间,根据刚才读取到的内容,确定出类对象需要的内存空间,申请这样的内存空间,并且把内存空间中所有的内容,都初始化为0。魔幻数字,计算机圈子中约定俗成的做法,二进制文件中,会在开头的若干个字节,设置一个固定的常熟进去,通过这个常数,标识当前这个文件是什么样的文件。防止用户自己写的类,把标准库的类给覆盖掉,保证标准库的类,被加载的类优先级是最高的,扩展库其次,第三方库的优先级最低。谈到地址就是“内存”的地址,而文件(硬盘)中没有地址的概念。
2024-10-07 09:45:00
1347
原创 【HTTP】https
在客户端询问服务器证书的时候,对于服务器返回的证书,fiddler会篡改证书中的数据,把证书中的公钥替换为自己的公钥,并且使用自己的私钥来加密,得到数字签名,并重新生成证书替换服务器的证书,发给客户。如果中间的路由器被黑客入侵,此时黑客就可以通过路由器抓包明确地看到传输的数据是什么样子,一旦明确了数据,此时既可以知道数据要干什么,也可以篡改这里的数据。产生中间人攻击主要是因为客户端不知道服务器发过来的公钥是不是被伪造的,问题的关键是,能让客户端识别出拿到的公钥是不是正确合理的,不是伪造的公钥。
2024-10-06 08:00:00
678
原创 【多线程】多线程(8):单例模式:阻塞队列
A的角色是一个“网关服务器”,收到客户端的请求,再把请求转发给其他的服务器,这样的服务器里面的代码做的工作比较简单(单纯的数据转发),消耗的硬件资源通常更少,处理一个请求消耗的资源更少,同样的配置下就能支持更多的请求处理。B这个服务器是真正干活的服务器,要真正完成一系列的业务逻辑,代码量十分庞大,消耗的时间和系统硬件资源更多,同一时刻可以支撑的请求数量更少。服务器每次收到一个请求,处理这个请求的过程就需要执行一系列的代码,在执行这些代码的过程中,就会需要消耗一定的硬件资源。
2024-10-05 09:00:00
1183
原创 【多线程】多线程(7):多线程的代码案例:单例模式-饿汉,懒汉
这种加锁方式是错误的,出现线程安全问题,是因为if和new操作之间出现了线程切换,出现了逻辑上的穿插,需要将if和new打包成一个整体。虽然通过加锁能避免线程安全问题,但加锁也会带来阻塞,若已经new完了对象,if再也进不去了,后面的代码都是单纯的读操作。在创建对象后,instance就不为null,此时接下来的循环就不会加锁了,只有第一次需要加锁,解决效率问题。设为private,意味着在类的外面无法调用构造方法,从而无法在其他地方new这个类,确保只有这一个实例。
2024-10-04 08:15:00
844
原创 【多线程】多线程(6):等待和通知
多个线程中,需要控制线程之间执行某个逻辑的先后顺序,就可以让后执行的逻辑,在一个线程内使用锁对象去调用wait,可以让这个线程进入阻塞,待其他线程完成某些逻辑之后,通过锁对象调用notify就可以唤醒对应的wait。使用sleep的目的是为了固定时间的阻塞,不涉及唤醒(虽然sleep可以被interrupt唤醒,但这表示的意思不是“唤醒”,而是要终止线程了)sleep和锁无关,若不加锁,sleep可以正常使用,若加了锁,sleep不会释放锁,而是会“抱着锁”一起睡,致使其他线程无法拿到锁。
2024-10-03 09:00:00
277
原创 【多线程】多线程(5):死锁,内存可见性
此时JVM执行代码时,发现每次执行1操作开销很大,而且执行结果一样,JVM没有意识到用户可能在未来修改n,于是JVM直接把1操作优化掉了——每次循环,不会重新读取内存中的数据,而是直接读取寄存器/cache中的数据(缓存的结果)/当JVM作出决定后,此时意味着循环开销大幅降低,但当用户修改n值时,内存中的n发生改变,但由于t1线程每次循环不会真的读内存,因此感知不到n的改变。在加锁时,判定该锁是否被占用,如果被其他线程占用了,就并不会进行加锁操作,也不会进行阻塞操作,而是一路放行,往下执行代码。
2024-10-02 08:00:00
950
原创 【多线程】多线程(2):Thread方法,线程核心操作
比如,此时sleep刚睡了100ms,还剩余900ms,此时interrupt被调用了会直接唤醒sleep,并且抛出InterruptedException异常,由于catc中默认代码再次抛出异常,再次抛出的异常没被catch,最终到了JVM,进程就直接异常终止了。如果这个线程在执行过程中,不能阻止进程结束(虽然线程在执行着,但是进程要结束了,此时这个线程也会随之被带走),这样的线程就是。但由于线程的调度顺序是不确定的,如果两个线程都是sleep3000,此时时间一到,两个线程谁先执行谁后执行就不确定了。
2024-09-30 08:00:00
979
1
原创 【数据结构】链表(2)
2.cur前驱节点的next域被设置为cur的next域中所存放的节点地址(cur.prev.next = cur.next)3.cur后继节点的prev域被设置为cur的prev域中所存放的节点地址(cur.next.prev = cur.prev)3.cur的前驱节点中的next域被设置为cur指向的节点地址(cur.prev.next = node)4.node的prev域被设置为cur前驱中所存放的节点地址(node.prev = cur.prev)【删除关键字为key的节点】
2024-09-29 09:00:00
710
原创 【多线程】多线程(1):概念,创建线程
能够提高效率,关键是充分利用多核心进行“并发执行”,如果只是“微观并发”,速度不会提升,真正能提升速度的是“并行”,凡事有度,尽管线程越多处理越快,但如果线程数目太多,比如超出了cpu核心数目,此时就无法在微观上完成所有线程的“并行”执行,势必存在严重的“竞争”,可能会影响效率。4.线程是当下实现并发编程的主流方式,通过多线程,可以充分利用好多核CPU,但也不是线程数目越多就越好,线程数量达到一定程度,把多个核心都利用充分后,此时继续增加线程,无法再提高效率,甚至可能会影响效率(线程调度,也是有开销的)
2024-09-29 08:30:00
1333
原创 【HTTP(3)】(状态码,https)
Cookie里面的内容也是来自于服务器,首次访问某个网站,可能是不带Cookie,在响应中就会有Set-Cookie这样的header,把一些键值对写回到浏览器这边,浏览器后续访问这个网站就会带有Cookie。Found,特殊的状态码,重定向,访问A网站自动跳转到B网站,响应中就会返回302这样的状态码,并且在响应头中添加Location属性(包含了B网站的地址)浏览器唯一能做的是,去插入一个键值对/读取一个键值对,但键值对具体是如何在硬盘上存储的,这就由浏览器来负责了,浏览器封装好,网页本身无法干预。
2024-09-29 08:15:00
1459
原创 【数据结构】链表(1)
【概念】一种物理存储结构上的非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序来实现的也就是说,链表是由一个一个的节点组织起来的,如车厢一般,整体就叫做链表【链表结构】节点可以理解为”节点对象“,它有两个域,一个val域,用于存储数据,一个next域,用于存储下一个节点的地址【单向,不带头,非循环链表】一般定义一个"head"对象作为链表的头节点这是最常见的链表类型【单向,带头,非循环链表】head这个节点可以认为是一个标志,其val域存储的值不
2024-09-28 09:00:00
1378
原创 【多线程】多线程(4)(线程安全问题的原因,如何解决线程安全问题)
因此,在该代码中,由于t1和t2都是针对locker进行加锁,t1先加锁,因此t1加锁成功,并执行锁内部的代码,t2后加锁,发现locker对象被t1已经使用了,因此t2加锁失败,进入阻塞,一直阻塞到t1释放锁为止。一个Java进程中,一个类的类对象是只有一个的,类对象也是对象,所以也能写到synchronized中,写类对象和写其他对象没有任何本质区别。此外,若是多个线程(两个以上)针对同一个锁对象加锁,拿到锁的对象释放了锁后,剩下的线程谁先拿到锁?(包括return,抛出异常),针对锁对象解锁。
2024-09-28 08:00:00
1280
原创 【多线程】多线程(3):线程等待,获取线程实例,线程状态,串行与并发执行
操作系统针对多个线程的执行,是一个“随机调度,抢占式执行”,而「线程」等待,就是在确定两个线程的结束顺序,它无法控制两个线程调度执行的顺序,但是可以控制谁先结束,谁后结束。注意,这只是该笔记中的表述方式,不同架构的cpu有不同的指令集,不同的指令集中有不用的指令,针对这三个操作,不同cpu中对应指令的名称肯定是不同的。因此,让后结束的线程等待先结束的线程即可,此时后结束的线程会进入阻塞,直到先结束的线程真的结束了,阻塞才解除。
2024-09-27 09:15:00
1390
原创 【数据结构】哈希表
在决定好寻找下一个空位置的方法后,设定好比例,当空位已经不足一个比例时(比如已经有十分之七的位置被使用),这样哈希冲突产生的概率就会大大提高,因此就需要对其进行扩容操作,随后把原本的值依照新的存储空间大小来进行新的操作。首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。对元素的关键码进行同样的计算,把求得的函数值当作元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功。
2024-09-27 08:00:00
860
原创 【网络原理】网络初识,协议分层,网络通信中的整体流程
QQ这样的应用程序,就会调用操作系统的API(传输层给应用层提供的api),操作系统就会提供一个类似于“发送数据”这样的API,然后应用程序就会把上述组织好的应用层数据包,作为参数传进来,于是应用层数据包,就到了系统内核中,就进入到传输层的代码部分了。由于网络通信非常复杂,如果只使用一个协议约定所有的网络通信细节,这个协议就十分庞大,因此需要对协议进行分层,把一个大的协议拆分成多个小的协议,让每个小协议专注于解决一个/一类问题,再让这些小协议相互配合。
2024-09-26 09:30:00
988
原创 【数据结构】Map&Set
【概念】【概念】Map和Set是一种专门用于搜索的数据结构,其搜索效率与具体实例化的子类数量有关,本质上是一颗搜索的关键数据为关键字“Key”,关键字对应的数据为值“Value”,将其称为“Key-Value键值对”【关于Map】Map是一个接口类,该类没有继承至Collection,该类中存储的是<K,V>结构的键值对,且K一定是唯一的,不可重复Map.Entry<K,V>是Map内部实现的,用于存放<K,V>键值对之间映射关系的内部类为什么有Entry?
2024-09-26 06:30:00
1004
原创 【网络原理】特殊IP地址,数据链路层,DNS
一旦有数据变更,针对这种数据变更,需要约定以某个服务器的数据为基准,一旦有变更,就修改这个基准的服务器,其他服务器从基准的服务器同步数据,这种基准服务器称为。但全世界这么多设备上网,每时每刻都在访问DNS服务器,单独一个服务器无法顶得住这么大的访问量,那么就需要多搞出来一些DNS服务器,这样的服务器称为。但网站很多,意味着域名很多,IP地址也很多,为了解决过多的问题,就搭建了DNS服务器,当某个电脑需要进行域名解析,就可以访问DNS服务器。因此,给局域网中的某个设备分配IP地址时,不能把主机号设置为全0。
2024-09-25 08:15:00
854
原创 【数据结构】栈和队列
在模拟栈时,可以使用usedSize这个变量,它不但可以标识当前数组中存放元素的个数,还可以表示当前存放元素的下标位置。,只允许在固定的一端进行插入和删除元素操作,进行插入和删除元素操作的一端称为“栈顶”,另一端称为“栈底”源码中,“E”的意思是“入栈/出栈的元素”,因此可以通过与出入栈元素相符的数据类型所定义的变量进行接收。,调用push方法实现的方法是链表头插法,而pop则是头删,peek等方法皆有类似的体现。一种先进先出的数据结构,只允许在一端插入数据 ,另一端删除数据,进行插入操作的一端叫。
2024-09-24 15:53:23
419
原创 【网络原理】IP协议
发送一个IP数据包时,会有一个初始的TTL的值(32,64,128……在该图这个局域网中,网络号不相同的设备(网络号不是192.168.0)无法上网,网络号相同的设表,如果主机号相同,也无法上网。假设构造一个IP数据包,目的IP写错了,写成了不存在的IP,若让这样的数据包无限传输,会消耗很多的网络资源?IP地址是一个32位的整数,左半部分是网络号,右半部分是主机号,如何判断左半部分和右半部分的界限。IP地址,用来标识网络上的一个设备,期望IP地址是唯一的,但如今可以上网的设备太多,IP不够用。
2024-09-24 09:00:00
1817
原创 【TCP】TCP核心机制:流量控制,拥塞控制,延时应答,面向字节流,异常处理
在通信中并非是发送方和接收方两点一线的结构,其是一个共享的空间,其中间还有一系列中转的设备,只要其中某个中转节点的数据承受能力超出了其的承受上限,那么这个中转节点就会进入“阻塞”状态,TCO数据报无法通过,进而导致这个中转节点在内的整条通信路径发生阻塞。正常情况下,ACK和响应是不同的时机,无法合并,但ack涉及到“延时应答”,延时应答会令ACK返回的时间往后拖,这样一延时,就可能赶得上接下来发送响应数据的操作了,于是就可以在发送响应信息时,把刚才ACK信息也带上。发送方不发送数据,要等待多久?
2024-09-23 09:30:00
1047
原创 【TCP】TCP核心机制:连接管理,滑动窗口
上图中,收到2001ACK,意味着1001-2000的数据得到应答了,然后立即发送5001-6000这个数据,此时等待数据的范围就是2001-6000(四份数据),窗口大小还是4000,窗口大小不变,窗口所处的位置改变了。批量发数据,批量ACK,多个ACK只是丢其中的一部分,此时要理解确认序号的含义:其表示收到数据的最后一个字节的下一个序号,进一步可理解为:确认序号之前的数据都已经收到了,接下来发送的数据就从确认序号这里向后发。
2024-09-22 12:00:00
809
原创 【TCP】UDP和TCP的协议结构和大体区别,TCP核心机制:确认应答,超时重传
这种面向方式允许数据被封装成一个个独立的集合数据单元(即“UDP数据报”),每个UDP数据报都包含了足够的信息,具有传输速度快,开销小,灵活性高的优点。这里的“一共四样东西”起到的作用即“校验和”的职务,通过“一共四样东西”,小明在买完菜后将可以对手里的菜进行校验检查,观察有没有买多、买少。校验和存在的目的,就是为了能够“发现”或者“纠正”里面的错误,其体现通常是携带一些「额外的数据」,用于发现/纠正传输数据的错误。此处谈到的“连接”,是抽象的“连接”,通信双方,如果保存了通信对端的信息,就相当于。
2024-09-21 11:49:59
907
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人