Skip to content

Latest commit

 

History

History
109 lines (92 loc) · 6.41 KB

2.md

File metadata and controls

109 lines (92 loc) · 6.41 KB

了解HTTP

HTTP是协议,是TCP/IP协议族内的一部分。作用是客户端和服务端之间的通信。一个简单点的说法就是浏览器跟网页的通信。

客户端发送请求(request),服务端响应请求(response)。打开百度,点击F12,查看一个name叫www.baidu.com的文件,下面的Request Headers就是客户端发送请求时,带的请求头信息。

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: ……
  1. GET 请求方法
    请求方法有很多种,而常用的有四种。
    GET:用于请求服务器资源
    PUT:传输文件,对资源进行修改
    POST:传输实体主体,创建一个新的资源
    DELETE:删除文件
  2. HTTP/1.1
    HTTP的版本号,毕竟他是一个协议,不是什么花里胡哨的东西。
  3. Host
    告知服务器,请求的资源所处的互联网主机名和端口号。
  4. Connection
    HTTP是无状态协议,也就是说他不会保存上一次请求的状态,每一次请求都是一个新的,不保留之前的请求头信息。这样做可以更快速的处理事务。
    但是随着互联网的发展以及普及。每一次访问都要建立一个TCP/IP连接,然后处理一个HTTP请求与响应。服务器逐渐承受不住通信量的增加,于是在原有的HTTP的基础上增加了一个持久连接,也就是添加一个keep-alive
    持久化连接使得多数请求以管线化方式发送成为可能。也就是说不用等待响应,也可以直接发送下一个请求。
  5. Cookie
    因为HTTP协议的无状态,虽然能够减少CPU和内存的资源消耗。但是不可避免的在某些时刻会出现矛盾。比如说一个用户登陆了,但是下一次再查看该服务器的时候,又要重新登录一遍,用户体验极差。
    于是引入了Cookie技术。没有Cookie信息状态下请求服务器,服务器会返回一个set-cookie让客户端保存下来,第二次访问的时候,客户端就会带上这个cookie,服务器检查了cookie,识别出了客户端信息。
  6. Accept-Encoding
    服务器传输资源,为了提高效率会将资源进行压缩发送。在HTTP中被称为内容编码。常用的编码有
    • gzip (GNU zip)
    • compress (UNIX系统的标准压缩)
    • deflate (zlib)
    • identity (不进行编码)
      这个字段说明客户端能够接受的编码有哪几种。分别是gzip, deflate, br。
      要知道数据的传输不是一次性传输,而是分割成一小块一条块传输的,可以看TCP/IP协议了解。

    有的时候我们获取一个图片,但是由于图片太大,接收一半的时候,连接断掉了。重新接收,难道又要重头开始吗?并不是的,他会检测需要的剩余资源,然后头信息里包含一个Range来告诉服务器需要资源的范围。服务器识别后,返回这个范围的资源。有点像浏览器下载到一半暂停,然后重新下载对不对。

  7. Accept-Language
    客户端愿意接受的语言,这里显示接受zh-CN也就是中文

    Accept 有多种用法。

  8. pragma
    由于 Pragma 在 HTTP 响应中的行为没有确切规范,所以不能可靠替代 HTTP/1.1 中通用首部 Cache-Control,尽管在请求中,假如 Cache-Control 不存在的话,它的行为与 Cache-Control: no-cache 一致。建议只在需要兼容 HTTP/1.0 客户端的场合下应用 Pragma 首部。
  9. Cache-Control
    no-cache:强制要求缓存服务器在返回缓存的版本之前将请求提交到源头服务器进行验证。防止从缓存中返回过期的资源。
  10. User-Agent
    将创建请求的浏览器和用户代理名称等信息传达给服务器。爬虫偶尔踩不到信息的原因可能是这个未添加导致使用默认的被服务器识别禁止的缘故。所以可以添加一个User-Agent。
HTTP/1.1 200 OK
Bdpagetype: 2
Bdqid: 0xbc445acb0001f151
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Fri, 28 Dec 2018 09:20:18 GMT
Expires: Fri, 28 Dec 2018 09:20:18 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=125; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1438_25810_21117_18559_28206_28131_26350_27750_28140; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
  1. HTTP/1.1 HTTP版本号

  2. 200OK 服务器响应状态码

    • 1XX:Informational(信息行状态码),接收的请求正在处理
    • 2XX:Success(成功状态码),请求正常处理完毕
    • 3XX:Redirection(重定向状态码),需要进行附加操作以完成请求
    • 4XX:Client Error(客户端错误状态码),服务器无法处理请求
    • 5XX:Server Error(服务器错误状态码),服务器处理请求出错
  3. set-Cookie 让客户端保存这个cookie,保证下一次访问的时候能识别这个客户端信息。

  4. Cache-Control
    public:公共缓存,private:私有缓存
    "public" 指令表示该响应可以被任何中间人(译者注:比如中间代理、CDN等)缓存。若指定了"public",则一些通常不被中间人缓存的页面(译者注:因为默认是private)(比如 带有HTTP验证信息(帐号密码)的页面 或 某些特定影响状态码的页面),将会被其缓存。
    而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。

  5. Connection 保持持久连接。

  6. Content-Encoding
    服务器使用的编码

  7. Content-Type
    报文主体的对象类型,text/html是字段值。

  8. Date 创建HTTP报文的日期和时间

  9. Transfer-Encoding
    规定了传输报文主体时采用的编码方式。

还有许多的基础首部字段,可以通过谷歌的方式查询用法