应用层 -> HTTP FTP 为应用软件提供了不少服务 构建于TCP协议之上 屏蔽网络传输的相关细节 传输层 -> TCP UDP 向用户提供可靠的端对端的服务(end to end) (数据量过大,会分包发送) 网络层 -> 为数据节点之间传输建立逻辑链路 数据链路层 -> 物理链接完成后,须要经过软件进行链接 物理层 -> 网线,光纤等传输硬件设备
计算机与网络设备相互通讯,双方就必须基于相同的方法,不管是语言之间的通信,设备,硬件,操做系统的通信,怎么开始,怎么发起,怎么结束,都须要一种规则。我这种规则被称为协议。例如:TCP、FTP、HTTP、DNS、ICMP、IP、UDP......javascript
IP协议位于网络层,指的是网际协议。做用是把各类数据包传送给对方。而要保证确实传送到对方那里。(须要两个重要的条件1:IP地址 2:MAC地址)css
TCP协议位于传输层,提供可靠的字节流服务。所谓字节流:指的是把大数据分割成以报文字段为单位的数据包进行管理。而且将数据准确可靠的传给对方。html
工做原理: 1.输入url地址,按回车 2.发生跳转(redirect)[可能有301的状况,纯客户端行为] 3.判断是否已经缓存过,缓存是否过时等 4.DNS域名解析,把解析完的地址返回给客户端 5.浏览器建立TCP连接,三次握手 6.http生成目标web请求报文 6.1 若是有代理服务器,会先通过代理服务器,也会判断缓存状况 7.通过各类路由器[能够经过抓包工具了解通过了哪些路由器] 8.服务器拿到报文信息,并把请求结果,也利用TCP通信协议按照原路返回给客户端 9.客户端拿到服务器的http响应报文后,使用了gzip或其余压缩算法,拿到指望的HTML代码 10.在浏览器接收完整HTML文件前,浏览器就开始渲染页面了(浏览器将HTML字节数据通过一个流程解析为DOM树) - 字节->字符->令牌->节点对象->对象模型 11.当HTML代码遇到<link>标签时,浏览器会发送请求得到该标签中标记的CSS文件。 使人欣喜的是,这是一个异步请求,不影响其余操做,浏览器得到数据后就会像构建DOM树同样构建CSSOM树。
URL Uniform Resource Identifier /统一资源标志符 用来惟一标识互联网上的信息资源 包含了URL URN URL Uniform Resource Locator /统一资源定位器 旧版 http://user:pass@host.com:80/path?query=string#hash 默认端口号:80 URN 永久统一资源定位符
第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。前端
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;java
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP链接成功)状态,完成三次握手。node
三次握手的目的:为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。nginx
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。web
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。算法
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。apache
P:由于服务端在LISTEN状态下,收到创建链接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭链接时,当收到对方的FIN报文时,仅仅表示对方再也不发送数据了可是还能接收数据,己方也未必所有数据都发送给对方了,因此己方能够当即close,也能够发送一些数据给对方后,再发送FIN报文给对方来表示赞成如今关闭链接,所以,己方ACK和FIN通常都会分开发送。(因此是四次挥手)
DNS服务是和HTTP协议同样位于应用层的协议,它提供域名到IP地址之间的解析服务。 计算机擅长处理IP地址这样长数字形式的内容,但却不符合人类的记忆习惯,因此用户会借助域名(www.baidu.com)和端口号等来记忆。
但域名却难以理解这样的一串字符串,所以,DNS协议就营运而生,用于解析域名,经过域名查找IP地址,也能够逆向从IP地址查找域名
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,若是缺乏了同源策略,则浏览器的正常功能可能会受到影响,能够说web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现。
他的核心在于它认为自任何站点装载的信赖内容都不安全的,当被浏览器半信半疑的脚本运行的沙箱时,他们应该只被容许访问来自统一站点的资源,而不是那些来自其余站点可能不怀好意的资源
另外,同源策略又分为如下两种
1.DOM同源策略:禁止对不一样源页面DOM进行操做,这里主要场景是iframe跨域的状况,不一样域名的iframe是限制相互访问的
2.XMLHttpRequest同源策略:禁止使用XHR对象向不一样源的服务器发起http请求
若是出现了域名不一样,协议不一样,端口不一样,就会受到同源策略的限制,产生跨域的问题。
同源策略的目的是保证用户信息安全,防止恶意的网站窃取数据,防止其余网站在访问的时候获取其余网站留下的cookie信息。
限制范围:
Cross-Origin Resource Sharing(CORS)跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不一样域传来沙盒脚本的方法,以避开浏览器的同源策略,确保安全的跨域数据传输。现代浏览器使用CORS在API容器如XMLHttpRequest来减小HTTP请求的风险来源。与 JSONP 不一样,CORS 除了 GET 要求方法之外也支持其余的 HTTP 要求。服务器通常须要增长以下响应头的一种或几种: Access-Control-Allow-Origin: *//(不安全)容许跨域的端口(url),或者是一个接口 Access-Control-Allow-Methods: POST, GET, OPTIONS//容许跨域的方式 Access-Control-Allow-Headers: X-PINGOTHER, Content-Type //容许跨域的请求头,能够自定 Access-Control-Max-Age: 86400 //容许在一千秒内发起正式,不用发起预请求
jsonp的原理就是,在客户端和服务端定义一个函数,当客户端发起一个请求时,服务端返回一段javascript代码,其中调用了在客户端定义的函数,并将相应的数据做为参数传入该函数。须要先后端协商函数。
代理与反向代理 同源策略是针对浏览器端进行的限制,能够经过服务器端来解决该问题 浏览器--访问(发出请求)--->代理服务器---(代请求)---> 服务器 Nginx,node中间件等
跨域技术不只仅是有这几种,还有图片ping方法!(一样利用了标签的src不受同源策略影响)、websocket(浏览器与服务器全双工通讯,同时容许跨域通信) 、window.postMessage()等等。(自行百度!)
做用:利用缓存技术减小网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的。
特色:代理不改变请求的URL,会直接发送给前方持有资源的目标服务器(源服务器)。在HTTP通讯中,可级联多台代理服务器(即请求和响应都通过数台相似锁链同样链接的代理服务器),转发时,须要附加Via首部字段以标记出通过的主机信息。
缓存代理:会预先将资源的副本(缓存)保存在代理服务器上,当下次再接受到一样的请求时,就能够不须要从源服务器上获取资源,而是在代理服务器上直接返回资源
透明代理:转发请求或响应时,不对报文作任何加工的代理类型,叫作透明代理,反之叫非透明代理...
目的:隧道的目的是为了确保客户端能与服务器进行安全的通讯
可按要求创建起来一条与其余服务器的通信线路,届时使用SSL等加密手段进行通信.确保安全性.隧道自己不会去解析HTTP请求。也就是说,隧道只是用来中转HTTP请求,当通信双方断开链接是结束
网关的工做机制和代理十分类似,而网关能使通信线路上的服务器提供非HTTP协议服务。 利用网关能提升通讯的安全性。由于能够在客户端与网关之间的通信路上加密以确保连接的安全
使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等内容。
请求报文和响应报文双方都要使用的首部!
通用首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 控制不在转发给代理的首部字段、管理持久连接 |
Date | 建立报文的日期和时间 |
Pragma | 仅做为HTTP/1.0的向后兼容被定义 |
Trailer | 报文主体后加的首部字段 ,可用在分块编码时 |
Transfer-Encoding | 指定报文主体的传输编码格式 |
Upgrade | 检测协议是否可以使用更高版本,(在使用该字段时要额外添加 Connection:Upgrade字段) |
Via | 追踪客户端和服务器以前请求和响应的传输路径,(全部代理服务器的信息) |
Warning | 各类错误警告 |
从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加的内容信息
响应首部字段名 | 说明 |
---|---|
Accept-Range | 用来告知客户端服务器是否能处理范围请求,能够指定为betys,反之指定为none |
Age | 返回资源建立到此次请求所通过的时间,单位为s |
ETage | 服务器将资源以字符串的形式做惟一标识ETage |
Location | 告知服务器用户代理可以处理的天然语言以及天然语言的优先级 |
Authorization | 用来告知服务器用户代理的认证信息(属客户端与代理之间的通讯) |
Retry-After | 告知客户端多久以后再次访问 |
Server | 告知客户端当前服务器安装的HTTP服务器应用程序的信息 |
Vary | 代理服务器须要缓存的管理信息 |
WWW-Authenticate | 服务器对对客户端的认证信息 |
从客户端向服务器发送请求报文时使用的首部!补充了请求的附加内容,客户端信息,响应内容的相关优先级等信息。
请求首部字段名 | 说明 |
---|---|
Accept | 通知服务器用户代理可处理的媒体类型以及优先级 |
Accept-Charset | 通知服务器用户代理支持的字符集以及字符集的优先顺序 |
Accept-Encoding | 告知服务器用户代理支持的内容编码以及内容编码的优先顺序 |
Accept-Language | 告知服务器用户代理可以处理的天然语言以及天然语言的优先级 |
Authorization | 用来告知服务器用户代理的认证信息 |
Expet | 期待服务器出现某种待定行为 |
From | 告知服务器用户代理的电子邮箱地址 |
Host | 请求资源所处计算机的主机名和端口号 |
If-Match | 告知服务器匹配资源所用的实体标记值 |
If-Modified-Sincest | 告知服务器字段值时间以后有更新资源,则获取 |
If-None-Match | 和If-Match相反 |
If-Range | 资源未更新时发送实体Bety的范围请求 |
If-Unmodified-Since | 告知服务器字段之间以后未更新资源,则获取 |
Max-Forwards | 以十进制的形式指定可通过的服务器的最大数目 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Pange | 只须要获取部分资源的请求告知服务器的资源指定范围 |
Referer | 告知服务器请求的原始资源的URI |
TE | 告知服务器客户端能处理的编码格式以及相对优先级 |
User-Agent | Http客户端的信息,若是请求通过代理也可能会添加代理服务器的信息 |
注:形如If-xxx这样的请求字段称为条件请求,服务器通常接收到附带条件请求的URL,只有判断条件成立后才会执行请求
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容,更新时间等与实体相关的信息。
实体首部字段名 | 说明 |
---|---|
Allow | 通知客户端能支持的HTTP的全部方法 |
Content-Encoding | 通知客户端服务器对实体的主体的编码方式 |
Content-Language | 通知客户端实体主体的天然语言 |
Content-Length | 实体主体的大小 |
Content-Location | 表示报文返回资源的原始URI |
Content-MD5 | 客户端对接收到的报文主体执行相同的MD5算法,而后与字段中的值进行比较。(目的检测传输过程实体主体是否保持完整) |
Content-Range | 实体主体返回的是资源的那部分位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 告知客户端资源的有效截止日期 |
Last-Modified | 告知客户端资源的最后修改日期 |
自行扩展的,非标转的首部字段
其余首部字段名 | 说明 |
---|---|
X-Frame-Options | 控制网站内容在其余web上用frame标签内显示的问题,主要防止点击劫持攻击 |
X-XSS-Protection | 针对跨脚本攻击的一种对策,用于控制浏览器XSS防御机制的开关(0 无效 1 有效) |
DNT | 拒绝我的信息被收集,表示拒绝被精准广告追踪的一种方法,(0 赞成 1 拒绝) |
P3P | 在线隐私偏好系统 |
1. 处理预请求 'Access-Control-Allow-Headers':'X-Test-Cors'//容许跨域的请求头,能够自定义 'Access-Control-Allow-Methods': 'POST, PUT, Delete'//容许跨域的方式 'Access-Control-Max-Age': '1000' //容许在一千秒内发起正式,不用发起预请求 2. CORS带Cookie的跨域请求 Access-Control-Allow-Origin:'*' //当设置为*的时候,容许任何地方的跨域请求,但当带有Cookie的时候,则报错,并且,也至关不安全。 //所以,须要设置成指定的要访问的域。 1.判断接口是否带cookie,若是带cookie,则获取请求头部的origin的值(即访问的域) 而且加上“Access-Control-Allow-Credentials":"true" 3. Content-Type //传输的数据类型 (很重要) text/plain multipart/form-data application/x-www-form-urlencoded 4. 可缓存 public (任何地方) private(发起请求的地方) no-cache(验证后是否使用本地缓存才能缓存) 5. 到期时间 max-age=100 (缓存时间) s-maxage=100 (缓存时间[在代理服务器上用]) max-stale=1000 (即便过去,也还能用,在规定时间范围内) 6. 从新验证 must-revalidate (在过时后,在服务端发送请求,从新获取数据验证是否真的过时) proxy-revalidate (在缓存服务器上使用) 7. 其余 no-store (不用验证,不能缓存,每次都要拿新的内容) no-transform (告诉代理服务器 不容许改动内容) 8. 资源验证 配合if-Match或者if-Non-Match使用对比资源的签名判断是否使用缓存 //第一个修改信息时,把修改的内容发送到服务器,第二次请求的时候,会返回第一次的数值,而后跟如今的数值对比,若是有不同,证实修改了,须要从后台拿数据
状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果,借助状态码,能够知道服务器端是正常处理了请求,仍是出现错误
code | 类别 | 缘由短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 须要进行附加操做以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器没法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
http状态码多达六十多种,但实际使用大概只有十四种左右
code | 缘由短语 |
---|---|
200 | 请求成功 |
204 | 请求成功,但无资源返回 |
206 | 请求成功,只是请求部分资源 |
code | 缘由短语 |
---|---|
301 | 永久性重定向 资源地址更新,须要进行变动,(主要做用在书签页) |
302 | 临时性重定向 资源地址更新,须要进行变动,(主要做用在书签页) |
303 | 临时性重定向 使用get 方法获取资源 |
304 | 资源找到了,但不符合条件请求,意思是:内容还没更新,先使用客户端内缓存的内容(非重定向) |
404 | 服务器没有找到该资源 |
code | 缘由短语 |
---|---|
400 | 没法理解请求的内容(报文语法错误) |
401 | 须要经过HTTP认证 |
403 | 被服务器拒绝访问内容 |
404 | 资源找到了,但不符合条件请求,意思是:内容还没更新,先使用客户端内缓存的内容(非重定向) |
code | 缘由短语 |
---|---|
500 | 服务器内部出现故障 |
503 | 服务器正忙(处于暂时超负载或者停机维护等,没法处理请求) |
是目前使用最普遍的Cookie标准,却不是RFC中定义的任何一个
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
HTTP协议中没有加密机制,但能够经过SSL(安全套接层)或者TLS(安全传输层协议)的组合,加密HTTP通讯内容
与SSL组合适用的HTTP称为HTTPS 超文本传输安全协议 或者HTTP over SSL
前提是要求客户端和服务器同时具有加密和解密的机制
但因为加密方式不一样,报文主体被加密处理,但报文首部未被加密处理,因此仍然有被篡改的风险。
SSL是当今世界上应用最普遍的网络安全技术
SSL才用一种叫作公开密钥加密的加密处理方式。 公开密钥加密使用一对非对称的密钥。一把叫作私有密钥(不能让任何人知道),一把叫作公开密钥(随意发布)。
HTTPS才用共享密钥加密和公开密钥加密二者并用的混合加密机制。
前提:证书的认证主要在三次握手中完成。 1.浏览器实现有数字证书机构的公开密钥。服务器有公钥和私钥
PS:非对称的RSA加密性能是很是低的,缘由在于寻找大素数、大数计算、数据分割须要耗费不少的CPU周期,因此通常的HTTPS链接只在第一次握手时使用非对称加密,经过握手交换对称加密密钥,在以后的通讯走对称加密。
浏览器将本身支持的一套加密规则发送给网站。
网站从中选出一组加密算法与HASH算法,并将本身的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
浏览器得到网站证书以后浏览器要作如下工做:
验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),若是证书受信任,则浏览器栏里面会显示一个小锁头,不然会给出证书不受信的提示。
若是证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将以前生成的全部信息发送给网站。
网站接收浏览器发来的数据以后要作如下的操做:
使用本身的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
使用密码加密一段握手消息,发送给浏览器。
浏览器解密并计算握手消息的HASH,若是与服务端发来的HASH一致,此时握手过程结束,以后全部的通讯数据将由以前浏览器生成的随机密码并利用对称加密算法进行加密。
HTTP/2.0在2014年11月实现标准化,但目前大部分的网络仍然使用HTTP/1.1协议
HTTP/2 协议由两个 RFC 组成:一个是 RFC 7540,描述了 HTTP/2 协议自己;一个是 RFC 7541,描述了 HTTP/2 协议中使用的头部压缩技术
Keep-Alive 解决了同一域名下屡次请求的重复创建三次握手和四次挥手的问题。只须要创建一次HTTP请求便可。 但仍然存在着 "串行传输问题",以及并发问题 由于浏览器限制,浏览器发起的最大请求数为6。
服务端推送容许咱们向用户发送一些尚未被访问的资源
若样式、脚本资源之外链及模块形式引用,会更高效地进行缓存。当用户访问后续页面须要这些资源时,能够直接从缓存中获取,从而省去了额外的资源请求
当推送资源时,咱们能得到与内联相同的性能提高,同时保持资源的外链形式,从而有独立的缓存策略。
使用Server Push,一般会如下面的方式使用 Link 这个HTTP首部。
Link: </css/styles.css>; rel=preload; as=style
在进行 HTTP/2 网站性能优化时很重要一点是「使用尽量少的链接数」,本文提到的头部压缩是其中一个很重要的缘由:同一个链接上产生的请求和响应越多,动态字典积累得越全,头部压缩效果也就越好。因此,针对 HTTP/2 网站,最佳实践是不要合并资源,不要散列域名。