HTTP协议
超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。HTTP使用TCP而不是UDP的原因在于(打开一个)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
从层次的角度看,HTTP是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
交互过程如下:
那么在浏览器输入URL,会经历以下过程:
①浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址。
②解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接。
③浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器。
④服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器。
⑤释放 TCP连接。
⑥浏览器将该 html 文本并显示内容
HTTP协议的特点
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP工作原理
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程分为四步:
(1)客户与服务器建立连接
首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。
(2)客户向服务器提出请求
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
(3)服务器接受请求,并根据请求返回相应的文件作为应答
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
(4)客户与服务器关闭连接
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
HTTP报文格式
HTTP报文由三部分组成:
(1)起始行:
报文的第一行就是起始行,用于区分是请求报文还是响应报文,请求报文中开始行叫做请求行,而响应报文中,开始行叫做状态行。在开始行的三个字段之间都用空格分开,结尾处 CRLF 表示回车和换行。
(2)首部行:
起始行后面有零个或多个字段。每个字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔,首部以一个空行结束。
用于说明浏览器、服务器或报文主体的一些信息。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行结束时,还有以空行将首部行和后面的实体分开。
(3)实体主体:
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体是要发送给服务器的数据;响应主体是要返回给客户端的数据。在请求报文中一般不用这个字段,而在响应报文中也可能没有这个字段。
Request请求报文
HTTP请求报文——从客户向服务器发送请求报文
请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1。方法字段就是HTTP使用的请求方法,比如常见的GET/POST
请求头:浏览器向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。
实体:若方法字段是GET,则此项为空,没有数据。若方法字段是POST,则通常来说此处放置的就是要提交的数据
请求报文实例
GET /sqli-labs-master/Less-1/ HTTP/1.1 #请求方法为POST,请求URL为/test/login.html,HTTP协议版本为HTTP/1.1
Host: 127.0.0.1 #客户机通过这个头告诉服务器,想访问的主机名
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 #指定用户代理服务器的类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate #指出发送此请求的浏览器支持哪些压缩编码方式。
DNT: 1
X-Forwarded-For: 8.8.8.8
Connection: close #是在告知服务器本浏览器不想使用永久连接方式(HTTP/1.0使用非永久连接,HTTP/1.1默认使用永久连接)
Upgrade-Insecure-Requests: 1 #表示能读懂服务器发过来的上面这条信息
请求方法
方法字段指出客户请求服务器执行的一般操作。HTTP/1.1中定义了八种请求方法,其中GET、POST、HEAD、是常用请求方法。
方法 | 描述 |
---|---|
GET | 获取一个URL指定的资源,即资源实体。 |
POST | 传输实体主体,向服务器提交数据。 |
HEAD | 获取一个指定资源的信息,类似GET方法,区别在于只返回报文首部,不返回报文主体。 |
PUT | 向服务器提交资源,用来传输文件。 |
DELETE | 请求源服务器删除Request-URI标识的资源,用来删除文件。 |
TRACE | 网络跟踪 |
CONNECT | 与PROXY之间的连接管理,要求用隧道协议连接代理。 |
OPTIONS | 查询能力,询问支持方法返回服务器支持的方法。 |
GET和POST之间的区别
1、GET方法的数据参数是暴露在起始行的URL中的,而POST方法的数据参数是在报文主体中的。
2、GET方法相对来说没有POST安全,因为它的数据参数可以直接从URL中获取,但是GET的效率更高。
3、GET方法的数据参数大小有一定的限制(1024)(原因也是因为它的数据参数是放在URL中的),而POST对数据大小是没有限制的。
其实他们的本质区别是GET是从服务器上请求数据,而POST是向服务器发送数据
请求报文属性
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔
常见请求头如下:
Client-IP:提供了运行客户端的机器的IP地址
From:提供了客户端用户的E-mail地址
Host:给出了接收请求的服务器的主机名和端口号
Referer:提供了包含当前请求URI的文档的URL,服务器能知道你是从哪个页面过来的
UA-Color:提供了与客户端显示器的显示颜色有关的信息
UA-CPU:给出了客户端CPU的类型或制造商
UA-OS:给出了运行在客户端机器上的操作系统名称及版本
User-Agent:将发起请求的应用程序名称告知服务器
Accept:告诉服务器能够发送哪些媒体类型
Accept-Charset:告诉服务器能够发送哪些字符集
Accept-Encoding:告诉服务器能够发送哪些编码方式
Accept-Language:告诉服务器能够发送哪些语言
TE:告诉服务器可以使用那些扩展传输编码
Expect:允许客户端列出某请求所要求的服务器行为
Range:如果服务器支持范围请求,就请求资源的指定范围
Cookie:客户端用它向服务器传送数据
Cookie2:用来说明请求端支持的cookie版本
Upgrade-Insecure-Requests:表示能读懂服务器发过来的上面这条信息,并且在以后发请求的时候不用http而用https
Response响应报文
HTTP响应报文——从服务器到客户的回答
HTTP的请求报文由三部分组成 : 状态行 、 首部行和实体 , 如下图 :
响应报文实例
HTTP/1.1 200 OK #HTTP协议及版本 状态码
Date: Mon, 29 Mar 2021 02:57:52 GMT #服务器创建并发送本响应消息的日期和时间。
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 #服务器和版本号
Last-Modified: Mon, 29 Mar 2021 02:57:07 GMT #对象本身的创建或最后修改日期或时间
ETag: "8e-5bea4098d63cb" #缓存相关的头
Accept-Ranges: bytes #标识自身支持范围请求(partial requests)
Content-Length: 142 #所发送对象的字节数
Connection: close #处理完这次请求后是否断开连接还是继续保持连接
Content-Type: text/html #包含在实体中的对象是HTML文本
响应状态码
HTTP 响应代码,状态代码由服务器发出,以响应客户端对服务器的请求。
请求报文的方法字段是对所请求对象进行的操作,而响应报文的状态码是一个 3 位数字,可以分为以下 5 类 :
状态码类别 | 描述 |
---|---|
1xx | 收到请求,继续处理。 |
2xx | 请求已成功接收,理解和接受 |
3xx | 重定向到其它地方 |
4xx | 客户的差错,请求包含错误的语法或无法满足。 |
5xx | 服务器的差错,服务器无法满足明显有效的请求。 |
常见的状态码:
状态码 | 描述 | 说明 |
---|---|---|
200 | OK | 表示从客户端发送给服务器的请求被正常处理并返回 |
204 | No Content | 表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分 |
301 | Moved Permanently | 永久重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL。 |
302 | Found | 临时重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL。 |
304 | Not Modified | 缓存文件并未过期,还可继续使用,无需再次从服务端获取 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器识别 |
401 | Unauthorized | 未经许可,需要通过HTTP认证 |
403 | Forbidden | 服务器接收到请求,但是拒绝提供服务。 |
404 | Not Found | 请求资源不存在 |
500 | Internal Server Error | 服务器内部错误 |
503 | Server Unavailable | 服务器暂时不能处理客户端的请求 |
响应报文属性
Age:(从最初创建开始)响应持续时间
Public:服务器为其资源支持的请求方法列表
Retry-After:如果资源不可用的话,在此日期或时间重试
Server:服务器应用程序软件的名称和版本
Title:对HTML文档来说,就是HTML文档的源端给出的标题
Warning:比原因短语更详细一些的警告报文
ETag:一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。
Accept-Ranges:对此资源来说,服务器可接受的范围类型
Vary:服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端
Proxy-Authenticate:来自代理的对客户端的质询列表
Set-Cookie:服务端可以设置客户端的Cookie,以便服务器对客户端进行标识。
Set-Cookie2:与Set-Cookie类似
WWW-Authenticate:来自服务器的对客户端的质询列表