【Linux】——应用层中的HTTP协议

一、HTTP协议介绍

我发现HTTP协议要想真的搞明白的话,那真的是这一两篇博客是写不完的。因为HTTP协议的请求方法很多,头部信息也很丰富,要想全部记住和区分请求方法,还是要花点时间的。还有HTTP和HTTPS的区别等都是面试常考点。

1.1 HTTP协议概要

HTTP(Hypertext Transfer Protocol),超文本传输协议,允许用户通过单击链接访问资源。如下图所示,HTTP协议是应用层的协议:
在这里插入图片描述
从上图还可以看出,HTTP使用的传输层协议是TCP协议,而网络层采用的是IP协议(当然还有其他协议),所以说HTTP是一个基于TCP/IP协议族来传递数据

1.2 HTTP协议特点

特点:
(1)支持客户/服务器模式:客户端向服务端发出请求,服务器程序向客户程序送回客户端所要的万维网文档
(2)简单快速:客户端向服务器请求服务时,只需要传送请求方法和路径
(3)灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记
(4)无连接:无连接的含义是限制每次连接只处理一个请求;服务器处理完客户的请求,并收到客户的应答后,便会立即断开连接
(5)无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即就是我们给服务器发送完HTTP请求之后,服务器会根据请求,但是,发送完,不会记录任何信息(cookie和session可以解决这个问题)

1.3 HTTP的请求和响应报文结构

HTTP请求报文由方法、URL、HTTP版本、HTTP首部字段等部分构成,如下图所示:
在这里插入图片描述
HTTP响应报文由http版本、状态码、http首部字段3部分组成
在这里插入图片描述
在报文众多的字段中,HTTP首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内。

二、HTTP的请求方法和请求首部字段

在请求报文中,我们可以看到请求报文包括:请求行和首部字段。

2.1 请求行中的请求方法

在请求报文中(上图可看到),请求行包括了方法,版本号,URL。我们直接来看下这里的请求方法。
在这里插入图片描述
虽然有以上10种方法,但是常用的是GET、POST、DELETE、PUT(其他博主有这么说过:对应于查、改、删、增三四个操作)

  • GET
    用来访问已经被URL识别的资源。指定的资源经过服务器解析之后返回响应内容。这里先看下URL的格式:
    在这里插入图片描述
    意思就是说,如果你的方法是GET,那么服务器就会解析出你请求报头的URL路径,从上图来看,如果你采用的方法是GET方法,那么这次客户端想请求的就是dir目录下下的index.htm文件。GET最大的特点就是URL传参
  • POST
    POST方法用来传输实体的主体,我们上面的GET方法也可以进行传输实体,但是由于URL长度的限制,一般都是用POST方法传递(附录里面会有GET和POST请求方法的区别)
  • PUT
    PUT方法用来传输文件,就像FTP协议文件的上传一样,要求在请求报文中包含文件的内容,然后保存在URL指定的路径位置
  • DELETE
    此方法刚好和PUT方法相反,DELETE请求方法用来删除指定的资源。

2.2 请求报文中的请求首部字段

请求首部字段是在请求报文中有意义的首部。用于说明是谁或者什么在发送请求,服务端根据请求首部给出的客户端信息,试着为客户端提供更好的响应。

请求的首部字段如下:
左边表示首部字段名,右边表示含义
在这里插入图片描述
如果这里还想知道每个字段名的具体含义,博主发现一个写的很详细的文章HTTP协议请求的首部字段含义
我们来看一个关于实际的关于HTTP请求的例子:
在这里插入图片描述

三、HTTP的响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的的字段,用于补充响应的腹肌下信息、服务器信息,以及对客户端的附加要求等信息。
在这里插入图片描述
同样这里也有一个很详细的说明:HTTP响应首部信息的含义
相应的这里也有一个关于HTTP响应的报文:
在这里插入图片描述

四、通用首部字段

这是客户端和服务端都可以使用的通用首部,可以再客户端和服务器和其他因工程需之间提供一些非常有用的通用功能,比如,Date首部就是一个通用首部,每一段都可以用它来说明构建报文的时间和日期。
在这里插入图片描述

五、实体首部字段

在HTTP的请求和响应报文中,都包含了实体首部字段,实体受不提供了有关实体及其内容的信息,实体首部告知报文的接收者它在对什么进行处理。
在这里插入图片描述

六、附录

Get和Post请求方法的区别

(1)安全性问题

在上文中,我们提到GET是使用URL传参,而POST请求方法是在报文主体内传参。也就是说POST在传参会更加安全
在这里插入图片描述
如上图,如果输入密码使用了GET方法传参,那么你的密码就会暴露子在URL中,这是一个很大的隐患。而POST请求方法的请求会有会有报文实体,报文的实体部分存放的是参数,GET是没有报文实体的。但是我想,HTTP发送的数据是没有经过加密的,就算使用了POST请求方法,如果我截获了你的报文,那密码不也很轻松的得到了么

(2)传输的资源大小

GET请求方法由于浏览器对地址长度的限制,导致传输的数据有限制,其实http协议并没有规定get和post的长度,只是因为浏览器限制了URL的长度。而POST 方法就不会有这问题

(3)传输的数据类型

HTTP也就是超文本传输协议,加入你使用了GET请求方法,意味着你只能传输ASCLL字符,而POST能欧传输更多类型的数据

(4)速度

post方法的请求报文需要多处理一步:这个不难理解,因为如果是post请求的话,那么在请求报文种就会多出报文实体的部分。不过以计算机的处理速度,这个影响很小。get会将数据缓存起来,而post不会:一般get方法请求图片等静态数据时,如果多次访问后几次的速度就会特别快,有兴趣的老铁可以进行图片的搜索,第一次有很多图片还在加载,而第二次进入则直接全部加载完毕。
其实我觉得这篇博客总结很好,有兴趣的可以看看HTTP请求方法中GET和POST的区别

后面我会继续整理出一篇关于HTTP和HTTPS的区别,看来又是一段漫长的学习历程,加油。
有问题的希望广大网友提出,小菜鸡要准备写代码了

原创文章 78 获赞 21 访问量 3523

猜你喜欢

转载自blog.csdn.net/Vicky_Cr/article/details/105801207