HTTP学习笔记
1. HTTP请求方法
1. GET
- 用来请求已被URL识别的资源。
- GET请求是幂等的,也就是说,每次请求GET的结果必须一样。
- GET请求的参数放在url后面,大部分浏览器对url的长度有限制,因此,使用GET请求上传数据有大小限制。
- GET上的数据类型只允许使用ASCII字符
- GET请求的资源可以缓存
2. POST
- 用于向服务器传送数据
- POST请求的数据放在请求实体中
- POST的数据类型没有限制,支持二进制数据
POST和GET的区别:
- GET请求数据放在url里面,传送数据有限;POST数据放在请求体,传送数据不限制大小。
- GET数据类型只能用ASCII码,post支持任意数据类型。
- GET请求的资源可以缓存,POST请求永远不缓存。
- POST请求较安全。
- GET请求一般用于请求资源,POST用于可能改变服务器状态。
- GET请求产生一个TCP数据包,POST请求产生两个TCP数据包。
原因:对于GET请求,浏览器会把header和数据一起发送出去,服务器返回200和数据。而对于POST请求,浏览器先发送http header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok和数据)。
3. HEAD
- 获取响应行、响应头
- HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体。经常用来测试超链接的有效性、可用性和最近的修改。(通过last-modified、if-modified-since或者ETag)
4. PUT
- 客户端向服务器传送数据,取代指定文件的内容。
- 关于使用PUT请求和使用POST请求,如果一个资源重复更新,产生的效果是一样的,使用PUT请求,否则,使用POST请求。
- PUT请求是幂等的(相同的请求得到相同的响应结果,GET,HEAD,PUT,DELETE)
5. DELETE
- 客户端让服务器删除url对应的资源
2. HTTP请求报文
举例
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.baidu.com/s?wd=HTTP%20%E5%8D%8F%E8%AE%AE%E6%9C%89%E5%87%A0%E7%A7%8D%E5%92%8C.....
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: BIDUPSID=670A04B660AAF2716D3120BEAF946A11; BAIDUID=2454D4....
1. 请求行
- 依次为:请求方法,请求的URL, HTTP版本
2. 请求头
- 紧接请求行的,因此和请求行没有分隔。
- 用来说明服务器要使用的附加信息,如下图:
3. 请求实体
-
请求头后面必须空一行,然后才到请求体,即使没有请求体,也要空一行。
请求体可以添加任意的其他数据。
3. HTTP响应报文
举例:
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Mon, 16 Jan 2017 06:35:24 GMT
Content-Type: text/html;charset=utf-8
Connection: keep-alive
Cache-Control: private
Expires: Mon, 16 Jan 2017 06:35:24 GMT
Content-Encoding: gzip
Set-Cookie: BDSVRTM=104; path=/
1. 响应行
- 依次为:HTTP版本、状态码、状态消息
2. 响应头
- 用来说明客户端要使用的一些附加信息,也就是一些参数。
3. 响应实体
- 响应头后面必须空一行
4. 常见状态码
2XX 成功
200 OK
204 No Content:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
206 Partial Content
3XX 重定向
301 Moved Permanently:永久性重定向
302 Found:临时性重定向
303 See Other
注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会把 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
304 Not Modified:如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,但是不满足条件,则服务器会返回 304 状态码。
307 Temporary Redirect:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
4XX 客户端错误
400 Bad Request:请求报文中存在语法错误
401 Unauthorized:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。
403 Forbidden:请求被拒绝,服务器端没有必要给出拒绝的详细理由。
404 Not Found
5XX 服务器错误
500 Internal Server Error:服务器正在执行请求时发生错误
503 Service Unavilable:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
5.HTTP缓存相关参数
1. Last-Modified和If-Modified-Since
- Last-Modified属于响应头的参数,是服务器发给客户端的,指示资源的最后修改时间。
- If-Modified-Since是属于请求头的参数,是客户端发给服务器的,与 Last-Modified配合使用:客户端再次请求相同资源时,会将上一次请求响应报文中的Last-Modified作为If-Modified-Since,然后发给服务器。服务器通过If-Modified-Since与服务器上的文件的实际最后修改时间做对比,如果时间一致返回304,客户端使用本地缓存;否则返回200和新的文件内容,客户端丢弃旧的本地内容,并缓存新的文件。
2. ETag和If-none-much
- 由服务端生成的一段字符串,附加在文件(image、css、js)后面,随着文件内容的变化而变化。这样客户端只会重新请求获取ETag发生变化的文件,加快浏览器反应速度,同时减少服务端压力。
- 主要为了解决Last-Modified无法解决的问题。(1)If-Modified-Since只能记录秒级的修改。ETag能记录秒级以下的修改。 (2)一些文件也许会进行周期性的更改,但是它的内容并不改变(仅仅改变修改时间),这个时候,我们并不希望客户端认为文件被修改了,而重新GET
- 具体使用:与if-not-match配合使用。客户端使用请求一个文件,服务器返回响应行、响应头、响应体,包括该文件和ETag的值; 当客户端再次请求该文件时,请求头中将该Etag值填入到if-not-match字段中,如果服务器发现该文件Etag没有改变,则返回304,客户端使用本地缓存;否则返回200和新的文件内容以及新的Etag,客户端丢弃旧的本地内容,并缓存新的文件。
3. HTTP 1.0 缓存控制响应头Pragma和Expire
- Pragma: no-cache 。由客户端发给服务器的,防止客户端缓存,需要强制从服务端获取最新数据(参数的值只能是no-cache,只有一种用法)
- Exipres:由服务器返回的,设置本地缓存的过期时间(绝对时间)
例如:Expires: Sun, 16 Oct 2016 05:43:02 GMT
4. HTTP 1.1 缓存控制响应头Cache-Control
- 请求、响应都可用,一般用于请求头
- Cache-Control: no-cache指示请求或响应消息不能缓存。强制客户端每次都请求服务端最新的资源,不经过本地缓存的副本验证。
- Cache-Control: no-store 指示客户端不保存请求和响应的副本。
- Cache-Control: max-age=[秒] 客户端副本缓存的最长时间,类似HTTP1.0 的Expires,只是此处基于请求的相对间隔来计算,而非绝对时间。
- Public 响应可被任何缓存区缓存,任何情况下都得缓存该资源。
- Cache-Control: Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。缓存只开放给某些特定的用户。
- Cache-Control: min-fresh 客户端想要获取一个小于指定时间内被更新过的资源。单位为秒。
- Cache-Control: max-stale 客户端想获取超出缓存时间多少秒的资源。
6. cookie和session
- Cookie和Session都是用来保存客户端状态信息的机制。
- Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
- Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
- cookie常用来实现记录用户名密码等功能。
- 当程序需要为某个客户端的请求创建一个Session的时候,先会查看客户端的请求里面是否包含sessionId,如果有,就通过sessionId查找对应的session,否则就新建一个session对象,并生成一个sessionId,这个sessionId将在本次响应中返回给用户保存(Set-Cookie:JSESSIONID=xxxx)。
- 客户端发送sessionId给服务器的方法有两种:
- sesionId保存在Cookie中,在请求的时候把sessionId发送给服务器(Cookie:JSESSIONID=xxxx)
- URL重写的方式:把sessionId直接附加在URL路径后面,发送给服务器。
- Session不会随着浏览器关闭而删除。一般来说浏览器关闭,存储sessionId的Cookie在关闭浏览器之后被删除了,因此,再次打开浏览器,去服务器找不到原来的sesion,就会觉得原来的session被删除了。
- 一般会给session设置一个失效时间。当距离客户端上一次使用session的时间超过这个失效时间,服务器就认为这个客户端已经停止了活动,因此删除该session,以节省存储空间。
7. HTTP1.0和1.1
- HTTP/1.0支持长连接(Connecttion:Keep-alive),但是默认是短连接。HTTP/1.1,默认就是长连接
- HTTP/1.1支持chunked编码(分块编码)传输,分块传输编码允许服务器在最后发送消息头字段,实时生成消息长度。
- HTTP/1.1新增了请求流水线(管道化连接):在一个TCP连接的过程中,多个HTTP请求可以同时并行,下一个HTTP请求在上一个HTTP请求响应前就可以发起。服务端按照HTTP请求的顺序返回响应。(请求&响应采用FIFO模式)
- HTTP/1.1支持字节范围请求。向服务器请求数据的一部分,该功能通过在请求头中加入range参数来实现,在响应头中,使用Content-Range参数表明了返回的这部分数据的偏移和长度。(可以用于实现多线程下载。)
- HTTP/1.1新增了一批HTTP请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT
- HTTP/1.1 引入 ETag缓存处理,新增Cache-Control缓存控制
8. HTTPS
1. 概念
- 运行在SSL或者TLS协议所构建的安全层之上的HTTP协议,采用对称加密和非对称加密结合的方式。
2. HTTPS的通信过程
3. 对称加密和非对称加密
对称加密
- 通信双方使用一个密匙,该密匙既用于数据加密(发送方),也用于数据解密(接收方)
- 对称加密的一大缺点是**的管理与分配,换句话说,如何把**发送到需要解密你的消息的人的手里是一个问题。在发送**的过程中,**有很大的风险会被黑客们拦截。
非对称加密
- 非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对**,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对**中的一个进行加密,而解密则需要另一个**。
- 比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人–银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
4. TLS和SSL
- SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
- TLS(Transport Layer Security,传输层安全协议):由SSL发展而来,是SSL更安全。用于两个应用程序之间提供保密性和数据完整性,该协议由两部分组成:TLS记录协议和TLS握手协议,SSL和TLS仅保障传输层安全。
上一篇: 46.排列的所有可能组合
下一篇: http协议学习笔记