简介:

http(Hyper Text Transfer Protocol)超文本传输协议是万维网应用层的协议,使用了面向连接的TCP作为运输层协议。

特征:

  1. 简单快速:通过url就可以访问资源,协议简单,使得HTTP服务器的程序规模小,通信速度很快。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. 无连接:每次连接响应一个请求,连接一次响应后就会断开连接。
  4. 无状态:无状态协议,是指对于事务处理没有记忆能力,不会记住客户访问过的状态,不能区分访问身份。

http工作原理:

http协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向服务器请求解析该URL中的域名所对应的IP地址
  2. 浏览器通过IP地址与默认监听的80端口,与服务器建立TCP连接
  3. 浏览器发送请求报文,这个报文作为TCP第三次握手的第三个报文数据发送给服务器
  4. 服务器对请求资源进行定位,响应给客户端,
  5. 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求(即持久连接);
  6. 客户端浏览器首先解析状态行、响应头、然后读取响应数据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 前端需明白的相关知识点的更多相关文章

  1. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  2. TCP/IP 相关知识点与面试题集

    第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...

  3. Python开发一个csv比较功能相关知识点汇总及demo

    Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...

  4. http及浏览器相关知识点归纳

    http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...

  5. sql注入原理+mysql相关知识点

    什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...

  6. UITableView相关知识点

    //*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...

  7. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  8. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  9. 学习记录013-NFS相关知识点

    一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...

随机推荐

  1. Java泛型和通配符那点事

    泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...

  2. DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库

    DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要       本文详细地介绍了"万能数据库查询分析器&qu ...

  3. adb shell后出现error解决方案

    解决办法: 解决办法: 1.adb kill-server 2.adb start-server 3.adb remount 4.adb shell 一般情况下都可以在此启动adb相关

  4. LeetCode之“动态规划”:Interleaving String

    题目链接 题目要求: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example ...

  5. Leetcode_203_Remove Linked List Elements

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/45868027 Remove all elements fr ...

  6. android 自定义gallerey并实现预览功能

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gal ...

  7. Erlang cowboy routing 路由

    Erlang cowboy routing 路由 本文译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/routing/ Routing 默认情况下,C ...

  8. 学习Selenium遇到的问题和解决方案

    问题1:IE驱动位数问题,未安装对应的IE,打不开IE浏览器(已解决20180323) 使用Selenium启动IE浏览器的时候,报错,报错信息如下 org.openqa.selenium.remot ...

  9. 自制无线共享工具C++源代码

    // wire.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <string.h> using namespace ...

  10. Python函数式实现单例特性

    传统的单例一般是基于类的特性实现,Python模块是天生的单例,下面来个简单的借助模块和函数实现单例特性: gdb = None def get_gdb(): global gdb if gdb is ...