🌈前言🌈
欢迎收看本期【网络世界】,本期内容将讲解应用层协议之一的HTTP协议。HTTP协议作为我们日常使用次数最多的,应用最为广泛的协议之一,学习HTTP协议,可以更好的帮助我们来初窥应用层。 本文旨在研究学习HTTP协议的底层机制,协议格式中各个参数的含义,如何正确使用,此外通过HTTP协议学习Cookie和Session技术。 此外,学习了HTTP协议,也是我们学习接下来的HTTPS协议的基础。
📁 概念
HTTP(HyperText Transfer Protocol,超文本传输协议),是互联网世界中一个至关重要的协议。它定义了客户端(如浏览器)如何和服务器之间进行通信,用来交换的传输超文本(如HTML文档,音视频等)。
应用层的协议是由我们程序员自助来实现,但是有一些大佬定义了一些现成的,非常好用的应用层协议,本着拿来主义的思想,我们直接拿来用就是了,但是,身为一个合格的程序员,我们还是需要了解如何实现的,才能更好的使用。
**HTTP协议是一个无连接的,无状态的协议。**
** **无连接指的是,通信双方无需建立连接,直接向对象读写数据即可,通过TCP协议建立的连接进行通信。
无状态指的是,通信双方每次请求都要建立新的连接,即**服务器不会保存用客户端的状态信息。 **
📁 URL
平时我们所说的网址,就是**URL = 协议名://主机域名:端口号/文件路径**![](https://i-blog.csdnimg.cn/direct/bf41fbf93d5a445cb16067c6e8f049c0.png)
但是,HTTP协议常使用80端口号。因此,80端口作为知名端口号,强绑定给HTTP协议,一般用户不能自主分配80端口号(0~1023默认用户不能更改)
📂 urlencode 和 urldecode
在URL中一些特殊字符被重载,用作特殊用途,因此这些字符不能出现在URL中,但是如果URL的要传递的参数中就有这个特殊字符,就要对特殊字符进行转义编码。
转义规则如下:
将需要转码的字符转为16进制,然后从右向左,取4位(不足4为直接处理),每两位为1位,前面加上%,编码成%XY格式。
+号就被编码为%2B。
urldecode就是urlencode的逆过程,将被转义的编码重新转义成原来的字符。
下面是一个编码工具网址:
UrlEncode编码/UrlDecode解码 - 站长工具
📁 协议格式
HTTP协议格式分为请求报文格式,响应报文格式
请求报文格式
**● 请求行**:[请求方法] + [URI] + [HTTP版本]。其中URI就是URL中的文件路径。HTTP版本不作为重点,不做讲解。
**● 请求报头(Header)**:请求的属性,是一个键值对(key:val),每一组属性用\r\n 分割,遇到空行表示Header结束
**● Body**:空行后面的内容都是Body,即正文。表示客户端向服务器发送数据参数。Body可以为空字符串,如果Body存在,则Header里会有一个Content-Length属性表示Body长度。
响应报文格式
**● 响应行**:[HTTP版本] + [状态码] + [状态码描述]。
**● 响应报头(Header)**:响应的属性,是一个键值对(key:val),每一组属性用\r\n 分割,遇到空行表示Header结束
**● DATA**:与Body类似,表示服务器向客户端写入数据,在Header中有一个属性Content-Length表示DATA的大小。
📁 方法
其中最为常用的就是GET和POST方法,也是重点讲解的方法,其余方法不做讨论。
📂 GET/get
**表示获取资源,也可以用来传输通过URL传递参数。**将要传递的参数数据添加至URL的后面,以“?”表示开始。
例如,网页中我们有一个表单要提交,数据就通过url传递。
但是附加在URL末尾,意味着所有参数和数据都会以明文的形式出现在URL中,如果传输的是敏感信息(用户个人信息),他们以明文的形式在网上传播,容易被中间人窃取,**安全性较差,且能传输的参数体量较小。**
📂 POST/post
通常**用来传递参数数据,通过Body正文部分传递参数**,**一次能传输大量数据,**和GET方法相比,Body部分对普通用户不可见,**安全性较好。**
📁 常见的报头
**● **Content-Type: 数据类型(text/html 等)
**● **Content-Length: Body 的长度
**● **Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
**● **User-Agent: 声明用户的操作系统和浏览器版本信息;
**● **referer: 当前页面是从哪个页面跳转过来的;
**●** Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问
● Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
● connection: 用于控制和管理客户端和服务器之间的连接状态。核心作用,管理持久连接。持久 连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接,以便在同一个连接 上发送多个请求和接收多个响应。
Connection: keep-alive; 表示希望保持连接以复用 TCP 连接
Connection: close; 表示请求/响应完成后,应该关闭 TCP 连接
📁 状态码
📂 分类
常见的状态码,比如200(OK),404(Not Found),403(Forbidden),302(Redirect,重定向),504(Bad geteway)
📂 重定向状态码
这里,我们以301(永久重定向)和302(临时重定向)作为讲解。它们依赖于Location。
当服务器返回301状态码时,表示请求资源已经永久移到新的位置,服务器会在响应中添加一个Location头部,用于指定资源的新位置。这个Location头部包含了新的URL地址,浏览器会重定向到该地址,之后就会直接访问所在位置,不会再回原来服务器所在位置进行请求。
当服务器返回302状态码时,表示请求的资源临时移到新的位置。同样地,服务器也会在响应中添加一个 Location 头部来指定资源的新位置。浏览 器会暂时使用新的 URL 进行后续的请求,但不会缓存这个重定向。![](https://i-blog.csdnimg.cn/direct/e26a88683c1540ebac4ffa14771c51f9.png)
无论是 HTTP 301 还是 HTTP 302 重定向,都需要依赖 Location 选项来指定资 源的新位置。这个 Location 选项是一个标准的 HTTP 响应头部,用于告诉浏览器应该 将请求重定向到哪个新的 URL 地址。
📁 Cookie 和 Session
HTTP是无连接,无状态的的协议,但是服务器为了业务需要,提高客户体验,可能需要知道用户身份。
例如在视频网站看视频,需要登录才能观看,用户再点开一个电影后登录观看,退出想要看一部电视剧时,因为HTTP是无状态的,所以用户需要重新登陆,这样对用户十分不方便。
因此,引入了Cookie和Session技术,基于HTTP协议,帮助服务器标识用户身份,可以一次登录,服务器长时间识别用户身份。
📂 Cookie技术
HTTP Cookie(Web Cookie)是服务器发送到客户端的并保存在客户端的一小块数据,它会在客户端向服务器发送请求时携带在报头发送到服务器,用于告知服务器用户信息。
工作原理
(1)当用户第一次访问服务器时,服务器会在响应包头中添加Set-Cookie属性(含有用户相关属性),传送到客户端。
(2)客户端收到响应后,检测到Cookie,将Cookie保存在本地。
(3)下一次请求时,将其添加至请求报头属性中的Cookie字段,发送给服务器。
分类
会话Cookie:浏览器关闭时失效。保存在内存的浏览器进程的空间中。
持久Cookie:浏览器关闭时不会失效。保存在硬盘中浏览器的工作路径下。
如果Set-Cookie没有设置失效时间,默认是会话cookie。如果cookie是一个持久cookie,保存cookie的文件是一个二进制文件或sqlist格式存储,一般不能直接查看。
基本格式
完整格式:
** ● expires=data**。用于设置Cookie的过期时间。
** ● path=some_path**。限制Cookie发送到服务器的哪些路径。默认为设置它的路径。例如只有访问/a/b路径文件,才可以发送Cookie。
** ● domain=domain_name**。用于指定哪些服务器/主机可以接受Cookie。例如B站的cookie不会发给腾讯视频的服务器中。
** ● secure:**晋档使用HTTPS协议时才发送Cookie。有助于防止Cookie在不安全的HTTP连接中获取。
** ● HTTPOnly:**意味着Cookie不能被客户端脚本(JavaScript)访问,有助于跨站脚本攻击(XSS)。
每个 Cookie 属性都以分号(;)和空格( )分隔。
名称和值之间使用等号(=)分隔。
如果 Cookie 的名称或值包含特殊字符(如空格、分号、逗号等),则需要 进行 URL 编码。
安全性
Cooki保存在客户端内,客户端防护能力较差,且Cookie内含很多用户敏感信息(用户身份,密码登),有很大的风险被窃取泄漏,因此单纯使用Cookie是非常不安全的。
📂 Session技术
HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。可以理解为,将用户信息保存在服务器中,服务器建立一个Session对象保存用户信息,将Seesion对象通过Hash函数,得到唯一的Sessionid,将Session发送给用户。
此后,用户收到的Cookie就不再是用户信息,而是一个Sessionid,这样大大降低了窃取风险。
服务器端会设置相应的机制,防止用户信息被窃取(如异地登录登),且服务器性能更好,防风险能力更高。
Session 可以设置超时时间,当超过这个时间后,Session 会自动失效。 服务器也可以主动使 Session 失效,例如当用户登出时。
HTTP协议采取明文传输,意味着报文在网络中是裸奔的,不安全的。Cookie和Session技术都不能保证在网络中Cookie不被窃取,造成用户数据泄漏,只能通过一些机制,最大可能避免用户身份被冒领,泄漏用户数据。
想要解决这个问题,就得对传输的报文进行加密,这就是HTTPS协议所做的。
📁 总结
以上,就是本期【网络世界】HTTP协议的主要内容了,主要讲解什么是HTTP,HTTP协议格式中各个参数的含义,以及HTTP作为无状态,无连接的协议,如何通过Cookie和Session技术来提高用户体验,实现一次登陆,上时间识别用户身份。
以及引入了HTTPS的概念,下一篇文章,将讲解HTTPS是如果实现安全传输,对报文进行加密的。
如果感觉本期内容对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ
版权归原作者 秋刀鱼的滋味@ 所有, 如有侵权,请联系我们删除。