【网络】HTTP协议浅析------HTTP格式

HTTP协议概述

HTTP(HyperText Transfer Protocol,超文本传输协议 )其作为一种约定规范,完成从客户端到服务器端等一系列运作流程。请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。是一个基于请求与响应,无状态的应用层协议。
应用层协议: 定义了运行在不同端系统上的应用程序进程如何相互传递报文。

HTTP协议使用

HTTP协议定义了Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端

首先要简述下当在网页搜索栏输入一个网址到内容出现期间的过程:
1.在浏览器输入网址(URL);
2.浏览器查找域名对应的IP地址;
3.根据IP地址与服务器建立socket连接(HTTP协议在传输层是基于TCP协议的)连接过程中主要经过三次握手;
4.浏览器与服务器经行通信,浏览器向服务器发送HTTP请求,服务端接收并处理,返回处理结果数据给客户端;
5.浏览器与服务器断开连接。

URL

URL(Uniform Resource Locator,统一资源定位器)就是我们俗称的网址,用来定位网络中某个服务器上的某个资源。

URL包含要素

一下以一个"网址"为例,解析一个较为完整的URL各部分的含义
在这里插入图片描述协议方案名称:告诉浏览器本次请求使用什么应用层协议,例如HTTP/HTTPS/FTP等;
登录信息:早期访问服务器同时携带用户名与密码,但由于其安全度太低,已经不是用了;
服务器地址:域名或服务器IP,HTTP服务端口默认是80、HTTPS默认为443、FTP默认为21;
资源路径:资源在服务器主机上的路径,是一个相对路径(其可能是一个实体资源的路径,也可能是某个功能的路径);
查询字符串:客户端交给服务器的数据,以键值对key=val组成,键值对之间以&符号间隔;
片段标识符:表示HTML数据中的某个标签,可以直接跳转到网页的某个位置;

URL编码

如上述URL所示,其各个部分都用/?:这样的特殊字符隔开,在URL中这样的字符都被当作特殊字符处理。
所以在资源路径和查询字符串等参数中为了避免出现这样的特殊字符产生歧义,必须对其进行转义,称为URL编码。
转义规则:将需要转码的字符转为16进制,然后从左到右,取4位(不足四位直接处理),每2位当作一位,并在其前加%,转换为%XY的格式。
例:将 ‘+’ 进行编码
'+'的ASCLL码为43,十六进制为0x2B,不足4位直接在前面加%,转换为%2B
解码:在URL中遇到%号,则将其紧跟的后面两个字符转换为数字;

HTTP协议格式

一下是使用Fiddler抓包工具捕获的一个HTTP请求和响应,以此为例对其各个部分的内容进行解析
HTTP协议主要有四大部分:首行、头部、空行、正文

请求:
在这里插入图片描述

请求首行

请求首行包含3个要素:请求方法、URL、协议版本
三个要素间以空格间隔,以\r\n结尾
请求方法
常用的HTTP方法

方法说明
GET获取某个实体资源,也可以提交数据到服务器,提交的数据放在URL查询字符串中(不安全、且长度受限)
POST主要用于向服务端提交表单数据,提交的 数据保存在正文中,没有长度限制
PUT传输文件,向指定资源位置上传其最新内容
HEAD获得报文首部
DELETE请求服务器删除文件
URL:上文中已作总结;
协议版本
版本简介
-------------
HTTP/0.9最早的HTTP协议版本,只有GET方法,只能回应HTML格式的字符串
HTTP/1.0除GET,还引入了POST和HEAD,支持了各种媒体流的数据传输,短连接
HTTP/1.1支持PUT、PATCH、HEAD、 OPTIONS、DELETE等方法,长连接
HTTP/2.0相比之前版本的文本传输,HTTP/2.0彻底采用二进制格式,解析更高效
短连接:http是基于TCP协议实现的,HTTP/1.0中,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接;
长连接:建立一次通信,可以进行多次相同服务器的请求。
请求头部

头部:描述本次请求或者响应的一些关键信息字段
头部信息格式:是由key=val组成的键值对,以\r\n作为结尾

Connection:描述本次通信是长连接还是短连接,close(短连接)/keep-alive(长连接)
Content-length:描述本次请求携带的正文长度(读取一条数据时,先以空行结尾,获取到首行和头部,从头部中获取Content-length的正文长度,根据长度获取正文)
Cache-Control:用于缓存控制,描述客户端书否可以将数据缓存起来,有缓存后就不用在重新请求数据了
Content-Type:描述正文的数据类型,决定对端如何处理正文数据;
Upgrade-Insecure-Requests:是否升级到加密协议(https);
User-Agent:客户端系统信息,描述浏览器版本、系统版本等;
Accept:告诉对端可以接收处理怎样的信息;
Accept-Encoding:声明浏览器支持的编码类型,* 表示支持所有类型;
Referer:用来让服务器判断来源页面, 即用户是从哪个页面来的;

空行

以\r\n 间隔头部与正文,头部的每个字段也是以\r\n 作为结束标志,所以在读取时,当读取到两个连续的\r\n时,表示头部结束。

响应:
在这里插入图片描述

响应首行

响应首行包含3个要素:协议版本、响应状态码、状态码描述
响应状态码:表示服务器收到请求进行处理的结果

状态码类别原因短语
1**信息性状态码接收的请求正在处理
2**成功状态码请求正常处理完毕
3**重定向状态码需要进行附加操作以完成请求
4**客户端错误状态码服务器无法完成请求
5**服务器错误状态码服务器处理请求出错

常见状态码:
100:继续,客户端应继续请求;
200:请求成功,一般用于GET、POST请求;
301:永久重定向;
302:临时重定向;
404:请求资源不存在;
500:服务器内部错误;
502:代理网关请求失败;
504:代理请求超时;

响应头部

Location:指定重定向的新URL,浏览器会重新请求新位置;

Cookie:用于持续通信中,保存客户端状态信息的字段,内容保存在客户端本地,客户端每次发起请时都会读取该信息,发送给服务端(海棠亭畔是无状态的,所以每次通信时,服务器都不知道是哪个客户端在于其通信)
Set-Cookie:服务端告知客户端要保存的cookie信息,将其响应给客户端,客户端将其中数据作为cookie保存起来。

缺陷:Cookie是不安全的,因为状态信息中会包含用户名、用户密码等信息;
解决方案:使用Session 会话
Session:描述本次客户端的通信信息,以及客户端的状态、认证信息,服务端为每个客户端都各自创建session保存在服务端的数据库中,将sessionID作为cookie中的数据,通过set-cookie返回给客户端。客户端通信时,通过cookie将sessionID交给服务端,服务端就可以根据ID获取该客户端的描述信息。

aaa

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值