HTTP协议基础知识(上) | 青训营

114 阅读9分钟

HTTP协议基础知识(上) | 青训营

1. 基本概念

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通讯的格式。

2. HTTP协议的基本特点

  • 基于请求和响应:客户端向http服务器发起一次请求,服务器对请求做出响应,一来一回;
  • 无连接:无连接是指在应用层无连接,限制每次连接只处理一次请求,也就是说客户发起请求,服务器做出响应。连接即终止。这么做的原因是http是基于互联网的。服务器可能同时面对数十万,百万的请求。由于请求具有瞬时性,突发性。网页浏览具有联想性等等。造成相邻两次请求之间的关系可能不大。如果采用长时间连接的方式,大部分的网络资源就会被空闲下来,造成浪费。所以讲http协议设计成,请求时建立连接,响应时释放连接,以尽快将资源释放出来去服务其他客户端;
  • 无连接:无状态是指http协议没有记忆能力,当一次请求完毕后,它并不会将这次的数据保存下来,缺点是下次请求的数据与上次相关联的话,就得进行数据重传,可能会造成每次传输的数据量都很大;优点是在不需要上次的数据时,应答比较快;
  • 简单快递:协议简单,一来一回就结束(一次请求,一次应答,也是所谓的短连接),使得http服务器的程序规模小,不需要去处理太复杂的逻辑,因而通信速度很快;
  • 灵活:http协议允许传输任意类型的数据,类型由报文头部的Content-Type指出;

3. HTTP请求的简化过程

  • 1.建立TCP请求
  • 2.Web浏览器给Web service发送请求命令
  • 3.Web浏览器发送请求头信息
  • 4.Web服务器应答
  • 5.Web服务器发送应答头信息
  • 6.Web服务器向浏览器发送数据
  • 7.Web服务器关闭一个TCP链接

4. HTTP请求报文

请求报文分为四部分:请求行、请求报头信息、空行和请求数据4个部分组成

1) 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段,它们用空格分割POST http://job.xjtu.edu.cn/companyLogin.do HTTP/1.1;HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

(1) GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind;

(2) POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将数据发送给目的服务器,并且没有数据长度限制。

URL:URL地址用于描述一个网络上的资源,基本格式:

image.png

从上面的URL可以看出,一个完整的URL包括以下几个部分:

(1)协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符;
(2)身份验证:其实这一块信息我们看到的比较少,这是一个可选部分,一般的协议(http\https之类)都会使用默认的匿名形式进行数据获取,该部分使用的是@作为该部分的结束符号;
(3)域名部分:可以使用IP地址或域名,这是一个很关键的部分,这关系到你需要从哪个服务器上去获取资源;
(4)端口:服务器设定的端口。像URL地址里一般无端口,那是因为服务器协议的默认端口了,用户使用url访问服务器时,可以省略的;
(5)路径:访问的资源在服务器下的相对路径,不是在服务器的绝对路径,是服务器上的一个目录或者文件地址;
(6)参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“uid=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符;
(7)片段部分: 该部分与上面的?后面的表单信息本质的区别就是这部分内容不会被传递到服务器端。一般用于页面的锚。就是我们常见的网站右下角一般有一个回到顶部的按钮,一般就是使用其实现的。

2) 请求报头信息

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔,常见请求头如下:

  • Accept :通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级,例如:Accept: text/html,application/xhtml+xml,application/xml;q=0.
  • Accept-Charset :可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段 Accept 相同的是可用权重 q 值来表示相对优先级。例: Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
  • Accept-Encoding :用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码 例:Accept-Encoding: gzip, defla
  • Accept-Langua :告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集
  • Authorization :用来告知服务器,用户代理的认证信息(证书值)
  • Expect :来告知服务器,期望出现的某种特定行为,因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码 417 Expectation Failed
  • From :用来告知服务器使用用户代理的用户的电子邮件地址
  • Host :告知服务器,请求的资源所处的互联网主机名和端口号(必须被包含在请求内的首部字段)
  • If-Match :条件请求,为真时候才会执行请求),若和Etag的值一样则返回200,不一样返回412,若if-Match的值为*号,服务器会忽略
  • If-None-Match :只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理该请求。与 If-Match 首部字段的作用相反,在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。因此,这与使用首部字段 If-Modified-Since 时有些类似
  • If-Modified-Since :告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求,If-Modified-Since,属附带条件之一,它会告知服务器若 IfModified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应
  • If-Unmodified-Since :和 If-Modified-Since 的作用相反,是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响返回
  • Range :获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围,带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源
  • If-Range :该字段的值若是和etag值或更新的日期时间匹配一致,那么就作为范围请求处理,若不一致,则忽略范围请求,返回全部资源。如果服务器的资源有更新的情况下,若不使用该首部字段,则需要处理2次
  • Max-Forwards :通过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 MaxForwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目
  • Proxy-Authorization :接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息
  • Referer :告知服务器请求的原始资源的 URI
  • TE :告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码
  • User-Agent :会将创建请求的浏览器和用户代理名称等信息传达给服务器

3) 空行

请求头部的最后会有一个空行,表示请求头部结束,用于区分请求头部信息和请求正文。

4) 请求正文

可选部分,比如GET请求就没有请求正文,若方法字段是POST,则通常来说此处放置的就是要提交的数据;比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。