HTTP自述(二)

前言

上一节我们简单介绍了一下TCP/IP协议族的基本情况,知道了四大层的职责,也了解到我们这一族的家族成员以及他们的能力。
无良作者把我这个主角变成了配角,让我很不爽,好在我打了作者一顿,没错,这次的主角是我了!
今天的自述,我要详细的和大家讲讲我的基本职责、请求报文、响应报文、能够达到一定目的的一些方法、持久连接问题以及状态管理。
好吧,这样讲我相信你可能会有点蒙,没关系,我会一个一个详细的介绍的。
#作用:连接用户和服务器老大
其实对于我来讲,每天的生活多少还是有些单调的,我所承担的职责想必在上一节你已经有所了解,就是使用我的请求报文和响应报文来达成用户和服务器老大的连接
服务器老大在我们这个世界上是一个比较特殊的存在,它能够存储海量的数据,能给用户提供丰富的内容,每个服务器或者说每一个在服务器上的资源,只要是和我们网络世界上有交互,那么通过URL,就可以访问到这个资源。而我,可以说是资源的传递者,因为在我的相应报文中包括的内容,就是用户请求的内容,这个内容可以是文字,可以是图片,还可以是视频。
因此,用户们每天和服务器请求的内容我都知道……(匿了匿了。。)
实际上,任何一台联网的计算机,既可以作为客户端,也可以作为服务端。因此,我还有一个非常重要的功能,区分究竟哪个是服务端,哪个是客户端。

达成交互

上面我讲了,我的职责是使用请求报文和响应报文来达成用户和服务器老大的连接。
需要注意的是,这里十分容易把我(HTTP)和TCP弄混,你只需要知道,我是负责建立连接的,而TCP是负责判断请求或者响应是否正确传输的。
用一张图来描述就是这样的:
这里写图片描述
客户端发送请求,服务器回复响应,这样就建立了连接。
那么,客户端发送的是什么,服务器回复的又是什么呢?这是一种被称作报文的东西,也就是刚才讲的请求报文和响应报文。

请求报文与响应报文

备注:请求报文为客户端发送,最终有且只有一个响应报文与之对应。
在开发中,可以使用浏览器的F12键查看请求报文以及响应报文。你可以自己尝试一下,下面这张图就是作者用火狐浏览器截取到的报文信息:
这里写图片描述

  • 请求报文所包含的内容:
请求URL:www.baidu.com
请求方法:GET
HTTP协议版本:HTTP/1.1
请求首部字段(可选)
实体内容

所谓的请求URL,就是资源所在的位置,比如说你请求的是百度,那么自然url就是www.baidu.com;请求方法,就是你请求的时候,使用的是什么方法,最常见的是POST和GET方法,对于这一点,后面会做详细介绍;HTTP协议版本,就是请求使用的HTTP版本,一般是1.1版本;请求首部字段,这究竟是啥?我们来看一张图片:
这里写图片描述
这是请求头,请求头同样是使用的键值对方式,每一个请求头名称,对应着一个值。所谓的可选,就是请求头的名,可以选,也可以不选,不选的话,在请求头中就没有那个相应的字段了。

  • 响应报文包含的内容
协议版本:HTTP/1.1
状态码 状态码短语:200 ok
响应首部字段(可选):
实体部分

和请求报文类似,所以这里我只说一下状态码和实体。
状态码以及状态码短语,就是那个200 ok,这代表请求成功。最常见的请求成功就是这个。当然,还有很多其他的状态码,每一种状态码对应着一种不同的情况。比如说,出错最常见的就是404,这代表着没有找到对应资源。状态码我后面会详细介绍,这节简单说说说就好了。
对于实体内容,就是最开始我讲的,服务器响应的内容可能是图片,可能是文字,可能是超文本,还有可能是视频,这些内容都会保存在实体内容之中,发送给客户端,然后再由客户端解码。

我是不会保存你的状态的

对于访问量低的服务器来说,保存每个请求连接的信息,还是没有什么压力的。不过,对于门户网站或者今日头条这种软件,每天都有十分庞大的访问量,用户数量以亿为单位,想要去一个个保存这些状态信息,那会不得把服务器老大累死。
所以,我HTTP协议是不会保持连接状态的,也就是,用户每次请完数据以后,我和服务器老大都不会知道用户究竟请求过什么东西。
这样,就大大提高了我的效率,降低了服务器老大的内存消耗。

服务器:你想干啥

用户每天和服务器交互,要做的事情也是各不相同。比如说,请求资源、上传文件、删除文件、获取信息等等操作。每一类操作就对应着我的一种方法,下面这张表就是我所支持的一些方法。
这里写图片描述
在上面的这些方法中,最为常用的就是GET和POST方法。GET方法用来获取资源,实际上,POST方法也可以用来获取资源。但是二者还是有着不同之处的。
比如:GET方法虽然也能够传递实体内容,但是他传递的实体内容却是在URL中以明文的方式传递,这就造成了一定的安全隐患。
而POST方法是将实体内容放在了请求报文的实体中 ,这样有着很多的好处。POST和GET最常用的场景就是表单的提交。比如下面这段代码。

<form action="/login" method="POST">
    用户名<input type="text" name="username"/>
    <hr/>
    密码<input type="password" name="password"/>
    <input type="submit" value="提交"/>
</form>

上面的代码,就是简单的表单操作,点击提交后就会交给相应的服务器controller进行处理。
其他的方法并不常见,也就不再过多的介绍。

持久连接:服务器老大很轻松

在以前的HTTP协议版本之中,采取的连接策略是这样的:客户端每次请求都会建立一条tcp连接,请求完成后都会关闭。这就无端端的造成了服务器负载过重。现在的HTTP协议,采取的是持久连接策略。
就是说,在默认情况下,HTTP协议是默认持久连接的,只有是服务器或者客户端任意一端发出断开连接的请求之后,请求才会关闭。这样就节省了服务器的消耗。
此外,以前的连接是只有当一个请求完成后,才会进行下一个请求,在以前那种以文本居多的网站中当然没什么问题,但是到了现在,一个网页有数不清的各种资源,如果还是这样请求,那么加载一张网页,估计得等上十年八年的。
于是,随着持久连接的出现,管线化的请求方式成为了现实。
什么叫管线化的请求呢?就是说,在一个HTTP连接的情况下,请求可以并行的到达服务器,然后服务器对每一条请求做出响应,这样无疑会使客户端的加载更快。

Cookie:我来替你保存状态

前面讲了,HTTP协议是不保存状态的协议。没错,就是说我HTTP协议记性不太好使,请求过后,我就忘记了我请求的是啥。
这一点令人很尴尬,毕竟每天我见过的人,我都不认识,如果某天他们和我打招呼,我却不认识他们,这就……
不但如此,因为我记不住,服务器老大就更别想记住了。即使他想记住,这么多的人,没有我的帮助,又怎么可能记住呢?勉强记住,只会徒增负担。
好在,Cookie的出现,帮助我解决了这个大麻烦。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。这样,我就能够帮助服务器老大记得住每个人了。
在没有Cookie的情况下,也就是客户端第一次对服务器请求的时候,会在响应报文中添加相应的Cookie信息,写入客户端。等到第二次再请求的时候,客户端会把Cookie信息放入请求报文中,然后服务器就能够识别了。
好了,今天这一讲就到这了,想了解更多HTTP的内容,那就关注我吧!

结语

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗
邮箱:roobtyan@outlook.com
个人博客:http://roobtyan.cn
扫描下面的二维码关注我吧,你将收获到意想不到的东西哟……
这里写图片描述

发表评论

电子邮件地址不会被公开。 必填项已用*标注