http协议与web本质

当你在浏览器地址栏敲入“http://www.csdn.net/”,然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的)。作为一个开发者,尤其是web开发人员,我想你有必要去了解这一系列的处理流程,在这期间,浏览器和服务器到底是如何打交道的?服务器又是如何处理的?浏览器又是如何将网页显示给用户的呢?......

疑惑和细节真是太多了。坦白讲,要想彻彻底底的弄清楚以上每个疑惑和处理细节,至少需要十本书的厚度,所谓“底层无极限”嘛,而且不同的web服务器和服务器端编程语言的实现和处理流程不尽相同(但本质都是相通的)。本文中,我将根据http协议的有关知识,跟大家讲解一些web开发的本质。不管你是从事.NET,还是J2EE或者php开发等等,都离不开这些本质。希望你读完本文,能有新的收获和见解。由于本人水平和经验有限,难免有误,望读者见谅。


何为http协议(Hypertext Transfer Protocol,超文本传输协议)

所谓协议,就是指双方遵循的规范。http协议,就是浏览器和服务器之间进行“沟通”的一种规范。我们在看空间,刷微博...都是在使用http协议,当然,远远不止这些应用。

笔者一直听说http是属于“应用层的协议”,而且是基于TCP/IP协议的。这个不难理解,如果你上大学时候学过“计算机网络”的课程,就一定知道OSI七层参考协议(我当时是死记硬背的)。如果你接触过socket网络编程,就应该明白TCP和UDP这两种使用广泛的通信协议(建立连接、三次握手等等,当然,这不是本文讨论的重点)。如图:

既然TCP/UDP是广泛使用的网络通信协议,那为啥有多出个http协议来呢?

笔者曾自己动手写过一个简单的web服务器处理软件,根据我的推断(不一定准确)。UDP协议具有不可靠性和不安全性,显然这很难满足web应用的需要。

而TCP协议是基于连接和三次握手的,虽然具有可靠性,但人具有一定的缺陷。但试想一下,普通的C/S架构软件,顶多上千个Client同时连接,而B/S架构的网站,十万人同时在线也是很平常的事儿。如果十万个客户端和服务器一直保持连接状态,那服务器如何满足承载呢?

这就衍生出了http协议。基于TCP的可靠性连接。通俗点说,就是在请求之后,服务器端立即关闭连接、释放资源。这样既保证了资源可用,也吸取了TCP的可靠性的优点。

正因为这点,所以大家通常说http协议是“无状态”的,也就是“服务器不知道你客户端干了啥”,其实很大程度上是基于性能考虑的。以至于后来有了session之类的玩意。


实战准备工作:

在监视网络方面,windows平台上有一款叫做Sniffer的优秀软件,这也是很多“黑客”经常使用的嗅探工具。 在研究http协议时,推荐大家使用一款

叫作httpwatch的工具。(遗憾的是,该工具是收费的。该咋办就咋办,你懂的)。安装完成后,可以在IE浏览器的tools中直接打开(目前也支持firefox)。如图所示:








点击Record,就可以开始监视并记录http消息了。stop、Clear等等按钮的功能,这里就不一一介绍了。拿实例来说话,下面就是我记录访问main.aspx页面的时候记录的,能够清晰的看到http报文消息的详细信息,如图:


学习http协议,主要需要了解http的请求和响应(当然,还有get、post等请求方式,状态码、URI、MIME等)


首先看看http请求消息(就是浏览器丢给服务器的):


一个http请求代表客户端浏览器向服务器发送的数据。一个完整的http请求消息,包含一个请求行,若干个消息头(请求头),换行,实体内容

请求行:描述客户端的请求方式、请求资源的名称、http协议的版本号。 例如: GET/BOOK/JAVA.HTML HTTP/1.1

请求头(消息头)包含(客户机请求的服务器主机名,客户机的环境信息等):
Accept:用于告诉服务器,客户机支持的数据类型  (例如:Accept:text/html,image/*)
Accept-Charset:用于告诉服务器,客户机采用的编码格式
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
Accept-Language:客户机语言环境
Host:客户机通过这个服务器,想访问的主机名
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等)
Cookie:客户机通过这个头,将Coockie信息带给服务器
Connection:告诉服务器,请求完成后,是否保持连接
Date:告诉服务器,当前请求的时间

(换行)
实体内容:
就是指浏览器端通过http协议发送给服务器的实体数据。例如:name=dylan&id=110
(get请求时,通过url传给服务器的值。post请求时,通过表单发送给服务器的值)
 
再看看HTTP响应消息(服务器返回给浏览器的):

一个http响应代表服务器端向客户端回送的数据,它包括:
一个状态行,若干个消息头,以及实体内容

响应头(消息头)包含:
Location:这个头配合302状态吗,用于告诉客户端找谁
Server:服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding:告诉浏览器,服务器的数据压缩格式
Content-Length:告诉浏览器,回送数据的长度
Content-Type:告诉浏览器,回送数据的类型
Last-Modified:告诉浏览器当前资源缓存时间
Refresh:告诉浏览器,隔多长时间刷新
Content-Disposition:告诉浏览器以下载的方式打开数据。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg");                                        context.Response.WriteFile("aa.jpg");
Transfer-Encoding:告诉浏览器,传送数据的编码格式
ETag:缓存相关的头(可以做到实时更新)
Expries:告诉浏览器回送的资源缓存多长时间。如果是-1或者0,表示不缓存
Cache-Control:控制浏览器不要缓存数据   no-cache
Pragma:控制浏览器不要缓存数据          no-cache

Connection:响应完成后,是否断开连接。  close/Keep-Alive
Date:告诉浏览器,服务器响应时间

理解了以上的http请求消息和响应消息,相信你对于http协议已经理解得足够深刻了。关于http协议的更多具体细节,可以参照http RFC文档

大致步骤就是:浏览器先向服务器发送请求,服务器接收到请求后,做相应的处理,然后封装好响应报文,再回送给浏览器。浏览器拿到响应报文后,再通过浏览器引擎去渲染网页,解析DOM树,javascript引擎解析并执行脚本操作,插件去干插件该干的事儿...关于浏览器渲染、解析的原理,可以参考http://kb.cnblogs.com/page/129756/

说白了,所谓web的本质,无非是:请求/处理/响应 ,任何的web服务器,任何的服务端编程语言,都没法脱离这个本质。 而浏览器端解析html、图片等静态内容,呈现给用户,脚本引擎执行脚本代码,完成脚本代码要做的事儿(例如dom操作,css属性更改,发送ajax请求等等)。

笔者浅浅的认为,其实浏览器就是一种特殊的Client,而B/S架构也是一种特殊的C/S架构。这里值得一提的是,不同的web服务器和编程语言,又是如何接收用户http请求。如何处理,如何响应的呢?笔者拿熟悉的ASP.NET为例,通过反编译工具查看源代码(微软这家伙实在封装的太好了)从底层进行了剖析,如图:


由于篇幅有限,无法再继续将asp.net、iis web服务器的细节及底层实现再做进一步地进行剖析了。因为微软的asp.net技术体系实在庞大,而且很复杂。有时间笔者会继续更新系列文章,欢迎读者继续关注。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker storage driver 选择

2019独角兽企业重金招聘Python工程师标准>>> Docker storage driver 选择 博客分类: docker 本文的目的是说明,如何在生产环境中选择Docker 的storage driver。以及对应Linux发行版本下Docker storage driver的配置方法。主要参考&#xff0c…

手机网站制作html5,【怎么样制作手机网站】如何使用dreamweavercs6建立手机网站?织梦手机WAP浏览模块如何制作手机网站?如何制作html5手机页面?...

【怎么样制作手机网站】如何使用dreamweavercs6建立手机网站?织梦手机WAP浏览模块如何制作手机网站?如何制作html5手机页面?下面就和小编一起来看看吧!如何使用dreamweavercs6建立手机网站?制作步骤如下:1。打开DreamweaverCS6软件,可以在DreamweaverCS6软件的开…

如果在docker中部署tomcat,并且部署java应用程序

2019独角兽企业重金招聘Python工程师标准>>> 如果在docker中部署tomcat,并且部署java应用程序 博客分类: docker 1、先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7&…

Spring Boot结合thymeleaf

之前在Eclipse里写了个Spring Boot响应jsp的小demo,后来发现打成jar包导出之后找不到jsp文件了。经过在网上查阅信息与资料,发现Spring Boot对于jsp的支持其实是不好的,而且在一些书中和官方都明确表示没有办法支持在jar包中打入jsp文件。虽然…

视觉测量简介

1.1 视觉测量技术 1.1.1 现代检测技术的发展趋势 检测技术是现代化工业的基础技术之一,是保证产品质量的关键。在现代化的大生产之中,涉及到各种各样的检测。随着工业制造技术和加工工艺的提高和改进,对检测手段、检测速度和精度提出了更…

高并发系统之降级特技

2019独角兽企业重金招聘Python工程师标准>>> 高并发系统之降级特技 博客分类: 架构 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。之前已经有一些文章介绍过缓存和限流了。本文将详细聊聊降级。当访问量剧增、服务出现问题&a…

freeradius 3.0 时间限制_创意营销3.0新模式下,易企秀要成为中国的Adobe

近几年,随着大数据和人工智能技术的发展,智能化、程序化营销在国内获得高速发展。从以创意内容、提升效率的工具到现在驱动企业数字化转型的智能营销,营销云在国内的热度与成熟度不断提升。营销云起源于“Enterprise Marketing Software Suit…

抢占式和非抢占式的进程调度

非抢占式(Nonpreemptive) 让进程运行直到结束或阻塞的调度方式 容易实现 适合专用系统,不适合通用系统 抢占式(Preemptive) 允许将逻辑上可继续运行的在运行过程暂停的调度方式 可防止单一进程长时间独占…

图形学基础知识

本篇主要给大家介绍图形学基础知识,了解Unity图像渲染机制,以及图像渲染管线流程。 主要是因为伴随着VR/AR的飞速发展,为了满足VR高清高帧率的极限渲染,着色器编程(Shader)也成为了Unity程序开发人员的必备…

调度队列模型

调度队列模型及准则 1 仅有进程调度的调度队列模型: 每个进程在执行时都可能出现以下三种情况: (1) 任务在给定的时间片内已经完成,该进程便在释放处理机后进入完成状态 (2) 任务在本次分得的时间片内尚未完成,OS便将该任务再放入…

数据库相关整理

一、MySQL 1、mysql如何做分页 mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize 2、mysql引擎有哪些,各自的特点是什么? http://www.cnblogs.com/ctztake/p/8453990.html 3、数据库怎么建立索引 create index account_…

api接口怎么对接_系统对接项目管理方面怎么做?从一次项目接口对接说起

故事:最近业务方有一个新的业务合作模式,需要与第三方公司进行系统的对接,原本预期2周可以完成的项目,最后要用到3周时间才能完成,出现的现象其实还挺典型的,也不是没遇到过,因为自己这边的进度…

周转时间 平均周转时间 带权周转时间 平均带权周转时间

1.周转时间 2.平均周转时间 平均周转时间是对n个而言的 3.带权周转时间 真正的运行时间指的是进程占有处理机的时间 4.平均带权周转时间 即n个平均的带权周转时间

unity应用开发实战案例_「简历」STAR法则的实战应用,附手把手教学案例

关注应届生求职网,了解更多求职信息本文共2072字,预计阅读需3分钟本期分享导师-Anna_青云导师51Job职场导师知乎职场千赞答主多年猎头及多行业人力资源管理经历职业生涯规划师、职业生涯咨询师、心理咨询师终身学习践行者、斜杠青年、职场教练在简历优化…

SOA架构设计经验分享—架构、职责、数据一致性

1.背景介绍2.SOA的架构层次 2.1.应用服务(原子服务)2.2.组合服务2.3.业务服务(编排服务)3.SOA化的重构 3.1.保留服务空间,为了将来服务的组合4.运用DDDGRASP进行分析和设计(防止主观的判断导致错误的假设&a…

计算机设备没有音频,电脑没有音频设备怎么办

有些朋友的的电脑没有声音,任务栏右下角也没有小喇叭声音图标,进入到控制面板里面的声音选项里面去设置,在“音量”项目中显示“没有音频设备”,很多朋友遇到这种情况不知道应该怎么解决,今天笔者就电脑没有音频设备怎…

全志科技公司A83T Qt 支持双屏显示

目前A83T支持单屏显示,首屏为LCD或者首屏为hdmi,都使用无论使用SCREEN0还是SCREEN1都是使用FB0作为framebuffer,在android下可以实现LCD和HDMI同样屏幕显示,而我们需要LCD和HDMI分别显示。FrameBuffer采用的是linux下的framebuffe…

明日之后怎么跳过实名认证_明日之后宝箱达人活动怎么玩 明日之后宝箱达人可以开箱多少次...

《明日之后》宝箱达人是今天游戏中更新的活动,玩家们在部分的野外地图中可以找到宝箱。很多玩家都想知道这个宝箱获得的奖励是什么。接下来就让小编给大家带来明日之后宝箱达人活动奖励介绍,一起来看看吧。明日之后宝箱达人活动介绍 一、活动时间2020年9…

JVM内存模型与垃圾回收GC

Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM。在C中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情况。在Java中JVM内置了垃圾回收的机制&#x…