Http协议详解
2018-04-09 00:00
453 查看
前言
这篇博客是我查阅别人的博客和一些资料,加上自己的理解写的,纯手打不易。其实以前也学过计算机网络,只是当时没引起重视,现在再来学习一下更加细节的东西。有补充或者纠错的话,请在下面留言补充,我及时更新。http是什么?
http:hyper text transfer protocol,超文本传输协议。用来干嘛?
用于从www(world wide web)服务器传输数据到本地浏览器的协议。工作在哪里?
在应用层,工作在客户端与服务器这种架构上。客户端通过http协议向服务器发送url 请求,服务器再将数据返回给客户端。特点是什么?
1、简单快速:客户端只需向服务端发送请求路径与方法,服务器就会根据不同的路径与方法返回相应数据,由于http请求简单,因此服务器程序规模小,响应快速。2、传输数据灵活:http可以传输任意类型的数据。类型由content-type决定。
3、无连接:即每次连接只处理一个请求,服务器在收到客户端请求载返回数据给客户端,收到客户端应答之后,即断开连接,采用这种方式都可以节约传输时间。
4、支持b/s,c/s架构。
5、无状态:即协议对传输状态没有记忆,如果后续处理需要用到之前的状态就必须重新加载,显然,这样的话,传输数据就比较大。
工作流程是什么?
1、建立tcp连接:比如点击一个超链接:www.baidu.com,http的工作就开始了。2、建立连接后,发送请求报文,请求报文包括:请求行,请求头,空行,请求数据
3、服务端接受请求并返回响应,服务端解析请求,查找资源,将资源返回给客户端。一个响应包括:响应行,响应头,空行,响应数据。
4、释放tcp连接:若connection状态为close,则服务器主动关闭连接,客户端被动关闭连接;若connection状态为keepalive,则该请求还会保持一段时间,在这段时间内还可以请求数据。
5、客户端渲染html内容:客户端首先解析状态行,如果状态成功,然后解析响应头,响应头则告知了应该处理的若干字节的html文档,客户端读取响应数据,根据语法规则进行渲染 。
对http有了初步了解之后,我们从请求开始看。
http请求request
之前工作流程中讲了发送请求包括的几部分,现在一一来看他们是什么。我随便点击一个开源中国的请求作为例子。![](https://static.oschina.net/uploads/space/2018/0409/100950_DWWM_3802541.png)
1、请求行:
就是general里面的内容,表明了请求的方法,请求的协议,请求的url地址,和氢气的状态码。
2、请求头:
就是request header里面的内容
3、空行:
请求头后面的空行是必须的
4、请求数据:
也叫主体,可以放任意的数据,我这里的请求数据就是我编辑的博客的文档内容,与我的账号的一些信息。
看了请求,再看请求里的内容,先看url。
http之url
是什么:url:UniformResourceLocator,统一资源定位符,是互联网上用于标注某一资源的位置。属于uri的一种。
说到这里,那就先说一下,uri。
uri:统一资源标识符,用于唯一地标识一个资源。
互联网上,一个html文档,一张图片,一个视频,一段程序等都是由一个uri来定位的。
uri的构成:
(1)、访问资源的命名机制;
(2)、存放资源的主机名;
(3)、资源自身的名字;
再说回url
举个栗子:https://my.oschina.net:8080/u/3802541/blog/edit?id=123&pwd=123#name
(1)、协议:前面的https就是协议;
(2)、域名:my.oschina.net,在一个url中也可以使用ip地址作为域名;
(3)、端口号:8080,端口不是必须的,如果省略的话,使用默认端口;
(4)、虚拟目录:端口号后面的第一个“/”开始到最后一个“/”之间就是虚拟目录;
(5)、文件名:从最后一个“/”到“?”之间就是文件名,如果没有“?”的话就是最后一个“/”到“#”之间,如果“?”和“#”都没有的话,就是最后一个“/”之后的都是文件名,当然,文件名也不是必须的,没有的话,就是用默认的文件名;
(6)、参数部分:“?”之后到“#”之前都是参数,参数使用“&”符号链接,也不是必须的;
(7)、锚部分:“#”之后的。
好了,说了请求的url,再说说下一个,请求的方法。
请求的方法有哪些?
http1.0定义了三种方法:get、post、headhttp1.1定义了新的方法:options、put、delete、trace、connect
介绍一下每种方法都是干嘛的。
(1)、get:请求指定的页面信息,并返回实体主体;
(2)、post:向指定资源提交数据进行处理请求,数据被包含在请求体中;
(3)、head:类似于get请求,不过返回的响应内容没有响应数据,只有头部;
(4)、options:允许客户端查看服务器的性能;
(5)、put:从客户端传送的数据替代指定文档的内容;
(6)、delete:请求服务器删除指定的页面;
(7)、trace:回显服务器收到的请求,用于测试或诊断;
(8)、connect:http1.1中预留给能够将连接改为管道方式的代理服务器;
说了请求方法,再说一下get请求与post请求的区别,前段时间考试的时候遇到过,没有答的很全面。
get请求与post请求的区别
(1)、提交数据的方式不同:get提交数据会将要提交的数据放在url中的?后面,而post则是将要提交的数据放在请求的body中;(2)、提交数据的大小限制:get提交的数据大小有限制(因为url长度有限),post请求的数据长度无限制;
(3)、关于缓存:get请求可以被缓存,而post请求不可以被缓存;
(4)、浏览器历史记录:get请求可以保存在浏览器历史记录中,而post请求不会保存在浏览器历史记录中;
(5)、关于收藏书签:get请求可以被收藏为书签,而post请求不可以被收藏为书签;
(6)、对数据类型的限制:get请求只允许ASCII字符,post请求没有限制,也允许二进制;
(7)、可见性:get请求数据在url中可见,post请求载url中不可见;
(8)、安全性:get请求发送的数据会在url中,可以被查看,因此相对于post来说不太安全,而post请求相对来说较为安全,因为数据不会被保存在浏览器历史或web服务器日志中。因此,如果要传密码的话,肯定不能用get请求;
(9)、后退:get请求后退无害,post请求后悔的话,数据会被重新提交(因此应该提醒用户数据会被重新提交);
状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
![](https://static.oschina.net/uploads/space/2018/0409/112953_F4L9_3802541.png)
点击这个查看具体的一些状态码的解释
http之响应消息Response
前文说过,响应报文是由响应行,响应头,空行,响应体组成。![](https://static.oschina.net/uploads/space/2018/0409/113407_Bttr_3802541.png)
一一来解释:
(1)、响应行:由协议、状态码、状态消息构成;
(2)、响应头:说明客户端要使用的一些附加信息;
(3)、空行:消息头后的空行是必须的;
(4)、响应数据体,是服务器返回给客户端的数据,这里是一个html文档。
好啦,我相信看了这篇博客之后,对理解http就有一定的了解了,想要深入的话,可以去看一下大神的博客和官方的文档。
为步入社会参加工作做准备,加油。