HTTP 协议详解
一、概述
HTTP(超文本传输协议)是应用层上的一种客户端/服务端模型的通信协议,它由请求和响应构成,且是无状态的。
-
协议
协议规定了通信双方必须遵循的数据传输格式,这样通信双方按照约定的格式才能准确的通信。
-
无状态
无状态是指两次连接通信之间是没有任何关系的,每次都是一个新的连接,服务端不会记录前后的请求信息。
(Cookie的诞生就是用来解决HTTP无状态的特性导致无法满足交互式web的问题)
-
客户端/服务端模型
HTTP 报文是面向文本的,报文中每一个字段都是一些 ASCII 码串,各个字段的长度是不确定的。HTTP 协议包括 2 类报文:请求报文和响应报文。
二、HTTP 请求报文
HTTP 请求报文由请求行、请求头部、空行和请求数据4 部分组成,如图所示:
(1)请求行
请求行由请求方法字段、URL 字段和 HTTP 协议版本字段组成,它们用空格分隔,例如:GET /index.html HTTP/1.1.
其中URL具体为:
请求方法主要有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET 和POST 方法。
− GET:当客户端要从服务器中读取某个资源时,使用GET 方法。GET 方法要求服务器将URL 定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用GET 方法时,请求参数和对应的值附加在URL 后面,利用一个问号(“?”)代表 URL 的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
− POST:当客户端给服务器提供信息较多时可以使用POST 方法,POST 方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。GET 一般用于获取/查询资源信息,POST 会附带用户数据,一般用于更新资源信息。POST 方法将请求参数封装在HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据。
其他的:
(2)请求头部
请求头部由key/value 键值对组成,每行一对,key 和value 用冒号":"分隔,请求头部通知服务器有关于Client 的请求信息,典型的请求头如下:
− User-Agent:产生请求的浏览器类型。
− Accept:客户端可识别的响应内容类型列表,星号“*”用于按范围将类型分组,用“*/*”表示可接受全部类型,用“type/* ”表示可接受type 类型的所有子类型。例如:
− Accept-Language:客户端可接受的自然语言。
− Accept-Encoding:客户端可接受的编码压缩格式。
− Accept-Charset:可接受的应答的字符集。
− Host:请求的主机名,允许多个域名同处一个 IP 地址,即虚拟主机。
− connection:连接方式(close 或 keepalive)。
− Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的 cookie。
常见的请求头:
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器请求头结束。空行对于一个完整的 HTTP 请求来说空行是必须的,否则服务器会任务本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在 GET 方法中使用,而是在 POST 中使用。POST 方法适用于需要客户端填写表单的场合,与请求数据相关的最常用的请求头是Content-Type 和 Content-Length。
三、HTTP 响应报文
HTTP 响应报文由状态行、响应头部、空行和响应包体4 部分组成,如图所示:
(1)响应行:由协议版本、状态码和状态码的描述3 部分组成,它们之间使用空格隔开。
− 状态码由三位数字组成,第 1 位数字表示响应的类型,常用的状态码有 5 大类:
(2)响应头部。
响应头可能包括:
− Location:Location 响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回 Location 响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源。
− Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。
− Vary:指示不可缓存的请求头列表。
− Connection:连接方式。
− WWW-Authenticate:WWW-Authenticate 响应报头域必须被包含在401(未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization 报头域的请求。
常见的响应头:
(3)空行
最后一个响应头部之后是一个空行,发送回车符和换行符,通知客户端以下不再有响应头部。
(4)响应包体:服务器返回给客户端的文本信息。
四、总结
篇幅有限,自认为已经写得比较详细了,当然还有很多细节没有涉及,篇幅有限还需要以后进一步学习啊~
原文始发于微信公众号(学安全在路上):【必学基础】开天辟地第一篇,HTTP 了解一下~
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论