HTTP协议--浏览器的实现
http和socket的区别:
socket和http都能用于网络上的通信。
那既然有socket那么为什么需要http呢?
socket一般用于比较即时的通信和实时性较高的情况,最常见的就是QQ,微信等聊天和实时推送。
但是长时间网络连接耗电量快,对于手机来讲,手机网络情况复杂,进出电梯丢信号,需要实现复杂的重传。
手机网络连接是电信运营商的网关,网关不允许长时间连接。
然而http一般用于实时性要求不那么高的情况,比如信息反馈,图片上传,获取新闻信息。
http是一个无状态,无连接的协议。只能由客户端主动发起请求,服务器回送响应。
一个完整的HTTP请求过程,通常有下面7个步骤:
1.建立TCP连接
2.Web浏览器向Web服务器发送请求命令
3.Web浏览器发送请求头信息
4.Web服务器应答
5.Web服务器发送应答头信息
6.Web服务器想浏览器发送数据
7.Web服务器关闭TCP连接
一个HTTP请求一般由四部分组成:
1.HTTP请求的方法或动作,比如是GET还是POST请求
2.正在请求的URL,总得知道请求地址是什么吧
3.请求头,包含一些客户端环境信息,身份证信息等
4.请求体,也就是请求正文,请求正文可以包含提交的查询字符串信息,表单信息等
HTTP请求:
当我们在浏览器中输入一个URL然后回车,就会获取我们想要的资源。执行起来so easy!得到效果so amazing!
它是怎样发生的呢?
第一步我们在浏览器中输入baidu.com然后按下回车键。
第二步DNS解析出IP地址
解析出来bai.com.com ip地址是220.181.57.217:80
第三步浏览器向服务器发送请求。
浏览器向220.181.57.217:80发送请求
像“http://baidu.com/”中的斜杠是至关重要的。这种情况下,浏览器能安全的添加斜杠。而像“http: //example.com/folderOrFile”这样的地址,因为浏览器不清楚folderOrFile到底是文件夹还是文件,所以不能自动添加 斜杠。这时,浏览器就不加斜杠直接访问地址,服务器会响应一个重定向,结果造成一次不必要的握手。
第四步浏览器向web服务器发送給浏览器一个重定向响应。
这样浏览器就访问"https://www.baidu.com/"而不是"http://www.baidu.com/"
(这样做可能是为了安全考虑)
第五步浏览器跟踪重定向地址
现在浏览器知道“https://www.baidu.com/”是正确的访问地址,于是它便向它发送请求,并得到了响应,200表示成功。
第六步服务器HTML响应
连接状态:keep-alive
整个响应体是以gzip压缩的。
第七步浏览器渲染HTML响应
镶嵌在"https://www.baidu.com"html里面的内容多要经历和它一样的方式获取
这样我们就可以通过url获取从web服务器获取我们想要的数据。
HTTP协议请求篇
其实在我们整个访问中浏览器涉及到的就是HTTP协议中的请求,简单来说浏览器就是http协议中的请求部分
HTTP协议中请求包括三部分;
请求行,消息报头,请求正文
请求行以一个方法符号开头,以空格分开,后面跟着URL和协议版本,格式如下:
Method Request-URL HTTP-Version CRLF
Methon表示请求方法(GET , POST ,DELETE等);
Request-URI是一个统一资源标识符;
HTTP-Version表示请求的HTTP协议版本;
CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
浏览器输入baidu.com
就是一个请求行:
Get baidu.com HTTP/1.1 CRLF
默认的是Get方式,HTTP版本协议可以在浏览器中查看,现在大多数多用的1.1
URL是网络上的资源定位符
每一个URL都代表唯一一个资源
就可以从web服务器获取你想要的数据了
了解到这里我们可以:
编写一个简单的HTTP客户端,通过原生的HTTP协议从任意的Web服务器上下载一些数据。
使用python内置库httplib,定义一个HTTPClient类,从远程主机获取数。
在fetch()方法中使用HTTP()函数及其他辅助函数(例如putrequest()和putheader())创建了一个虚拟的HTTP客户端,
客户端采用GET服务器获取资源
然后设定用户代理,其值为当前脚本(__file__)
Accept表明客户端可以接受任何类型数据信息。
此时完成了请求行:
Get baidu.com HTTP/1.1 CRLF
python httplib里面用的是HTTP/1.1版本
官方文档
发起请求的getreply()方法放在一个try-except块中。响应通过getfile()方法获取,然后读取数据流中的内容。
并且把从服务器获取类容打印出来
就可以看到从www.baidu.com中获取的一个网页
这样一个http浏览器就实现了。
下一篇将实现http服务器
HTTP协议--浏览器的实现相关推荐
- 浏览器服务器协议,浏览器工作原理之HTTP协议
浏览器要做的事情, 就是把一个URL变成一个屏幕上可以显示的网页 大体流程是这样的: 浏览器首先使用HTTP协议或者HTTPS协议, 向服务端请求页面. 把请求回来的HTML代码经过解析, 构建成DO ...
- HTTP 协议 -- 浏览器缓存机制
浏览器缓存机制 浏览器缓存机制主要是 HTTP 协议定义的缓存机制. HTTP 协议中有关缓存的缓存信息头的关键字有 Cache-Control,Pragma,Expires,Last-Modifie ...
- HTTP协议, 浏览器访问服务器, HTTP响应, HTTP请求, 访问百度
浏览器访问服务器的过程 1/用户输入网址 2/浏览器请求DNS服务器,获取域名对应的IP地址(电脑连上网之后会被自动分配一个DNS服务器,域名跟ip是以键值对的形式存在DNS服务器,会按一定规则更新, ...
- http 协议 浏览器F12 拦击数据技巧
过滤器里面可以放类似的链接地址 比如 get/api/等,就可以用了,多去尝试新鲜东西,不要怕,万一能行呢 点在在上面一点ctrl+F 全局搜索,就可以找到了要查找的字段,不要挨个去找,要想办法
- python 全栈开发,Day66(web应用,http协议简介,web框架)
一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...
- (二)HTTP初相识--了解HTTP协议
HTTP初相识--了解HTTP协议 浏览器背后的故事 HTTP协议的前世今生 透过TCPIP看HTTP DNS域名解析 回溯HTTP事务处理过程 与HTTP请求的第一次亲密接触 浏览器背后的故事 通过 ...
- Nodejs学习笔记(四)——http协议与服务器
[目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(五)--expr ...
- javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)
1.关于系统架构 1.1系统架构包括 C/S架构: Client/Server(客户端/服务器) 例如电脑上安装的各种软件,qq等,需要安装特定的软件 优点: 速度快(软件中数据大部分在客户端中,少量 ...
- 深入学习HTTP协议
HTTP是什么?HTTP又不是什么? 简单来说HTTP是超文本传输协议,所以可以拆分成超文本.传输.协议 从协议上看 HTTP 是一个用在计算机世界里的协议.它使用计算机能够理解的语言确立了一种计算机 ...
最新文章
- Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法
- WCF的三个名称/命名空间,你是否傻傻分不清楚?
- 几个简单的shell脚本
- php 時間比較,PHP用strtotime()函數比較兩個時間的大小實例詳解
- updatePanle总结
- 又有程序员把产品经理给打了!
- itunes gift card apple id 充值接口API秒冲接口收藏
- 上帝视角!美国记者用公开数据,还原川普的全天行动轨迹
- linux中pingpong测试程序的解读
- 俞军推荐:一份完整的产品经理职业成长书单
- Java微信公众平台开发之素材管理
- 阅读心得:JDE:Towards Real-Time Multi-Object Tracking
- mysql查询一天内,一周,一个月内的消费记录
- 绝地求生亚服服务器维护,绝地求生亚服维护时间
- Joomla建站之幻灯片
- 微分的定义和介绍习题
- windows 2008 r2 sharepoint 2007 文档库 在windows资源管理器打开问题
- js-4 代理Proxy,object原型链, prototype, 继承,
- C#窗体猜数字小游戏AB
- Sailfish OS 2.0之初体验
热门文章
- 六大常用软件设计模式—工厂模式
- 31 给华为P10做个宣传海报 33 认识图标
- 签署《目标承诺书》,没完成目标,厚着脸皮不离职是否可行
- DIY 第三弹 封边与钥匙排
- CNN的输入图像尺寸问题
- rabbitmq死信队列详解与使用
- 手机拍照对比——原来相机的软件算法是如此重要!
- sklearn.svm.SVC中raise ValueError(“Unknown label type: %r” % y_type)ValueError: Unknown label type:处理
- Vs2019安装---QT vs TOOLS的方法及出错原因
- 加油站的智慧转型,你感受到了吗?