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协议的主要内容,如果未能解决你的问题,请参考以下文章