HTTP协议简介
HTTP协议简介
先简单介绍一下五层网络协议。
- 物理层:实现物理层面的比特流传输,比如将0101转换成电压信号通过电缆传输。处于协议最底层。
- 链路层:局域网内的不同MAC地址之间的信息传输,数据包会封装MAC信息。
- 网络层:通过IP协议,实现不同IP地址间IP数据包(含有源ip和目的ip信息)的传输。
- 传输层:构建于IP协议之上,实现不同主机端口间的通信。如TCP、UDP协议。TCP传输的是数据流,该协议保证了数据包的有序、可靠传输。
- 应用层:各种网络应用会有自己独特的通信协议,比如邮件传输协议、ftp协议以及本文要讨论的http协议。
HTTP协议
HTTP协议全称为超文本传输协议(HyperText Transfer Protocol),是客户端(主要为浏览器)和服务端(网站)之间的通信标准,基于该协议构建了无处不在的万维网(world wide web)。HTTP通常基于TCP进行传输,由客户端发起对某一资源的请求,此时会建立到服务器指定端口(默认80)的TCP连接,服务端对该请求作出响应。HTTP协议规定了请求和响应的格式、请求方法和响应状态码等。
HTTP请求
当在浏览器地址栏输入www.baidu.com时,会发出如下请求(有简化):
GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: keep-alive
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
该请求符合以下格式标准:
请求行
请求头
[空行]
消息体[可选]
在上面请求信息中,请求行包含三项信息:
- 请求方法 -> GET
- 请求的资源路径 -> / 表示对网站根目录的请求,根据网站设定,通常是index.html或index.php。
- 协议 -> HTTP/1.1 HTTP第一个广泛使用的版本是1.0,这里使用1.1,最新的2.0协议也推出了。
对请求头的说明如下:
- Accept 告知server本客户端能够接受的回应内容类型(Content-Types)。
- Accept-Encoding 能够接受的编码方式。
- Accept-Language 能够接受的回应内容的自然语言列表。
- Connection 连接类型。keep-alive表示保持连接以备其它资源如css、图片等请求使用。
- HOST 主机信息,指定向哪个网站发出请求,除host外,头信息中其它内容都是可选的。
- User-Agent 客户端类型。不同浏览器一般都不一样,服务器可据此返回差异化内容。
根据需要,请求头中还可能携带其它信息。列举几个比较常用的:
- Cookie 由于http是无状态协议,cookie通常用来传递一些个性化信息,如PHPSESSID,据此实现了session会话控制,以保持用户状态。
- Referer 表示浏览器所访问的前一个页面,正是那个页面上的某个链接将浏览器带到了当前所请求的这个页面。
- If-Modified-Since 对应于HTTP响应头中的Last-Modified(资源最后修改时间),如果服务器发现资源在此时间后没被修改,则返回304 Not Modified响应,这样浏览器会直接使用本地缓存,节省了文件传输的消耗。
- If-None-Match 对应于HTTP响应头中的ETag(资源版本号)文件的唯一标志符,类似哈希或者指纹,如果文件发生变化,则ETag也会改变。服务器文件ETag与请求头中If-None-Match内容相同时,就发出304响应,否则返回新的文件。由于服务器时间可能不准确,ETag优先级高于Last-Modified。
- Range 请求资源的范围,一般为字节(可理解为“分页”)。可实现断点续传。
请求头结束后,会有一个空行,然后是可选的消息体,用来向服务器提交数据,如post请求的表单信息。本例中,请求没有消息体。
HTTP响应
请求到达baidu.com服务器后,处理完会发出如下响应:
HTTP/1.1 200 OK
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Fri, 30 Mar 2018 07:26:56 GMT
Expires: Fri, 30 Mar 2018 07:26:05 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
<!DOCTYPE html>
<!--STATUS OK-->
[省略html内容]
同样的,响应也有一定的格式:
状态行
响应头
[空行]
响应体
状态行中也包含三项信息:
- HTTP/1.1 协议版本
- 200 状态码(status code)。
- OK 状态描述
对响应头中各字段说明如下:
- Cache-Control 缓存控制,private 意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,中间的代理服务器不允许缓存;no-cache 不能缓存。
- Connection TCP连接选项。Keep-Alive 保持并复用该连接。
- Content-Encoding 内容编码方式 gzip 使用gzip压缩,则浏览器要用对应的方式解压。
- Date 服务器发出响应的时间。
- Expires 资源过期时间。
- Server 服务器软件类型。
- Set-Cookie 设置cookie。
除此之外,还有其它比较重要的响应头:
- Location 重定向。
- Access-Control-Allow-Origin 指定哪些网站可参与到跨来源资源共享过程中。
- Last-Modified 资源最后修改时间。
- Pragma 常见值no-cache。HTTP1.0可用此禁止缓存。
- ETag 资源的唯一标示符。
响应结束后,会有一个空行,然后是响应的正文,本例中是baidu.com首页的html内容。
HTTP请求方法
注:这一部分内容参考了中文wiki
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
- GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中。
- HEAD 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
- POST 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
- PUT 向指定资源位置上传其最新内容。
- DELETE 请求服务器删除Request-URI所标识的资源。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- OPTIONS 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
- CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP响应状态码
- 1** 服务器收到请求,需要请求者继续执行操作。
- 2** 成功,操作被成功接收并处理。典型的如200 OK,响应一切顺利。
- 3** 重定向,需要进一步的操作以完成请求,如304 Not Modified,资源未修改,用你的缓存吧。
- 4** 客户端错误,请求包含语法错误或无法完成请求。著名的404 Not Found 你要的东西没有哦。
- 5** 服务器错误,服务器在处理请求的过程中发生了错误。比如500 Internal Server Error,服务器内部错误,大概是程序员比较怕看到的。