1, 什么是HTTP协议?
- HTTP客户端和服务端之间进行数据通信的一种协议。协议规定了客户端应该按照什么格式给服务端发送请求,服务端应该以什么样的格式返回响应结果。
- HTTP协议规定只能由客户端主动发起请求,服务端接收请求处理后返回结果。
- HTTP是应用层的协议,TCP是传输层,HTTP是要基于TCP连接基础上的。TCP就是单纯建立连接,不涉及任何我们需要的请求数据;而HTTP是用来收发数据的,即实际应用上。
2,HTTP协议的特点?
-
灵活。HTTP允许传输任意类型的数据对象,正在传输的类型由content-type标记。
-
无状态。协议对于实物处理没有记忆能力,如果后续需要处理前面的信息,必须重传,这样可能导致每次连接需要传输的数据量增大。
解决无状态的方法:使用cookie,cookie就相当以一个通行证,当客户端第一次访问的时候发给客户端一个cookie,当客户端再次访问的时候拿着cookie,就知道是个老客户了。 -
不同版本的HTTP协议。
①HTTP1.0
<1>短连接。客户端和服务端每进行完依次HTTP(请求-响应)操作,就建立一次连接,任务结束就释放连接。如果客户端访问的服务器上还有其他web资源,那客户端每遇到这样一个资源,就要建立一次HTTP连接。
②HTTP1.1
<1>长连接。一次连接可以处理多个请求(keep Alive 默认开启),减少了建立和关闭连接的消耗和延时。一个包含了许多图像的网页文件的许多个请求和应答,可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要建立自己的连接。HTTP1.1还允许客户端不用等待上一次请求结果返回就可以发送下一个请求,但服务端还是要按照接收到客户端请求的先后顺序依次送回响应结果,以保证客户端能够区分出每次响应内容。
<2>节约带宽。HTTP1.1支持只发送header信息(不发送body信息),如果服务端任务客户端有权限请求服务端,则返回100,否则返回401。客户端如果接收到100,才开始把body请求发送给服务端。HTTP还支持传送内容的一部分,如果客户端已经有一部分资源,只需要向服务端请求剩余资源即可,这是文件断点续传的基础。
<3>HOST域。HTTP1.1支持web server(如Tomcat)上多个虚拟站点共享一个ip地址和端口号,使用不同主机名来创建多个虚拟站点。
③HTTP2.0
<1>多路复用。同一个连接可以并发处理多个请求,同时客户端发送请求和服务端同时回应请求。
<2>数据压缩。在HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据。在HTTP2.0当中,将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,它们之间就以索引号表示信息字段,这样避免了1.0版本中复杂繁琐的字段。同时使用HPACK算法进行压缩,这样数据体积小了,传输的时候更快。
<3>服务器推送。服务器还没有收到客户端请求,服务器就把各种资源发送给客户端。比如客户端只请求了index.html,但是服务器把index.html、style.css、example.png全部发送给客户端,免得客户端再次创建连接发送请求到服务器端获取,这种方式非常合适加载静态资源。客户端解析主请求响应index.html后,可以”无延时”从本地缓存获取依赖资源style.css、example.png, 减少访问延时, 提高访问体验. -
如何保持长连接:客户端需要不断地向服务端发送连接请求。客户端每保持一段固定时间发送一次"保持连接"请求,服务器在收到该请求后对客户端进行回复,表明知道客户端在线。若服务器长时间没有收到客户端的请求,则认为客户端"下线",若客户端长时间没有收到服务端的回复,则认为网络已经断开,TCP连接关闭(四次挥手)。
-
为什么HTTP是无状态的短连接,而TCP是有状态的长连接?
HTTP是每次请求完后就把TCP连接关了,所以是短连接。而我们通过socket编程使用TCP协议的时候,可以通过代码手动控制什么时候连接、什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就一直在客户端和服务端之间,相关状态数据会一直保存着。
3,什么是队头阻塞?如何解决队头阻塞?
-
TCP队头阻塞
①含义:TCP数据包是有序传输的,如果中间的某个包丢失,会等待该包重传,造成后面的数据包的阻塞。
②解决方法:没有解决方法,这是TCP本身的机制所导致的,要解决只能弃用TCP,采用别的传输协议,如UDP。 -
HTTP队头阻塞
①含义:
<1> HTTP1.0 非管道化方式:完全串行执行,请求->响应->请求->响应,后一个请求必须在上一个响应后发送。
<2> HTTP1.1 管道化方式:请求可以同时发送,但响应必须串行发送,后一个响应必须在前一个响应之后。
②解决方法:
<1>HTTP2.0 多路复用:引入消息、帧、数据流的概念,每个请求/响应都称为消息,每个消息拆分为若干个帧进行传输,每个帧编号,每个帧在传输时属于一个数据流,一个连接上可以存在多个数据流,每个帧在数据流和连接上独立传输,到达之后再组装成消息。
<2>并发TCP连接:对于一个域名而言,是允许多个长连接的,浏览器一个域名采用多个TCP连接,并发处理HTTP请求。
<3>域名分片:一个域名下分出多个二级域名出来,但它们还是指向同一个服务器,多个域名可以建立更多的TCP连接,并发处理HTTP请求。
4,HTTP协议报文格式
- 请求报文格式

POST /index.html HTTP/1.1 //请求行
// 方法/ URL /协议版本号
HOST:WWW.XXX.com //请求头部
USER-AGENT:MOZILLA/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
//空白行
Username=admin&password=admin //请求正文
- 响应报文格式

HTTP/1.1 200 OK //响应行
// 协议版本/状态码/状态码描述
Content-Encoding: gzip //响应头部
Content-Type: text/html;charset=utf-8
//空白行
<!DOCTYPE html> //响应正文
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<p>this is http response</p>
</body>
</html>
5,请求方法
-
HTTP1.0
① get
获取URL指定的资源,将参数和值附在URL后,利用"?“将URL和请求参数隔开,参数之间使用”&"隔开,如/index.jsp?username=holmofy&password=123123。传递参数长度收到了限制,与隐私相关的信息也直接暴露。
② post
一般用于提交信息或数据,请求服务器处理,将请求参数封装在HTTP请求数据中(Body),以名称:值的方式出现,可以大量传输数据,也不会显示在URL中。
③ head
类似与get,但服务器收到head请求后,只返回响应头,而不发送响应内容。当我们只查看某个页面的状态时,使用head方法高效,因为在传输的过程中省去了页面的内容。 -
HTTP1.1 新增
① options
用于检测服务器所支持的方法,比如是get还是post。
② delete
请求服务器删除URL所表示的资源。
③ put
向指定资源位置(URL)上传其最新内容,原来没有就上传,原来有就覆盖。
④patch
对put方法的补充,用来对已知资源局部更新。
⑤trace
请求服务器回送收到的请求信息,主要用于测试或者诊断。
⑥ connect
保留将来使用。
6,HTTP工作原理
① 客户端连接到web服务器(三次握手)
一个HTTP客户端,通常是浏览器,与web服务器的HTTP端口(默认为80)建立一个socket套接字连接。
② 客户端发送HTTP请求
通过socket套接字,客户端向web服务器发送一个http请求报文。
③ 服务器接收请求并返回HTTP响应
web服务器解析请求,定位请求资源。服务器将资源复写到socket套接字,发送给客户端。
④ 释放连接(四次挥手)
若connection模式为close,则服务端主动关闭连接;若connection模式为keeplive,则该连接会保持一段时间,在该段时间内服务端可以继续接收请求。
⑤ 客户端解析HTML内容
客户端首先解析状态行,查看状态码是否成功。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
7,在浏览器地址栏输入URL,按下回车键后发生了什么?
① DNS域名解析,将域名(浏览器中输入www.baidu.com,这就是域名)解析为ip地址。
浏览器收到域名后,先在本地查找是否有对应的域名-ip对应关系,如果有,则向其ip地址发送请求;如果没有,向DNS服务器请求解析该URL中域名对应的ip地址。
② 建立TCP连接,三次握手。解析出ip地址后,根据该ip地址和默认端口号80,与服务器建立连接。
③ 发送HTTP请求。
④ 服务器处理请求,返回HTTP响应结果。
⑤ 关闭TCP连接,四次挥手。
⑥ 浏览器解析HTML,展示内容。
- 域名解析的具体过程

8,HTTP状态码
-
1xx:指示信息,表示请求已接收,继续处理。
-
2xx:成功,表示请求已被成功接收、理解,200最常见(ok)。
-
3xx:重定向,要完成请求必须进行更进一步的操作。重定向状态码用来告诉客户端,它们访问的资源已被移动,web服务 器发送一个重定向状态码和一个可选的Location Header,告诉客户端新的资源地址在哪。
-
4xx:客户端错误,请求有语法错误,或者最常见的是请求了一个不存在的url。
-
5xx:服务端错误,比如服务器运行出错,或者网站挂了。
9,URI和URL?
- URI – Uniform Resource Identifier 统一资源标识符
URI是用来标示一个具体的资源的,我们通过URI可以知道一个资源是什么,比如每个人的身份证号都不同,一个身份证号可以唯一标识某个人,那身份证号就是URI。 - URL – Uniform Resource Location 统一资源定位符
URL是用来定位具体资源的,标示了一个可以找到该资源的路径,比如身份证上的地址+身份证号,不仅可以唯一标识你,还可以找到你。 - URI属于父类,URL是URI的一个子集。
10,什么是socket?socket、TCP、HTTP的关系?
socket是网络通信中端点的抽象表示,一个程序将一段信息写入socket中,该socket将这段信息发送给另一个socket,使这段信息可以传送到其他socket中。
- socket和TCP的关系:
①socket只是对TCP协议的封装和应用,使得程序员更方便地使用TCP协议而已,是对TCP协议的抽象,从而形成了常见的函数connect()、accept()、write()、read()等。
② 创建socket连接的时候,可以指定协议,比如TCP或者UDP,当使用TCP协议进行连接时,该socket连接就是一个TCP连接。
③一个服务端可以和多个客户端进行tcp连接,运用多线程技术为每一个客户端分配一个线程,服务端通过while-true方法不停地accept()监听客户端的连接。在进行连接时只需指定服务端端口号和ip地址号,客户端的端口号是客户端请求连接时系统自动分配,我们事先并不知道。 - TCP和HTTP的关系:
TCP是传输层协议,HTTP是应用层协议,在进行HTTP连接前先进行TCP连接,然后通过HTTP连接发送数据。
-① 客户端首先发起建立与服务端的TCP连接(三次握手),一旦建立连接,就可以通过各自的套接字socket访问TCP。客户端套接字是客户端进程和TCP连接之间的"门",服务端套接字是服务端进程和同一TCP连接之间的"门"。
②客户端往自己的套接字里面发送HTTP请求消息,也从自己的套接字里面接收HTTP响应消息;服务端从自己的套接字里面接收HTTP请求消息,也从自己的套接字里面发送HTTP响应消息。
③客户端或者服务端一旦把某个消息送入socket后,这个消息就落入TCP的控制之中。TCP给HTTP提供了一个可靠的数据传输服务,这意味着每个由客户端发出的HTTP请求消息都将无损地到达服务端,由服务端发出的HTTP响应消息都将无损地到达客户端。
11,HTTP和HTTPS?
-
HTTPS
基于HTTP协议,通过SSL(secure socket layer 安全套接字层)或TLS(transport layer security 传输层安全 TLS的前身是SSL)提供加密处理数据,验证对方身份,以及数据完整性保护,是HTTP的安全版本。 -
HTTP的缺点
① 请求信息明文传输,容易被窃听。
② 没有验证对方身份,容易被冒充。
③ 数据的完整性为校验,容易被篡改。 -
加密方式
对称加密:加密和解密用同一个密钥。
非对称加密:一把公钥+一把私钥。发送方使用对方的公钥对信息加密,对方收到加密信息后,再使用自己的私钥对密文进行解密。
① 仅使用对称加密,那么所有的密钥都是一把,黑客可以伪装程客户端也拿到密钥,则相当于没有加密。
② 仅使用非对称加密

此时存在一个问题,如果服务端要向客户端发送数据怎么办呢?
<1> 服务端用私钥加密数据,客户端用公钥解密数据,但黑客也有公钥,失败。
<2> 服务端用公钥加密数据,但客户端没有私钥,无法解密。
③仅使用非对称加密+对称加密

num1是客户端随机生成的,其他客户端或者黑客是不知道的,所以客户端无法对数据进行破解,但此时如果黑客充当中间人,则遭受到攻击。

④ CA+非对称加密+对称加密

- HTTPS详解

- HTTP与HTTPS的区别
①HTTPS对数据进行了加密,验证了身份,安全性好。

② HTTP端口是80,HTTPS端口是443.
③ HTTPS传输一般需要申请证书,而申请证书可能需要一定的费用。
④ HTTPS响应速度慢,HTTPS建立连接的过程更复杂,需要交换的数据也更多,所以速度慢一点。
⑤HTTPS要耗费的服务器资源更多,因为HTTPS是构建再TLS/SSL上的HTTP协议。
12,md5算法?
-
介绍:
信息摘要算法 — Message-Digest 5 Algorithm,一种被广泛密码散列函数,可以产生一个128位(16字节),用于确保消息传输完整一致。 -
特点
① 压缩性:任意长度得数据,计算出得md5值长度都是固定得。
② 容易计算:对原数据计算出md5值很容易。
③ 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到得md5值都有很大差别。
④ 强抗碰撞:想找到两个不同得数据,使它们具有相同得md5值,是非常困难的。 -
算法处理
算法详细描述博客
算法简要描述视频
① 填充:使得输入信息长度对512求余等于448。如果输入信息长度(bit)对512求余不等于448,就需要填充使得对512求余等于448。填充规则是一个1和n个0,这样输入长度就变成了N512+448(bit)。
② 记录信息长度:用64位来存储填充前信息长度。这样加上这64位,输入信息长度就变成了N512+448+64 =(N+1)512 bit。
③ 装入链接变量,用来做循环计算初始值用,最后的结果也是这四个链接变量经过多轮hash运算后的结果。
A=0x01234567;
B=0x89abcdef;
C=0xfedcba98;
D=0x76543210;
④ 四轮循环运算,循环的次数是分组的个数(N+1)。
<1> 四个线性函数(& 是与,| 是或,~ 是非,^ 是异或 (同为0 、异为1))
F(X,Y,Z) = (X&Y)|(~X&Z); //如果是X那么Y,否则Z
G(X,Y,Z) = (X&Z)|(Y&(~Z)); //
H(X,Y,Z) = X^Y^Z; //按位异或
I(X,Y,Z) = Y^(X|(~Z)); //
<2> 每个512位分为16个小组,每个小组64位。
<3> 四个线性函数
A,B,C,D是四个链接变量,X是第 j 个移位分组,S 代表加法运算参数,AC代表移位个数。每次操作改变的是第一个参数的值
FF(A,B,C,D,X,S,AC);
GG(A,B,C,D,X,S,AC);
HH(A,B,C,D,X,S,AC);
II(A,B,C,D,X,S,AC);
<4> 将4个链接参数轮换顺序作为前4个参数输入,每一轮执行16次,一共执行4轮,这些操作为一次循环。
<5> 一次循环之后得到的A、B、C、D与一开始的A、B、C、D相加,成为更新后的链接参数,作为第二次循环的链接参数。
<6> 每次循环使用更新后的链接参数,共进行N+1次循环,最后得到的A、B、C、D就是最终的md5。
-
应用场景
① 用户密码保护
在保存密码的时候不记录密码本身,而记录它的md5值,校验时是要密码正确得到的md5值一定一样。这样即便密码数据库被盗,也无法通过md5值推出密码本身。
② 文件完整性校验
要传输一个非常大的文件,由于网络传输中的不可靠因素,有可能导致文件传输不完整或者被篡改。要校验接收端和发送端文件是否一致,只需要现在发送端计算一次文件的md5,并把这个结果发送给接收端,接收端在文件传输完成后也计算一次md5,如果这两个结果一致,那文件一定是完整的。
③ 数字签名
发布程序的时候为了防止其被植入木马,在发布程序的时候同时发布其md5,这样别人下载程序后,只需要计算一遍md5是否与发布的一样,就能知道程序有没有被篡改 。
④ 云盘秒传
云盘上传一个很大的文件有时候是秒传,这并不是真的把文件上传了,而是上传了文件的md5,然后在数据库中搜索一下这个md5是否存在,如果存在则不用上传了,直接使用已存在的文件就好了,从而实现了秒传的功能。 -
攻击方法
① 暴力破解
一个一个尝试,时间复杂度非常高。
② 字典法
构建一个“明文–密文”数据库,破译时直接通过密文反查明文,空间复杂度非常高。
③ 彩虹表
彩虹表解释博客
在字典发基础上的改进,以时间换取空间。
<1>hash链:将原文重复k次(hash计算+R计算=1次k),将头、尾结点存储起来。以大量的随机明文作为起节点,通过上述步骤计算出哈希链并将终节点进行储存,可得到一张哈希链集。
hash链使用规则:重复运算,匹配尾结点,然后从头开始。
1, 与尾结点匹配:从头结点依次顺着链计算hash值,如果匹配到了密文,则从头结点明文开始顺着链表计算,看哪一步的计算的密文和要匹配的密文一致,一致的话说明找到了。
2,没有与尾结点匹配:对R运算后的结果进行H+R计算,直至匹配或来到结尾。然后从头结点明文开始顺着链表计算,如果计算得到的密文和要匹配的密文一致,一致的话说明找到了。
3,如果计算了k次之后还没有找到,说明破解失败。
<2>彩虹表
① hash链中每一步R函数都是相同的,这样一旦某个位置结果一样,之后的结果都一样,导致两条链中重复过多,但是尾结点又不一样,检测不出来。
② 在彩虹表中,k步中使用k个不同的R函数,当两个链条发生碰撞的位置并非相同的序列位置时,后续的R函数的不一致使得链条的后续部分也不相同,从而最大程度地减少了链条中的重复结点。
即使极端情况下两条链在同一位置相同了,这样的话尾结点也一样,可以检测出来。
③ 彩虹表使用规则:从k-1、k-2倒序匹配尾结点,然后从头开始。
<3>彩虹表和hash链对比:
hash链 彩虹链
最大计算次数:k 1+2+...+k=(K+1)k/2
平均计算次数:2/k (k+1)(k+2)/2
① 解相同个数的明文,彩虹链的时间复杂度要高一些,但是其可以减少重复链条的存储。
② 对于相同个数的明文,当k越大时,解密时间越长,一条彩虹链可以存储的信息越多,因此要使用的空间越少;当k越小时,解密时间约短,但是要用多条彩虹链存储,因此要用到的空间越多。这是时间、空间平衡的精髓。
<4>彩虹表的防御:加盐
彩虹表在生成的过程中,针对的是特定的 H 函数,H 函数如果发生了改变,则已有的彩虹表数据就完全无法使用。
如果每个用户都用一个不同的盐值,那么每个用户的 H 函数都不同,则必须要为每个用户都生成一个不同的彩虹表,大大提高了破解难度。
393

被折叠的 条评论
为什么被折叠?



