HTTP协议

HTTP协议

    • 一、什么是HTTP?
    • 二、HTTP工作过程
    • 三、HTTP协议特点
    • 四、HTTP协议格式
      • 4.1 抓包原理
      • 4.2 抓包工具使用
      • 4.3 抓包结果分析
    • 五、HTTP交互
      • 5.1 HTTP请求地址URL
      • 5.2 HTTP请求地址方法
        • 5.2.1 GET
        • 5.2.2 POST
        • 5.2.3 GET和POST的区别
      • 5.3 请求报头
        • 5.3.1 Host
        • 5.3.2 Content-Length
        • 5.3.3 Content-Type
        • 5.3.4 User-Agent
        • 5.3.6 Cookie
      • 5.4 请求正文
      • 5.5 HTTP响应
        • 5.5.1 状态码
      • 5.6 响应报头
      • 5.7 响应正文

一、什么是HTTP?

HTTP(Hyper Text Transfer Protocol),全称超文本传输协议,是一种应用非常广泛的应用层协议。HTTP是一套在网络上传输文件(如文本、图像、视频、声音和其他多媒体文件)的规则。

二、HTTP工作过程

通常,当我们在浏览器输入一个“网址”,此时浏览器就会给对应的服务器发送一个HTTP请求,对方服务器收到这个请求之后,经过计算处理,就会返回一个HTTP响应

三、HTTP协议特点

  • 支持客户端、服务器端模式;
  • 简单快速:客户向服务器端发送请求时,只需要传送请求的方法和路径,由于HTTP协议简单,因此使得通信速度较快;
  • 无连接:每次只处理一个客户端的请求,服务器端处理完用户的请求,并收到用户的回应,就会断开连接,这种方式可以节省传输时间;
  • 灵活:HTTP可以允许任意类型的数据对象,正在传输的数据类型由Content-Type来标记。
  • 无状态:每次服务器端接收客户端的请求时,都是一个全新的请求,服务器端不知道客户端的历史请求记录。(可通过①cookie ②session 解决。

四、HTTP协议格式

HTTP是一个文本格式的协议,可以通过Chrome开发者工具或者Fiddler进行抓包,来分析HTTP协议的格式。

4.1 抓包原理

抓包工具Fiddler相当于一个“代理”,当浏览器访问发送一个请求时,会将请求先发给Fiddler,Fiddler再把请求转发给服务器,当服务器端返回数据时,Fiddler拿到返回数据,再把数据交给浏览器。

举个栗子来理解Fiddler的代理功能:我们现在经常会使用uu跑腿帮你买东西,当我们要买一个东西时,把钱发给uu跑腿的小哥,然后小哥在来到超市把钱给老板,买到东西之后,再把这个东西交到你手上,因此这个跑腿小哥对“我”和“超市老板”之间的交易非常清楚。

HTTP协议_第1张图片

这就时Fiddler的工作原理。

4.2 抓包工具使用

Fiddler(下载:https://www.telerik.com/fiddle):


HTTP协议_第2张图片
以上就是Fiddler的抓包功能的一些使用,运用上面的方法,完全可以实现抓包。

4.3 抓包结果分析

下面用一个具体的HTTP请求和响应的抓包结果,我们用这个抓包结果来分析HTTP请求和HTTP响应的详细数据格式:

HTTP请求:
HTTP协议_第3张图片

  • 首行(请求行):[方法]+[url]+[版本];
  • 请求报头(Header):请求的属性,用冒号分隔的键值对(冒号后有一个空格!!!),每组属性之间使用\n分隔,遇到空行表示Header部分结束;
  • 请求正文(Body):空行后面的内容都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度。

HTTP协议_第4张图片
HTTP响应:
HTTP协议_第5张图片

  • 首行:[版本号]+[状态码]+[状态码解释]
  • 响应报头(Header):与请求报头相同
  • 响应正文(Body):空行后面的内容都是Body.Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;如果服务器返回了一个html页面,那么页面内容就在Body中。

HTTP协议_第6张图片

注意:
HTTP中的报文中空行的作用:由于HTTP协议并没有规定报头部分的键值对的个数,因此空行的作用就是为了分隔报头和正文的内容。

五、HTTP交互

HTTP交互主要分为:

  • HTTP请求
  • HTTP响应

HTTP协议_第7张图片

下面我们来详细的分析一下HTTP请求和HTTP响应中的内容。

5.1 HTTP请求地址URL

URL的全称是(Uniform Resource Identifier),中文名是统一资源定位符,也就是我们俗称的“网址”。HTTP协议_第8张图片
由于服务器的ip地址很难记,是一串数字,因此将ip地址转换为便于人类记忆的协议就是DNS协议(域名系统),它作为将域名和ip地址相互映射的一个分布式数据库,当人们使用URL地址进行请求时会对DNS系统进行解析得到具体的ip地址。(我们通过ping命令可以看到真实的IP地址)HTTP协议_第9张图片

一个具体的URL地址:

https://edge.microsoft.com/extensionrevocation/v1/threatListUpdates:fetch?&key=d414dd4f9db345fa8003e32adc81b362

  • https:协议方案名。常见的有http和https。
  • edge.microsoft.com:服务器地址,此处是一个域名,会通过解析DNS系统解析成一个具体的ip地址。
  • 端口号ip地址+端口号可定位到计算机上的某个程序。当端口号省略时,浏览器会根据协议类型自动决定使用哪个端口。http协议默认使用80端口,https协议默认使用443端口。
  • key=d414dd4f9db345fa8003e32adc81b362:url中的参数,本质是一个键值对结构,键值对之间使用&分隔,键和值之间使用=分隔。

5.2 HTTP请求地址方法

这里的方法是指请求的方法类型。

5.2.1 GET

GET常用于获取服务器上的某个资源。GET中的请求参数会直接加在url后面,只能添加少量参数,请求参数会显示在浏览器的地址栏。

浏览器会发送get请求的情况:

  • 直接在浏览器地址栏输入某个地址
  • 点击链接
  • 表单默认方式
  • JavaScript的ajax构造GET请求

GET请求的特点:

  • 首行的第一部分为GET
  • url的query string可以为空,也可以不为空
  • header部分有若干个键值对结构
  • body部分为空

5.2.2 POST

POST常用于提交用户的数据给服务器。请求参数添加在实体内容里,可以添加大量参数(这也就解释了为什么浏览器地址栏不能发送POST请求,因为在地址栏里我们只能填写url,并不能进入到HTTP包的实体当中)。

浏览器会发送post请求的情况:

  • 设置表单method=“POST”
  • JavaScript的ajax构造POST请求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录系统</title>
</head>
<body>
<form action="login" method="post" >
    <div style="margin-top:50px;margin-left:40%">
        <h1>用户登录</h1>
        姓名:<input type="text" name="username"><br>
        密码:<input type="password" name="password">
        <p>
            <input type="submit" value="提 交"> &nbsp;&nbsp;&nbsp;
            <input type="reset" value="重 置">
        </p>
    </div>


</form>
</body>
</html>

POST请求的特点:

  • 首行的第一部分为POST
  • url的query string一般为空(也可以不为空)
  • header部分有若干个键值对结构
  • body部分一般不为空,body内的数据格式由Content-Type指定。body的长度由header中的Content-Length指定。

HTTP协议_第10张图片

5.2.3 GET和POST的区别

  1. 语义不同:get一般用于获取数据,post一般用于提交数据。
  2. body是否为空:get类型的body一般为空,post类型的一般不为空。
  3. 幂等不同:标准建议get实现为幂等的,但实际开发中get也不必完全遵守这个规则(主流网站都有“猜你喜欢”的功能,会根据用户的历史悉能为实时更新现有的结果),而post的实现为非幂等的。
  4. 关于传输数据量:HTTP协议没有规定GET类型的请求有长度限制,但是在实际浏览器的实现通常GET请求都是有长度限制。post没有长度限制,可以传输大量参数。
  5. 是否能缓存:GET可以被缓存,但是POST不能被缓存。
  6. 关于安全性:由于get类型的请求参数直接显示在url地址中,而post请求的参数放在body中,所有post比get稍微安全一些。

5.3 请求报头

请求报头在发送请求时用来描述更多消息,header整体格式也是键值对结构的,每个键值对占一行,键和值之间用冒号分隔。
HTTP协议_第11张图片

下面介绍几个常见的消息:

5.3.1 Host

表示服务器的地址和端口号。

5.3.2 Content-Length

表示body中的数据长度。

5.3.3 Content-Type

表示请求的body中的数据格式。
常见的数据格式有以下几种:

  • application/x-www-form-urlencoded:form表单提交的数据格式,此时body的格式如下:error=login_required&error_description=AADSTS500
  • mulipart/form-data:form表单提交的数据格式,通常用于提交图片/文件。
  • application/json:数据格式为json,body的格式如下:
{
	"username": "12345678",
	"password": "12345678"
}

5.3.4 User-Agent

表示浏览器/操作系统的属性,形如

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39

5.3.5 Referer
表示这个页面是从哪个页面跳转过来的,如:Referer: https://www.sojson.com/
如果直接在浏览器中输入URL,或者直接通过收藏夹访问页面时是没有Referer的。

5.3.6 Cookie

Cookie顾名思义就是“甜饼”,由于HTTP是一种无状态的协议,服务器单从网络连接上无法直到用户的身份,那该怎么办呢?因此人们想出了一个办法,就是给客户端颁发一个通行证,在向服务器端发送请求时带上自己的通行证,这样服务器就能从通行证上确认客户身份了。这就是cookie的工作原理了。

HTTP协议_第12张图片

5.4 请求正文

上文在讲Content-Type时已经提到请求正文的数据格式由Content-Type决定,上面列出了三种形式。
分别是: application/x-www-form-urlencodedapplication/jsonmultipart/form-data。具体我们可以通过抓包看到详细信息,这里就不再展示。

5.5 HTTP响应

HTTP协议_第13张图片

  1. 首行:版本号、状态码、状态描述信息
  2. 响应报头
  3. 空行
  4. 响应正文

5.5.1 状态码

常见的状态码:

1. 200 OK:表示访问成功
HTTP协议_第14张图片

2. 404 NOT FOUND:没有找到资源
当输入的url所标识的资源不存在,就会出现404。
HTTP协议_第15张图片
HTTP协议_第16张图片

3. 403 Forbidden: 表示访问被拒绝
有的页面通常需要用户具有一定的权限才能访问,如果没有权限进行访问就会见到403.
HTTP协议_第17张图片
HTTP协议_第18张图片
4. 500 Internal Server Error
服务器内部出现错误,一般是服务器的代码在执行过程中遇到了一些错误。
HTTP协议_第19张图片

5. 504 Gateway Timeout
当服务器负载比较大,流量剧增时,服务器单条请求的时候消耗时间就会很长,就会出现超时的情况。

6. 302 Move temporarily
临时重定向,重定向就相当于呼叫转移,拨打这个号码会在用户不知情的情况下自动跳转到另一个号码。

重定向常见于登录页面,用于登录成功后自动跳转到哪个页面。响应报文中会包含一个字段Location,表示要跳转到哪个页面。

HTTP协议_第20张图片

7. 301 Moved Permanently
永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改为新地址。
同302,也是通过Location来表示重定向的新地址。

5.6 响应报头

响应报头中的Content-TypeContent-Length等属性的含义一致。

Content-Type:

  • text/html:body数据格式是HTML
  • text/css:body数据格式是CSS
  • application/javascript:body数据格式是JavaScript
  • application/json:body数据格式是JSON

5.7 响应正文

与请求正文类似,响应正文的数据格式由响应报头中的Content-Type决定。

以上就是HTTP协议以及HTTP协议的交互的详细介绍啦,如果觉得对你有帮助,那就点个赞吧~~

你可能感兴趣的:(Java,Web,http,https,网络协议)