既然是http的专题,那么首先要知道什么是http?
http是超文本传输协议(hypertext transfer prototal)!是客户端和服务器端互相通信时必须遵守的协议。HTTP协议是应用层协议,底层是基于TCP协议。默认是用80端口。 tips:TCP/IP协议(协议群的统称),计算机网络分层(五层) 应用层http - 传输层tcp/udp - 网络层IP - 数据链路层 - 物理层。可通过以下链接了解详细信息(了解即可): https://blog.csdn.net/yi_master/article/details/79358920 https://developer.51cto.com/art/201906/597961.htm
http版本发展历史
https://blog.csdn.net/liujianfei526/article/details/53289350
- http0.9
1991年发布。只有一个GET命令。 - http1.0
1996年5月发布。首先任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还可以传输图片、视频和二进制文件(灵活)。其次,除了GET命令外还新增了POST和HEAD命令,丰富了浏览器和服务器的互动手段。再次,新增了Header和服务端处理请求的状态码、多字符集支持、多部分发送、权限、缓存、内容编码等。 1.0的主要缺点:每个tcp连接只能发送一个请求,每次发送请求都必须重新建立tcp连接。而建立tcp连接的成本很高,需要客户端和服务器端三次握手,而且开始时发送速率慢。 - http1.1
1997年1月发布。1.1版本进一步完善了http协议,一直用到了现在。与1.0对比,最大的变化是引入了持久连接,即复用tcp连接(长连接)。不用声明:Connection: keep-alive。客户端和服务器端发现对方一段时间没有活动,就可以主动关闭连接,Connection: close。目前对于同一个域名,大多数浏览器允许同时建立6个持久连接。第二个变化是引入了管道机制,即在同一个tcp连接里,客户端可以同时发送多个请求。同时还新增了很多方法,如PUT、PATCH、DELETE、HEAD、OPTIONS等。另外客户端请求头信息里新增了host字段,用来指定服务器端的域名。 缺点:虽然1.1版本允许复用tcp连接,但同一个tcp连接里,所有的数据通信都是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。那就极有可能出现“队头堵塞”。为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致很多网页优化技巧:比如合并js和css,将图片嵌入css代码,域名分片等。 tips: 理解持久连接和管线化 https://blog.csdn.net/weixin_44486539/article/details/102988300 持久连接即复用tcp连接,此时 请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3 管线化是建立在持久连接之上,此时 请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3 所以说1.1版本缺点是即使复用了tcp连接,然而所有的数据通信都是按次数进行,可能会出现队头堵塞的情况。 - http2
2015年发布。二进制协议,复用tcp连接,在一个连接里,客户端和服务器端可以同时发送多个请求或回应,而且不用按照顺序一一回应,这样就避免了“队头堵塞”。这样双向的、实时的通信,就叫做多工。数据流。头信息压缩。服务器推送。 - http3
https://blog.csdn.net/qq_34827674/article/details/115188998 即将问世的http3。将传输层中的tcp替换成了udp协议,并在udp协议上开发了QUIC协议,来保证数据的可靠传输。QUIC协议特点:无队头阻塞,建立连接速度快(无需三次握手等),支持连接迁移(即使网络发生变化,导致IP地址改变,也无需断开连接后重连)。
http协议的特点
- 支持客户/服务器端模式
- 简单快速
- 灵活:http允许传输任意类型的数据对象。由content-type标记。
- 无状态:http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,对于事务处理没有记忆能力,客户端和服务器端永远处于一种“无知”的状态,就是每次请求和响应都是独立的,没有任何联系。所以引入了cookie(记录在客户端)和session(记录在服务器端)。
- 无连接特点是针对1.0版本的http协议,指的是每次服务器端返回响应报文后自动断开连接,1.1版本的http协议是保持连接的,connection默认为keep-alive。
http和https的区别
- http是明文传输,而https是http+ssl(对数据加密),比http安全。ssl协议位于传输层协议与应用层协议之间,为数据通讯提供安全支持。
- https需要申请CA证书,付费;
- http和https使用的是完全不同的连接方式,用的端口号也不一样,http端口号80,https端口号443;
- http协议是无状态的,而https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http安全。
http状态码
1XX 服务器端已收到请求 2XX 成功 200ok 3XX 重定向/缓存 301永久重定向 302临时重定向 304资源未更改 4XX 客户端错误 403 请求页面禁止访问 404 not found资源不存在 比如输入错误的url 5XX 服务器端错误 500 服务器代码问题
请求方法
GET POST(提交表单) HEAD OPTIONS DELETE PUT(上传文件) 最常用的是GET和POST,restful接口一般会使用GET POST PUT DELETE
GET和POST的区别,特点
https://www.cnblogs.com/logsharing/p/8448446.html
- GET参数通过URL传递,POST放在Request body中。
- GET参数只接受ASCII字符,而POST没有限制。
- GET请求会被浏览器主动cache,但POST不会。
- GET请求参数在URL中传送的参数是有长度限制的,但POST没有。
- GET请求只产生一个TCP数据包,而POST产生两个TCP数据包。
对于get请求,请求头和数据一并发出去;而post请求,先发送请求头,服务器响应100后,客户端再发送数据;
TCP协议和UDP协议(传输层协议)
https://blog.csdn.net/petterp/article/details/102779131 传输层为两台主机上的应用程序提供端到端的通信。传输层有俩个传输协议:TCP(传出控制协议)和UDP(用户数据报协议)。
TCP和UDP协议的区别
- 其中TCP是一个可靠的面向连接的协议,而UDP是无连接的协议。
- TCP提供可靠的服务。也就是说,通过tcp连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付。
- UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通道。
- 每一条TCP连接都是点到点的,UDP支持N对N;
- TCP对系统资源要求较多,而UDP对系统资源要求较少。
TCP的三次握手和四次挥手
http://blog.sina.com.cn/s/blog_160965eee0102yleh.html
报文主要段的意思
序号(seq):表示发送的数据字节流,确保TCP传输有序,对每个字节编号
确认序号(ack):发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
FIN:结束标志,用于释放连接,为1表示关闭本方数据流 由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式(http2才是全双工模式,0.9,1.0都是短连接,1.1版本是半双工模式)。 tips:什么双工模式——客户端和服务器端都能主动发送数据。
为什么要三次握手和四次挥手?
三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里。
四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。
为什么要等待2MSL的时间
MSL为最长报文段寿命,它是任何报文段被丢弃前在网络内的最长时间。
理解一:如果第四次挥手报文没有到达服务器端,那么服务器会在超时之后重新发送FIN,如果此时的客户端已经是closed状态的话,重发的FIN就找不到对应的连接了。所以第四次挥手的时候客户端不能马上进入closed状态,而要保持time_wait状态。
理解二:客户端需要保证最后一次发送的ACK报文到服务器,如果服务器未收到,可以请求客户端重发,这样客户端还有时间再发,重启2MSL计时。
ajax请求和http请求的关系
ajax请求属于http请求。http包括两种请求,一种是同步(普通请求),一种是异步(ajax请求也可以设置为同步,设置async为false,默认为true,但绝大部分情况不需要使用同步)。
如何区分是普通请求还是ajax请求呢? 通过请求头header中的x-requested-with字段是否为XMLHttpRequest,普通请求为null。虽然我们能设置ajax请求中的header字段,但是x-requested-with字段不会被完全重置,对于XMLHttpRequest对象发出的请求都被会被浏览器设置一遍这个值。 tips: 我们在浏览器中设置referer(源)字段也是无效的。
本质区别就是ajax请求通过XMLHttpRequest对象请求数据,而普通请求通过httpRequest对象发送数据请求服务器。
ajax请求一般是指上图中的XHR部分。
用xhr写一个get或post请求?理解xhr。
XHR(XMLHttpRequest)对象用于与服务器交互。通过XHR对象可以在不刷新页面的情况下请求特定url,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。
- 构造函数 XMLHttpRequest()
该构造函数用于初始化一个 XMLHttpRequest 实例对象。在调用下列任何其他方法之前,必须先调用该构造函数,或通过其他方式,得到一个实例对象。 - readyState (只读属性)代表请求的状态码
- onreadystatechange 当readyState发生变化时,触发该事件
- status (只读属性)返回数字,代表请求的响应状态码
- statusText (只读属性)返回DOMString, 代表请求的响应状态
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readystate === 4 && xhr.status === 200) {
console.log('success' + xhr.statusText);
}
}
xhr.open('GET', url, true);
xhr.send();
前端缓存 - 详谈http缓存
缓存的好处:缓解服务器压力,提升性能(获取资源耗时更短了)。
前端缓存分为两种,一种是http缓存,一种是存储,如localstorage、sessionstorage、indexDB等。
只有GET方法获取到的数据能被缓存,且一般只缓存js、css、图片等静态资源。
http缓存都是从第二次请求开始的。第一次请求资源的时候,服务器返回资源,并在响应头中回传资源的缓存参数,如果是强缓存,则将资源存储在内存或磁盘中(标记过期时间),若是协商缓存则带Etag或Last-modified字段。
http缓存又分为强缓存和协商缓存。 和强缓存相关的header头有cache-control、expires、Pragma(向后兼容http1.0)。 和协商缓存相关的header头有Etag/If-none-match,last-modified/If-modified-since。
若命中强缓存,直接从内存或硬盘中读取数据而不向服务器发送http请求。判断是否为强缓存cache-control: max-age=xxx,单位秒,或者expires,判断资源是否过期。 若未命中强缓存,则发送http请求头带If-none-match或者if-modified-since,判断协商缓存Etag/If-none-match,last-modified/If-modified-since,若命中协商缓存,则http状态码为304,直接从缓存中读取数据,并重置缓存时间,若未命中协商缓存,则请求成功时状态码为200,读取服务器数据。
以下情况即命中了强缓存。
http1.1定义的cache-control头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性。通过它的值来定义缓存策略。 cache-control: no-store // 没有缓存。客户端必须从服务器拿数据 cache-control: no-cache // 强缓存失效,判断协商缓存情况 cache-control: private/public // 客户端私有缓存/客户端和代理服务器共有缓存 cache-control: max-age=xxx // 资源有效期
注意: 在chrome浏览器中返回的200状态会有两种情况: 1、from memory cache (从内存中获取/一般缓存更新频率较高的js、图片、字体等资源)
2、from disk cache (从磁盘中获取/一般缓存更新频率较低的js、css等资源)
缓存和用户的行为
http缓存还和用户行为有关。 如果是刷新,那么强缓存失效,如果是强制刷新,那么强缓存和协商缓存都失效。
https是如何加密的?
|