HTTP协议--浏览器的实现

http和socket的区别:

socket和http都能用于网络上的通信。

那既然有socket那么为什么需要http呢?

socket一般用于比较即时的通信和实时性较高的情况,最常见的就是QQ,微信等聊天和实时推送。

但是长时间网络连接耗电量快,对于手机来讲,手机网络情况复杂,进出电梯丢信号,需要实现复杂的重传。

手机网络连接是电信运营商的网关,网关不允许长时间连接。

然而http一般用于实时性要求不那么高的情况,比如信息反馈,图片上传,获取新闻信息。


http是一个无状态,无连接的协议。只能由客户端主动发起请求,服务器回送响应。


一个完整的HTTP请求过程,通常有下面7个步骤:

扫描二维码关注公众号,回复: 11270153 查看本文章

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服务器


猜你喜欢

转载自blog.csdn.net/qq_23948283/article/details/52704822
今日推荐