HTTP协议笔记
文章目录
一.HTTP协议简介
(1)什么是HTTP协议?
- HTTP协议是(Hyper Text Transfer Protocol 超文本传输协议)的缩写
- HTTP协议是 一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件,查询结果等)
- HTTP协议是属于应用层的面向对象的协议,由于其简捷,快速的方式,适用于分布式超媒体信息系统
- 用于从万维网(www == World Wide Web)服务器传输
超文本
到本地浏览器的传送协议- 超文本: 是超级文本*的中文缩写。*超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本
- HTTP协议工作于客户端/服务端架构之上
- 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求
- WEB服务器根据接收到的请求后,向客户端发送响应信息
--------------------------------------------- HTTP请求/响应图-----------------------------------------------
(2)HTTP协议的特点
- 简单快速
● 客户向服务器请求服务时,只需传送请求方法和路径,请求方向学用的有GET,POST,HEAD等.每种方法规定了客户与服务器联系的类型不同.由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快 - 灵活
● HTTP允许传输任意类型的数据对象.正向传输的类型由Content-Type加以标记 - 无连接(短连接)
● 无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,这样可节省时间 - 无状态
● HTTP协议是无状态协议,无状态协议是指协议对于事务处理没有记忆能力(每次连接之间没有记忆)- 缺少状态意味着,如果处理后续处理需要前面的信息,则它必须要重传,这样可能导致每次连接传送的数据量增大
- 另一方面,在服务器不需要先前信息时,它的应答就较快
- 支持B/S以及C/S模式
二.URL详解
(1)什么是URL?
- URL,全称(Uniform Resource Locator),中文名叫统一资源定位符,是互联网上用来标识某一处资源的地址
- HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接,URL是一种特殊的URI,包含了用于查找某个资源的足够的信息
(2)URL详解
- 从下面的例子分析
http://www.mrsunflower.cn:8080/obsessed/index.html?userID=5&username=fei&page=1#name
|--1--|--------2---------|-3--|---4----|---5------|-------------6--------------|-7--|
- 从上面的URL可以看出,一个完整的URL包括以下几个部分
- 协议部分
● 该URL的协议部分为http
,这代表网页使用的是HTTP协议
● 在Internet中可以使用很多种协议,如HTTP,FTP等等
● http后面的//
为分隔符 - 域名部分
● 该URL的域名部分为www.mrsunflower.cn
● 除了上面之后,一个URL还可以使用IP地址作为域名使用 - 端口部分
● 跟在域名后面的就是端口,域名和端口之间使用:
进行分隔
● 端口并不是一个URL必须的部分,如果不写明端口地址,则默认会使用80端口 - 虚拟目录部分
● 从域名后面的第一个/
起,到最后一个/
中间的,就是虚拟目录部分
● 虚拟目录不是必须的,本例中使用的是 “/obsessed/” - 文件名部分
● 从虚拟目录或者域名后的最后一个/
开始,到?
为止,则是文件名
● 如果没有?
,则从虚拟目录或者域名后的最后一个/
开始到#
为止是文件名
● 如果没有?
和#
,那么从域名的最后一个/
开始到结束都是文件名 - 参数部分
● 从?
开始到#
之止,之间的部分都是参数部分,又称为搜索部分,查询部分
● 参数可以有多个,一般来说参数都是key=value
格式的,多个参数之间使用&隔开 - 锚部分
● 从#
开始到最后,都是锚部分
● 锚部分也不是一个URL必须的组成部分
- 协议部分
(原文:http://blog.csdn.net/ergouge/article/details/8185219 )
(3)URI与URL的区别
-
URI是 Uniform Resource Identifier ,统一资源定位符,用来唯一标识一个资源
- Web上可用的每种资源,如HTML,图像,视频片段,程序等,都是由一个URI来定位的
- URI一般由三部分组成
- 访问资源的命名机制
- 存放资源的主机名
- 资源自身的名称,由路径表示,着重强调资源
-
URL是 Uniform Resource Locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源
- URL是Internet上用来描述信息资源的字符串,主要用来在各种www客户端程序和服务器程序上,特别是著名的Mosic(Mosaic,是互联网历史上第一个获普遍使用和能够显示图片的网页浏览器)
- 采用URL可以统一用一种统一的格式来描述各种信息资源,包括文件,服务器的地址和目录等
- URL一般由三部分组成
- 协议(或称为服务方式)
- IP地址+端口号
- 主机中资源的具体地址(目录,文件名等)
三.HTTP之请求消息Request
(1)Request请求格式
- 请求行(request line)
- 请求头部(header)
- 空行()
- 请求数
(2)HTTP请求消息结构图
(3)GET请求例子
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mrsunflower.cn
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
-
详解
-
请求行:用来说明
请求类型
,要访问的资源
以及所使用的HTTP版本
POST /562f25980001b1b106000338.jpg HTTP/1.1 请求类型 要访问的资源 HTTP版本
-
请求头:说明服务器要使用的附加信息
● 从第二行起,到空行为止,是请求头部分
Host img.mukewang.com User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Accept image/webp,image/*,*/*;q=0.8 Referer http://www.imooc.com/ Accept-Encoding gzip, deflate, sdch Accept-Language zh-CN,zh;q=0.8
● Host:请求的目的地
● User-Agent:浏览器信息,由发送的浏览器定义
● accept:告诉服务端客户接收什么样的响应
● Referer:表示这个请求是从哪个URL过来的
● Accept-Encoding:申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),这里不是指字符编码
● Accept-Language:申明浏览器自己接收的语言 -
空行,请求头部后面的空行是必须的
● 即使第四部分的请求数据为空,也必须有空行
-
请求数据:也叫主体,可以添加任意的其他数据
● 本例的主体为空
-
(4)POST请求例子
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:30
Connection: Keep-Alive
name=mrsunflower&password=666
-
详解
- 请求行 : 第一行表明了是post请求,以及http1.1版本。
- 请求头部:第二行至第六行。
● Content-Type:表示具体请求中的媒体类型信息
● Content-Length:这个头信息只适用于 POST 请求,并给出 POST 数据的大小(以字节为单位)。
● Connection:这个头信息指示客户端是否可以处理持久 HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求来检索多个文件。值 Keep-Alive 意味着使用了持续连接。 - 空行:第七行的空行。
- 请求数据:第八行。
四.HTTP之响应消息Response
- 一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
(1)HTTP响应组成部分
- 状态行
- 消息报头
- 空行
- 响应正文。
(2)格式图解
(3)例子
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
(4)Response详解
1.状态行
HTTP/1.1 200 OK
- HTTP协议版本号
- 状态码
- 状态消息
2.消息报头
-
作用:用来说明客户端要使用的一些附加信息
-
信息
-
Date:生成响应的日期和时间
-
Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
…
-
3.空行
- 消息报头后面的空行是必须的
4.响应正文
- 服务器返回给客户端的文本信息
- 空行后面的HTML部分为响应正文
五.HTTP之状态码
(1)HTTP状态码分类
分类 | 简介 | 详细描述 |
---|---|---|
1XX | 信息 | 服务器收到请求 |
2XX | 成功 | 操作被成功处并处理 |
3XX | 重定向 | 需要近一步的操作以完成请求 |
4XX | 客户端错误 | 请求包含语法错误或无法完成请求 |
5XX | 服务器错误 | 服务器在处理请求的过程中发生了错误 |
(2)常用的状态码
状态码 | 信息 |
---|---|
200 | 请求成功 |
301 | 资源(网页等),被永久重定向 |
404 | 请求的资源(网页等)不存在 |
500 | 内部服务器错误 |
(3)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 | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
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-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
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协议的版本,无法完成处理 |
六.请求方法
(1)HTTP1.0(定义了三种请求方法)
-
POST
● 向指定资源提交数据进行处理请求(表单提交,文件上传等)
● 数据被包含在请求体中
● POST一般用于处理新增或修改资源 -
GET
● 请求指定的页面信息,并返回实体主体。
-
HEAD
● 类似于get请求,只不过响应中没有具体的内容,用于获取报头
(2)HTTP1.1(新增五种,共八种方法)
- PUT
● 从客户端向服务器传送的数据取代指定的文档的内容 - DELETE
● 请求服务器删除指定的页面。 - CONNECT
● HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 - OPTIONS
● 允许客户端查看服务器的性能。 - TRACE
● 回显服务器收到的请求,主要用于测试或诊断。
七.HTTP的工作原理
- HTTP协议定义web客户端如何从web服务器请求web页面,以及服务器如何把web页面传送给客户端
- HTTP协议采用了请求/响应(request/response)模型
HTTP请求/响应步骤
- 客户端连接到web服务器
● 客户端(一般是浏览器)与web服务器的HTTP端口(默认为80)建立一个TCP套接字(Socket)连接 - 发送HTTP请求
● 通过TCP套接字,客户端向web服务器发送一个文本的请求报文
● 一个请求报文,由请求行,请求头,空行,请求数据四部分组成 - 服务端接受请求并返回HTTP响应
● web服务器解析请求,定位请求资源
● 服务器将复本写到TCP套接字中,由客户端读取
● 一个响应由状态行,响应头部,空行,响应数据4部分组成 - 释放TCP连接
● 若connection模式为false,则服务器主动关闭TCP连接,客户端则被动关闭连接,释放TCP连接
● 若connection模式这keep-alive,则该连接保持一段时间,在该时间可以继续接收请求 - 客户端浏览器解析为HTTP内容
● 客户端浏览器首先解析状态行,查看表明请求行是否成功的状态代码
● 然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集
● 客户端浏览器读取响应数据HTML,根据HTML语法对其进行格式化,并在浏览器容器中显示
例: 在浏览器地址输入URL后,按下回车之后会经历以下的流程
- 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
- 解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接
- 浏览器以出读取文件(URL域名后面部分对应的文件)的HTTP请求,该请求作为TCP三次握手的第三个报文数据发送给服务器
- 服务器对浏览器请求作出响应,并把对应的HTML文本发送给浏览器
- 释放TCP连接
- 浏览器将该HTML文本显示内容
八.GET请求和POST请求的区别
(1)地址栏显示不同
- GET
- 请求的数据会附在URL之后(就是放置在HTTP协议头中),以
?
分割URL和传输数据,以&
连接多个参数
- 请求的数据会附在URL之后(就是放置在HTTP协议头中),以
- POST
- 把提交的数据放置在HTTP包的包体中,
- 因此,GET提交的数据会在地栏上显示,POST提交,地址栏则不会变
(2)传输数据的大小上限不同
- HTTP协议并没有对传输的数据的大小进行限制,HTTP也没有对URL长度进行限制
- GET
- 特定的浏览器和服务器对URL的长度有限制,因此GET提交时,传输数据可能会受到URL长度的影响
- POST
- 由于不是通过URL传值,理论上数据不受限.但实际上,各个服务器会规定对post提交数据大小进行限制
(3)安全性不同
- POST的安全性是要高于GET的,因为地址栏可见,浏览记录可见,
- 使用GET提交数据,可能会造成Cross-site request forgery攻击
(4)JAVA中取值不同
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
------------------------此博客部分学习自ranyonsue的<<关于HTTP协议,一篇就够了>>一文,致谢作者!!-------------------------------