一、说一下 http 和 https
https 的 SSL 加密是在传输层实现的。
1. http 和 https 的基本概念
HTTP: HTTP 协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议 TLS/SSL 具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。。
HTTPS: 超文本传输安全协议,。HTTPS 经由 HTTP 进行通信,利用 SSL/TLS 来加密数据包。HTTPS 的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
安全层的主要职责就是对发起的 HTTP 请求的数据进行加密操作 和对接收到的 HTTP 的内容进行解密操作。
https 协议的主要作用是:建立一个信息安全通道,来确保数组的传输,确保网站的真实性。
2. http 和 https 的区别?
http
传输的数据都是未加密的,也就是明文的,网景公司设置了 SSL 协议来对 http 协议 传输的数据进行加密处理,简单来说 https 协议是由 http 和 ssl 协议构建的可进行加密传输和身份认证的网络协议,比 http 协议的安全性更高。
主要的区别如下:
- Https 协议需要 ca 证书,费用较高;而 HTTP 协议不需要。
- http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
- 使用不同的连接方式,端口也不同,一般而言,http 协议的端口为 80,https 的端口为 443
- http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
3、什么是 HTTP 无状态协、议?如何克服 HTTP 无状态协议的缺陷?
- 无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续需要处理,需要前面提供的信息。
- 克服无状态协议缺陷的办法是通过cookie和会话保存信息。
4、 https 协议的工作原理
客户端在使用 HTTPS 方式与 Web 服务器通信时有以下几个步骤,如图所示。
- 客户使用 https url 访问服务器,则要求 web 服务器建立 ssl 链接。
- web 服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
- 客户端和 web 服务器端开始协商 SSL 链接的安全等级,也就是加密等级。
- 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加 密会话密钥,并传送给网站。
- web 服务器通过自己的私钥解密出会话密钥。
- web 服务器通过会话密钥加密与客户端之间的通信。
5、HTTPS 通信(握手)过程
HTTPS 的通信过程如下:
- 客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数、以及客户端支持的加密方法。
- 服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数。
- 客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服务器。并且还会提供一个前面所有内容的 hash 的值,用来供服务器检验。
- 服务器使用自己的私钥,来解密客户端发送过来的随机数。并提供前面所有内容的 hash 值来供客户端检验。
- 客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥来加密信息。
6、完整的 HTTP 事务流程是怎样的?
- 域名解析。
- 发起 TCP 的 3 次握手。
- 建立 TCP 连接后发起 HTTP 请求。
- 服务器端响应 HTTP 请求,浏览器得到 HTML 代码。
- 浏览器解析 HTML 代码, 并请求 HTML 代码中的资源 。
- 浏览器对页面进行渲染并呈现给用户 。
7、HTTP 协议有哪些特征?
支持客户端/月民务器模式,简单快速,灵活,无连接,无状态。
8、与 HTTPS 相比, HTTP 有什么缺点?
- 通信使用明文,不加密,内容可能被窃听,也就是被抓包分析。
- 不验证通信方身份,可能遭到伪装。
- 无法验证报文完整性,可能被篡改。 HTTPS就是HTTP+加密处理(一般是SSL安全通信线路)+认证+完整性保护。
9、 https 协议的优点
- 使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
- HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
- 谷歌曾在 2014 年 8 月份调整搜索引擎算法,并称“比起同等 HTTP 网站,采用 HTTPS 加密的网站在搜索结果中的排名将会更高”。
10、 https 协议的缺点
- https 握手阶段比较费时,会使页面加载时间延长 50%,增加 10%~20%的耗电。
- https 缓存不如 http 高效,会增加数据开销。
- SSL 证书也需要钱,功能越强大的证书费用越高。
- SSL 证书需要绑定 IP,不能再同一个 ip 上绑定多个域名,ipv4 资源支持不了这种消耗。
11、 常见的 HTTP 请求头和响应头
(1)HTTP Request Header(请求报文) 常见的请求头:
- Accept:浏览器能够处理的内容类型
- Accept-Charset:浏览器能够显示的字符集
- Accept-Encoding:浏览器能够处理的压缩编码
- Accept-Language:浏览器当前设置的语言
- Connection:浏览器与服务器之间连接的类型
- Cookie:当前页面设置的任何 Cookie
- Host:发出请求的页面所在的域
- Referer:发出请求的页面的 URL
- User-Agent:浏览器的用户代理字符串
(2)HTTP Responses Header(响应报文) 常见的响应头:
- Date:表示消息发送的时间,时间的描述格式由 rfc822 定义
- server:服务器名称
- Connection:浏览器与服务器之间连接的类型
- Cache-Control:控制 HTTP 缓存
- content-type:表示后面的文档属于什么 MIME 类型
(3)常见的 Content-Type 属性值有以下四种:
- application/x-www-form-urlencoded:浏览器的原生form表
单,如果不设置enctype属性,那么最终就会以
application/x-www-form-urlencoded方式提交数据。该种方式提交
的数据放在body里面,数据按照
key1=val1&key2=val2
的方式进 行编码,key和val都进行了URL转码。 2.multipart/form-data:该种方式也是一个常见的POST提交方 式,通常表单上传文件时使用该种方式。 3.application/json:服务器消息主体是序列化后的JSON字符 串。 4.text/xml:该种方式主要用来提交XML格式的数据。
(4)常见的 HTTP 请求方法
- GET:请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL,给服务器传递参数数据。
- POST:传输信息给服务器,主要功能与GET方法类似,但传递的数据量通常不受限制。
- PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置。
- HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
- DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
- OPTIONS:查询相应URI支持的HTTP方法。
12、HTTP 常见状态码
- 100 Continue 表示继续,一般在发送 post 请求时,已发送了 HTTP header 之后,服务器端将返回此信息,表示确认,之后发送具体参数信息。
- 200 OK 表示正常返回信息。 请求已成功,请求所希望的响应头或数据体将随此响应返回。即返回的数据为全量的数据,如果文件不通过 GZIP 压缩的话,文件是多大,则要有多大传输量。
- 201 Created 表示请求成功并且服务器创建了新的资源。
- 202 Accepted 表示服务器已接受请求,但尚未处理。
- 301 Moved Permanently 表示请求的网页己永久移动到新位置。 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
- 302 Found 表示临时性重定向 。 302 Found 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在 Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。
字面上的区别就是 301 是永久重定向,而 302 是临时重定向。 301 比较常用的场景是使用域名跳转。 302 用来做临时跳转 比如未登陆的用户访问用户 中心重定向到登录页面。
- 303 See Other 表示临时性重走向, 且总是使用 GET 请求新的 URL
- 304 Not Modified 表示自从上次请求后 ,请求的网页未修改过。
如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个 304 状态码。即客户端和服务器端只需要传输很少的数据量来做文件的校验,如果文件没有修改 过,则不需要返回全量的数据。
- 400 Bad Request 表示服务器无法理解请求的格式(请求无效),客户端不应当尝试再次使用相同的内容发起请求 产生原因: 前端提交数据的字段名称和字段类型与后台的实体没有保持一致,前端提交到后台的数据应该是 json 字符串类型,但是前端没有将对象 JSON.stringify 转化成字符串。 解决方法: 对照字段的名称,保持一致性 将 obj 对象通过 JSON.stringify 实现序列化
- 401 Unauthorized 表示请求未授权。(当前请求需要用户验证)
- 403 Forbidden 表示禁止访问 。(服务器已经得到请求,但是拒绝执行)
- 404 Not Found 表示找不到如何与 URI 相匹配的资源 。
- 500 Internal Server Error 表示最常见的服务器端错误。
- 503 Service Unavailable 表示服务器端暂时无法处理请求(可能是过载或维护)。
(1)强协商缓存200,304状态码(说一下浏览器缓存)
缓存分为两种:强缓存和协商缓存,根据响应的 header 内容来决定。
获取资源形式 | 状态码 | 发送请求到服务器 | |
---|---|---|---|
强缓存 | 从缓存取 | 200(from cache) | 否,直接从缓存取 |
协商缓存 | 从缓存取 | 304(not modified) | 是,通过服务器来告知缓存是否可用 |
强缓存相关字段有expires
,cache-control
。如果cache-control
与expires同时存在的话,cache-control
的优先级高于expires
。协商缓存相关字段有Last-Modified/If-Modified-Since,Etag/If-None-Match
强缓存、协商缓存什么时候用哪个? 因为服务器上的资源不是一直固定不变的,大多数情况下它会更新,这个时候如果我们还访问本地缓存,那么对用户来说,那就相当于资源没有更新,用户看到的还是旧的资源;所以我们希望服务器上的资源更新了浏览器就请求新的资源,没有更新就使用本地的缓存,以最大程度的减少因网络请求而产生的资源浪费。
(2)304 缓存的原理
- 服务器首先为请求生成
ETag
,服务器可在稍后的请求中,使用它来判断页面是否已经修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)是否缓存。 - 304 是 HTTP 状态码,服务器用它来标识这个文件没有修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件。
- 客户端请求页面A。 服务器返回页面A,并给A加上一个
ETag
。 客户端展现该页面,并将页面连同ETag
一起缓存。 客户端再次请求页面A,并将上次请求时服务器返回的ETag
一起传递给服务器。服务器检查该ETag
,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应 304(未修改一Not Modified )和一个空的响应体。
(3)什么是 Etag?
- 当发送一个服务器请求时,浏览器首先会进行缓存过期判断。浏览器根据缓存过期时间判断缓存文件是否过期。
- 若没有过期,则不向服务器发送请求,直接使用缓存中的结果。 此时,我们在浏览器控制台中可以看到 200 OK(from cache),这种情况就是完全使用缓存,浏览器和服务器没有任何交互。
- 若已过期,则向服务器发送请求。此时,请求中会带上文件修改时间和
ETag
,然后, 进行资源更新判断。 - 服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是否被修改过。根据
ETag
,判断文件内容自上一次请求之后,有没有发生变化。 - 若两种判断的结论都是文件没有被修改过,服务器就不给浏览器发送新的内容,而是直接告诉浏览器,文件没有被修改过,可以继续使用缓存一304 Not Modified。 此时, 浏览器就会从本地缓存中获取请求资源的内容,这种情况叫协议缓存,浏览器和服务器之间有一次请求交互。
- 若修改时间或文件内容判断中有任意一个没有通过,则服务器会受理此次请求,并返回新的数据。
- 注意,只有 get 请求会被缓存, post 请求不会。
(4)说说 ETag 的应用?
Etag 由服务器端生成,客户端通过 If-Match
或者 If-None-Match
这个条件判断 请求来验证资源是否修改。常见的是使用If-None-Match。
请求一个文件的流程如下:
- 第一次请求时,客户端发起
HTTP GET
请求,以获取一个文件,服务器处理请求, 返回文件内容和请求头(包括Etag
),并返回状态码 200。 - 第二次请求时,客户端发起
HTTP GET
请求,以获取一个文件。 注意,这个时候客户 端同时发送一个If-None-Match
头 , 这个头的内容就是第一次请求时服务器返回的Etag
. 服务器判断发送过来的Etag
和计算出来的Etag
是否匹配。 如果If-None-Match
为False
, 不返回 200,返回 304,客户端继续使用本地缓存。 如果服务器设置了Cache-Control:max-age
和Expires
,服务器端在完全匹配If-Modified-Since
和If-None-Match
后,即检查完修改时间和Etag
之后,才能返回 304。
(5)Expires 和 Cache-Control 的作用是什么?
- Expires 要求客户 端和服务器端的时间严格同步。
- HTTP 1.1 引入 Cache-Control来克服 Expires 头的限制 。 如果 max-age 和 Expires 同时出现,则 max-age 有更高的优先级。 具体代码如下所示 :
Cache-Control: no-cache, private, max-age=O
ETag: "8b4c-55fl6e2e30000"
Expires: Thu, 02 Dec 2027 11:37 :56 GMT
Last-Modified: Wed, 29 Nov 2017 03:39:44 GMT
13、HTTP 1.1 和 HTTP 2.0 的区别
- 二进制协议:HTTP/2 是一个二进制协议。在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。
- 多路复用:HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵塞"的问题。
- 数据流:HTTP/2 使用了数据流的概念,因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流 ID ,用来区分它属于哪个数据流。
- 头信息压缩:HTTP/2 实现了头信息压缩,由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。
- 服务器推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对减少一些延迟时间。这里需要注意的是 http2 下服务器主动推送的是静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。
二、DNS 完整的查询过程
1、DNS 服务器解析域名的过程
- 首先会在浏览器的缓存中查找对应的 IP 地址,如果查找到直接返回,若找不到继续下一步
- 将请求发送给本地 DNS 服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
- 本地 DNS 服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
- 本地 DNS 服务器向顶级域名服务器发送请求,接受请求的服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回相关的下一级的权威域名服务器的地址
- 本地 DNS 服务器向权威域名服务器发送请求,域名服务器返回对应的结果
- 本地 DNS 服务器将返回结果保存在缓存中,便于下次使用
- 本地 DNS 服务器将返回结果返回给浏览器
2、输入 URL 到页面加载显示完成发生了什么?
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
3、例子:比如要查询 www.baidu.com 的 IP 地址
首先会在浏览器的缓存中查找是否有该域名的缓存,如果不存在就将请求发送到本地的 DNS 服务器中,本地 DNS 服务器会判断是否存在该域名的缓存,如果不存在,则向根域名服务器发送一个请求,根域名服务器返回负责 .com的顶级域名服务器的 IP 地址的列表。然后本地 DNS 服务器再向其中一个负责 .com 的顶级域名服务器发送一个请求,负责 .com 的顶级域名服务器返回负责 .baidu 的权威域名服务器的 IP 地址列表。然后本地 DNS 服务器再向其中一个权威域名服务器发送一个请求,最后权威域名服务器返回一个对应的主机名的 IP 地址列表。
4、经典问题:在地址栏里输入一个 URL,到这个页面呈现出来,中间会发生什么?
输入url
后,首先需要找到这个url
域名的服务器ip
,为了寻找这个ip
,浏览器首先会寻找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存->系统缓存->路由器缓存,缓存中没有则查找系统的hosts
文件中是否有记录,如果没有则查询DNS
服务器,得到服务器的ip
地址后,浏览器根据这个ip
以及相应的端口号,构造一个http
请求,这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数据,并将这个http
请求封装在一个tcp
包中,这个tcp
包会依次经过传输层,网络层,数据链路层,物理层到达服务器,服务器解析这个请求来作出响应,返回相应的html
给浏览器,因为html
是一个树形结构,浏览器根据这个html
来构建DOM
树,在dom
树的构建过程中如果遇到JS
脚本和外部JS
连接,则会停止构建DOM
树来执行和下载 相应的代码,这会造成阻塞,这就是为什么推荐JS
代码应该放在html
代码的后面,之后根据外部央视,内部央视,内联样式构建一个CSS
对象模型树 CSSOM
树,构建完成后和DOM
树合并为渲染树,这里主要做的是排除非视觉节点,比如script
,meta
标签和排除 display 为 none
的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为 html
文件中会含有图片,视频,音频等资源,在解析DOM
的过 程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是4-6
个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过Cache-Control、Last-Modify、Expires
等首部字段控制。 Cache-Control
和 Expires
的区别 在于 Cache-Control
使用相对时间,Expires
使用的是基于服务器端的绝对时间,因为存 在时差问题,一般采用 Cache-Control
,在请求这些有设置了缓存的数据时,会先查看是否过期,如果没有过期则直接使用本地缓存,过期则请求并在服务器校验文件是否修改,如果上一次 响应设置了 ETag
值会在这次请求的时候作为 If-None-Match
的值交给 服务器校验,如果一致,继续校验 Last-Modified
,没有设置 ETag
则直接验证 Last-Modified
,再决定是否返回 304。
5、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
整个过程可分为 4 个步骤。
- 当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器土启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
- 浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手包括一个同步报文、一个同步-应答报文和一个应答报文,这3个报文在浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,然后服务器应答并接受客户端的请求,最后由客户端发出已经接受该请求的报文。
- 一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的GET请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态码表示一个正确的响应。
- 此时Web服务器提供资源服务,客户端开始下载资源。请求返回后,使进入了浏览器端模块。浏览器会解析HTML生成DOM Tree,其次会根据css生成css规则树,而JavaScript又可以根据DOM API操作DOM。
三、OSI 七层模型
ISO 为了更好的使网络应用更为普及,推出了 OSI 参考模型
七层分别是应用( Application )层、表示( Presentation )层、会话( Session )层、 传输( Transport )层、 网络( Network )层、数据链路( Link )层和物理( Physical )层。
每一层的作用如下。
- 应用层:允许访问OSI环境的手段。
- 表示层:对数据进行翻译、加密和压缩。
- 会话层:建立、管理和终止会话。
- 传输层: 提供端到端的可靠报文传递和错误恢复。
- 网络层:负责数据包从源到宿的传递和网际互联。
- 数据链路层: 将比特组装成帧并实现点到点的传递。
- 物理层:通过媒介传输比特,确定机械及电气规范 。
1. 应用层
- OSI 参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP 等。
- 在客户端与服务器中经常会有数据的请求,这个时候就是会用到http(hyper text transfer protocol)(超文本传输协议)或者 https.在后端设计数据接口时,我们常常使用到这个协议。
- FTP 是文件传输协议,在开发过程中,个人并没有涉及到,但是我想,在一些资源网站,比如百度网盘``迅雷应该是基于此协议的。
- SMTP 是 simple mail transfer protocol(简单邮件传输协议)。在一个项目中,在用户邮箱验证码登录的功能时,使用到了这个协议。
2. 表示层
- 表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通 信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
- 在项目开发中,为了方便数据传输,可以使用 base64 对数据进行编解码。如果按功能来划分,base64 应该是工作在表示层。
3. 会话层
会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
4. 传输层
传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP 就是在这一层。端口号既是这里的“端”。
5. 网络层
本层通过 IP 寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的 IP 层。这一层就是我们经常说的 IP 协议层。IP 协议是 Internet 的基础。我们可以这样理解,网络层规定了数据包的传输路线,而传输层则规定了数据包的传输方式。
6. 数据链路层
- 将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用 MAC 地址)来访问介质,并进行差错检测。
- 网络层与数据链路层的对比,通过上面的描述,我们或许可以这样理解,网络层是规划了数据包的传输路线,而数据链路层就是传输路线。不过,在数据链路层上还增加了差错控制的功能。
7. 物理层
实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。
8、OSI 七层模型通信特点:对等通信
对等通信,为了使数据分组从源传送到目的地,源端 OSI 模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。在每一层通信过程中,使用本层自己协议进行通信。
四、TCP和UDP相关
1、TCP三次握手
三次握手(Three-way Handshake)其实就是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。
为了准确无误地把数据送达目标处,TCP采用了三次握手策略。用TCP把数据包发送出去后,TCP不会对传送后的数据置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志,即SYN和ACK。
发送端首先给接收端发送一个带 SYN 标志的数据包。接收端收到后,回传一个带有SYN/ACK标志的数据包以表示正确传达,并确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。若在握手过程中的某个阶段莫名中断,TCP会再次以相同的顺序发送相同的数据包。
2、TCP四次挥手
断开一个 TCP 连接则需要“四次握手”
- 第一次握手:主动关闭方发送一个FIN,用来关闭主动关闭方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方,主动关闭方已经不会再给被动关闭发送数据了(当然,在FIN包之前发送出去的数据,如果没有收到对应的ACK确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接收数据。
- 第二次握手:被动关闭方收到FIN包后,给对方发送一个ACK,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
- 第三次握手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,被动关闭方的数据也发送完了,不会再给主动关闭方友送数据了。
- 第四次握手:主动关闭方收到FIN后,给被动关闭方发送一个ACK,确认序号为收到序号+1,至此,完成四次握手。
3、说说 TCP 和 UDP 的区别。
答1
- TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过3次 “对话”才能建立起来。
- UDP(User Datagram Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
答2
- TCP 是面向连接的,udp 是无连接的即发送数据前不需要先建立链接。
- TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。并且因为tcp可靠,面向连接,不会丢失数据因此适合大数据量的交换。
- TCP 是面向字节流,UDP 面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如 IP 电话和视频会议等)。
- TCP 只能是1对1的,UDP支持1对1,1对多。
- TCP 的首部较大为20字节,而UDP只有8字节。
- TCP 是面向连接的可靠性传输,而UDP是不可靠的。
五、描述一下 XSS 和 CRSF 攻击?防御方法?
- XSS, 即为(Cross Site Scripting), 中文名为跨站脚本, 是发生在目标用户的浏览器层面上的,当渲染 DOM 树的过程成发生了不在预期内执行的 JS 代码时,就发生了 XSS 攻击。 大多数 XSS 攻击的主要方式是嵌入一段远程或者第三方域上的 JS 代码。实际上是在目标网站的作用域下执行了这段 JS 代码。
- CSRF(Cross Site Request Forgery,跨站请求伪造),字面理解意思就是在别的站点伪造了一个请求。专业术语来说就是在受害者访问一个网站时,其 Cookie 还没有过期的情况下,攻击者伪造一个链接地址发送受害者并欺骗让其点击,从而形成 CSRF 攻击。
- XSS 防御的总体思路是:对输入(和 URL 参数)进行过滤,对输出进行编码。也就是对提交的所有内容进行过滤,对 url 中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行 html 编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的 XSS 攻击。
- 防御CSRF 攻击主要有三种策略: 验证 HTTPReferer 字段; 在请求地址中添加 token 并 验证;在 HTTP 头中自定义属性并验证
XSS原理及防范
Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意 html标签或者javascript代码。比如:攻击者在论坛中放一个 看似安全的链接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表 单, 当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。 XSS防范方法 首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容 写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过 一半的XSS 攻击。 首先,避免直接在cookie 中泄露用户隐私,例如email、密码等等。 其次,通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价 值,不可能拿来重放。 如果网站不需要再浏览器端对cookie 进行操作,可以在Set-Cookie 末尾加上HttpOnly 来防止javascript 代码直接获取cookie 。 尽量采用POST 而非GET 提交表单