HTTP协议: 全称:Hyper Text Transfer Protocol 即超文本传输协议 是浏览器与服务端之间传输数据的协议,底层的传输协议为TCP。
HTTPS协议:全称:Hyper Text Transfer Protocol over Secure Socket Layer,就是HTTP的安全版,再通俗点就是身披SSL外壳的HTTP。
HTTPS = HTTP+SSL/TLS
HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私及完整性。
HTTPS特点:
A.内容加密:采用混合加密技术,中间者无法直接从截取的数据包中查看明文内容
B.验证身份:通过证书认证客户端访问的是自己的服务器
C.保护数据完整性:防止传输的内容被中间人冒充或者篡改
HTTPS协议优缺点
HTTP则为应用层协议,负责定义传输数据的格式。
HTTP协议有1.0、1.1、2.0三个版本。现在常用为1.1与2.0版本。
协议规定客户端与服务端通讯方式为:一次请求一次响应,即:客户端发起请求,服务端接收到请求后向客户端发送响应。服务端不会主动发送内容给客户端。采取"一问一答"的形式。
HTTP协议工作流程
一、首先通过TCP的三次握手与服务器建立连接
1. 第一次:浏览器首先发送SYN给服务器,请求和服务器建立连接。
2. 第二次:服务器接收到SYN码后,发送SYN+ACK码给浏览器,告诉浏览器已建立连接。
3. 第三次:浏览器接收ACK码,验证是否正确,若正确是建立数据连接,可以进行数据传输。
二、客户端通过TCP三次握手与服务器建立连接,TCP建立连接成功后,向服务器发送HTTP请求,服务器收到HTTP请求后,向客户端发送HTTP响应。
三、首先通过TCP的四次挥手与服务器断开连接
1. 第一次:浏览器发送FIN码给服务器,告诉服务器,数据传输完成。
2. 第二次:服务器接收到FIN码,然后发送ACK码给浏览器,告诉浏览器,你可以断开连接。
3. 第三次:服务器继续发送FIN+ACK码,告诉浏览器我的数据发送完毕。
4. 第四次:浏览器接收到FIN+ACK码之后,同样会发送ACK码给服务器,告诉服务器,我已接收到,你可以断开连接。
数据包在通信过程中涉及的编码格式
客户端请求数据包中包含浏览器可以解析的编码格式
传输过程
浏览器与服务器之间的传输过程采用的是HTTP协议,该协议默认编码格式为iso-8859-1,所以URL地址栏中不会出现中文,无论是请求还是响应中发送的字符(不含正文部分内容)必须符合ISO8859-1编码字符(如:数字,字母,符号)。像中文等其他字符都需要经过转换后才可以发送。
服务端响应数据包中包含响应数据格式以及浏览器解析页面应使用的解码格式
URL:专业术语统一资源定位符,俗称网址
一个网址包含三部分:
1.使用的请求协议 2.服务器域名或(IP:端口号) 3资源路径(访问服务器某路径下的某个页面)
HTTP请求
一个HTTP请求分为三部分组成:请求行,消息头,消息正文
1:请求行
请求行分为三部分:
请求方式 资源路径 协议(F)
method url protocol(CRLF)
例如:
GET /index.html HTTP/1.1(CRLF)
请求行以CRLF结束
CR:回车符,asc编码中对应数字13
LF:换行符,asc编码中对应数字10
HTTP请求方式
HTTP请求方式共有8种 get、post、put、options、head、delete、trace、connect
其中get请求和post请求最常用
get请求:浏览器地址栏直接通过URL进行的访问都属于get请求 a标签连接是get请求img标签中的src是get请求 从服务器获取资源都是get请求
get请求有长度限制,主要用于提交不需要保密的参数信息
post请求: 通过from表单提交的请求都属于post请求 例如input标签 name为其参数名,value为默认的参数值 向服务器提交数据都是post请求 post请求没有长度限制,还可以提交需要保密的参数信息,若参数设为保密属性,提交时则不会显示在地址栏中,其他非保密参数与get提交方式一样,提交的参数信息都会显示在地址栏中。
?分割符 在地址栏中提交的请求地址与参数之间使用?分割 多个请求参数之间使用&符连接
HTTP请求方式判断,判断get提交还是post提交
题目:
判断方法一:用户名,密码输入内容123,点击提示按钮,观察上面地址栏的信息(username和password的值):
1、如果是这样:
username和password均有输入值,则是get提交;
2、如果是这样
username和password均无输入值,则是post提交;
或者是这样
username和password参数被过滤不显示,也这种也是post提交;
判断方法二:使用burp抓包工具查看
在代理-Raw选项中可以查看当前请求页面是以哪种方式提交
1. get方式提交请求
2. post方式提交请求
最下面一行显示有提交的所有参数名与对应的参数值
2:消息头
消息头由若干行表示,每行表示一个具体的头信息
每个头信息格式分为两部分:
消息头名字:消息头的值(CRLF)
name:value(CRLF)
每个消息头都以CRLF结尾。
最后一个消息头结尾处会有两个CRLF,第一个表示最后一个
消息头结束,第二个表示消息头部分结束。
消息头中主要包含主机名及端口、当前客户端浏览器版本、操作系统类型、可以接收的数据格式以及访问来源。
常用的消息头
下面是浏览器发送给服务端的一个请求数据包(不含有正文部分)
GET /index.html HTTP/1.1 (CRLF)
Host: localhost:8080(CRLF)
Connection: keep-alive(CRLF)
Cache-Control: max-age=0(CRLF)
Upgrade-Insecure-Requests: 1(CRLF)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106Safari/537.36(CRLF)
Accept: application/json,text/html,*/*;q=0.8(CRLF)
Accept-Encoding: gzip,deflate, sdch(CRLF)
Referer: https://www.runoob.com/jsref/prop.html(CRLF)
Accept-Language: zh-CN,zh;q=0.8(CRLF)(CRLF)
3:消息正文
正文部分不是必须部分,消息正文是2进制数据。是客户端
在发送请求时发送给服务端客户提交的数据。这些数据可能
是注册信息,上传的图片等。具体数据是什么类型以及这些
2进制数据有多少字节会在消息头中具体说明。若消息头中
没有说明消息正文内容,则这个请求中认为是不含有正文的。
消息正文中主要包含post请求参数等的信息
HTTP响应
HTTP响应格式也分为三部分:状态行,响应头,响应正文
状态行格式:
协议版本 状态码 状态描述
protorol status-code status-reason
状态代码有五类:
1xx:信息响应类,表示接受到请求并继续处理
2xx:处理成功响应类,页面访问成功
3xx:重定向类,为了完成指定的动作,必须接受下一步处理
4xx:客户端错误类,表示客户端请求中包含了错误的语法或请求的资源路径未找到
5xx:服务端错误类,因服务端问题不能正确的处理一个正确的请求。
常见的:
200:一切正常,页面访问成功
302:服务端要求客户端重定向到指定路径
400: 添加了@RequestParam注解,注解中标注的参数名为强制提交,若未提交则报400错误!
401 Unauthorized:访问此文件需要身份验证;
403:禁止访问: 访问被拒绝 服务器端网站访问权限配置问题
404:页面访问失败,请求的资源不存在
404造成原因:
1. 到服务器之间通讯链路中断 可以通过ping命令检测链路
2. 网站域名更换未向DNS申报导致无法正确解析域名
3. 请求的页面资源不存在 一般为请求的页面文件被删除导致
4. 网站数据库出错
405:请求方式错误 例如服务器要POST请求,客户端发送的是get请求
406:要么没添加jackson依赖jar包,要么没添加注解驱动
500:服务端处理异常 只要是500错误都是服务器原因造成的
响应头格式: 响应头的格式与请求中的消息头格式一致。
常用的响应头
下面是服务端发送给浏览器的一个响应数据包(不含有正文部分)
Connection: keep-alive
Content-Length: 174
Content-Type: application/json;charset=utf-8
Date: Fri, 11 Jun 2021 10:54:59 GMT
Server: Microsoft-IIS/7.0
响应正文:
响应正文也是二进制数据,用于将客户端请求的资源等
信息发送回给客户端。该正文具体表示的介质类型以及占用
的字节长度会在响应头中有所描述。