3-2:HTTP协议

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-2:HTTP协议相关的知识,希望对你有一定的参考价值。

一:URI和URL

(1)URI和URL分别是什么

  • URI(Uniform Resource Identifier):统一资源标识符——表示的是web上每一种可用的资源,如 html文档、图像、视频片段、程序等都由一个URI进行标识的。
  • URL(Uniform Resource Locator):统一资源定位符——URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。

URL是URI的一个子集,URL是URI概念的一种实现方式。

URI和URL都定义了资源是什么,但是URL还定义了如何访问资源,URL是一种具体的URL。他不仅唯一标识资源,而且还提供了定位该资源的信息。因此URL是一种语义上的抽象概念,可以是绝对的也可以是相对的,但是URL必须提供绝对的定位信息

(2)URL的格式(网址)

URL的格式如下
在这里插入图片描述

  • 协议方案名:http或https协议
  • 登录信息(认证):指定用户名和密码作为服务器端获取资源时的必要信息,此项为可选项,浏览器显示时会隐藏
  • 服务器地址:访问服务器时必须指明服务器地址,上图给出的只是方便人们记忆的网址,实际会由DNS(域名解析器)进行解析
  • 服务器端口号:指定服务器连接的网络端口号,也是一个可选项,其中有些端口号非常有名,属于强绑定了,如果用户省略则会使用默认的端口号
  • 带层次的文件路径:指定服务器的文件路径来定位指定的资源。和UNIX系统目录结构类似,但这不是根目录,而是一个部署好的web根目录。
  • (注意"?“好前面就是基本的URL格式,如果需要传入参数,在”?"号后面加入,以K-V形式传入)
  • 查询字符串:百度搜索时就按照这种方式传参

另外,可以发现像/ ? @ :这样的字符在URL中是具有特殊的意义的,因此在传参时如果需要传入这样的字符,就必须对其进行转义转义的过程称为urlencode,其逆过程称为urldecode

如下,如果输入普通字符,可以发现关键字未被转义
在这里插入图片描述
如果输入特殊字符,发现进行了转义
在这里插入图片描述

  • 转义规则:将需要转义的字符先转为16进制,然后从右向左取4位(不足4位直接处理),每2位做一位,在前面加上%,编成“%XY”的格式

因此在编写服务器时,面对这些特殊字符,一定要做编码处理,下面是一个在线的编码/解码工具

二:HTTP协议基本概念

(1)HTTP协议是什么

HTTP协议(HyperText Transfer Protoco)即超文本传输协议,属于网络分层中的应用层协议

(2)什么是超文本传输协议

1:协议
这个在这里就不多解释了,学习网络对于协议这二字解释的已经够多了

2:传输
HTTP协议是一个双向协议。

我们在上网冲浪时,浏览器是请求方 A ,百度网站就是应答方 B。双方约定用HTTP 协议来通信,于是浏览器把请求数据发送给网站,网站再把⼀些数据返回给浏览器,最后由浏览器渲染在屏幕,就可以看到图片、视频了。

在这里插入图片描述
3:超文本
再来理解「超文本」,它就是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从⼀个超文本跳转到另外⼀个超文本

因此对于HTTP协议可以总结为:HTTP 是⼀个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」

(3)HTTP的基本特征

A:无连接

HTTP本身是基于TCP的,而TCP又是面向连接的,但HTTP却是无连接的,这似乎有点矛盾。
实际上,HTTP既然建立与TCP之上,所以其本身是不关心TCP通信细节的,TCP是否是面向连接的与我HTTP是没有半毛钱关系的。
而且,当TCP连接建立成功之后,HTTP是没有必要在应用层再建立一个连接的,所以TCP建立好之后,HTTP直接向对方发HTTP请求(request)就可以了。

B:无状态

TCP很明显是有状态的,但是HTTP是没有状态的。
HTTP是一种不保存状态协议,其自身不对请求和相应之间的通信状态进行保存,也就是说在HTTP这个级别,协议对于发送过的请求或相应都不会做持久化处理
在这里插入图片描述
使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的

但是这样的简单会带了一个很大的问题——就是它不会记录任何用户信息,这样就意味着你登录淘宝,刚登上就断了,无法保持登录状态。为了解决这个问题就引入了记录基本信息的技术:cookie和session

C:简单快速

HTTP在刚出来时是基于短连接的,用于传输html,img,css等文件,后续版本也支持了长连接。

三:HTTP的构成

HTTP很简单——request和respond

注意下面需要分析请求报头和响应报头的构成,需要使用到抓包工具,推荐使用fillder
在这里插入图片描述

(1)request

在这里插入图片描述

A:请求报文基本构成

在这里插入图片描述
在浏览器中输入百度的网址,选中相应数据,右侧显示中上半部分为请求报头,下半部分显示为相应报头,点击raw(原始数据)查看

在这里插入图片描述
信息具体如下

GET https://www.baidu.com/ HTTP/1.1 #请求行
Host: www.baidu.com #请求的主机
Connection: keep-alive #长连接 HTTP可以选择不断开TCP,从而连接持久化
sec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)#浏览器,操作系统信息
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: BIDUPSID=9F74B621908F780204441F86DCCE03A5; PSTM=1598331815; BAIDUID=9F74B621908F7802E2D41BCA0AE628E1:FG=1; BAIDUID_BFESS=9F74B621908F7802E2D41BCA0AE628E1:FG=1; BD_UPN=12314753; COOKIE_SESSION=0_1_1_1_0_0_0_0_1_0_0_0_0_0_0_1_0_1624878202_1624878201%7C1%230_1_1624878201%7C1; BDUSS=kFjVE4wOVphT2l-Ym82YnE5RHdJUlZTRW10MU5qM1lqS1p4eVUxaVNHR2pPUUZoRVFBQUFBJCQAAAAAAAAAAAEAAADjDoXG1-7Lp77NysfO0jYyMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOs2WCjrNlgR; BDUSS_BFESS=kFjVE4wOVphT2l-Ym82YnE5RHdJUlZTRW10MU5qM1lqS1p4eVUxaVNHR2pPUUZoRVFBQUFBJCQAAAAAAAAAAAEAAADjDoXG1-7Lp77NysfO0jYyMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOs2WCjrNlgR; BD_HOME=1; H_PS_PSSID=34099_34225_31253_34226_33848_34133_33607_34134_26350; sugstore=0; BA_HECTOR=ah85al8g252h0l05ui1gdoqqk0r #缓存信息
# 此行为空行



(2)respond

A:响应报文基本构成

在这里插入图片描述
抓包信息如下

HTTP/1.1 200 OK #响应行
Bdpagetype: 2
Bdqid: 0x8231b40200113aab
Cache-Control: private
Connection: keep-alive # 长连接
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8 # 返回的文件类型
Date: Wed, 30 Jun 2021 13:08:55 GMT
Expires: Wed, 30 Jun 2021 13:08:55 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=271; path=/ # 服务器给客户端设置cookie
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=34099_34225_31253_34226_33848_34133_33607_34134_26350; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 162505853526142891629381477419473517227
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
# 此行为空行,下面是正文
dab
        k k u  V ?@ EͽC4ޏ #Gd  ()! -*   @    NIv I$[  S \\N *  D +J  , ǘ3 > /d= Y q t ;   4  } >        ' ?  w

*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

可以看到响应报头正文部分均为乱码,其实这是HTTPS请求,已经被加密了
在这里插入图片描述
这里我们使用Linux中telnet工具尝试抓包
在命令行中输入telent www.baidu.com 80,请求百度的80端口
在这里插入图片描述
接着我们手动进行请求,请求方法是GET,请求URL如果输入/表示请求首页,版本为1.1
在这里插入图片描述
请求正文略过,直接输入换行,此时会发现百度服务器会将百度的首页,也就是一个HTML文件返回过来,这就是响应正文
在这里插入图片描述
其中content-length就是标识响应正文的长度的
在这里插入图片描述

以上是关于3-2:HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章

代码适用于与单个 html 文件不同的堆栈片段

怎么用http协议实现安卓数据

CPNtools协议建模安全分析---实例变迁标记

HTTP协议

HTTP协议

HTTP客户端代码片段