《浅谈HTTP协议》
——整合资源·共同学习
博主从网络上整合了一些讲解HTTP协议的文章,结合自身所学习的内容,对其进行了汇总。力求精简。文章主要从以下几个方面总结HTTP协议的基本内容:
1.基本概念;2.方法;3.无状态协议;4.TCP连接;5.数据传输流程;6.状态码;7.WEB缓存;8.安全性HTTPS
HTTP服务器至少应实现GET和HEAD方法,其他的方法可选。在WEB应用中,常用的是POST方法。
问,GET和POST有什么区别?
1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. 而POST方法是把提交的数据放在HTTP包的Body中。
2、GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
3、GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
无状态协议:
协议的状态是指下一次传输可以“记住”这次传输信息的能力。HTTP属于无状态协议 为什么?
HTTP是不会为了下一次连接而维护这次连接所传输的信息,这是为了保证服务器内存。
比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
由于Web服务器要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。
由于Web服务器不保存发送请求的Web浏览器进程的任何信息,因此HTTP协议属于无状态协议(Stateless Protocol)。
HTTP协议是无状态的和Connection: keep-alive的区别:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
如何解决HTTP无状态的问题?
可以通过Cookie和Session来保存状态信息。
Cookie和Session有以下明显的不同点:
1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。
4. TCP 连接
HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。
在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。
TCP 建立连接需要三次握手,断开连接时需要四次挥手。
问:为什么是三次握手而非两次?
答:三次握手改成仅需要两次握手,死锁是可能发生。
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。这样就形成了死锁。
数据的传输过程中,从应用层到传输层,网络层,再到链路层,发送端每经过一层,就会增加相应的首部;接收端则每往上传播一层,则会剔除相应的首部,直到应用层,获取到的是原始的 HTTP 数据。
6 状态码
类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success (成功状态码) 请求正常,处理完毕
3XX Redirection (重定向状态码) 要求进行附加操作以完成请求
4XX Client Error (客户端错误状态码) 服务器无法处理请求
5XX Server Error (服务器错误状态码) 服务器处理请求出错
2XX:正确响应
200:正确处理;
204:No content,服务器已正确处理,但是响应实体中没有主体;
206:Partial content,对于请求头中包含 content-range 字段的,响应一部分数据;
3XX:重定向
301:Moved permanently,永久重定向,响应头中包含的 location 字段为重定向后的结果;
302:Found,临时重定向,请求的资源已被分配到新的URI,希望用户本次使用新URI(临时的意思是指以后有可能再变回来)。
303:See other, 请求的资源存在另一个URI,请以 GET 方式去获取。
304:Not modified,客户端发送附带条件(if-modified-since, if-range 等条件)的请求时,服务端资源已经找到,但是不符合条件。(304 响应中没有响应实体,和重定向没有关系)
4XX:客户端错误
400:Bad request,请求报文中有语法错误。
401:Unauthorized,请求需要 HTTP 认证(BASIC / DIGEST 认证,请求头中应包含 www-authenticate 字段)。
403:Forbidden,请求的资源被服务器拒绝了;
404:Not found,服务器上没有找到请求的资源。
5XX:服务器错误
500:Internal server error,服务器在执行请求时发生了错误。
503:Service unavailable,服务器处于超负载状态或者正在进行停机维护,现在无法处理请求。
注:状态码和情况不一致,如服务器发生错误,但是仍然返回 200 的状态码,这种情况也很常见。
7 WEB缓存
WEB缓存(cache)位于Web服务器和客户端之间。
缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。
HTTP协议定义了相关的消息头来使WEB缓存尽可能好的工作。
缓存的优点:
减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快。
减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。
客户端缓存生效的常见流程:
服务器收到请求时,会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。
Web缓存机制:
HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。
HTTP定义了3种缓存机制:
1)Freshness:允许一个回应消息可以在源服务器不被重新检查,并且可以由服务器和客户端来控制。例如,Expires回应头给了一个文档不可用的时间。Cache-Control中的max-age标识指明了缓存的最长时间;
2)Validation:用来检查以一个缓存的回应是否仍然可用。例如,如果一个回应有一个Last-Modified回应头,缓存能够使用If-Modified-Since来判断是否已改变,以便判断根据情况发送请求;
3)Invalidation:在另一个请求通过缓存的时候,常常有一个副作用。例如,如果一个URL关联到一个缓存回应,但是其后跟POST、PUT和DELETE的请求的话,缓存就会过期。
8. 安全性HTTPS
HTTPS
HTTPS 相对于 HTTP 就是在应用层和传输层之间添加了 SSL / TLS (加密身份验证层)。默认端口443。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL通过互相认证、使用数字签名确保完整性、使用加密确保机密性,以实现客户端和服务器之间的安全通讯。如图所示。
SSL 证书就是遵守 SSL协议的服务器数字证书,由受信任的证书颁发机构(CA机构),验证服务器身份后颁发,部署在服务器上,具有网站身份验证和加密传输双重功能。HTTPS协议的通信过程:
使用HTTPS通信的优点:
客户端产生的密钥只有客户端和服务器端能得到;
加密的数据只有客户端和服务器端才能得到明文;
客户端到服务端的通信是安全的。
转载自http://blog.csdn.net/mengzhengyu1025/article/details/51050880