1、HTTP协议简介

1.1 协议概念

通信计算机双方必须共同遵守的一组约定,只有遵守这个约定,计算机之间才能互相通信

1.2 HTTP与HTTPS协议

(1)HTTP协议(HyperText Transfer Protocol):超文本传输协议,是一种发布和接收HTML页面的方法,是明文传输
(2)HTTPS(HyperText Transfer Protocol over SSL):超文本传输安全协议,在http下加入SSL层,是密文传输
(3)SSL(Secure Sockets Layer 安全套接层):主要用于web的安全传输协议,在传输层对网络进行加密保障在Internet上数据传输的安全;

1.3 HTTP与HTTPS的端口号

  • HTTP的端口号为:80
  • HTTPS的端口号为:443


    2、HTTP的请求与响应

    2.1 HTTP的通信

    HTTP通信由两部分组成: 客户端请求消息 与 服务器响应消息

02_http_pro.jpg

2.2 HTTP通信过程

  1. 当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
  2. 当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。
  3. 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
  4. 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。

2.3 URL

URL:统一资源定位符,是用于完整的描述Internet上网页和其他资源地址的一种标识方法;

url基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:协议,指使用的是哪种协议(http、https、ftp…)
  • host:服务器主机,要请求的域名或ip地址
  • port#:服务器的端口(不写则走协议默认的端口,80、443)
  • path:访问的资源路径
  • query-string:参数,发送给服务器的数据,通常以 ?表示参数开始,有时是 #
  • anchor:锚(跳转到当前页面的某一个位置),通常以 # 开始

3、http报文结构

3.1 http报文

1.3HTTP协议简介 - 图2

3.2 请求报文

1.3HTTP协议简介 - 图31.3HTTP协议简介 - 图4

示例:

  1. GET / HTTP/1.1
  2. Host: www.baidu.com
  3. Connection: keep-alive
  4. Cache-Control: max-age=0
  5. Upgrade-Insecure-Requests: 1
  6. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36
  7. Sec-Fetch-Mode: navigate
  8. Sec-Fetch-User: ?1
  9. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
  10. Sec-Fetch-Site: same-origin
  11. Referer: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=Python%20%20%E6%89%8B%E5%8A%A8%E5%9B%9E%E6%94%B6%E5%9E%83%E5%9C%BE&oq=Python%2520%25E6%2594%25B6%25E5%2588%25B0%25E5%259B%259E%25E6%2594%25B6%25E5%259E%2583%25E5%259C%25BE&rsv_pq=f5baabda0010c033&rsv_t=1323wLC5312ORKIcfWo4JroXu16WSW5HqZ183yRWRnjWHaeeseiUUPIDun4&rqlang=cn&rsv_enter=1&rsv_dl=tb&inputT=2315&rsv_sug3=48&rsv_sug2=0&rsv_sug4=2736
  12. Accept-Encoding: gzip, deflate, br
  13. Accept-Language: zh-CN,zh;q=0.9
  14. Cookie: BIDUPSID=4049831E3DB8DE890DFFCA6103FF02C1;

1、http请求方法

方法 作用 HTTP协议版本 请求行例子
GET 向服务器获取资源 1.1、1.0 GET / HTTP/1.1
POST 向服务器发送数据 1.1、1.0
HEAD 获得报文头部 1.1、1.0
PUT 从客户端向服务器传送的数据取代指定的文档的内容。 1.1
DELETE 请求服务器删除指定的资源 1.1

GET与POST请求的区别
习惯上的区别

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有(是受浏览器、服务器的限制)。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。


    但是它们的本质都是 TCP 链接,并无区别;只是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中可能会有所不同。
    **

    GET VS POST

  1. 多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。
  2. GET请求能够被cache,POST不进行缓存。,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)
  3. GET参数是带在URL后面,POST请求放在请求体Request Body中。传统IE中URL的最大可用长度为2083字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制。
  4. GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制,而且某些数据只能用 POST 方法「携带」,比如 file。
  5. 全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。
  6. GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)。

post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?

幂等操作特点是(以GET为例):任意多次执行所得到的结果,与一次执行得到的结果相同。 POST则不是幂等操作,因为每次得到的结果都可能不同。

https://www.jianshu.com/p/ea99c1e4f6a4
https://juejin.im/entry/597ca6caf265da3e301e64db

2、常见请求报头

  • Host请求的主机地址(域名或ip);

**

  • Connection:连接方式;keep-alive:长连接;close:关闭常连接;

  • Pragma:缓存控制,nocache不缓存;Pragma是HTTP/1.0版本有的,而Cache-Control是HTTP/1.1版本才有的;

  • Cache-Control:缓存控制,响应的内容在客户端是否缓存(缓存多久),no-cache不缓存,max-age=3600,缓存最大的有效时间为3600s;

  • Upgrade-Insecure-Requests:1 ,升级不安全请求,将http自动转为https;

  • User-Agent浏览器的版本信息,内核;

**

  • Accept:浏览器可接受的文件类型,如:/、text/html、text/plain、img/、application/xml、text/xml; application与text的区别:在一次响应中,有两个地方可以指定响应内容的格式,一个是响应头的content-type字段,另一个是xml的序言部分(prolog,e.g. <?xml version=”1.0”, encoding=”UTF-8”?>)。根据定义,如果是text/ 则在解析响应体内容时,首先会根据响应头指定的格式,如果响应头没有指定,则使用ASCII,忽略xml序言中指定的格式。如果是application/* 则首先使用xml序言中指定的格式,而后使用响应头中指定的格式,如果都没有指定才使用ASCII格式解析。


  • Referer:当前请求是从哪个url跳转过来的,用户是从Referer页面访问到当前页面;

**

  • Accept-Language:客户端可接受的自然语言;


  • Accept-Encoding:客户端可接受的编码压缩格式(可能是导致乱码的原因之一);

  • Cookie浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息;


3.3 响应报文

1.3HTTP协议简介 - 图5http HTTP/1.1 200 OK Bdpagetype: 1 Bdqid: 0xdbeb11ea000cfef4 Cache-Control: private Connection: keep-alive Content-Encoding: gzip Content-Type: text/html Cxy_all: baidu+642857607c537ed21fa04bcfb54ff6ee Date: Thu, 02 Jan 2020 06:32:55 GMT Expires: Thu, 02 Jan 2020 06:32:51 GMT Server: BWS/1.1 Set-Cookie: delPer=0; path=/; domain=.baidu.com Set-Cookie: BDSVRTM=6; path=/ Set-Cookie: BD_HOME=0; path=/ Set-Cookie: H_PS_PSSID=1448_21096_30210_30283_30504; path=/; domain=.baidu.com Strict-Transport-Security: max-age=172800 Traceid: 1577946775028760116215846779410554093300 Vary: Accept-Encoding X-Ua-Compatible: IE=Edge,chrome=1 Transfer-Encoding: chunked 1、常见状态码

  • 100-199:表明服务器已成功接收部分请求,需要客户端继续提供其余请求才可完成整个请求过程;
  • 200-299:表明请求成功;常用200 OK;
  • 300-399: 重定向(redirect)到其它地方。它让客户端再发起一个请求以完成整个处理;常用302:暂时重定向,301:永久重定向;
  • 400-499:客户端的请求有错误;常用404:服务器无法找到被请求的页面,403:服务器拒绝访问,权限不够;
  • 500-599:服务器端出现错误;常用500:表示服务器发生不可预期的错误,导致无法完成客户端的请求;



2、响应报头

  • Cache-Control:must-revalidate, no-cache, private。
  • 这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要从新请求服务器,不能从缓存副本中获取资源。

  • Connection:keep-alive

  • 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。

  • Content-Encoding:gzip

  • 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

  • Content-Type:text/html;charset=UTF-8

  • 告诉客户端,资源文件的类型,还有字符编码客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

  • Date: Thu, 02 Jan 2020 06:32:55 GMT

  • 这个是服务端发送资源时的服务器时间GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

相关单词

HyperText Transfer Protocol:超文本传输协议;
source:起源、来源
parse:分析,已经整理好了;
scheme:计划、方案、协议
uniform:制服、校服、统一的
resource:资源
locator:定位、定位点
cache:缓存、匿藏、隐藏
accept:接受、认可
Referer:来源网址、提交方
refer:涉及、提到
application:申请、请求
bookmarks:书签
content:内容、目录 满足、满意