赞
踩
今天我们来详细解析一下当今应用层最常用的协议 — http协议
从各种格式出发详细介绍,感兴趣的小伙伴千万不要错过~
名称:超文本传输协议(http,HyperText Transfer Protocol)
是目前我们生活中使用最为频繁的协议之一,只要我们使用浏览器,就一定能使用到http协议。
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
HTTP三点注意事项:
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 + 第二个数字 即为原始数据
最后片段标识符就是定位一个网页中标题的
浏览器向客户端请求一个网页的时候,要搭建一个tcp客户端
而我们所说的http服务器本质上就是一个tcp服务器
http格式数据由4部分组成:首行、头部、空行、正文
接下来我们逐个进行解析
首行也分为两种,分别是请求首行和响应首行
请求首行包含三个元素:请求方法 + 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
由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—请求头部字段,每次从保存的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,防止隐私泄露,用来维持客户端状态。
\r\n 用来间隔头部信息和正文,头部信息每条数据最后都是\r\n结尾,当遇到两个连续的\r\n,说明接下来就是正文信息
要发送或者响应的数据。长度和数据类型在头部中都有规定。
篇幅关系,我就写到下一篇了
感兴趣的小伙伴请猛戳 实现简易http服务器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。