是时候该了解一下啦:什么是HTTP协议呢
http协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
http是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
http是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
http协议工作于客户端-服务端架构为上。浏览器作为http客户端通过URL向http服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
讲到http协议,我们首先简单了解什么是url?
在浏览器输入URL,会经历以下过程:
③ 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器。
④ 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器。
⑤ 释放 TCP连接。
⑥ 浏览器将该 html 文本并显示内容
HTTP 协议一共有五大特点:
支持客户/服务器模式
简单快速
灵活
无连接
无状态(重点介绍无连接和无状态)
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
早期这么做的原因是 HTTP 协议产生于互联网,因此服务器需要处理同时面向全世界数十万、上百万客户端的网页访问,但每个客户端(即浏览器)与服务器之间交换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的联想性、发散性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端占用资源。因此 HTTP 的设计者有意利用这种特点将协议设计为请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
随着时间的推移,网页变得越来越复杂,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。后来,Keep-Alive 被提出用来解决这效率低的问题。
Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。市场上的大部分 Web 服务器,包括 iPlanet、IIS 和 Apache,都支持 HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive 功能对资源利用的影响尤其突出。
协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive,而HTTP/1.1默认是支持长连接的,有没有这个请求头都行。
无状态
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
|
1、Http请求消息结构:
抓包的request结构如下:
注:每行数据后面都有/r/n
请求首行:GET为请求类型, / 为要访问的资源,HTTP/1.1是协议版本
请求头部:从第二行起为请求头部,Host指出请求的目的地(主机域名);User-Agent是客户端的信息,它是检测浏览器类型的重要信息,由浏览器定义,并且在每个请求中自动发送。
空行:请求头后面必须有一个空行。
请求数据:请求的数据也叫请求体,可以添加任意的其它数据。
2、响应:
状态行:状态行由协议版本号、状态码、状态消息组成。
响应头:响应头是客户端可以使用的一些信息,如:Date(生成响应的日期)、Content-Type(MIME类型及编码格式)、Connection(默认是长连接)等等。
空行:响应头和响应体之间必须有一个空行。
响应体:响应正文。
3、HTTP常见Header
|
常见的http状态码:
200:OK //客户端请求成功
400:Bad Request //客户端请求有语法错误,不能被服务器所理解
401:Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403:Forbidden //服务器收到请求,但是拒绝提供服务
404:Not Found //请求资源不存在,eg:输入了错误的URL
500:Internal Server Error //服务器发生不可预期的错误
503:Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
下面讲一下GET和POST的区别:
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.(注意对于用户登录来说,get是不安全的,网页直接显示你的用户名和密码) POST方法是把提交的数据放在HTTP包的Body中。
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。当然,安全只是相对的,不管是GET还是POST都能直接获取到数据