(网络)应用层:http协议解析 (详细)

今天我们来详细解析一下当今应用层最常用的协议 — http协议
从各种格式出发详细介绍,感兴趣的小伙伴千万不要错过~



http协议介绍

名称:超文本传输协议(http,HyperText Transfer Protocol)

是目前我们生活中使用最为频繁的协议之一,只要我们使用浏览器,就一定能使用到http协议。

HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

HTTP三点注意事项:

  • HTTP是无连接的无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态的HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

URL

url: 统一资源定位符, 在网络中定位某台主机的某个资源. 也就是我们通常说的网址

url的组成结构及解析

协议方案名称://用户名:密码@服务器域名或IP地址:端口/path?查询字符串#片段标识符

随便举个例子:
在这里插入图片描述

协议方案:http/https等协议

用户名密码:写上可以直接登录,但是由于不安全,一般省略

服务器域名:是服务器的一个别名,由便于记忆的字符串组成,最终经过转换得到服务器ip地址

端口:http协议默认使用80端口,https默认使用443端口

/path资源路径:请求资源在服务器上的相对路径
注意这里的/不是根目录,只是相对根目录,由服务器设置

查询字符串:提交给服务器的数据,由key=val的键值对组成,键值对之间以&间隔

在url中很多特殊字符串都有其特定的含义,因此在查询字符串或者请求的资源路径中含有特殊字符,就会与url中的特殊字符产生歧义。

为了解决歧义,一旦遇到特殊字符,就要进行转义表示——url编码

urlencode(url编码)
将特殊字符的每个字节转换为其十六进制的数字字符,为了标记这是经过转义的数据,要加%前缀。 比如: + ⇒ %2B

urldecode(url解码)
找到url中的%,将后面紧跟的两个字符转换为数字(16进制到10进制)
第一个数字*16 + 第二个数字 即为原始数据

最后片段标识符就是定位一个网页中标题的


http协议实现

  • http协议是一个字符串明文协议 (说白了就是讲多个数据对象组成一个指定格式的字符串进行数据传输)
  • http协议是一个应用层协议,在传输层使用TCP协议进行传输
  • 了解http协议实现说白了就是了解http协议数据协议格式

浏览器向客户端请求一个网页的时候,要搭建一个tcp客户端
而我们所说的http服务器本质上就是一个tcp服务器

http协议格式

http格式数据由4部分组成:首行、头部、空行、正文

接下来我们逐个进行解析


1. 首行

首行也分为两种,分别是请求首行和响应首行

请求首行

请求首行包含三个元素:请求方法 + url + 协议版本
三个元素之间以空格间隔,首行以\r\n结尾

请求方法:不同的请求方法表示不同的目的

这里简要几种常用的请求方法:
GET:用于请求获取实体资源,没有正文,提交的数据在url的查询字符串中,提交的数据有长度限制,且不安全
HEAD:与get类似,但是响应数据不要正文,只要头部
POST:用于向服务器提交表单数据,有正文,数据在正文中

以上三种是经常问到的,如果有兴趣的小伙伴可以去查看剩下的几种请求方法,这里附上链接:HTTP 请求方法


URL上面已经详细说过,这里不再赘述

但是这里准确的说应该是uri,一般没有url中的协议名,ip和port,只有/path后面的信息

url是完整的一个链接路径包含服务器的地址信息和协议方案名
uri是通常说的资源路径包括后边的信息,没有前边的方案名和地址信息

所以这里说是uri更为准确


协议版本
在这里插入图片描述
我们目前使用最多的还是HTTP1.1版本
有想了解HTTP2.0的小伙伴,戳HTTP2.0 详解


响应首行

响应首行包含三个元素:协议版本 + 响应状态码 + 状态码描述
三个元素之间以空格间隔,首行以\r\n结尾

版本上面刚说,不再赘述


响应状态码:本次请求处理结果的直观状态展示

1xx:描述信息,协议切换
2xx:表示本次请求正确处理,典型:200
3xx:表示本次请求重定向到新位置。301–永久重定向 302–临时重定向(资源路径已经改变,但是保持原先链接依然可用)
4xx:表示客户端错误。典型:400,404
5xx:表示服务端错误。典型:500,502,504

这里只列举了一些典型的状态码,有兴趣的小伙伴戳HTTP状态码查询或者学习更多的状态码。

状态码描述:顾名思义,对状态码的描述

最典型最常见的就是:200 OK


2. 头部信息

由key: val形式的键值对组成,每个键值对都以\r\n结尾
注意key和val中间以冒号 + 空格间隔!!

接下来列举一些比较常见重要的头部信息

请求头部
Connection: keep-alive / close 用于控制长短连接
Content-Length: 表示正文长度,防止黏包问题
Content-Type: 表示正文数据类型
Accept: 表示所能接收的数据类型
Referer: 当前页面是从哪个页面跳转过来的
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
Cookie: 比较重要,下面详细说

响应头部
Expire: 缓存控制字段
Location: 资源重定向位置,与3xx状态码搭配使用
Set-Cookie: 下面与cookie一起说

Cookie和Session

Cookie—请求头部字段,每次从保存的cookie文件中读取数据,发送给服务端
Set-Cookie—响应头部字段,其中包含的信息会在客户端进行保存

HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。

举个栗子:当我们在淘宝买东西的时候,我们把想买的东西放入购物车,此时完成一次数据交换,服务端已经忘记数据,当我们点击付款的时候服务端已经无法确认是哪个用户了。

这就很僵硬,用户体验极差,那我们就必须引入一个跟踪机制,也就是cookie。

Cookie包含了用户的各种信息,相当于一个通行证。

在用户第一次登录服务端后,服务端在Set-Cookie返回一个Cookie字段,客户端就会把它保存起来,下次再请求服务的时候就会把Cookie一起发送给服务端,服务端看到Cookie这个通行证就会直接认证成功。

Cookie使用起来非常方便好用,但是里面包含许多敏感信息,容易被抓取,很不安全,于是又引入了Session

Session不同于Cookie,Cookie存在客户端,而Session存在服务端

Session是保存在服务端的会话信息,类似于创建一个表,为每个用户创建一个会话信息,通过Cookie将session id返回给客户端 (session id就是一个不重复的数字)保证每个用户一个session id,用户拿着session id来确认,服务端通过sess id查询用户信息,这样就极大的提高了安全性。

Cookie和Session的区别
Cookie是保存在客户端的数据,每次请求服务端时通过Cookie字段发送给服务端,用来维持客户端状态。
Session是保存在服务端的会话信息,服务端为每个客户端创建会话信息保存客户端状态,通过Set-Cookie返回给客户端session id,防止隐私泄露,用来维持客户端状态。


3. 空行

\r\n 用来间隔头部信息和正文,头部信息每条数据最后都是\r\n结尾,当遇到两个连续的\r\n,说明接下来就是正文信息

4. 正文

要发送或者响应的数据。长度和数据类型在头部中都有规定。


请求响应栗子

在这里插入图片描述


简易http服务器实现

篇幅关系,我就写到下一篇了
感兴趣的小伙伴请猛戳 实现简易http服务器

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殇&璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值