HTTP基础知识详解
一、HTTP简介
◼HTTP (Hyper Text Transfer Protocol),译为超文本传输协议
◻是互联网中应用最广泛的应用层协议之一
◻设计HTTP最初的目的是:提供一种发布和接收HTML页面的方法,由URI来标识具体的资源
◻后面用HTTP来传递的数据格式不仅仅是HTML,应用非常广泛
◼HTML(Hyper Text Markup Language):超文本标记语言
◻用以编写网页
二、HTTP版本
◼1991年,HTTP/0.9
◻已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
◼1996年,HTTP/1.0
◻支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据)
◻浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接
◼1997年,HTTP/1.1(最经典、使用最广泛的版本)
◻支持PUT、DELETE等请求方法
◻默认采用持续连接(Connection: keep-alive),能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
◻HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:缓存处理/带宽优化及网络连接的使用/错误通知的管理/消息在网络中的发送/互联网地址的维护/安全性及完整性
◼2015年,HTTP/2.0
◼2018年,HTTP/3.0
◻最新版本,于2022年6月6日标准化为RFC9114。会抛弃使用TCP,通过UDP上使用QUIC来承载应用层数据。
三、HTTP标准
◼HTTP的标准
◻由万维网协会(W3C)、互联网工程任务组(IETF)协调制定,最终发布了一系列的RFC
◼RFC(Request For Comments,可以译为:请求意见稿)
◻HTTP/1.1最早是在1997年的RFC2068中记录的
√该规范在1999年的RFC 2616中已作废
√2014年又由RFC 7230系列的RFC取代
◻HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP/1.1成为HTTP的实现标准
◼中国的RFC
◻1996年3月,清华大学提交的适应不同国家和地区中文编码的汉字统一传输标准被IETF通过为RFC1922
◻成为中国大陆第一个被认可为RFC文件的提交协议
四、报文格式
请求信息
发出的请求信息(message request)包括以下几个:
- 请求行(例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件)
- 请求头(例如Accept-Language: en)
- 空行
- 其他消息体
请求行和标题必须以作为结尾。空行内必须只有而无其他空格。在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。
客户端请求
GET / HTTP/1.1
Host: www.google.com
(末尾有一个空行。第一行指定方法、资源路径、协议版本;第二行是在1.1版里必带的一个header作用于指定主机)
服务器应答
HTTP/1.1 200 OK
Content-Length: 3059
Server: GWS/2.0
Date: Sat, 11 Jan 2003 02:44:04 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqy
X9j; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Connection: keep-alive
五、HTTP请求方法
◼RFC 7231,section 4:Request methods:描述了8种请求方法
◻GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE
◼RFC 5789,section 2:Patch method:描述了PATCH方法
◼GET:常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的
◼POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
◼HEAD:请求得到与GET请求相同的响应,但没有响应体
◻使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载。以此可以节约带宽资源
◼OPTIONS:用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
◻OPTIONS * HTTP/1.1
◼PUT:用于对已存在的资源进行整体覆盖
◼PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
◼DELETE:用于删除指定的资源
◼TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
◼CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)
◻可以用来访问采用了SSL(HTTPS)协议的站点
六、状态码(Status Code)
◼在RFC2616 10.Status Code Definitions规范中定义
◻状态码指示HTTP请求是否已成功完成
◼状态码可以分为5类
◻信息响应:100~199
◻成功响应:200~299
◻重定向: 300~399
◻客户端错误:400~499
◼服务器错误:500~599
状态码列表
◼100 Continue
◻请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
◻允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(服务器通过请求头判断
◻在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
◼101 Switching Protocols:切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如切换到HTTP的新版本协议
◼200 OK:请求成功。一般用于 GET 和 POST 请求
◼201 Create:已创建。成功请求并创建了新的资源
◼202 Accepted:已接受。已经接受请求,但未处理完成
◼203 Non-Authoritative Information:非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
◼204 No Content:无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
◼205 Reset Content:重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
◼206 Partial Content:部分内容。服务器成功处理了部分GET请求
◼300 Multiple Choices:多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
◼301 Moved Permanently:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
◼302 Found:请求的资源被暂时的移动到了由Location头部指定的URL上
◼303 See Other:查看其它地址。与301类似。使用GET和POST请求查看
◼304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
◼305 Use Proxy:使用代理。所请求的资源必须通过代理访问
◼306 Unused:已经被废弃的HTTP状态码
◼307 Temporary Redirect:临时重定向。与302类似。使用GET请求重定向
◼400 Bad Request:由于语法无效,服务器无法理解该请求
◼401 Unauthorized:由于缺乏目标资源要求的身份验证凭证
◼402 Payment Required:保留,将来使用
◼403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
◼404 Not Found:服务器端无法找到所请求的资源
◼405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
◼406 Not Acceptable:服务器端无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应
◼407 Proxy Authentication Required:请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
◼408 Request Timeout:服务器想要将没有在使用的连接关闭
◻一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
◼409 Conflict:服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
◼410 Gone:客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通 过301代码指定资源的新位置
◼411 Request-URI Too Large:请求的URI过长(URI通常为网址),服务器无法处理
◼412 Precondition Failed:客户端请求信息的先决条件错误
◼413 Request Entity Too Large:由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
◼414 Request-URI Too Large: 请求的URI过长(URI通常为网址),服务器无法处理
◼415 Unsupported Media Type:服务器无法处理请求附带的媒体格式
◼416 Requested range not satisfiable:客户端请求的范围无效
◼417 Expectation Failed:服务器无法满足Expect的请求头信息
◼500 lInternal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
◼501 Not lmplemented:请求的方法不被服务器支持,因此无法被处理
服务器必须支持的方法(即不会返回这个状态码的方法)只有GET和HEAD
◼502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
◼503 Service Unavailable:服务器尚未处于可以接受请求的状态
◼500 lInternal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
◼501 Not lmplemented:请求的方法不被服务器支持,因此无法被处理
服务器必须支持的方法(即不会返回这个状态码的方法)只有GET和HEAD
◼502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
◼503 Service Unavailable:服务器尚未处于可以接受请求的状态
◻通常造成这种情况的原因是由于服务器停机维护或者已超载