欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HTTP学习笔记

程序员文章站 2022-06-28 17:46:04
...

1. HTTP请求方法

1. GET

  • 用来请求已被URL识别的资源。
  • GET请求是幂等的,也就是说,每次请求GET的结果必须一样。
  • GET请求的参数放在url后面,大部分浏览器对url的长度有限制,因此,使用GET请求上传数据有大小限制。
  • GET上的数据类型只允许使用ASCII字符
  • GET请求的资源可以缓存

2. POST

  • 用于向服务器传送数据
  • POST请求的数据放在请求实体中
  • POST的数据类型没有限制,支持二进制数据

POST和GET的区别:

  1. GET请求数据放在url里面,传送数据有限;POST数据放在请求体,传送数据不限制大小。
  2. GET数据类型只能用ASCII码,post支持任意数据类型。
  3. GET请求的资源可以缓存,POST请求永远不缓存。
  4. POST请求较安全。
  5. GET请求一般用于请求资源,POST用于可能改变服务器状态。
  6. 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请求报文

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. 请求头

  • 紧接请求行的,因此和请求行没有分隔
  • 用来说明服务器要使用的附加信息,如下图:
    HTTP学习笔记

3. 请求实体

  • 请求头后面必须空一行,然后才到请求体,即使没有请求体,也要空一行。
    请求体可以添加任意的其他数据。

3. HTTP响应报文

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. 响应头

  • 用来说明客户端要使用的一些附加信息,也就是一些参数。
    HTTP学习笔记

3. 响应实体

  • 响应头后面必须空一行

4. 常见状态码

HTTP学习笔记

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给服务器的方法有两种:
    1. sesionId保存在Cookie中,在请求的时候把sessionId发送给服务器(Cookie:JSESSIONID=xxxx)
    2. URL重写的方式:把sessionId直接附加在URL路径后面,发送给服务器。
  • Session不会随着浏览器关闭而删除。一般来说浏览器关闭,存储sessionId的Cookie在关闭浏览器之后被删除了,因此,再次打开浏览器,去服务器找不到原来的sesion,就会觉得原来的session被删除了。
  • 一般会给session设置一个失效时间。当距离客户端上一次使用session的时间超过这个失效时间,服务器就认为这个客户端已经停止了活动,因此删除该session,以节省存储空间。

7. HTTP1.0和1.1

  1. HTTP/1.0支持长连接(Connecttion:Keep-alive),但是默认是短连接。HTTP/1.1,默认就是长连接
  2. HTTP/1.1支持chunked编码(分块编码)传输,分块传输编码允许服务器在最后发送消息头字段,实时生成消息长度。
  3. HTTP/1.1新增了请求流水线(管道化连接):在一个TCP连接的过程中,多个HTTP请求可以同时并行,下一个HTTP请求在上一个HTTP请求响应前就可以发起。服务端按照HTTP请求的顺序返回响应。(请求&响应采用FIFO模式)
  4. HTTP/1.1支持字节范围请求。向服务器请求数据的一部分,该功能通过在请求头中加入range参数来实现,在响应头中,使用Content-Range参数表明了返回的这部分数据的偏移和长度。(可以用于实现多线程下载。)
  5. HTTP/1.1新增了一批HTTP请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT
  6. HTTP/1.1 引入 ETag缓存处理,新增Cache-Control缓存控制

8. HTTPS

1. 概念

  • 运行在SSL或者TLS协议所构建的安全层之上的HTTP协议,采用对称加密和非对称加密结合的方式。

2. HTTPS的通信过程

HTTP学习笔记

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仅保障传输层安全。