Jinqq's Home

证明自己

HTTP

http/1.0 vs http/1.1

连接方式 : HTTP/1.0 为短连接,HTTP/1.1 支持长连接。HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。

状态响应码 : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,100 (Continue)——在请求大资源前的预热请求,206 (Partial Content)——范围请求的标识码,409 (Conflict)——请求与当前资源的规定冲突,410 (Gone)——资源已被永久转移,而且没有任何已知的转发地址。

缓存机制 : 在 HTTP/1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP/1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。

带宽:HTTP/1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP/1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

Host 头(Host Header)处理 :HTTP/1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP/1.0 没有 Host 头字段,无法实现虚拟主机。

http/1.1 vs http/2.0

多路复用(Multiplexing):HTTP/2.0 在同一连接上可以同时传输多个请求和响应(可以看作是 HTTP/1.1 中长链接的升级版本),互不干扰。HTTP/1.1 则使用串行方式,每个请求和响应都需要独立的连接,而浏览器为了控制资源会有 6-8 个 TCP 连接的限制。。这使得 HTTP/2.0 在处理多个请求时更加高效,减少了网络延迟和提高了性能。

二进制帧(Binary Frames):HTTP/2.0 使用二进制帧进行数据传输,而 HTTP/1.1 则使用文本格式的报文。二进制帧更加紧凑和高效,减少了传输的数据量和带宽消耗。

头部压缩(Header Compression):HTTP/1.1 支持Body压缩,Header不支持压缩。HTTP/2.0 支持对Header压缩,使用了专门为Header压缩而设计的 HPACK 算法,减少了网络开销。

服务器推送(Server Push):HTTP/2.0 支持服务器推送,可以在客户端请求一个资源时,将其他相关资源一并推送给客户端,从而减少了客户端的请求次数和延迟。而 HTTP/1.1 需要客户端自己发送请求来获取相关资源。

http/2.0 vs http/3.0

传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。

连接建立:HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。

头部压缩:HTTP/2.0 使用 HPACK 算法进行头部压缩,而 HTTP/3.0 使用更高效的 QPACK 头压缩算法。

队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。

连接迁移:HTTP/3.0 支持连接迁移,因为 QUIC 使用 64 位 ID 标识连接,只要 ID 不变就不会中断,网络环境改变时(如从 Wi-Fi 切换到移动数据)也能保持连接。而 TCP 连接是由(源 IP,源端口,目的 IP,目的端口)组成,这个四元组中一旦有一项值发生改变,这个连接也就不能用了。

错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制。

安全性:在 HTTP/2.0 中,TLS 用于加密和认证整个 HTTP 会话,包括所有的 HTTP 头部和数据负载。TLS 的工作是在 TCP 层之上,它加密的是在 TCP 连接中传输的应用层的数据,并不会对 TCP 头部以及 TLS 记录层头部进行加密,所以在传输的过程中 TCP 头部可能会被攻击者篡改来干扰通信。而 HTTP/3.0 的 QUIC 对整个数据包(包括报文头和报文体)进行了加密与认证处理,保障安全性。

http vs https

  1. 端口号:HTTP 默认是 80,HTTPS 默认是 443。
  2. URL 前缀:HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://
  3. 安全性和资源消耗:HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

工作原理如下所示:

  1. 客户端发送请求
  2. 服务端返回一个公钥证书,里面包含一个非对称加密的公钥,私钥则在服务端自己这
  3. 客户端验证证书的有效性
  4. 客户端利用伪随机数生成一个对称加密的密钥,并用证书中的公钥将其加密,发送给服务端
  5. 服务端接收到被非对称加密的公钥加密过 的 对称加密的密钥,使用自己的非对称加密的私钥将其解密,这样也得到了 对称加密的密钥
  6. 接下来双方使用对称加密的密钥进行加密通信

即整个过程为,通过一次非对称加密来获得通信使用的对称加密的密钥。

image-20250306214611000

http常见状态码

image-20250306214724326

200 OK:请求被成功处理。例如,发送一个查询用户数据的 HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。

201 Created:请求被成功处理并且在服务端创建了一个新的资源。例如,通过 POST 请求创建一个新的用户。

202 Accepted:服务端已经接收到了请求,但是还未处理。例如,发送一个需要服务端花费较长时间处理的请求(如报告生成、Excel 导出),服务端接收了请求但尚未处理完毕。

204 No Content:服务端已经成功处理了请求,但是没有返回任何内容。例如,发送请求删除一个用户,服务器成功处理了删除操作但没有返回任何内容

301 Moved Permanently:资源被永久重定向了。比如你的网站的网址更换了。

302 Found:资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。

400 Bad Request:发送的 HTTP 请求存在问题。比如请求参数不合法、请求方法错误。

401 Unauthorized:未认证却请求需要认证之后才能访问的资源。

403 Forbidden:直接拒绝 HTTP 请求,不处理。一般用来针对非法请求。

404 Not Found:你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。

409 Conflict:表示请求的资源与服务端当前的状态存在冲突,请求无法被处理。

500 Internal Server Error:服务端出问题了(通常是服务端出 Bug 了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。

502 Bad Gateway:我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。

WebSocket

WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。

WebSocket 协议本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket与HTTP的区别

下面是二者的主要区别:

  • WebSocket 是一种双向实时通信协议,而 HTTP 是一种单向通信协议。并且,HTTP 协议下的通信只能由客户端发起,服务器无法主动通知客户端。
  • WebSocket 使用 ws:// 或 wss://(使用 SSL/TLS 加密后的协议,类似于 HTTP 和 HTTPS 的关系) 作为协议前缀,HTTP 使用 http:// 或 https:// 作为协议前缀。
  • WebSocket 可以支持扩展,用户可以扩展协议,实现部分自定义的子协议,如支持压缩、加密等。
  • WebSocket 通信数据格式比较轻量,用于协议控制的数据包头部相对较小,网络开销小,而 HTTP 通信每次都要携带完整的头部,网络开销较大(HTTP/2.0 使用二进制帧进行数据传输,还支持头部压缩,减少了网络开销)。

DNS

DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题

目前 DNS 的设计采用的是分布式、层次数据库结构,DNS 是应用层协议,它可以在 UDP 或 TCP 协议之上运行,端口为 53

image-20250306223825953

TCP与UDP

TCP与UDP的区别

是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。

是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。

是否有状态:这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 ,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了。

传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。

传输形式:TCP 是面向字节流的,UDP 是面向报文的。

首部开销:TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。

是否提供广播或多播服务:TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;

TCP三次握手与四次挥手

image-20250306224053063

一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;

二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;

三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。

image-20250306224123498

第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务端的数据传送。然后客户端进入 FIN-WAIT-1 状态。

第二次挥手:服务端收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。

第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。

第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

服务端收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务端到客户端的数据传送。

TCP如何保证传输可靠性

  1. 基于数据块传输:应用数据被分割成 TCP 认为最适合发送的数据块,再传输给网络层,数据块被称为报文段或段。
  2. 对失序数据包重新排序以及去重:TCP 为了保证不发生丢包,就给每个包一个序列号,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据就可以实现数据包去重。
  3. 校验和 : TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. 重传机制 : 在数据包丢失或延迟的情况下,重新发送数据包,直到收到对方的确认应答(ACK)。TCP 重传机制主要有:基于计时器的重传(也就是超时重传)、快速重传(基于接收端的反馈信息来引发重传)、SACK(在快速重传的基础上,返回最近收到的报文段的序列号范围,这样客户端就知道,哪些数据包已经到达服务器了)、D-SACK(重复 SACK,在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了)。
  5. 流量控制 : TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议(TCP 利用滑动窗口实现流量控制)。
  6. 拥塞控制 : 当网络拥塞时,减少数据的发送。TCP 在发送数据的时候,需要考虑两个因素:一是接收方的接收能力,二是网络的拥塞程度。接收方的接收能力由滑动窗口表示,表示接收方还有多少缓冲区可以用来接收数据。网络的拥塞程度由拥塞窗口表示,它是发送方根据网络状况自己维护的一个值,表示发送方认为可以在网络中传输的数据量。发送方发送数据的大小是滑动窗口和拥塞窗口的最小值,这样可以保证发送方既不会超过接收方的接收能力,也不会造成网络的过度拥塞。

IP

ARP

copy from 李亚飞

1. Redis相关

1.1 Redis常用命令

1.2 如何使用Redis

1.使用Redis做缓存

2.使用setIfAbsent来实现互斥锁(setnx命令,set if not exist)

3.使用increment自增实现ID生成器

阅读全文 »

考试形式

一共十道简答题,书本——《软件安全技术(陈波)(Z-Library)》上的十章的课后题中每章选一题。

2024期末试卷回忆

  1. 什么是零日(0 day)漏洞?什么是零日(0 day)攻击?
  2. 试述软件漏洞的概念,谈谈软件漏洞与软件错误、软件缺陷、软件Bug的区别与联系。
  3. 分析攻击事件中XSS漏洞的原理。
  4. 什么是敏捷SDL?敏捷SDL和经典SDL的主要区别是什么?
  5. 软件安全需求的获取方法中的策略分解是指什么?
  6. 什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。
  7. 安全编译是指在代码编译阶段采取的哪些安全措施?
  8. 什么是Rootkit?它与木马和后门有什么区别与联系?
  9. 所开发的软件中使用了带GPL许可证的开源软件,那么这个软件是不是就要开源?
  10. 试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?
阅读全文 »

关于考试

开卷考试,允许携带一张A4纸,可以展示大家的压缩字体能力和眼部放大镜能力了。

本章只是对本课所有课件的一个整理,同时还偷了一些来自参考的整理。

没有银弹NoSilverBullet

Author:Fredrick P. Brooks1986

主要思想

  • 没有任何一种单纯的技术或管理上的进展,能够独立地承诺十年内使生产率、可靠性或简洁性获得数量级上的进步。
  • 所有大家看到的技术、管理方法都不会给软件开发带来意想不到的效果。
  • 软件开发在根本上就是困难的。
阅读全文 »

没有银弹

  1. 在《没有银弹》中,Brooks主张:

    • 存在能够显著提高软件生产力的技术

    • 软件开发的主要困难是复杂度、一致性、变化性和不可见性

    • 通过采用新的编程语言,软件危机可以完全得到解决。

    • 大多数的软件开发问题都是由于使用了错误的工具。

  2. 《没有银弹》文章中提到的“银弹”是指:

    • 一种新的编程语言。
    • 一种新的软件开发方法。
    • 一种新的软件工具。
    • 一个具有魔法般效果的解决方案。
阅读全文 »

考点

  1. 聚类的定义,方法,k-means算法步骤,方法论的分类。k-means步骤,优缺点。比如迭代3次之后的结果。评价聚类算法的好坏,角度有哪些。

  2. em算法:概念,适用场景(可以扩展,混合高斯等),em的实现,计算,jensen不等式,如何计算。计算:高斯分布混合而成。em优缺点,其他应用。

  3. 分类:决策树,knn,贝叶斯,基本的分类的算法。分类的定义,现实世界的应用场景(垃圾邮件识别等)。训练和验证测试集的划分,要完成哪些条件。常见的分类器。贝叶斯公式的形式,计算。决策树,id3,c4.5克服了缺点(简答题)

  4. gamma:知道gamma函数的形式,在实数域的特征,阶乘。要看一下性质(递推式),如何证明性质。gamma函数积分的形式,阶乘实现。

  5. beta分布:最基本的表现(4个分布),看到特征、数学表达式,符号的含义是什么(简答题)。会计算题。beta分布在前四种之上构造的,看到特征characteristics,稍微了解一下表达,也有计算题。每个分布数学公式,均值方差,图形表达,应用,例题等等。

  6. nlp:不用管工具使用。传统nlp的任务是什么。做分词,特征构建等。可用特征(词频,共线频率等)。稍微看一下分词。什么事停用词。命名实体识别。其他处理过程(词根化等)。马尔科夫链,看一下转移矩阵的概率,计算。n-gram应用。word vector如何构建,给你一个句子,写出来对应的向量。tf-idf不用太多记,如何根据它构建主题模型。词项-文档矩阵,给一个文档,算出来tf-idf,得到矩阵。了解信息熵概念,什么是最大熵。·

阅读全文 »

一 简答题(共12题,每题5分,共60分)

1. 解释C++内存管理的机制,并说明栈、堆、静态存储区的区别。

答:C++中的内存管理分为栈、堆和静态存储区: 栈用于存储局部变量,由编译器自动分配和释放,生命周期短,访问快;堆用于动态分配内存,由程序员手动管理,适合大块数据,生命周期由程序控制;静态存储区存储全局变量和静态变量,整个程序生命周期内有效,访问速度与栈相当。

2. 简要解释指针和数组的关系,并说明如何通过指针操作数组元素。

答:数组名相当于指向其首元素的指针。通过指针偏移可以访问数组元素,使用*(指针+偏移量)解引用操作具体的元素。

3. 虚函数是如何支持多态性的?虚函数被调用时,如何确保正确的函数被调用?

答:虚函数通过动态绑定支持多态性。当基类指针或引用指向派生类对象时,调用虚函数时由虚函数表和虚表指针机制决定具体调用哪个函数。每个类有一个虚函数表,记录函数地址,派生类会覆盖基类的对应入口。调用虚函数时,通过对象的虚表指针定位到正确的函数地址,确保调用派生类的实现。

阅读全文 »

复习建议

  • 开卷考试,建议携带材料:

    • 数据仓库白皮书(数据仓库与数据挖掘) + 黑皮书 (数据挖掘:概念与技术),可能会考一些往年没有的题,这个时候翻书就很有用了;
    • 往年卷题型解答(最好是你自己写的过程);
    • 对数表、分数表、信息熵计算表;
  • 题型与往年题相同,数据会变,因此推荐面向往年题复习。

    • 一道数据仓库 + 一道关联 + 一道数据预处理与分类 + 一道聚类;
    • 复习时建议动笔计算,只有动手了才更好理解如何计算;
    • 一定要使用题目要求的算法;
阅读全文 »

写在前面

本篇复习参考了多个来源,因此可能会在一些细节上出现相互矛盾的地方,这时候需要多多思考和理解。

策略模式 Strategy Pattern

image-20241227154520757

image-20241223153121545

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

image-20241227154630105

阅读全文 »

一、山在那儿

  “我今天一定要搞清楚你这个怪癖:为什么从不上岸?”船长对冯帆说,“五年了,我都记不清蓝水号停泊过多少个国家的多少个港口了,可你从没上过岸。如果蓝水号退役了,你是不是也打算像电影的主人公那样随它沉下去?”

  “我会换条船,海洋考察船总是欢迎我这种不上岸的地质工程师的。”

  “是陆地上有什么东西让你害怕吧?”

  “相反,陆地上有东西让我向往。”

  “什么东西?”

  “山。”

阅读全文 »
0%