文章目录
1. 网络分层
- 应用层
为应用提供通信服务- 表示层
定义数据格式以及加密- 会话层
定义了如何开始、控制、结束一个会话,包括对多个双向消息的控制和管理。- 传输层
选择差错恢复协议还是无差错恢复协议 TCP、UDP- 网络层 端到端包传输。 路由选择、包分解成更小的包
- 数据链路层
定义单个链路上如何传输数据- 物理层
传输介质相关
2. DNS解析过程
DNS 查询的过程如下图所示。
- 在浏览器中输入网址,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找本地DNS服务器,本地DNS服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器配置区域解析,但本地DNS服务器缓存中存储此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果以上查询都失败,则根据本地DNS服务器是否设置转发器进行查询
- 如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www . qq .com主机。
- 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。直到找到为止。
从客户端到本地DNS服务器的查询是属于递归查询,而DNS服务器之间进行的交互查询就是迭代查询。
3. TCP协议
- 为什么HTTP协议要基于TCP来实现?
TCP是一种面向连接的单播协议。TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接,HTTP基于传输层TCP协议不用担心数据传输的各种问题。
TCP协议的三次握手、四次挥手策略
- 三次握手
(1)第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认。
(2)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。
(3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,建立连接。
最少需要三次握手过程,才让发送端和接收端双方都能知道双方具备正常发送和接受数据的能力
-
四次挥手
(1)第一次挥手:客户端主动断开连接,发送一个FIN包,用来关闭客户端到服务器端的数据传送,也就是客户端告诉服务器端:我已经不会再给你发数据了,但是,此时客户端还可以接受数据。
(2)第二次挥手:服务端收到FIN包后,发送一个ACK包给客户端
(3)第三次挥手:服务器端发送一个FIN包,用来关闭服务器端到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发送数据了
(4)第四次挥手:客户端收到 FIN包 后,发送一个 ACK包 给服务端,至此,完成四次挥手。 -
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN(监听)状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。所以需要四次挥手
TCP与UDP区别:
-
TCP是面向连接的,即发送请求之前需要建立连接;UDP是无连接的,即发送数据之前不需要建立连接
-
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。TCP是面向连接的可靠性传输,而UDP是不可靠的。
-
TCP面向字节流,就是数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞,不会使发送速率降低,因此可能会出现丢包。
-
TCP是连接点到点的全双工的可靠信道;UDP支持一对一,一对多,多对一和多对多的交互通信
-
TCP首部开销为20字节;UDP的首部开销只有8个字节
TCP如何保证可靠传输
4. http协议
http是不保存状态的协议,及无状态协议。http协议自身不对请求和响应支架的通信状态进行保存,http协议自身不具备保存之前发送的请求或响应的功能
1). 请求报文格式
HTTP的请求报文包括:请求行(request line)、请求头部(header)、请求空行 和 请求数据(request data) 四个部分组成。
请求行 简要地描述了客户端想要如何操作服务器端的资源。包括: 请求方法,URL(包括参数信息),协议版本号这三部分信息 (GET /admin_ui/rdx/core/images/close.png HTTP/1.1)
请求头部(Header) 是一个个的key-value值组成的首部字段,比如 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0
空行(CR+LF) 请求报文用空行表示header和请求数据的分隔
请求数据 GET方法不携带数据, POST方法会携带一个body
http的8种请求方法
- GET :向特定资源发出请求,获取资源,可以理解为读取或者下载数据
- POST :向指定资源提交数据(提交表单、上传文件),可能导致新的资源的建立或原有资源的修改。向资源提交数据,相当于写入或上传数据
- HEAD :HEAD 方法和 GET 方法很类似,但响应报文中只返回首部。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。
- PUT:向指定资源上传其最新内容
- OPTIONS:返回服务器针对特定资源所支持的HTML请求方法 或web服务器发送测试服务器功能(允许客户端查看服务器性能)
- DELETE:请求服务器删除指定资源
- TRACE:追踪请求 - 响应的传输路径。用于测试和诊断
- CONNECT:HTTP/1.1协议中能够将连接改为管道方式的代理服务器
GET和POST的区别
-
get参数通过url传递,post参数放在r请求体中。
-
get请求在url中传递的参数是有长度限制的,而post传递的参数是没有长度限制的。
-
因为get参数直接暴露在url中,所以get比post更不安全。
-
get请求只能进行url编码,而post支持多种编码方式
-
get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
-
GET产生一个TCP数据包;POST产生两个TCP数据包。
2). 响应报文格式
HTTP的响应报文包括:状态行,响应头,空行,数据(响应体)
状态行 服务器响应的状态,由HTTP版本号,状态码和状态值组成。 (HTTP/1.1 200 OK)
响应头 类似请求头,是一系列key-value值组成的首部字段,如: Cache-Control: private Content-Encoding: gzip Server: BWS/1.1 Set-Cookie: delPer=0; path=/;
domain=.baidu.com
空白行 响应报文也用空白行来分隔header和数据
响应体 响应的data,如:一段HTML
响应状态码
3).http报文首部字段
5. 描述一下http的缓存机制(重要)
-
什么是http缓存?
http缓存就是浏览器初次请求服务器获取的数据,被暂时存储起来,再次请求该数据时,不需要再到服务器请求数据,就可以获取数据。 -
为什么需要http缓存?
1.可以减少冗余的数据传输。
2.可以缓解服务器的压力, 提高网站的性能
3.可以加快客户端加载网页的速度 -
哪些资源可以被缓存?
静态资源,例如js、css、图片资源 -
http缓存分类?
http缓存分为强制缓存和协商缓存,根据响应的header内容来决定。强制缓存:浏览器直接从本地缓存中获取数据,不与服务器进行交互。
协商缓存:浏览器发送请求到服务器,服务器判定是否可使用本地缓存。
强制缓存和协商缓存的联系与区别:两种缓存方式最终使用的都是本地缓存;强制缓存无需与服务器交互,协商缓存需要与服务器交互。
与缓存相关的header:- Expires使用的是绝对过期时间,要求客户端和浏览器的时间必须同步
- Cathe-Control,它使用max-age指定组件被缓存多久,是相对时间,可以解决expires的缺陷。
- Last-Modified
- if-Modified-Since
- Etag
- if-None-Match
Cathe-Control字段及其作用:
- private:仅客户端可缓存
- public:客户服务都可缓存
- no-cache 告诉浏览器该资源不使用强缓存,使用协商缓存
- no-store 所有的内容都不会被缓存
- max-age:缓存过期时间,有效期限内使用强制缓存,过期后使用协商缓存
-
强制缓存:
对于强制缓存,主要研究 Cache-Control 中的 max-age 和 no-cache。浏览器初次向服务器请求数据,服务器可以设置Cache-Control响应头告诉浏览器,响应数据是否可以使用强制缓存,如果有max-age=xxx秒,且在有效期内则命中强缓存,如果过期,走协商缓存。如果Cache-Control的值是no-cache,说明没命中强缓存,走协商缓存。 -
协商缓存(对比缓存)
协商缓存是服务器端缓存策略。服务器通过资源标识判断客户端缓存的资源是否和服务器端的资源一样,一样则返回状态码304,表示资源没有更新,本地缓存的资源还可以使用,否则返回状态码200和最新数据。资源标识有两种,一种是Last-Modified,表示资源的最后修改时间;另一种是Etag是资源的唯一标识。两种资源标识共存时,会优先使用Etag,因为Last-Modified只能精确到秒级,使用Etag会更精确。
-
http缓存
刷新操作对http缓存的影响
- 三种刷新操作对http缓存的影响
1.正常操作,比如地址栏输入,跳转链接,前进后退操作等,强制缓存有效,协商缓存有效
2.手动刷新,比如F5键,点击刷新按钮等,强制缓存失效,协商缓存有效
3.强制刷新,ctrl+F5刷新,强制缓存失效,协商缓存失效
http状态码304是多好还是好少
服务器为了提高网站访问速度,对之前访问的部分页面指定缓存机制,当客户端在此对这些页面进行请求,服务器会根据缓存内容判断页面与之前是否相同,若相同便直接返回304,此时客户端调用缓存内容,不必进行二次下载。
状态码304不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。
网络爬虫会更加青睐内容源更新频繁的网站。通过特定时间内对网站抓取返回的状态码来调节对该网站的抓取频次。若网站在一定时间内一直处于304的状态,那么爬虫可能会降低对网站的抓取次数。相反,若网站变化的频率非常之快,每次抓取都能获取新内容,那么日积月累的回访率也会提高。
产生较多304状态码的原因:
●页面更新周期长或不更新
●纯静态页面或强制生成静态html
6. https协议
http的缺点:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已被篡改
http+加密【对称加密和非对称加密算法】+身份认证+完整性保护=https
http协议中没有加密机制,但可以通过和SSL/TLS的组合使用,加密http通信内容,与SSL/TLS组合使用的http被称为https(http secure 超文本传输安全协议)。HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证和完整性保护的网络协议。
- SSL
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议;
SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
- TLS
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议;
http与https的区别
- http和https使用的是完全不同的连接方式,http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- http和https用的端口也不一样,http是80,https是443。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
- http不验证通信方的身份,因此有可能遭遇伪装,https协议需要到CA申请证书,证书一般不免费。
https加密
1. 对称密钥加密(共享密钥加密)
对称加密的特点是数据加密和解密使用相同的密钥
在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客户端发送真实数据的时候,会用这把密钥对数据进行加密,客户端收到加密数据之后,用刚才收到的密钥进行解密。如图:
对称加密的问题在于如何把密钥安全的传输给客户端(密钥交换)。
2. 非对称密钥加密(公开密钥加密)
服务器在给客户端传输数据的过程中,可以用客户端明文给他的公钥进行加密,然后客户端收到后,再用自己的私钥进行解密。客户端给服务器发送数据的时候也一样采取这样的方式。这样就能保持数据的安全传输了。画个图理解一下:
- 非对称加密在加密是速度特别慢,比对称加密慢上百倍。采用组合加密方式解决非对称加密速度很慢的问题。
- 非对称加密也并非是传输安全的,非对称加密之所以不安全,是因为客户端不知道公钥是不是属于服务器的。可以使用数字证书,来证明这把公钥就是服务器的,而不是别人冒充的
3. 组合加密
在通信刚开始的时候使用非对称加密算法,解决对称加密算法的密钥交换问题。先用非对称加密算法的公钥对对称加密的会话密钥进行加密。因为会话密钥很短,通常只有 16 字节或 32 字节,所以慢一点也无所谓。对方拿到密文后用非对称加密算法的私钥解密,取出会话密钥。这样,双方就实现了对称密钥的安全交换,后续就不再使用非对称加密,全都使用对称加密。
https连接过程
HTTPS协议是由SSL+HTTP协议构建的可进行 加密传输、身份认证的网络协议,比http协议安全。
一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。
-
客户端根据url向服务器发起HTTPS请求,连接到服务器的443端口
-
服务端接收到客户端的请求之后,会将数字证书(证书中包含了公钥)返回给客户端。
-
客户端收到服务器端的证书之后,会对证书进行检查,验证其合法性,如果发现发现证书有问题,那么HTTPS传输就无法继续。如果证书合格,那么客户端会随机生成会话密钥。然后用服务器返回的公钥对这个会话密钥进行非对称加密。
证书检查需要认证三点信息:
- 证书是否为受信任的权威机构颁发的
- 证书是否被篡改
- 证书是否为服务器发过来的,而不是第三方发的
-
将加密之后的会话密钥发送给服务器。
-
服务端会用自己的私钥对加密的会话密钥进行非对称解密
-
用客户端会话密钥对响应数据进行对称加密,这样响应数据就变成了密文。
-
然后服务器将加密后的响应数据发送给客户端。
-
客户端收到服务器发送来的加密的响应数据,会用会话密钥对其进行对称解密,得到服务器返回的响应数据。整个HTTPS传输完成。
https数字证书
数字证书是Https实现安全传输的基础,它是由权威的CA机构颁发的,证书的主要内容有:公钥(Public Key)、ISSUER(证书的发布机构)、Subject(证书持有者)、证书有效期、签名算法、指纹及指纹算法