学习分享:HTTP请求流程
  

李佳伟_长沙办_技术支持 3220

{{ttag.title}}
首先,说一下HTTP协议是如何工作的。HTTP属于TCP/IP模型中的应用层协议,而两个应用程序(我们这里指的就是浏览器与服务器)之间要进行互相通信,首先得建立TCP连接,然后浏览器才能向服务器发送请求信息,服务器在接受到请求信息后,返回相应的应答信息,浏览器接收到来自服务器的应答信息后,对这些数据进行解释执行。  
在HTTP1.0的版本中,浏览器的每次请求(也就是对每一个页面的访问)都要求建立一次单独的连接,在处理完每一次的请求后,就自动释放连接。(这点我们应该都有感觉,比如我们访问一个页面,当该页面在浏览器中显示出来的时候,我们可以拔掉网线,此时该页面上的信息并不会丢失。)而当我们请求的网页文件中有很多图片、音乐、电影等信息时,服务器返回的信息中并不直接包含图片数据,而只是保存该图片的链接,当浏览器进行解释的时候,遇到图片的URL时,才向服务器发出对图片的请求信息。可见如果一个网页中包含多个图片数据时,将会频繁的与服务器建立连接,与释放连接,这无疑会造成资源的浪费。HTTP1.0 请求模式如下图:
     
而HTTP1.1则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。HTTP1.1请求模式:
  

      HTTP请求消息      
1次完整的HTTP请求消息包括:一个请求行、若干消息头以及实体内容,而消息头和实体内容可以没有,消息头和实体内容间有一个空行。      
我们来看一个例子(为了便于说明,我在每行前加了序号):            
1 Get /mattmarg/ HTTP/1.0            
2 User-Agent: Mozilla/2.0 (Macintosh; I; PPC)            
3 Accept: text/html; */*            
4 Cookie: name = value            
5 Referer: http://www.XXX.com/a.html      
其中,第1行就是请求行:请求方式为Get(除了Get之外,还有Post、Put、Delete方式),请求的文件位于"根目录/mattmarg/"下,当然也可以直接给出需要的页面(如:/mattmarg/index.asp,也可以加上一些其它字段 如:/mattmarg/index.asp?id=1&uid=xxx。
当我们通过Get请求时,提交给服务器的请求行长度不能超过1K,而如果利用Post方式,则是把所提交的信息以实体内容形式发送给服务器,所以如果服务器没有限制的话,原则上讲可以传输无限大的内容),HTTP/1.0 表示了http的版本为1.0。其余几行就是消息头了,消息头主要是用来向服务器传达某种信息或指示。如告诉服务器自己的终端(User-Agent)是什么(如果是浏览器则返回相应的浏览器型号),终端所可以解释的类型(Accept)是什么,是从哪个页面提交的请求(Referer),以及浏览器所能解释的语言(Accept-Language)等等。
我们这里拿Accept-Language来举个例子,大家都知道hotmail在中国大陆显示的是简体中文,而在其它的国家则显示对应的语言,这个是怎么做到的呢?其实就是浏览器向服务器递交的请求信息中包含了Accept-Language,而我们的浏览器默认是zh-cn,然后服务器在接受到该信息时返回对应的页面。      我们可以通过以下方法来验证一下:      
1、打开浏览器->工具->internet选项->常规选项卡
2、选择"语言",可见默认的语言是中文
     3、选择"添加",选择一种语言,然后调节一下优先顺序
     4、确定之后,我们再访问一下http://www.hotmail.com/,发现原来的简体中文全都成了繁体字了。      
HTTP响应消息      
HTTP响应消息的格式为:一个状态行、若干消息头和实体内容,其中消息头和实体内容可以没有,消息头和实体内容间有一个空行。      
我们依旧先来看一个例子:            
01 HTTP/1.1 200 OK            
02 Server: Microsoft-IIS/5.1            
03 X-Powered-By: ASP.NET            
04 Date: Sun, 06 Jul 2008 11:01:21 GMT            
05 Content-Type: text/html            
06 Accept-Ranges: bytes            
07 Last-Modified: Wed, 02 Jul 2008 01:01:26GMT            
08 ETag: "0f71527dfdbc81:ade"            
09 Content-Length: 46            
10            
11 <html><head></head><body>adfasfa</body></html>
其中,01行是状态行,用于显示服务器响应的状态,HTTP/1.1显示了对应的HTTP协议版本,200为状态数字,OK为状态信息用于解释状态数字(这里OK对应200,表示请求正常);02~09是消息头部分,10为空行,11为实体内容(也就是服务器返回的网页内容)。      
实验:如何利用Telnet来模拟HTTP请求      
1、打开"运行"->cmd进入命令环境;      
2、输入"telnetwww.baidu.com 80",回车后 ,屏幕为全黑,此时我们利用快捷键"Ctrl+](右中括号)"来打开本地回显功能,这样我们就可以看见我们所打的东西了,如图:(注本阶段执行过程和以下的过程均要求操作时间尽可能短,因为时间一长,便会被认为断开连接。)
3、单击回车,进行编辑状态。      
4、输入:"GET /HTTP/1.1"后回车,在第二段接着输入:"HOST:"然后按两个回车,这样一个简单的HTTP请求就完成了,接着只要再按下回车,便向服务器递交这个请求了。如图:(我们来看一下这个是什么意思:GET表示请求方式,/表示请求的根目录下的文件,HTTP/1.1表示HTTP协议版本)
5、接收服务器返回,这步其实不需要我们来做,因为当我们发送请求后,只需几秒钟,我们便会收到来自服务器反应.
6、这样,请求就算完成了。下面我们在百度中搜一下"1",浏览器中的地址应该是:http://www.baidu.com/s?wd=1.看看请求是怎么样的
以上就是用GET方式进行请求。
PS:关于HTTP头部更详细的分析,请参考《HTTP请求头字段分析.doc

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

SteveNiaobs 发表于 2015-3-27 16:47
  
非常详细的介绍
liangjiahang 发表于 2016-8-26 10:55
  
谢谢分享!
发表新帖
热门标签
全部标签>
每日一问
2024年技术争霸赛
安装部署配置
干货满满
技术盲盒
技术笔记
2023技术争霸赛专题
产品连连看
每周精选
功能体验
信服课堂视频
新版本体验
秒懂零信任
运维工具
技术晨报
自助服务平台操作指引
功能咨询
通用技术
GIF动图学习
问题分析处理
标准化排查
纪元平台
技术咨询
SDP百科
排障笔记本
华北区交付直播
畅聊IT
专家问答
技术圆桌
测试报告
每日一记
用户认证
原创分享
解决方案
VPN 对接
项目案例
地址转换
存储
技术争霸赛
深信服技术支持平台
卧龙计划
北京区每日一练
答题自测
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
日志审计
流量管理
云计算知识
sangfor周刊
SANGFOR资讯
专家分享
技术顾问
信服故事
终端接入
授权
设备维护
资源访问
虚拟机
迁移
加速技术
产品预警公告
玩转零信任
信服圈儿
S豆商城资讯
「智能机器人」
追光者计划
社区帮助指南
答题榜单公布
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV

本版版主

12
185
6

发帖

粉丝

关注

本版达人

LoveTec...

本周分享达人

新手24116...

本周提问达人