HTTP 前端需明白的相关知识点
简介:
http(Hyper Text Transfer Protocol)超文本传输协议是万维网应用层的协议,使用了面向连接的TCP作为运输层协议。
特征:
- 简单快速:通过url就可以访问资源,协议简单,使得HTTP服务器的程序规模小,通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:每次连接响应一个请求,连接一次响应后就会断开连接。
- 无状态:无状态协议,是指对于事务处理没有记忆能力,不会记住客户访问过的状态,不能区分访问身份。
http工作原理:
http协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向服务器请求解析该URL中的域名所对应的IP地址
- 浏览器通过IP地址与默认监听的80端口,与服务器建立TCP连接
- 浏览器发送请求报文,这个报文作为TCP第三次握手的第三个报文数据发送给服务器
- 服务器对请求资源进行定位,响应给客户端,
- 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求(即持久连接);
- 客户端浏览器首先解析状态行、响应头、然后读取响应数据HTML,并在浏览器窗口中显示。
Url:
<协议>://<主机>:<端口(默认80可省略)>/<路径>
Url与Uri区分:
url统一资源定位符,uri统一资源标识符,url它是一种具体的URI,即URL可以用来标识一个资源,是uri的子集,即url属于uri。
http报文组成:
请求报文:请求行、请求头、空行、请求体
响应报文:状态行、响应头、空行、响应体
请求方法:
GET:获取资源
POST :传输资源
HEAD :获得报文首部
DELETE :删除资源
PUT:更新资源
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
Post/Get方法区别:
Get比Post方法不安全,参数暴漏在url上,不能用来传递敏感信息;
Get在url中可传递的参数长度是有限的,Post方法可以传递的参数长度没有限制;
Get参数放在url上传递,Post放在request body中;
Get请求参数会被完整保留在浏览器历史记录里,Post参数不会被保留;
浏览器回退,Get请求不会重复提交,Post请求会重复提交;
Get请求浏览器会自动缓存,Post请求不会自动缓存。
响应行状态码:
1**: 指示信息
2**:成功 200 :ok 206 :partial content(请求带range头的GET请求)
3**:重定向301 :所请求页面转移至新的url,永久重定向 302:临时重定向 304:内容未修改
4**:客户端错误 400:客户端语法错误 403:被请求页面访问被禁止 404:没找到资源
5**:服务器错误 503:服务器过载或当机。
状态码、请求头、响应头资料转载连接:
http://www.51testing.com/html/38/225738-216202.html
持久连接(持续连接)
http1.1版本开始支持持久连接,即keep-alive连接,在使用非持久连接的状态下,http采用的是“请求--应答模式”,每次请求的时候建立连接,完成之后断开连接,即无连接状态。持久连接(持续连接)即响应完成之后还保持连接,可以继续在这条连接上传送http请求报文和响应报文。
管线化:
在使用持久连接的情况下,某个连接上消息的传递类似于:
请求1 ==> 响应1 ==> 请求2 ==> 响应2 ==> 请求3 ==> 响应3
某个连接上的消息变成:
请求1 ==> 请求2 ==> 请求3 ==> 响应1 ==> 响应2 ==> 响应3
特点:通过持久连接完成,仅http1.1支持;仅GET、HEAD请求可以进行管线化,post有所限制,初次创建连接时不应启动管线化,因为服务器不一定支持,管线化不会影响响应的顺序,服务端支持管线化,并不要求服务端也对管线化进行处理。由于端管线化并不能带来大幅度的性能提高,因此现代浏览器chrome、firefox并未开启管线化。
http/https区别:
https是在http下加入SSL层进行安全加密。http标准端口是80 ,而https的标准端口是443。
与缓存有关的头部:
Expires:
有效期,过期时间,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改。几乎所有的缓存服务器都支持Expires(过期时间)属性。
Cache-control:
这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法,比如 Expires 和 Last-Modified。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。
客户端可以在HTTP请求中使用的标准 Cache-Control 指令:
Cache-Control: max-age=<seconds>
缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。
Cache-control: no-store
所有内容都不会被缓存到缓存或 Internet 临时文件中。
Cache-control: no-transform
Cache-control: only-if-cached
服务器可以在响应中使用的标准 Cache-Control 指令:
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>
Last-modified/If-Modified-Since:
如果第二次请求相同的数据,可以告诉服务器上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。
如果数据从那时起没有改变,服务器将返回一个304,当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。
ETag/If-None-Match:
ETag用于标示URL对象是否改变,在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:ETag:"50b1c1d4f775c61:df3"客户端的查询更新格式是这样的:If-None-Match : W / "50b1c1d4f775c61:df3"如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。测试Etag主要在断点下载时比较有用。
Expires/Cache-Control Header是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是Cache-Control比Expires可以控制的多一些, 而且Cache-Control会重写Expires的规则。
Last-Modified/If-Modified-Since和ETag/If-None-Match是浏览器发送请求到服务器后判断文件是否已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。
HTTP 前端需明白的相关知识点的更多相关文章
- Android开发涉及有点概念&相关知识点(待写)
前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...
- TCP/IP 相关知识点与面试题集
第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...
- Python开发一个csv比较功能相关知识点汇总及demo
Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...
- http及浏览器相关知识点归纳
http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...
- sql注入原理+mysql相关知识点
什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...
- UITableView相关知识点
//*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- 学习记录013-NFS相关知识点
一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...
随机推荐
- mysql进阶(十五) mysql批量删除大量数据
mysql批量删除大量数据 假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM s ...
- Cocos2d-swift V3.x 中的update方法
在cocos2d V3.x中update方法如果实现,则会被自动调用;不用向早期的版本那样要显式schedule. 但是你还是要显式schedule其他方法或blocks使用node的schedule ...
- 如何缩放SpriteBuilder中的scene
我们在制作游戏的level时,往往会发现level的长或宽会大大超过窗口的尺寸.比如在类似超级马里奥游戏中(iphone横屏显示),level的宽度为5000,而窗口的宽只有960. 我想快速查看到l ...
- "《算法导论》之‘图’":单点最短路径(有向图)
也许最直观的图处理问题就是你常常需要使用某种地图软件或者导航系统来获取从一个地方到另一个地方的路径.我们立即可以得到与之对应的图模型:顶点对应交叉路口,边对应公路,边的权重对应该路段的成本(时间或距离 ...
- Linux - sed 工具
我们先来谈一谈 sed 好了, sed 本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed 还可以将数据进行取代.删除.新增.撷取特定行等等的功能呢!很不错吧- 我们先 ...
- Mybatis 源码之Plugin类解析
public class Plugin implements InvocationHandler { private Object target; //目标对象 private Interceptor ...
- HBase事务
众所周知,ACID是指原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability). HBase对同一行数据的操作提供ACID保证.HB ...
- ibm云时代的转型
好几个月了,有两个说法很流行. 第一个说法,是老有人嚷嚷思科快被SDN整趴下了:第二个说法,是老有人嚷嚷IBM在云计算时代完全落后了,要倒下了. 刚开始我还跟有些人辩论: 1.裁员是西方企业常用的战略 ...
- err:安装程序试图挂载映像 1(缺少ISO 9660图像)
一般出现此错误是因为你没有把相应的CentOS-6.4-i386-bin-DVD1.iso文件放入到你装系统所引导的盘中,造成找不到挂载映像文件. ubuntu-12.04.3-desktop-i38 ...
- javascript中正则表达式和ruby中的一点差异
看到一个例子,不过这个例子中正则表达式的格式貌似是错的: Function.prototype.get_name = function(){ return this.name || this.toSt ...