【HTTP协议——八股文(上)篇】

目录

一、HTTP协议的基础概念以及用途

二、通过抓包观察HTTP协议

三、HTTP请求详细解释 

1.URL :含义就是“网络上唯一资源标识符”

2、HTTP请求方法(Method)


一、HTTP协议的基础概念以及用途

首先我们了解到网络层的五层体系,跟我们程序猿最密切相关的就是应用层,说到应用层,我们就不得不提到一个协议,那就是HTTP协议。HTTP(“超文本传输协议”)是一种应用非常广泛的应用层协议。我们首先需要了解HTTP协议具体是干什么用的,再来了解他的机制。

用途:我们学过TCP/IP,用淘宝购物来类比的话,TCP/IP所做的工作就是快递这样的服务,而应用层协议则关心的是货物具体的用途和加工,应用层协议中最经典的协议即是HTTP协议。

机制:当我们在浏览器中输入网址的时候,就会构成一个HTTP请求发送给服务器,告知服务器我们想要干什么,而当服务器收到请求的时候,也会生成一个HTTP响应,将我们所需要的东西封装起来返回给用户,HTTP协议所做的是就是对通信双方的数据进行加工处理。

二、通过抓包观察HTTP协议

我们使用的抓包工具分为很多种,而对HTTP协议进行抓包的工具中最常见的是使用Fiddler,接下来我们通过Fiddler工具进行抓包,观察HTTP协议的格式以及内在细节。

在进行抓包之前,我们需要了解Fiddler抓包工具的工作原理,当我们在浏览器输入网址的时候,一般情况下是将HTTP请求直接发送给服务器,服务器也会将HTTP响应直接返回给用户,而Fiddler所起到的作用就类似于中间商,但是区别在于不会赚差价~~双方将HTTP请求/响应都通过Fiddler工具发送给对方,而非直连式的发送~

我们以访问百度主页为例来进行抓包观察:

我们现在浏览器中输入百度的网址:

通过Fiddler抓包工具对这次操作进行抓包:

我们先来观察HTTP请求的格式中都有哪些数据:

 

 

 HTTP请求遵循的格式如上图:

①、第一行为请求行,首先是Method,在抓到的HTTP请求中可以看到此次的Method为GET方法,URL为https://www.baidu.com/ ,协议版本为HTTP/1.1,当前HTTP协议的版本大体上分为3中HTTP1、HTTP2、HTTP3,当前市场是主流使用的版本为HTTP1.1。

对于Method我们还有更近一步的研究,在此处先不进行过多赘述~

②、接下来就是请求报头Header,请求报头包含了很多行,它是以KEY=Value的形式组成的,键和值之间使用:空格 来分割。

③、空行 空行的存在意义是标志着请求报头的结束

④、请求正文(body) 可选的 不一定有,在此次抓包过程中就并没有~

然后我们来看HTTP响应中有哪些数据:

 

 HTTP响应遵循的格式如上图:

我们观察到和HTTP响应和HTTP请求并没有很大的区别,最主要的区别就在于第一行不再是请求行,而是状态行~

①、状态行:Version即为使用的HTTP协议版本,此处为HTTP/1.1 ,状态码为200,状态码描述为OK。关于状态码,我们也有更深一步的研究,同样也不在此处进行赘述,状态码描述就是对状态码的更进一步的说明。

②、响应报头:和请求报头类似,也是K=V格式的一些数据

③、空行:标志着响应报头的结束

④、响应正文(body):服务器返回给客户端的具体数据,响应正文可能会存在多种不同的格式,最最常见的格式为html~~

三、HTTP请求详细解释 

1.URL :含义就是“网络上唯一资源标识符”

URL既要明确主机是谁,又要明确获取主机上的哪个资源

对于上面的访问百度主页案例中,该URL过于简单,我们可以试着访问更复杂一点的网址进行观察:

 我们先来看看常见的URL格式是怎样的:

 ①、协议方案名称:描述当前这个URL是给哪个协议来使用的,我们主要的协议为HTTP和HTTPS,http://供HTTP协议使用,https://供HTTPS协议使用

②、登录信息:登录信息和协议方案名现在很少会用到,在古代上网,这里会体现用户名密码等信息

③、服务器地址:要访问的主机是啥,可以是IP地址,也可以是域名,通过域名解析会自动将域名解析成IP地址~

④、服务器端口号:表示当前要访问目的主机上的哪个应用程序,端口号大部分情况下会省略,省略并非不存在,而是会赋予默认值,对于使用HTTP协议的URL,就会使用80端口作为默认值,对于使用HTTPS协议的URL,则会使用443端口作为默认值。

⑤、文件路径:描述当前需要访问的服务器资源是啥,注意:虽然请求的URL中写的是一个文件路径,但是不一定服务器上就真的会存在一个对应的文件,这个文件可能是一个真实的,在磁盘上的的确确存在的文件,也有可能是虚拟的,由服务器端的代码构建出来的~

⑥、查询字符串:又称为query String,本质上是浏览器/客户端,给服务器传递的自定义信息,相当于对获取的资源提出进一步的要求,比如说我需要获取类型为动画片的视频主页面或者类型为电影的视频主页面,千变万化,完全由程序猿自己定义这里的具体信息,同样此处也是遵循K=V结构,查询字符串和路径之间使用?来分割~~

⑦、片段标识符:描述了要访问当前html页面中哪个具体的子部分,能够控制浏览器滚动到相关位置,至今也很少去使用~

 至此,我们对URL就有了更深一步的理解,上述的ip地址+端口+带层次的文件路径,其实就是描述了一个网络上的具体资源,在此基础上还可以携带一些更多的要求,也就是后面的参数~~

此外,我们还有一个知识需要补充,那就是URL encode/decode ,当query String(查询字符串)中如果包含了特殊字符,例如/ : ? & = .....这些在URL中具有特殊含义的符号出现在query String中,我们该如何处理?如果包含特殊字符,那么就需要对特殊字符进行转义,转义的过程我们就称为url encode;反之,把转义之后的内容还原回来,就叫做url decode。下面我们举例来说明该过程的具体实现:

我们在百度当中搜索C++

 我们可以查询ascii表,查询+这个符号对应的信息:

 +所对应的十六进制正是2B,url encode规则,其实就是把需要转义的内容,用其ascii码表中对应的十六进制表示,同时加上%,每个字节都分别这样处理,在实际开发过程中,尤其是前后端交互的时候,尤其是通过URL给服务器传递信息的时候,一定要针对里面的特殊字符进行url encode。不仅仅是标点符号,还有中文字符,如果不做转义处理,就可能会带来问题。

URL小结:对于URL来说,里面的结构看似比较复杂,其实对于我们开发人员来说,最关系紧密的,主要就是四个部分:①、ip地址/域名、②、端口号、③带层次结构的路径、④、query String 查询字符串,其中③和④是我们写代码密切相关的~~

2、HTTP请求方法(Method)

 HTTP协议的方法非常多,但是最最最最最常用的,也就只有GET和POST~

起初,设计HTTP协议的大佬希望程序猿能够按照HTTP语义(说明)来使用这些方法,但是随着时间的推移,现实有些事与愿违,现在大家写代码,基本上都是GET/POST代替了其余方法,基本没咋考虑语义的事情,这样就导致了多种HTTP方法之间的界限越来越模糊,当下默认的用法:GET从服务器获取资源,POST将数据传输给服务器,但是,二者的作用也是可以颠倒的~

经典面试题:浅谈GET和POST的区别?

第一句话盖棺定论,GET和POST没有本质区别~~

具体来说,相当于是GET的使用场景也可以使用POST来代替,同样的POST的使用场景,也可以使用GET代替~

接下来说细节上的区别:

1.语义上的区别

GET用于获取资源、POST用于上传数据

2.通常情况下,GET是没有body的,GET通过query String 向服务器传递数据;

通常情况下,POST是有body的,POST通过body向服务器传递数据,但是POST没有query String。

但是!!!如果我想让GET有body(自己构造一个带body的GET请求),或者就想让POST带有query string,也是可以完全可以实现的~~

3.GET请求一般是幂等的,POST请求一般是不幂等的。

幂等:每次你相同的输入,得到的输出结果是确定的

非幂等:每次相同的输入,得到的结果不确定

4.GET可以被缓存,POST不能被缓存

提前把结果记住,如果是幂等的,记住结果是相当有用的,可以大大节省下次访问的开销,如果不是幂等的,就不应该去记~

举个例子:假设访问腾讯视频主页,那就不能被缓存,因为视频主页的内容是要随着时间的推移而不断更新的,因此就需要每次访问都获取最新的页面资源,但是比如访问具体的某个长时间不会发生更新修改的页面,那就可以被缓存,因为输入相同的网址,输出的结果是确定的~

剩余内容接中篇我们在描述~~~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值