前言

上一节我们简单介绍了一下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

扫描下面的二维码关注我吧,你将收获到意想不到的东西哟……

HTTP协议(二):作用的更多相关文章

  1. TCP/IP协议<二>

    一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...

  2. HTTP协议 (二) 基本认证

    HTTP协议 (二) 基本认证 http协议是无状态的, 浏览器和web服务器之间可以通过cookie来身份识别. 桌面应用程序(比如新浪桌面客户端, skydrive客户端)跟Web服务器之间是如何 ...

  3. telnet协议的作用详解,以及telnet端口号介绍

    转:http://www.ctowhy.com/382.html Telnet协议,工作在TCP/IP协议栈的“应用层”,telnet是一种使用命令行的远程终端管理的协议,可以远程连接到网络设备上,并 ...

  4. 什么是http协议(二)

    一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...

  5. iOS网络编程解析协议二:XML数据传输解析

    XML两种解析方式,一种是SAX,NSXMLParser是SAX方法解析,另一种是DOM(Document Object Model); 区别: SAX: 只能读,不能修改,只能顺序访问,适合解析大型 ...

  6. Python Web开发中,WSGI协议的作用和实现原理详解

    首先理解下面三个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server ...

  7. LoRaWAN协议(二)--LoRaWAN MAC数据包格式

    名词解析 上行:终端的数据发送经过一个或多个网关中转到达网络服务器. 下行:由网络服务器发送给终端设备,每条消息对应的终端设备是唯一确定的,而且只通过一个网关中转. LoRaWAN Classes L ...

  8. TCP协议(二)——TIME_WAIT状态

    当TCP主动关闭套接字时,采用四步握手机制来彻底关闭连接.如图: 客户端主动关闭连接,发送FIN段到服务端.TCP状态由ESTABLISHED(连接状态)转为FIN_WAIT1(表示,发送的FIN需要 ...

  9. 0710 mux协议的作用(ppp拨号时如何和gprs进行at指令交互)

    ppp拨号使gprs上网的同时如何和gprs模块进行at指令的交互,这是一个问题. 在linux中,ppp拨号上网是内核中支持的,只需要在内核配置中选上. ppp拨号的方式使gprs进行上网与at指令 ...

  10. HTTP网络协议(二)

    HTTP报文内的HTTP信息 HTTP协议交互的信息被称为HTTP报文,请求端的HTTP报文叫做请求报文,响应端的叫做响应报文.    HTTP为了提升传输速率,其在传输数据时,按照数据原样进行压缩传 ...

随机推荐

  1. hadoop-mapreduce的官方示例的测试执行方法

    1.根据给出的精度参数计算 pi : hadoop jar /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-m ...

  2. Android框架模式

    参考大佬写的文章:https://www.jianshu.com/p/f17f5d981de7 1.MVC模式 Model:模型层,负责处理数据的加载或存储 View:视图层,负责界面数据的展示,与和 ...

  3. 12.redis的AOF持久化深入讲解各种操作和相关实验

    1.AOF持久化的配置 2.AOF持久化的数据恢复实验3.AOF rewrite4.AOF破损文件的修复5.AOF和RDB同时工作 ---------------------------------- ...

  4. android studio (安卓开发)如何使用外部模拟器(mumu模拟器)调试运行程序

    开发安卓 我觉得大家明白自带的模拟器卡的要死而且启动慢(我觉得八核的计算机应该可以解决这个问题),这里使androidstudio 使用外部模拟器 MuMu模拟器  配置方法 eclipse 开发安卓 ...

  5. pom.xml报unknown error

    1. 从https://start.spring.io/的spring initializr生成demo,使用默认的2.1.6.release(2019年7月10日) 2. 在eclipse加载后,p ...

  6. F. Fairness 分硬币最大差值最小

    F. Fairness time limit per test 2.0 s memory limit per test 64 MB input standard input output standa ...

  7. ORIGIN(起源属性)路由起源骗术

    ORIGIN(起源属性)配置: ①:抓取感兴趣流量——prefix.access ②:创建route-map 流量地图——permit 10 ③:匹配感兴趣流量——match ④:设置起源属性——se ...

  8. 127-PHP类通过魔术变量判断类中是否存在指定的方法

    <?php class ren{ //定义人类 //定义成员属性 private $name='Tom'; private $age=15; //定义成员方法 public function g ...

  9. Mysql 终端中文显示乱码

    查看编码 show variables like 'char%'; 结果 +--------------------------+--------+ | Variable_name | Value | ...

  10. express连接数据库 读取表

    connection 连接数据库    connection.query 查询表   1.依赖 const mysql = require('mysql'); 连接数据库代码 var connecti ...