宜春市城乡规划建设局网站企业型网站制作
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:02
当前位置: 首页 > news >正文
宜春市城乡规划建设局网站,企业型网站制作,北京网站建设软件,wordpress手动更新视频教程1.如何理解 URI#xff1f;
URI, 全称为(Uniform Resource Identifier), 也就是统一资源标识符#xff0c;它的作用很简单#xff0c;就是区分互联网上不同的资源。但是#xff0c;它并不是我们常说的网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分#xff0c;由…1.如何理解 URI
URI, 全称为(Uniform Resource Identifier), 也就是统一资源标识符它的作用很简单就是区分互联网上不同的资源。但是它并不是我们常说的网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分由于 URL 过于普及就默认将 URI 视为 URL 了。
URI 的结构
URI 真正最完整的结构是这样的 好像跟平时见到的不太一样先别急来一一拆解。scheme 表示协议名比如http, https, file等等。后面必须和://连在一起。user:passwd 表示登录主机时的用户信息不过很不安全不推荐使用也不常用。host:port** 表示主机名和端口。path 表示请求路径标记资源所在位置。query 表示查询参数为keyval这种形式多个键值对之间用隔开。fragment 表示 URI 所定位的资源内的一个锚点**浏览器可以根据这个锚点跳转到对应的位置。
https://www.baidu.com/s?tn54093922_6_hao_pgieutf-8wd%E7%99%BE%E5%BA%A6这个 URI 中
https 即scheme部分www.baidu.com 为host:port部分注意http 和 https 的默认端口分别为80、443kenguba/upkpls/gisxr2 为path部分word1namekenguba 表示query部分#UrkH4 就是锚点
URI 编码
URI 只能使用 ASCII , ASCII 之外的字符是不支持显示的而且还有一部分符号是界定符如果不加以处理就会导致解析出错。因此URI 引入了编码机制将所有非 ASCII 码字符和界定符转为十六进制字节值然后在前面加个%。
encodeURI(https://www.yuque.com/kenguba/upkpls/gisxr2?name一缕清风)
https://www.yuque.com/kenguba/upkpls/gisxr2?name%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E
decodeURI(https://www.yuque.com/kenguba/upkpls/gisxr2?name%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E)encodeURIComponent(https://www.yuque.com/kenguba/upkpls/gisxr2?name一缕清风)
https://www.yuque.com/kenguba/upkpls/gisxr2?name%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E
decodeURIComponent(https://www.yuque.com/kenguba/upkpls/gisxr2?name%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E)2.解释一下HTTP的超文本传输协议
HTTP 是超文本传输协议也就是HyperText Transfer Protocol。它可以拆成三个部分
超文本传输协议 协议 生活中的协议本质上与计算机中的协议是相同的协议的特点:
协 字代表的意思是必须有两个以上的参与者。例如三方协议里的参与者有三个你、公司、学校三个租房协议里的参与者有两个你和房东。议 字代表的意思是对参与者的一种行为约定和规范。例如三方协议里规定试用期期限、毁约金等租房协议里规定租期期限、每月租金金额、违约如何处理等。 针对 HTTP 协议我们可以这么理解。HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范两个以上的参与者以及相关的各种控制和错误处理方式行为约定和规范
传输
所谓的「传输」很好理解就是把一堆东西从 A 点搬到 B 点或者从 B 点 搬到 A 点。别轻视了这个简单的动作它至少包含两项重要的信息。HTTP 协议是一个双向协议。我们在上网冲浪时浏览器是请求方 A 百度网站就是应答方 B。双方约定用 HTTP 协议来通信于是浏览器把请求数据发送给网站网站再把一些数据返回给浏览器最后由浏览器渲染在屏幕就可以看到图片、视频了。 数据虽然是在 A 和 B 之间传输但允许中间有中转或接力。就好像第一排的同学想穿递纸条给最后一排的同学那么传递的过程中就需要经过好多个同学中间人这样的传输方式就从「A - B」变成了「A - N - M - B」。而在 HTTP 里需要中间人遵从 HTTP 协议只要不打扰基本的数据传输就可以添加任意额外的东西。针对传输我们可以进一步理解了 HTTP。HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。
超文本
HTTP 传输的内容是「超文本」 我们先来理解「文本」在互联网早期的时候只是简单的字符文字但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等在 HTTP 眼里这些都算做「文本」。再来理解「超文本」它就是超越了普通文本的文本它是文字、图片、视频等的混合体最关键有超链接能从一个超文本跳转到另外一个超文本。HTML 就是最常见的超文本了它本身只是纯文字文件但内部用很多标签定义了图片、视频等的链接在经过浏览器的解释呈现给我们的就是一个文字、有画面的网页了。OK经过了对 HTTP 里这三个名词的详细解释就可以给出比「超文本传输协议」这七个字更准确更有技术含量的答案HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」
⚠️注意: HTTP 不是用于从互联网服务器传输超文本到本地浏览器的协议也可以是服务器到服务器所以采用两点之间的描述会更准确
3.HTTP 的特点HTTP 有哪些缺点
HTTP 的特点概括
灵活可扩展 主要体现在两个方面。 一个是语义上的自由只规定了基本格式比如空格分隔单词换行分隔字段其他的各个部分都没有严格的语法限制 另一个是传输形式的多样性不仅仅可以传输文本还能传输图片、视频等任意数据非常方便。 可靠传输 HTTP 基于 TCP/IP因此把这一特性继承了下来。这属于 TCP 的特性不具体介绍了。 请求-应答 也就是一发一收、有来有回 当然这个请求方和应答方不单单指客户端和服务器之间如果某台服务器作为代理来连接后端的服务端那么这台服务器也会扮演请求方的角色。 无状态 这里的状态是指通信过程的上下文信息而每次 http 请求都是独立、无关的默认不需要保留状态信息
HTTP 缺点
无状态 所谓的优点和缺点还是要分场景来看的对于 HTTP 而言最具争议的地方在于它的无状态。 在需要长连接的场景中需要保存大量的上下文信息以免传输大量重复的信息那么这时候无状态就是 http 的缺点了。 但与此同时另外一些应用仅仅只是为了获取一些数据不需要保存连接上下文信息无状态反而减少了网络开销成为了 http 的优点。 明文传输 即协议里的报文(主要指的是头部)不使用二进制数据而是文本形式。这当然对于调试提供了便利但同时也让 HTTP 的报文信息暴露给了外界给攻击者也提供了便利。WIFI陷阱就是利用 HTTP 明文传输的缺点诱导你连上热点然后疯狂抓你所有的流量从而拿到你的敏感信息。 队头阻塞问题 当 http 开启长连接时共用一个 TCP 连接同一时刻只能处理一个请求那么当前请求耗时过长的情况下其它的请求只能处于阻塞状态也就是著名的队头阻塞问题。接下来会有一小节讨论这个问题。
4.HTTP 报文结构是怎样的
对于 TCP 而言在传输的时候分为两个部分: **TCP头 和 数据部分。而 HTTP 类似也是 header body 的结构具体而言:
起始行 头部 空行 实体由于 http 请求报文和响应报文是有一定区别因此分开介绍 起始行
对于请求报文来说起始行类似下面这样:
GET /home HTTP/1.1也就是方法 路径 http版本。对于响应报文来说起始行一般张这个样:
HTTP/1.1 200 OK响应报文的起始行也叫做状态行。由 http版本、状态码和原因 三部分组成。⚠️注意在起始行中每两个部分之间用空格隔开最后一个部分后面应该接一个换行严格遵循 ABNF 语法规范
头部
展示一下请求头和响应头在报文中的位置: 不管是请求头还是响应头其中的字段是相当多的而且牵扯到http非常多的特性这里就不一一列举的重点看看这些头部字段的格式
字段名不区分大小写字段名不允许出现空格不可以出现下划线_字段名后面必须紧接着 **:
空行
很重要用来区分开头部和实体。问: 如果说在头部中间故意加一个空行会怎么样那么空行后的内容全部被视为实体。
实体
就是具体的数据了也就是 body 部分。请求报文对应请求体, 响应报文对应响应体。
5.如何理解 HTTP 的请求方法
http/1.1 规定了以下请求方法(注意都是大写):
GET 通常用来获取资源HEAD 获取资源的元信息POST 提交数据即上传数据PUT 修改数据DELETE 删除资源(几乎用不到)CONNECT 建立连接隧道用于代理服务器OPTIONS 列出可对资源实行的请求方法预检请求用来跨域请求TRACE 追踪请求-响应的传输路径
6.http 常见字段有哪些
HostContent-LengthConnectionContent-EncodingContent-Type
7.对于定长和不定长的数据HTTP 是怎么传输的
定长包体
对于定长包体而言发送端在传输的时候一般会带上 Content-Length, 来指明包体的长度。我们用一个nodejs服务器来模拟一下:
const http require(http);const server http.createServer();server.on(request, (req, res) {if(req.url /) {res.setHeader(Content-Type, text/plain);res.setHeader(Content-Length, 10);res.write(helloworld);}
})server.listen(8081, () {console.log(成功启动);
})启动后访问: localhost:8081。浏览器中显示如下:
helloworld这是长度正确的情况那不正确的情况是如何处理的呢我们试着把这个长度设置的小一些:
res.setHeader(Content-Length, 8);重启服务再次访问现在浏览器中内容如下:
hellowor那后面的ld哪里去了呢实际上在 http 的响应体中直接被截去了。然后试着将这个长度设置得大一些:
res.setHeader(Content-Length, 12);此时浏览器显示如下: 直接无法显示了。可以看到 Content-Length 对于 http 传输过程起到了十分关键的作用如果设置不当可以直接导致传输失败。
不定长包体
上述是针对于定长包体那么对于不定长包体而言是如何传输的呢这里就必须介绍另外一个 http 头部字段了:
Transfer-Encoding: chunked// Transfer-Encoding: chunked
// Transfer-Encoding: compress
// Transfer-Encoding: deflate
// Transfer-Encoding: gzip
// Transfer-Encoding: identity
// Several values can be listed, separated by a comma
// Transfer-Encoding: gzip, chunked表示分块传输数据设置这个字段后会自动产生两个效果:
Content-Length 字段会被忽略基于长连接持续推送动态内容 我们依然以一个实际的例子来模拟分块传输nodejs 程序如下:
const http require(http);const server http.createServer();server.on(request, (req, res) {if(req.url /) {res.setHeader(Content-Type, text/html; charsetutf8);res.setHeader(Content-Length, 10);res.setHeader(Transfer-Encoding, chunked);res.write(p来啦/p);setTimeout(() {res.write(第一次传输br/);}, 1000);setTimeout(() {res.write(第二次传输);res.end()}, 2000);}
})server.listen(8009, () {console.log(成功启动);
})用 telnet 抓到的响应如下: 注意Connection: keep-alive 及之前的为响应行和响应头后面的内容为响应体这两部分用换行符隔开。响应体的结构比较有意思如下所示:
chunk长度(16进制的数)
第一个chunk的内容
chunk长度(16进制的数)
第二个chunk的内容
……
0最后是留有有一个空行的这一点请大家注意。以上便是 http 对于定长数据和不定长数据的传输方式。
8.HTTP 如何处理大文件的传输
对于几百 M 甚至上 G 的大文件来说如果要一口气全部传输过来显然是不现实的会有大量的等待时间严重影响用户体验。因此HTTP 针对这一场景采取了范围请求的解决方案允许客户端仅仅请求一个资源的一部分。
如何支持
当然前提是服务器要支持范围请求要支持这个功能就必须加上这样一个响应头:
\( curl -I https://www.yuque.com/
HTTP/1.1 200 OK
...
Accept-Ranges: bytes
Content-Length: 146515\) curl -I http://download.dcloud.net.cn/HBuilder.9.0.2.macosx_64.dmg
$ curl -H Range: bytes0-10 http://download.dcloud.net.cn/HBuilder.9.0.2.macosx_64.dmg -v//省略
HTTP/1.1 200 OK
…
Accept-Ranges: none//详细的
HTTP/1.1 200 OK
Server: Tengine
Content-Type: application/octet-stream
Content-Length: 233295878
Connection: keep-alive
Date: Mon, 26 Apr 2021 13:12:46 GMT
x-oss-request-id: 6086BC4E66D721363972F4A8
x-oss-cdn-auth: success
Accept-Ranges: bytes
ETag: 6D932737FD8C6058D6AE93BCC4C74AA7-45
Last-Modified: Tue, 06 Mar 2018 13:20:31 GMT
x-oss-object-type: Multipart
x-oss-hash-crc64ecma: 7369427768111114923
x-oss-storage-class: Standard
x-oss-server-time: 156
Ali-Swift-Global-Savetime: 1617704046
Via: cache15.l2cn1809[0,200-0,H], cache2.l2cn1809[1,0], cache7.cn682[39,39,200-0,M], cache2.cn682[44,0]
Age: 778
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Mon, 26 Apr 2021 13:25:44 GMT
X-Swift-CacheTime: 3600
Timing-Allow-Origin: *
EagleId: af062a4216194435440612604e假如在响应中存在Accept-Ranges首部并且它的值不为 “none”那么表示该服务器支持范围请求 在上面的响应中Accept-Ranges: bytes 表示界定范围的单位是 bytes 。这里 Content-Length也是有效信息因为它提供了要检索的图片的完整大小
如果站点未发送Accept-Ranges首部那么它们有可能不支持范围请求。一些站点会明确将其值设置为 “none”以此来表明不支持。在这种情况下某些应用的下载管理器会将暂停按钮禁用。
curl -I https://www.youtube.com/watch?vEwTZ2xpQwpAHTTP/1.1 200 OK
…
Accept-Ranges: noneRange 字段拆解
而对于客户端而言它需要指定请求哪一部分通过 Range 这个请求头字段确定格式为bytesx-y。接下来就来讨论一下这个 Range 的书写格式:
0-499 表示从开始到第 499 个字节。
500- 表示从第 500 字节到文件终点。
-100 表示文件的最后100个字节。
服务器收到请求之后首先验证范围是否合法如果越界了那么返回416错误码否则读取相应片段返回206状态码。同时服务器需要添加 Content-Range 字段这个字段的格式根据请求头中Range字段的不同而有所差异。具体来说请求单段数据和请求多段数据响应头是不一样的。举个例子:
// 单段数据
curl http://i.imgur.com/z4d4kWk.jpg -i -H Range: bytes0-1023
Range: bytes0-9// 多段数据
curl http://www.example.com -i -H Range: bytes0-50, 100-150
Range: bytes0-9, 30-39接下来就分别来讨论着两种情况
单段数据
对于单段数据的请求返回的响应如下:
HTTP/1.1 206 Partial Content
Content-Length: 10
Accept-Ranges: bytes
Content-Range: bytes 0-9/100i am xxxxx值得注意的是Content-Range字段0-9表示请求的返回100表示资源的总大小很好理解。
多段数据
接下来看看多段请求的情况。得到的响应会是下面这个形式:
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary00000010101
Content-Length: 189
Connection: keep-alive
Accept-Ranges: bytes–00000010101
Content-Type: text/plain
Content-Range: bytes 0-9/96i am xxxxx
–00000010101
Content-Type: text/plain
Content-Range: bytes 20-29/96eex jspy e
–00000010101–这个时候出现了一个非常关键的字段Content-Type: multipart/byteranges;boundary00000010101它代表了信息量是这样的:
请求一定是多段数据请求
响应体中的分隔符是 00000010101
因此在响应体中各段数据之间会由这里指定的分隔符分开而且在最后的分隔末尾添上–表示结束。以上就是 http 针对大文件传输所采用的手段。
与分块传输编码的对比
Transfer-Encoding 首部允许分块编码这在数据量很大并且在请求未能完全处理完成之前无法知晓响应的体积大小的情况下非常有用。服务器会直接把数据发送给客户端而无需进行缓冲或确定响应的精确大小——后者会增加延迟。范围请求与分块传输是兼容的可以单独或搭配使用
9.HTTP 中如何处理表单数据的提交
在 http 中有两种主要的表单提交的方式体现在两种不同的Content-Type取值:
application/x-www-form-urlencodedmultipart/form-data 由于表单提交一般是POST请求很少考虑GET因此这里我们将默认提交的数据放在请求体中
application/x-www-form-urlencoded
对于application/x-www-form-urlencoded格式的表单内容有以下特点:
其中的数据会被编码成以分隔的键值对字符以URL编码方式编码。如
// 转换过程: {a: 1, b: 2} - a1b2 - 如下(最终形式)
a%3D1%26b%3D2multipart/form-data
对于multipart/form-data而言:
请求头中的Content-Type字段会包含boundary且boundary的值有浏览器默认指定。例:
Content-Type: multipart/form-data;boundary—-WebkitFormBoundaryRRJKeWfHPGrS4LKe数据会分为多个部分每两个部分之间通过分隔符来分隔每部分表述均有 HTTP 头部描述子包体如Content-Type在最后的分隔符会加上–表示结束。
相应的请求体是下面这样:
Content-Disposition: form-data;namedata1;
Content-Type: text/plain
data1
—-WebkitFormBoundaryRRJKeWfHPGrS4LKe
Content-Disposition: form-data;namedata2;
Content-Type: text/plain
data2
—-WebkitFormBoundaryRRJKeWfHPGrS4LKe–值得一提的是multipart/form-data 格式最大的特点在于:每一个表单元素都是独立的资源表述。另外你可能在写业务的过程中并没有注意到其中还有boundary的存在如果你打开抓包工具确实可以看到不同的表单元素被拆分开了之所以在平时感觉不到是以为浏览器和 HTTP 给你封装了这一系列操作。而且在实际的场景中对于图片等文件的上传基本采用multipart/form-data而不用application/x-www-form-urlencoded因为没有必要做 URL 编码带来巨大耗时的同时也占用了更多的空间。
10.如何理解 HTTP 代理
我们知道在 HTTP 是基于请求-响应模型的协议一般由客户端发请求服务器来进行响应。当然也有特殊情况就是代理服务器的情况。引入代理之后作为代理的服务器相当于一个中间人的角色对于客户端而言表现为服务器进行响应而对于源服务器表现为客户端发起请求具有双重身份。那代理服务器到底是用来做什么的呢
功能
负载均衡 客户端的请求只会先到达代理服务器后面到底有多少源服务器IP 都是多少客户端是不知道的。因此这个代理服务器可以拿到这个请求之后可以通过特定的算法分发给不同的源服务器让各台源服务器的负载尽量平均。当然这样的算法有很多包括随机算法、轮询、一致性hash、LRU(最近最少使用)等等不过这些算法并不是本文的重点大家有兴趣自己可以研究一下。保障安全 利用心跳机制监控后台的服务器一旦发现故障机就将其踢出集群。并且对于上下行的数据进行过滤对非法 IP 限流这些都是代理服务器的工作。缓存代理 将内容缓存到代理服务器使得客户端可以直接从代理服务器获得而不用到源服务器那里
相关头部字段
Via
代理服务器需要标明自己的身份在 HTTP 传输中留下自己的痕迹怎么办呢通过Via字段来记录。举个例子现在中间有两台代理服务器在客户端发送请求后会经历这样一个过程:
客户端 - 代理1 - 代理2 - 源服务器在源服务器收到请求后会在请求头拿到这个字段:
Via: proxy_server1, proxy_server2而源服务器响应时最终在客户端会拿到这样的响应头:
Via: proxy_server2, proxy_server1可以看到Via中代理的顺序即为在 HTTP 传输中报文传达的顺序
X-Forwarded-For
字面意思就是为谁转发, 它记录的是请求方的IP地址(注意和Via区分开X-Forwarded-For记录的是请求方这一个IP)。
X-Real-IP
是一种获取用户真实 IP 的字段不管中间经过多少代理这个字段始终记录最初的客户端的IP。相应的还有X-Forwarded-Host和X-Forwarded-Proto分别记录客户端(注意哦不包括代理)的域名和协议名。
X-Forwarded-For产生的问题
前面可以看到X-Forwarded-For这个字段记录的是请求方的 IP这意味着每经过一个不同的代理这个字段的名字都要变从客户端到代理1这个字段是客户端的 IP从代理1到代理2这个字段就变为了代理1的 IP。但是这会产生两个问题:
意味着代理必须解析 HTTP 请求头然后修改比直接转发数据性能下降。在 HTTPS 通信加密的过程中原始报文是不允许修改的。 由此产生了代理协议一般使用明文版本只需要在 HTTP 请求行上面加上这样格式的文本即可:
// PROXY TCP4/TCP6 请求方地址 接收方地址 请求端口 接收端口
PROXY TCP4 0.0.0.1 0.0.0.2 1111 2222
GET / HTTP/1.1这样就可以解决X-Forwarded-For带来的问题了
11.说说 HTTP1.1 相比 HTTP1.0 提高了什么性能
HTTP1.1 相比 HTTP1.0 性能上的改进
使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。支持 管道pipeline网络传输只要第一个请求发出去了不必等其回来就可以发第二个请求出去可以减少整体的响应时间。
但 HTTP1.1 还是有性能瓶颈
请求/响应头部Header未经压缩就发送首部信息越多延迟越大。只能压缩 Body 的部分发送冗长的首部。每次互相发送相同的首部造成的浪费较多服务器是按请求的顺序响应的如果服务器响应慢会招致客户端一直请求不到数据也就是队头阻塞没有请求优先级控制请求只能从客户端开始服务器只能被动响应
12.那上面的 HTTP1.1 的性能瓶颈HTTP2 做了什么优化
HTTP/2是Web的未来demo演示HTTP2 协议是 基于 HTTPS 的所以 HTTP2 的安全性也是有保障的。那 HTTP2 相比 HTTP1.1 性能上的改进
- 头部压缩 HTTP2 会压缩头Header如果你同时发出多个请求他们的头是一样的或是相似的那么协议会帮你消除重复的分。这就是所谓的 HPACK 算法 索引表霍夫曼编码 在客户端和服务器同时维护一张头信息表所有字段都会存入这个表生成一个索引号以后就不发送同样字段了只发送索引号这样就提高速度了。
- 二进制格式 HTTP2 不再像 HTTP1.1 里的纯文本形式的报文而是全面采用了二进制格式头信息和数据体都是二进制并且统称为帧(frame)头信息帧和数据帧。 这样虽然对人不友好但是对计算机非常友好因为计算机只懂二进制那么收到报文后无需再将明文的报文转成二进制而是直接解析二进制报文这增加了数据传输的效率 数据流 HTTP2 的数据包不是按顺序发送的同一个连接里面连续的数据包可能属于不同的回应。因此必须要对数据包做标记指出它属于哪个回应。每个请求或回应的所有数据包称为一个数据流Stream。每个数据流都标记着一个独一无二的编号其中规定客户端发出的数据流编号为奇数 服务器发出的数据流编号为偶数 客户端还可以指定数据流的优先级。优先级高的请求服务器就先响应该请求。 同域名下所有通信都在单个连接上完成。单个连接可以承载任意数量的双向数据流。数据流以消息的形式发送而消息又由一个或多个帧组成多个帧之间可以乱序发送因为根据帧首部的流标识可以重新组装。 这一特性使性能有了极大提升 同个域名只需要占用一个 TCP 连接消除了因多个 TCP 连接而带来的延时和内存消耗。单个连接上可以并行交错的请求和响应之间互不干扰。在HTTP2中每个请求都可以带一个 31bit的优先值0表示最高优先级 数值越大优先级越低。有了这个优先值客户端和服务器就可以在处理不同的流时采取不同的策略以最优的方式发送流、消息和帧。 多路复用 HTTP2 是可以在一个连接中并发多个请求或回应而不用按照顺序一一对应。移除了 HTTP1.1 中的串行请求不需要排队等待也就不会再出现「队头阻塞」问题降低了延迟大幅度提高了连接的利用率。举例来说在一个 TCP 连接里服务器收到了客户端 A 和 B 的两个请求如果发现 A 处理过程非常耗时于是就回应 A 请求已经处理好的部分接着回应 B 请求完成后再回应 A 请求剩下的部分。 服务器推送 HTTP2 还在一定程度上改善了传统的「请求 - 应答」工作模式服务不再是被动地响应也可以主动向客户端发送消息。举例来说在浏览器刚请求 HTML 的时候就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端减少延时的等待也就是服务器推送(Server Push也叫 Cache Push) 13.HTTP2 有哪些缺陷HTTP3 做了哪些优化 HTTP2 主要的问题在于多个 HTTP 请求在复用一个 TCP 连接下层的 TCP 协议是不知道有多少个 HTTP 请求的。所以一旦发生了丢包现象就会触发 TCP 的重传机制这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。 HTTP1.1 中的管道(pipeline) 传输中如果有一个请求阻塞了那么队列后请求也统统被阻塞住了 HTTP2 多请求复用一个TCP连接一旦发生丢包就会阻塞住所有的 HTTP 请求。 这都是基于 TCP 传输层的问题所以 HTTP3 把 HTTP 下层的 TCP 协议改成了 UDPUDP 发生是不管顺序也不管丢包的所以不会出现 HTTP1.1 的队头阻塞 和 HTTP2 的一个丢包全部重传问题 大家都知道 UDP 是不可靠传输的但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。 QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时只会阻塞这个流其他流不会受到影响。 TL3 升级成了最新的1.3版本头部压缩算法也升级成了 QPack HTTPS 要建立一个连接要花费 6 次交互先是建立三次握手然后是 TLS/1.3 的三次握手。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互 合并成了 3 次减少了交互次数 所以 QUIC 是一个在 UDP 之上的伪 TCP TLS HTTP2 的多路复用的协议。QUIC 是新协议对于很多网络设备根本不知道什么是 QUIC只会当做 UDP这样会出现新的问题。所以 HTTP3 现在普及的进度非常的缓慢不知道未来 UDP 是否能够逆袭 TCP 14.HTTP 与 HTTPS 有哪些区别 HTTP 是超文本传输协议信息是明文传输存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议使得报文能够加密传输。HTTP 连接建立相对简单 TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后还需进行SSL/TLS 的握手过程才可进入加密报文传输。HTTP 的端口号是 80HTTPS 的端口号是 443。HTTPS 协议需要向 CA证书权威机构申请数字证书来保证服务器的身份是可信的 15.HTTPS 解决了 HTTP 的哪些问题 HTTP 由于是明文传输所以安全上存在以下三个风险 窃听风险比如通信链路上可以获取通信内容用户号容易没。篡改风险比如强制入垃圾广告视觉污染用户眼容易瞎。冒充风险比如冒充淘宝网站用户钱容易没。 HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议可以很好的解决了上述的风险 信息加密交互信息无法被窃取校验机制无法篡改通信内容篡改了就不能正常显示身份证书证明淘宝是真的淘宝网 可见只要自身不做「恶」SSL/TLS 协议是能保证通信是安全的 16.HTTPS 是如何解决上面的三个风险的 混合加密的方式实现信息的机密性解决了窃听的风险。 摘要算法的方式来实现完整性它能够为数据生成独一无二的「指纹」指纹用于校验数据的完整性解决了篡改的风险。将服务器公钥放入到数字证书中解决了冒充的风险 混合加密 通过混合加密的方式可以保证信息的机密性解决了窃听的风险。 混合加密 HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式 在通信建立前采用非对称加密的方式交换「会话秘钥」后续就不再使用非对称加密。在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。 采用「混合加密」的方式的原因对称加密只使用一个密钥运算速度快密钥必须保密无法做到安全的密钥交换。非对称加密使用两个密钥公钥和私钥公钥可以任意分发而私钥保密解决了密钥交换问题但速度慢。 摘要算法 摘要算法用来实现完整性能够为数据生成独一无二的「指纹」用于校验数据的完整性解决了篡改的风险 客户端在发送明文之前会通过摘要算法算出明文的「指纹」发送的时候把「指纹 明文」一同 加密成密文后发送给服务器服务器解密后用相同的摘要算法算出发送过来的明文通过比较客户端携带的「指纹」和当前算出的「指纹」做比较若「指纹」相同说明数据是完整的。 数字证书 客户端先向服务器端索要公钥然后用公钥加密信息服务器收到密文后用自己的私钥解密。这就存在些问题如何保证公钥不被篡改和信任度所以这里就需要借助第三方权威机构 CA数字证书认证机构将服务器公钥放在数字证书由数字证书认证机构颁发中只要证书是可信的公钥就是可信的。 通过数字证书的方式保证服务器公钥的身份解决冒充的风险 17.HTTPS 是如何建立连接的其间交互了什么 SSL/TLS 协议基本流程 1.TCP 三次同步握手 2.客户端向服务器索要并验证服务器的公钥 3.双方协商生产「会话秘钥」 4.SSL 安全加密隧道协商完成 5.双方采用「会话秘钥」进行加密通信。 23步是 SSL/TLS 的建立过程也就是握手阶段 SSL/TLS 的握手阶段涉及四次通信可见下图 SSL/TLS 协议建立的详细流程
- ClientHello 首先由客户端向服务器发起加密通信请求也就是 ClientHello 请求。在这一步客户端主要向服务器发送以下信息1客户端支持的 SSL/TLS 协议版本如 TLS 1.2 版本。2客户端生产的随机数Client Random后面用于生产「会话秘钥」。3客户端支持的密码套件列表如 RSA 加密算法。
- SeverHello 服务器收到客户端请求后向客户端发出响应也就是 SeverHello。服务器回应的内容有如下内容1确认 SSL/ TLS 协议版本如果浏览器不支持则关闭加密通信。2服务器生产的随机数Server Random后面用于生产「会话秘钥」。3确认的密码套件列表如 RSA 加密算法。4服务器的数字证书。
- 客户端回应 客户端收到服务器的回应之后首先通过浏览器或者操作系统中的 CA 公钥确认服务器的数字证书的真实性。如果证书没有问题客户端会从数字证书中取出服务器的公钥然后使用它加密报文向服务器发送如下信息 1一个随机数pre-master key。该随机数会被服务器公钥加密。 2加密通信算法改变通知表示随后的信息都将用「会话秘钥」加密通信。 3客户端握手结束通知表示客户端的握手阶段已经结束。 这一项同时把之前所有内容的发生的数据做个摘要用来供服务端校验。上面第一项的随机数是整个握手阶段的第三个随机数这样服务器和客户端就同时有三个随机数接着就用双方协商的加密算法各自生成本次通信的「会话秘钥」
- 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后通过协商的加密算法计算出本次通信的「会话秘钥」。然后向客户端发生最后的信息 1加密通信算法改变通知表示随后的信息都将用「会话秘钥」加密通信。 2服务器握手结束通知表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要用来供客户端校验。 至此整个 SSL/TLS 的握手阶段全部结束。接下来客户端与服务器进入加密通信就完全是使用普通的 HTTP 协议只不过用「会话秘钥」加密内容。
18.UDP 和 TCP 的区别 19.TCP 三次握手和四次挥手
TCP 三次握手和四次挥手也是面试题的热门考点它们分别对应 TCP 的连接和释放过程。下面就来简单认识一下这两个过程
TCP 三次握手
在了解具体的流程前需要先认识几个概念 SYN它的全称是 Synchronize Sequence Numbers同步序列编号。是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立 TCP 连接时首先会发送的一个信号。客户端在接受到 SYN 消息时就会在自己的段内生成一个随机值 X。SYN-ACK服务器收到 SYN 后打开客户端连接发送一个 SYN-ACK 作为答复。确认号设置为比接收到的序列号多一个即 X 1服务器为数据包选择的序列号是另一个随机数 Y。ACKAcknowledge character, 确认字符表示发来的数据已确认接收无误。最后客户端将 ACK 发送给服务器。序列号被设置为所接收的确认值即 Y 1。 如果用现实生活来举例的话就是 小明 - 客户端 小红 - 服务端 小明给小红打电话接通了后小明说喂能听到吗这就相当于是连接建立。 小红给小明回应能听到你能听到我说的话吗这就相当于是请求响应。 小明听到小红的回应后好的这相当于是连接确认。在这之后小明和小红就可以通话/交换信息了。
TCP 四次挥手
在连接终止阶段使用四次挥手连接的每一端都会独立的终止。下面来描述一下这个过程。 首先客户端应用程序决定要终止连接(这里服务端也可以选择断开连接)。这会使客户端将 FIN 发送到服务器并进入 FIN_WAIT_1 状态。当客户端处于 FIN_WAIT_1 状态时它会等待来自服务器的 ACK 响应。 然后第二步当服务器收到 FIN 消息时服务器会立刻向客户端发送 ACK 确认消息。 当客户端收到服务器发送的 ACK 响应后客户端就进入 FIN_WAIT_2 状态然后等待来自服务器的 FIN 消息 服务器发送 ACK 确认消息后一段时间可以进行关闭后会发送 FIN 消息给客户端告知客户端可以进行关闭。 当客户端收到从服务端发送的 FIN 消息时客户端就会由 FIN_WAIT_2 状态变为 TIME_WAIT 状态。处于 TIME_WAIT 状态的客户端允许重新发送 ACK 到服务器为了防止信息丢失。客户端在 TIME_WAIT 状态下花费的时间取决于它的实现在等待一段时间后连接关闭客户端上所有的资源包括端口号和缓冲区数据都被释放。 还是可以用上面那个通话的例子来进行描述 小明对小红说我所有的东西都说完了我要挂电话了。 小红说收到我这边还有一些东西没说。 经过若干秒后小红也说完了小红说我说完了现在可以挂断了 小明收到消息后又等了若干时间后挂断了电话。
20.说说TCP传输的三次握手四次挥手策略
三次握手
为了准确无误地把数据送达目标处TCP协议采用了三次握手策略。 用TCP协议把数据包送出去后TCP不会对传送后的情况置之不理它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志SYN和ACK
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后发送端再回传一个带ACK标志的数据包代表“握手”结束。
注意若在握手过程中某个阶段莫名中断TCP协议会再次以相同的顺序发送相同的数据包四次挥手
断开一个TCP连接则需要四次挥手 第一次挥手主动关闭方发送一个FIN用来关闭主动方到被动关闭方的数据传送也就是主动关闭方告诉被动关闭方我已经不会再给你发数据了(当然在fin包之前发送出去的数据如果没有收到对应的ack确认报文主动关闭方依然会重发这些数据)但是此时主动关闭方还可以接受数据 第二次挥手被动关闭方收到FIN包后发送一个ACK给对方确认序号为收到序号1与SYN相同一个FIN占用一个序号 第三次挥手被动关闭方发送一个FIN用来关闭被动关闭方到主动关闭方的数据传送也就是告诉主动关闭方我的数据也发送完了不会再给你发数据了 第四次挥手主动关闭方收到FIN后发送一个ACK给被动关闭方确认序号为收到序号1至此完成四次挥手
21.什么是无状态协议HTTP 是无状态协议吗怎么解决
无状态协议(Stateless Protocol) 就是指浏览器对于事务的处理没有记忆能力。举个例子来说就是比如客户请求获得网页之后关闭浏览器然后再次启动浏览器登录该网站但是服务器并不知道客户关闭了一次浏览器。
HTTP 就是一种无状态的协议他对用户的操作没有记忆能力。可能大多数用户不相信他可能觉得每次输入用户名和密码登陆一个网站后下次登陆就不再重新输入用户名和密码了。这其实不是 HTTP 做的事情起作用的是一个叫做 小甜饼(Cookie) 的机制。它能够让浏览器具有记忆能力。
如果浏览器允许 cookie 的话查看方式 chrome://settings/content/cookies 也就说明记忆芯片通电了…… 当向服务端发送请求时服务端会发送一个认证信息服务器第一次接收到请求时开辟了一块 Session 空间创建了Session对象同时生成一个 sessionId 并通过响应头的 Set-CookieJSESSIONIDXXXXXXX 命令向客户端发送要求设置 Cookie 的响应客户端收到响应后在本机客户端设置了一个 JSESSIONIDXXXXXXX 的 Cookie 信息该 Cookie 的过期时间为浏览器会话结束 接下来客户端每次向同一个网站发送请求时请求头都会带上该 Cookie信息包含 sessionId 然后服务器通过读取请求头中的 Cookie 信息获取名称为 JSESSIONID 的值得到此次请求的 sessionId。这样浏览器才具有了记忆能力。 还有一种方式是使用 JWT 机制它也是能够让浏览器具有记忆能力的一种机制。与 Cookie 不同JWT 是保存在客户端的信息它广泛的应用于单点登录的情况。JWT 具有两个特点
JWT 的 Cookie 信息存储在客户端而不是服务端内存中。也就是说JWT 直接本地进行验证就可以验证完毕后这个 Token 就会在 Session 中随请求一起发送到服务器通过这种方式可以节省服务器资源并且 token 可以进行多次验证。JWT 支持跨域认证Cookies 只能用在单个节点的域或者它的子域中有效。如果它们尝试通过第三个节点访问就会被禁止。使用 JWT 可以解决这个问题使用 JWT 能够通过多个节点进行用户认证也就是常说的跨域认证。
22.OSI与TCP/IP各层的结构与功能,都有哪些协议? 应用层
应用层(application-layer的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程进程主机中正在运行的程序间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多如域名系统DNS支持万维网应用的 HTTP协议支持电子邮件的 SMTP协议等等。把应用层交互的数据单元称为报文。
域名系统
域名系统(Domain Name System缩写 DNSDomain Name被译为域名)是因特网的一项核心服务它作为可以将域名和IP地址相互映射的一个分布式数据库能够使人更方便的访问互联网而不用去记住能够被机器直接读取的IP数串。百度百科例如一个公司的 Web 网站可看作是它在网上的门户而域名就相当于其门牌地址通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名类似的还有IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco公司的域名是 www.cisco.com 等。
HTTP协议
超文本传输协议HTTPHyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW万维网 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。
运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务分用和复用相反是运输层把收到的信息分别交付上面应用层中的相应进程。
运输层主要使用以下两种协议:
传输控制协议 TCPTransmission Control Protocol–提供面向连接的可靠的数据传输服务。用户数据协议 UDPUser Datagram Protocol–提供无连接的尽最大努力的数据传输服务不保证数据传输的可靠性。
网络层
在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点 确保数据及时传送。 在发送数据时网络层把运输层产生的
报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中由于网络层使用 IP 协议因此分组也叫 IP 数据报 简称 数据报。
这里要注意不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外无论是哪一层的数据单元都可笼统地用“分组”来表示。
这里强调指出网络层中的“网络”二字已经不是通常谈到的具体网络而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构heterogeneous网络通过路由器router相互连接起来的。互联网使用的网络层协议是无连接的网际协议Intert Protocol和许多路由选择协议因此互联网的网络层也叫做网际层或IP层。
数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输总是在一段一段的链路上传送的这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时数据链路层将网络层交下来的 IP 数据报组装成帧在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息如同步信息地址信息差错控制等。
在接收数据时控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样数据链路层在收到一个帧后就可从中提出数据部分上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错数据链路层就简单地丢弃这个出了差错的帧以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错这就是说数据链路层不仅要检错而且还要纠错那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
物理层
在物理层上所传送的数据单位是比特。 物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送尽可能屏蔽掉具体传输介质和物理设备的差异。 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化对传送的比特流来说这个电路好像是看不见的。
在互联网使用的各种协中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的TCP/IP并不一定单指TCP和IP这两个具体的协议而往往表示互联网所使用的整个TCP/IP协议族。
23.TCP协议如何保证可靠传输 1.应用数据被分割成 TCP 认为最适合发送的数据块。 2.TCP 给发送的每一个包进行编号接收方对数据包进行排序把有序数据传送给应用层。 3.校验和 TCP 将保持它首部和数据的检验和。这是一个端到端的检验和目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错TCP 将丢弃这个报文段和不确认收到此报文段。 4.流量控制 TCP 连接的每一方都有固定大小的缓冲空间TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据能提示发送方降低发送的速率防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 TCP 利用滑动窗口实现流量控制 5.拥塞控制 当网络拥塞时减少数据的发送。 6.ARQ协议 也是为了实现可靠传输的它的基本原理就是每发完一个分组就停止发送等待对方确认。在收到确认后再发下一个分组。 7.超时重传 当 TCP 发出一个段后它启动一个定时器等待目的端确认收到这个报文段。如果不能及时收到一个确认将重发这个报文段。 8.TCP 的接收端会丢弃重复的数据。 24.说说ARQ协议 自动重传请求Automatic Repeat-reQuestARQ是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议。 25.什么是滑动窗口和流量控制 TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小从而影响发送方的发送速率。将窗口字段设置为 0则发送方不能发送数据。 26.什么是拥塞控制 在某段时间若对网络中某一资源的需求超过了该资源所能提供的可用部分网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程涉及到所有的主机所有的路由器以及与降低网络传输性能有关的所有因素。相反流量控制往往是点对点通信量的控制是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率以便使接收端来得及接收。 为了进行拥塞控制TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。 TCP的拥塞控制采用了四种算法即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略如主动队列管理 AQM以减少网络拥塞的发生。 慢开始 慢开始算法的思路是当主机开始发送数据时如果立即把大量数据字节注入到网络那么可能会引起网络阻塞因为现在还不知道网络的符合情况。经验表明较好的方法是先探测一下即由小到大逐渐增大发送窗口也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1每经过一个传播轮次cwnd加倍。 拥塞避免 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大即每经过一个往返时间RTT就把发送放的cwnd加1. 快重传与快恢复 在 TCP/IP 中快速重传和恢复fast retransmit and recoveryFRR是一种拥塞控制算法它能快速恢复丢失的数据包。没有 FRR如果数据包丢失了TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内没有新的或复制的数据包被发送。有了 FRR如果接收机接收到一个不按顺序的数据段它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认它会假定确认件指出的数据段丢失了并立即重传这些丢失的数据段。有了 FRR就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时快速重传和恢复FRR能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时它则不能很有效地工作。 27.在浏览器中输入url地址 - 显示主页的过程 总体来说分为以下几个过程: 1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面 6.连接结束 28.HTTP长连接,短连接 在HTTP/1.0中默认使用短连接。也就是说客户端和服务器每进行一次HTTP操作就建立一次连接任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源如JavaScript文件、图像文件、CSS文件等每遇到这样一个Web资源浏览器就会重新建立一个HTTP会话。 而从HTTP/1.1起默认使用长连接用以保持连接特性。使用长连接的HTTP协议会在响应头加入这行代码 Connection:keep-alive在使用长连接的情况下当一个网页打开完成后客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭客户端再次访问这个服务器时会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接它有一个保持时间可以在不同的服务器软件如Apache中设定这个时间。实现长连接需要客户端和服务端都支持长连接。 HTTP协议的长连接和短连接实质上是TCP协议的长连接和短连接。 29.Cookie的作用是什么?和Session有什么区别 Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式但是两者的应用场景不太一样。 Cookie 一般用来保存用户信息 比如 ①在 Cookie 中保存已经登录过得用户信息下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了 ②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了这是因为用户登录的时候可以存放了一个 Token 在 Cookie 中下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑重新登录一般要将 Token 重写) ③登录一次网站后访问网站其他页面不需要重新登录。 Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车当你要添加商品到购物车的时候系统不知道是哪个用户操作的因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 Cookie 数据保存在客户端(浏览器端)Session 数据保存在服务器端。 Cookie 存储在客户端中而Session存储在服务器上相对来说 Session 安全性更高。如果要在 Cookie 中存储一些敏感信息不要直接写入 Cookie 中最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 30.URI和URL的区别是什么? URI(Uniform Resource Identifier) 是统一资源标志符可以唯一标识一个资源。 URL(Uniform Resource Location) 是统一资源定位符可以提供该资源的路径。它是一种具体的 URI即 URL 可以用来标识一个资源而且还指明了如何 locate 这个资源。 URI的作用像身份证号一样URL的作用更像家庭住址一样。URL是一种具体的URI它不仅唯一标识资源而且还提供了定位该资源的信息。 31.HTTP常见的状态码有哪些 1xx指示信息–表示请求已接收继续处理2xx成功–表示请求已被成功接收、理解、接受3xx重定向–要完成请求必须进行更进一步的操作4xx客户端错误–请求有语法错误或请求无法实现5xx服务器端错误–服务器未能实现合法的请求 常见的状态码 200请求被正常处理204请求被受理但没有资源可以返回206客户端只是请求资源的一部分服务器只对请求的部分资源执行GET方法相应报文中通过Content-Range指定范围的资源。301永久性重定向302临时重定向303与302状态码有相似功能只是它希望客户端在请求一个URI的时候能通过GET方法重定向到另一个URI上304发送附带条件的请求时条件不满足时返回与重定向无关307临时重定向与302类似只是强制要求使用POST方法400请求报文语法有误服务器无法识别401请求需要认证403请求的对应资源禁止被访问404服务器无法找到对应资源500服务器内部错误503服务器正忙 32.说说常见的常见HTTP首部字段 通用首部字段请求报文与响应报文都会使用的首部字段 Date创建报文时间Connection连接的管理Cache-Control缓存的控制Transfer-Encoding报文主体的传输编码方式 请求首部字段请求报文会使用的首部字段 Host请求资源所在服务器Accept可处理的媒体类型Accept-Charset可接收的字符集Accept-Encoding可接受的内容编码Accept-Language可接受的自然语言 响应首部字段响应报文会使用的首部字段 Accept-Ranges可接受的字节范围Location令客户端重新定向到的URIServerHTTP服务器的安装信息 实体首部字段请求报文与响应报文的的实体部分使用的首部字段 Allow资源可支持的HTTP方法Content-Type实体主类的类型Content-Encoding实体主体适用的编码方式Content-Language实体主体的自然语言Content-Length实体主体的的字节数Content-Range实体主体的位置范围一般用于发出部分请求时使用 33.HTTPS方式与web服务器通信的步骤 1、客户使用HTTPS的URL访问web服务器要求与web服务器建立SSL连接 2、web服务器收到客户端请求后将网站的证书信息证书中包含公钥传送一份给客户端 3、客户端的浏览器与web服务器开始协商SSL连接的安全等级也就是信息的加密等级 4、客户端的浏览器根据双方同意的安全等级建立会话秘钥然后利用网站的公钥将会话秘钥加密并传送给网站 5、web服务器利用自己的私钥解密出会话秘钥 6、web服务器利用会话秘钥加密与客户端之间的通信 34.HTTP请求报文与响应报文格式 请求报文 a、请求行包含请求方法、URI、HTTP版本信息 b、请求首部字段 c、请求内容实体 响应报文 a、状态行包含HTTP版本、状态码、状态码的原因短语 b、响应首部字段 c、响应内容实体 35.地址栏输入 URL 发生了什么 输入 URL 后到响应都经历了哪些过程。 首先需要在浏览器中的 URL 地址上输入要访问的地址如下 然后浏览器会根据输入的 URL 地址去查找域名是否被本地 DNS 缓存不同浏览器对 DNS 的设置不同如果浏览器缓存了访问的 URL 地址那就直接返回 ip。如果没有缓存 URL 地址浏览器就会发起系统调用来查询本机 hosts 文件是否有配置 ip 地址如果找到直接返回。如果找不到就向网络中发起一个 DNS 查询。 首先来看一下 DNS 是啥互联网中识别主机的方式有两种通过主机名和 IP 地址。人们喜欢用名字的方式进行记忆但是通信链路中的路由却喜欢定长、有层次结构的 IP 地址。所以就需要一种能够把主机名到 IP 地址的转换服务这种服务就是由 DNS 提供的。DNS 的全称是 Domain Name System 域名系统。DNS 是一种由分层的 DNS 服务器实现的分布式数据库。DNS 运行在 UDP 上使用 53 端口。DNS 是一种分层数据库它的主要层次结构如下 一般域名服务器的层次结构主要是以上三种除此之外还有另一类重要的 DNS 服务器它是 本地 DNS 服务器(local DNS server)。严格来说本地 DNS 服务器并不属于上述层次结构但是本地 DNS 服务器又是至关重要的。每个 ISP(Internet Service Provider) 比如居民区的 ISP 或者一个机构的 ISP 都有一台本地 DNS 服务器。当主机和 ISP 进行连接时该 ISP 会提供一台主机的 IP 地址该主机会具有一台或多台其本地 DNS 服务器的 IP地址。通过访问网络连接用户能够容易的确定 DNS 服务器的 IP地址。当主机发出 DNS 请求后该请求被发往本地 DNS 服务器它起着代理的作用并将该请求转发到 DNS 服务器层次系统中。 首先查询请求会先找到本地 DNS 服务器来查询是否包含 IP 地址如果本地 DNS 无法查询到目标 IP 地址就会向根域名服务器发起一个 DNS 查询。 注意DNS 涉及两种查询方式一种是递归查询(Recursive query) 一种是迭代查询(Iteration query)。《计算机网络自顶向下方法》竟然没有给出递归查询和迭代查询的区别找了一下网上的资料大概明白了下。 如果根域名服务器无法告知本地 DNS 服务器下一步需要访问哪个顶级域名服务器就会使用递归查询 如果根域名服务器能够告知 DNS 服务器下一步需要访问的顶级域名服务器就会使用迭代查询。在由根域名服务器 - 顶级域名服务器 - 权威 DNS 服务器后由权威服务器告诉本地服务器目标 IP 地址再有本地 DNS 服务器告诉用户需要访问的 IP 地址。 第三步浏览器需要和目标服务器建立 TCP 连接需要经过三次握手的过程具体的握手过程请参考上面的回答。在建立连接后浏览器会向目标服务器发起 HTTP-GET 请求包括其中的 URLHTTP 1.1 后默认使用长连接只需要一次握手即可多次传输数据。如果目标服务器只是一个简单的页面就会直接返回。但是对于某些大型网站的站点往往不会直接返回主机名所在的页面而会直接重定向。返回的状态码就不是 200 而是 301,302 以 3 开头的重定向码浏览器在获取了重定向响应后在响应报文中 Location 项找到重定向地址浏览器重新第一步访问即可。然后浏览器重新发送请求携带新的 URL返回状态码 200 OK表示服务器可以响应请求返回报文。 36.HTTPS的工作原理 上面描述了一下 HTTP 的工作原理下面来讲述一下 HTTPS 的工作原理。因为 HTTPS 不是一种新出现的协议而是 所以探讨 HTTPS 的握手过程其实就是 SSL/TLS 的握手过程。 TLS 旨在为 Internet 提供通信安全的加密协议。TLS 握手是启动和使用 TLS 加密的通信会话的过程。在 TLS 握手期间Internet 中的通信双方会彼此交换信息验证密码套件交换会话密钥。 每当用户通过 HTTPS 导航到具体的网站并发送请求时就会进行 TLS 握手。除此之外每当其他任何通信使用HTTPS包括 API 调用和在 HTTPS 上查询 DNS时也会发生 TLS 握手。 TLS 具体的握手过程会根据所使用的密钥交换算法的类型和双方支持的密码套件而不同。以RSA 非对称加密来讨论这个过程。整个 TLS 通信流程图如下 在进行通信前首先会进行 HTTP 的三次握手握手完成后再进行 TLS 的握手过程ClientHello客户端通过向服务器发送 hello 消息来发起握手过程。这个消息中会夹带着客户端支持的 TLS 版本号(TLS1.0 、TLS1.2、TLS1.3) 、客户端支持的密码套件、以及一串 客户端随机数。ServerHello在客户端发送 hello 消息后服务器会发送一条消息这条消息包含了服务器的 SSL 证书、服务器选择的密码套件和服务器生成的随机数。认证(Authentication)客户端的证书颁发机构会认证 SSL 证书然后发送 Certificate 报文报文中包含公开密钥证书。最后服务器发送 ServerHelloDone 作为 hello 请求的响应。第一部分握手阶段结束。加密阶段在第一个阶段握手完成后客户端会发送 ClientKeyExchange 作为响应这个响应中包含了一种称为 The premaster secret 的密钥字符串这个字符串就是使用上面公开密钥证书进行加密的字符串。随后客户端会发送 ChangeCipherSpec告诉服务端使用私钥解密这个 premaster secret 的字符串然后客户端发送 Finished 告诉服务端自己发送完成了。 Session key 其实就是用公钥证书加密的公钥。实现了安全的非对称加密然后服务器再发送 ChangeCipherSpec 和 Finished 告诉客户端解密完成至此实现了 RSA 的非对称加密。
- 上一篇: 宜城建设局网站广州百度推广开户
- 下一篇: 宜丰做网站的wordpress标签查看id
相关文章
-
宜城建设局网站广州百度推广开户
宜城建设局网站广州百度推广开户
- 技术栈
- 2026年04月20日
-
宜昌营销型网站电子商务平台定制开发
宜昌营销型网站电子商务平台定制开发
- 技术栈
- 2026年04月20日
-
宜昌营销型网站北京学校网站建设
宜昌营销型网站北京学校网站建设
- 技术栈
- 2026年04月20日
-
宜丰做网站的wordpress标签查看id
宜丰做网站的wordpress标签查看id
- 技术栈
- 2026年04月20日
-
宜良网站建设哈尔滨大型网站制作开发
宜良网站建设哈尔滨大型网站制作开发
- 技术栈
- 2026年04月20日
-
宜良网站建设网站优化建设深圳
宜良网站建设网站优化建设深圳
- 技术栈
- 2026年04月20日






