一、什么是HTTP协议
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。
二、HTTP协议的版本
HTTP协议的版本:HTTP/1.0、HTTP/1.1
三、HTTP1.0和HTTP1.1的区别
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
在HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
四、HTTP请求
4.1、HTTP请求包括的内容
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。
一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容
范例:
4.2、HTTP请求的细节——请求行
请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*'的请求来测试服务器的功能性
- HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
- GET:向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
- PUT:向指定资源位置上传其最新内容
- DELETE:请求服务器删除Request-URL所标识的资源
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
GET和POST的区别
1.标准答案
GET在浏览器回退时是无害的,而POST会再次提交请求。GET产生的URL地址可以被Bookmark,而POST不可以。GET请求会被浏览器主动cache,而POST不会,除非手动设置。GET请求只能进行url编码,而POST支持多种编码方式。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。GET请求在URL中传送的参数是有长度限制的,而POST没有。对参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。GET参数通过URL传递,POST放在Request body中。
2.深入答案
GET和POST是HTTP协议中的两种发送请求的方法。HTTP是基于TCP/IP关于数据如何在万维网中如何通信的协议。(HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。)GET产生一个TCP数据包;POST产生两个TCP数据包。(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据))
4.3、HTTP请求的细节——消息头
HTTP请求中的常用消息头
accept:——浏览器通过这个头告诉服务器,它所支持的数据类型Accept-Charset: ——浏览器通过这个头告诉服务器,它支持哪种字符集Accept-Encoding:——浏览器通过这个头告诉服务器,支持的压缩格式Accept-Language:——浏览器通过这个头告诉服务器,它的语言环境Host:——浏览器通过这个头告诉服务器,想访问哪台主机If-Modified-Since:—— 浏览器通过这个头告诉服务器,缓存数据的时间Referer:——浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链Connection:——浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
例如:
1
|
< code class = "hljs lasso has-numbering" style = "display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;" >Accept: application/x< span class = "hljs-attribute" style = "box-sizing: border-box;" >-ms</ span >< span class = "hljs-attribute" style = "box-sizing: border-box;" >-application</ span >, image/jpeg, application/xaml< span class = "hljs-subst" style = "color: rgb(0, 0, 0); box-sizing: border-box;" >+</ span >< span class = "hljs-built_in" style = "color: rgb(102, 0, 102); box-sizing: border-box;" >xml</ span >, image/gif, image/pjpeg, application/x< span class = "hljs-attribute" style = "box-sizing: border-box;" >-ms</ span >< span class = "hljs-attribute" style = "box-sizing: border-box;" >-xbap</ span >, application/vnd< span class = "hljs-built_in" style = "color: rgb(102, 0, 102); box-sizing: border-box;" >.</ span >ms< span class = "hljs-attribute" style = "box-sizing: border-box;" >-excel</ span >, application/vnd< span class = "hljs-built_in" style = "color: rgb(102, 0, 102); box-sizing: border-box;" >.</ span >ms< span class = "hljs-attribute" style = "box-sizing: border-box;" >-powerpoint</ span >, application/msword, < span class = "hljs-subst" style = "color: rgb(0, 0, 0); box-sizing: border-box;" >*</ span >< span class = "hljs-comment" style = "color: rgb(136, 0, 0); box-sizing: border-box;" >/* Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jsp Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3) Accept-Encoding: gzip, deflate Host: localhost:8080 Connection: Keep-Alive</ span ></ code >< ul class = "pre-numbering" style = "box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);" >< li style = "box-sizing: border-box; padding: 0px 5px;" >1</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >2</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >3</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >4</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >5</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >6</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >7</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >8</ li ></ ul > |
五、HTTP响应
5.1、HTTP响应包括的内容
一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。
范例:
1
|
< code class = "hljs http has-numbering" style = "display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;" >< span class = "hljs-status" style = "color: rgb(0, 0, 136); box-sizing: border-box;" >HTTP/1.1 < span class = "hljs-number" style = "color: rgb(0, 102, 102); box-sizing: border-box;" >200</ span > OK</ span > < span class = "hljs-attribute" style = "box-sizing: border-box;" >Server</ span >: < span class = "hljs-string" style = "color: rgb(0, 136, 0); box-sizing: border-box;" >Apache-Coyote/1.1</ span > < span class = "hljs-attribute" style = "box-sizing: border-box;" >Content-Type</ span >: < span class = "hljs-string" style = "color: rgb(0, 136, 0); box-sizing: border-box;" >text/html;charset=ISO-8859-1</ span > < span class = "hljs-attribute" style = "box-sizing: border-box;" >Content-Length</ span >: < span class = "hljs-string" style = "color: rgb(0, 136, 0); box-sizing: border-box;" >105</ span > < span class = "hljs-attribute" style = "box-sizing: border-box;" >Date</ span >: < span class = "hljs-string" style = "color: rgb(0, 136, 0); box-sizing: border-box;" >Tue, 27 May 2014 16:23:28 GMT</ span > < span class = "xml" style = "box-sizing: border-box;" >< span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ><< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >html</ span >></ span > < span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ><< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >head</ span >></ span > < span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ><< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >title</ span >></ span >Hello World JSP< span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ></< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >title</ span >></ span > < span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ></< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >head</ span >></ span > < span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ><< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >body</ span >></ span > Hello World! < span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ></< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >body</ span >></ span > < span class = "hljs-tag" style = "color: rgb(0, 102, 102); box-sizing: border-box;" ></< span class = "hljs-title" style = "box-sizing: border-box; color: rgb(0, 0, 136);" >html</ span >></ span ></ span ></ code >< ul class = "pre-numbering" style = "box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);" >< li style = "box-sizing: border-box; padding: 0px 5px;" >1</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >2</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >3</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >4</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >5</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >6</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >7</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >8</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >9</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >10</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >11</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >12</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >13</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >14</ li >< li style = "box-sizing: border-box; padding: 0px 5px;" >15</ li ></ ul > |
5.2、HTTP响应的细节——状态行
状态行格式: HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK
2开头 (请求成功)表示成功处理了请求的状态代码。
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
3开头 (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
5开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
5.3、HTTP响应细节——常用响应头
HTTP响应中的常用响应头(消息头)
- Location: 服务器通过这个头,来告诉浏览器跳到哪里
- Server:服务器通过这个头,告诉浏览器服务器的型号
- Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
- Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
- Content-Language:服务器通过这个头,告诉浏览器语言环境
- Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
- Refresh:服务器通过这个头,告诉浏览器定时刷新
- Content-Disposition:服务器通过这个头,告诉浏览器以下载方式打数据
- Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
- Expires: -1 控制浏览器不要缓存
- Cache-Control: no-cache
- Pragma:no-cache
HTTP与HTTPS的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
一、HTTP和HTTPS的基本概念
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
二、HTTP与HTTPS有什么区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
三、HTTPS的工作原理
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
- 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
- Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
- 客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
- 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
- Web服务器利用自己的私钥解密出会话密钥。
- Web服务器利用会话密钥加密与客户端之间的通信。
四、HTTPS的优点
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:
- 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
- 谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
五、HTTPS的缺点
虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:
- HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
- HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
- SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
- SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
- HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。
六、http切换到HTTPS
如果需要将网站从http切换到https到底该如何实现呢?
这里需要将页面中所有的链接,例如js,css,图片等等链接都由http改为https。例如:http://www.baidu.com改为https://www.baidu.com
BTW,这里虽然将http切换为了https,还是建议保留http。所以我们在切换的时候可以做http和https的兼容,具体实现方式是,去掉页面链接中的http头部,这样可以自动匹配http头和https头。例如:将http://www.baidu.com改为//www.baidu.com。然后当用户从http的入口进入访问页面时,页面就是http,如果用户是从https的入口进入访问页面,页面即使https的。
到此这篇关于详解Http协议以及post与get区别的文章就介绍到这了,更多相关Http协议以及post与get区别内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/StackFlow/article/details/79606309