文章目录
1、HTTP概述
HTTP的全称是Hyper Text Transfer Protocol,超文本传输协议。是一个简单的请求-响应协议,属于应用层协议,建立在TCP协议的基础上。它指定了客户端可能发给服务器什么样的消息以及得到什么样的响应,所有的www服务器都基于该协议。
2、HTTP请求工作流程
HTTP协议工作的OSI模型的第七层,即最顶层应用层。HTTP协议的重要应用是www服务,下面是HTTP协议请求工作流程。
(1)用户在浏览器输入访问地址:http://www.baidu.com
(2)浏览器请求DNS进行域名解析,从而得到域名对应的IP地址
(3)浏览器将端口号(默认80)从访问地址中解析出来
(4)浏览器通过解析出来的IP和端口号与服务器之间进行tcp三次握手建立一条可靠的tcp连接
(5)三次握手建立好tcp连接后,浏览器向服务器发送一条http请求报文
(6)服务器响应并读取浏览器的请求信息,然后返回响应报文
(7)服务器关闭http连接,关闭tcp连接,浏览器显示访问内容到网页上
3、HTTP请求报文格式
举个例子如下:
请求行:说明了请求方法、请求URL和HTTP协议及版本
请求头(报文头、请求头部):说明是谁在发送请求,请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好地响应,请求头中信息的格式为key:value。
请求体(报文体、请求数据):客户端传递给服务器的数据。
4、URL格式
URL(Uniform Resource Locator),统一资源定位符,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器该怎么处理它。
URL的具体格式:
1、资源在哪台主机上——域名(dormain)或者ip来体现主机(host)
2、和主机上的哪个进程去获取资源——端口(port)
3、具体定位到是该进程管理的哪个资源——资源路径/路径(path)
4、URL设计之初,不仅仅为HTTP协议使用。所以需要表示出本次资源对应的协议(protocol/schema)
5、针对本次请求,除了资源本身之外的特殊要求。(查询字符串 query string、文档片段fragment)
5、请求方法
请求方法 | 说明 |
---|---|
GET | 向指定的资源发出“显示”请求。GET请求中会将请求中传递的数据包含在URL中并在浏览器的地址栏中显示。GET请求传递数据时要求数据必须是ASCII字符。GET请求可以被浏览器缓存。 |
POST | 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求传递数据时,数据可以试试ASCII字符也可以是字节型数据,默认为字符型。POST请求默认情况下不会被浏览器缓存。 |
HEAD | 向服务器索要与GET请求相一致的响应,只不过响应体不会被返回。这一方法在不必传输整个响应内容的情况下,就可以获取包含在响应消息头部中的元信息。 |
PUT | 向指定资源位置上传其最新内容。 |
DELETE | 请求服务器删除Request-URI所表示的资源。 |
TRANCE | 回显服务器收到的请求,主要用于测试或诊断。 |
OPTIONS | 使服务器传回资源所支持的所有HTTP请求方法。用‘*’代替资源名称,向web服务器发送options请求,可以测试服务器的功能是否正常运作。 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用户SSL加密服务器的链接(经由非加密的HTTP代理服务器)。 |
6、GET和POST的区别(重要,面试经常问)
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能被缓存 |
编码类型 | 只能进行URL编码(appliacation-x-www-form-urlencoded) | 支持多种编码(multipart/form-data等) |
历史 | 参数保留在浏览器历史中 | 参数不会保留在浏览器历史中 |
对数据长度的限制 | 当发送数据时,GET方法向URL添加数据;URL的长度是受限制的(URL的最大长度是2048个字符) | 无限制 |
对数据类型的限制 | 只允许ASCII字符 | 无限制,也允许二进制数据 |
安全性* | 与POST相比,GET的安全性较差,因为发送的数据时URL的一部分 | POST比GET更安全,因为参数不会被保存在浏览器历史或web服务器日志中。 |
可见性 | 数据在URL中对所有人都是可见的 | 数据不会被显示在URL中 |
*安全性:从传输的角度上来说,他们都是不安全的,因为HTTP在网络上是明文传输,只要在网络节点上抓包,就能完整获取数据报文。
7、常见报文头属性
字段 | 说明 | 示例 |
---|---|---|
Accept | 可接收额响应内容类型 | Accept:text/plain (文本类型) |
Accept-Charset | 可接收的字符集 | Accept-Charset: utf-8 |
Accept-Encoding | 可接受的响应内容的编码方式 | Accept-Encoding: gzip, deflate |
Accept-Language | 可接受的响应内容语言列表 | Accept-Language: en-US |
Accept-Datetime | 可接受的按照时间来表示的响应内容版本 | Accept-Datetime:Thu, 31 May 2007 20:35:00 GMT |
Cache-Control | 请求/回复中的,是否使用缓存机制 | Cache-Control: no-cache |
Connection | 客户端想要优先使用的连接类型 | Connection: keep-alive Connection: Upgrade |
Content-Length | 以8进制表示的请求体的长度 | Content-Length: 348 |
Content-Type | 请求体的MIME类型 | Content-Type: application/x-www-form-urlencoded |
Date | 发送该消息的日期和时间 | Date: Dec, 26 Dec 2022 17:30:00 GMT |
Expect | 表示客户端要求服务器做出特定的行为 | Expect: 100-continue |
From | 发起此请求的用户的邮件地址 | From: user@itbilu.com |
Host | 服务器域名和端口号,默认端口可省略 | Host: www.itbilu.com:80 or www.itbilu.com |
If-Match | 主要用于PUT,实体匹配才可以操作 | If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd” |
If-Modified-Since | 资源未被修改的情况下返回304未修改 | If-Modified-Since: Dec, 26 Dec 2022 17:30:00 GMT |
User-Agent | 浏览器的身份标识字符串 | User-Agent: Mozilla/ |
Upgrade | 要求服务器升级到一个高版本协议 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Via | 告诉服务器,这个请求是由哪个代理发出的 | Via: 1.0 fred, 1.1 itbilu.com.com (Apache/1.1) |
Referer | 表示跳转到当前页面的之前的页面 | Referer: http://itbilu.com/nodejs |
Origin | 发起一个针对跨域资源共享的请求 | Origin: http://www.itbilu.com |
8、HTTP状态码分类
分类 | 分类描述 |
---|---|
1XX | 信息,服务器收到请求,需要请求者继续执行操作 |
2XX | 成功,操作被成功接收并处理 |
3XX | 重定向,需要进一步的操作以完成请求 |
4XX | 客户端错误,请求包含语法 |
5XX | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的状态码及含义
状态码 | 含义 |
---|---|
200 | 请求成功,已经正常处理完毕 |
301 | 请求重定向,转移到其他URL |
302 | 请求临时重定向 |
304 | 请求被重定向到客户端本地缓存 |
400 | 客户端请求存在语法错误 |
401 | 客户端请求没有经过授权 |
403 | 客户端的请求被服务器拒绝,一般为客户端没有访问权限 |
404 | 资源未找到,客户端请求的URL在服务端不存在 |
500 | 服务端出现异常 |
HTTP状态码列表
状态码 | 英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议。 |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成。 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过次返回码清除浏览器的表单域。 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求。 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择。 |
301 | Moved Permanently | 永久移动。请求的资源已被永久地移动到新URL,返回信息会包括新的URL,浏览器会自动定向到新URL。今后任何新的请求都应使用新的URL代替。 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有的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 | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权。 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的PUT请求可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置。 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息。 |
414 | Request-URL Too Large | 请求的URL过程(URL通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中。 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
9、HTTP几个重要概念
连接:Connection
一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
在http1.1,request和reponse头中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理。
在http1.1中,client和server都是默认对方支持长链接的,如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。
消息:Message
HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连续传输。
请求:Request
一个客户端到服务器的请求消息包括应用于资源的方法,资源的标识符和协议的版本号。
响应:Response
一个服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
实体:Enity
数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
客户端:Client
一个为发送请求目的而建立连接的应用程序。
用户代理:User-Agent
初始化一个请求的客户机,它们是浏览器、编辑器或者其他工具。
代理:Proxy
一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其他客户机建立请求。请求时通过可能的翻译在内部或经过传递到其它服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
网关:Gateway
一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好像对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
通道:Tunnel
是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
缓存:Cache
反应信息的局域存储。
10、HTTP的特点
(1)支持客户端/服务器模型。
(2)简单快速
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有get,post,head。每种方法规定了客户与服务器联系的类型不同。由于http协议简单,使得http服务器的程序规模小,因而通信速度很快。
(3)独立灵活
http允许传输任意类型的数据对象。
(4)无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端的请求,然后响应,并受到应答后就断开连接。这种方式可以节省传输的时间。
(5)无状态
http是无状态协议。无状态指的是协议对于事务处理没有记忆能力。这种方式的一个坏处就是,如果后续的处理需要用到之前的信息,则必须重传,这样就导致了每次连接传输的数据量增大。好处就是,如果后续的连接不需要之前提供的信息,响应就比较快。为了解决http的无状态特性,出现了cookie和session技术。