应用层-详解HTTP协议

一:HTTP概念

HTTP的全称为 "超文本传输协议",是一种应用非常广泛的应用层协议


①文本:本义上其实就是指字符串


②超文本:除了字符串,还有图片、字体、视频、音频

二:HTTP版本

🌟HTTP 往往是基于传输层的TCP协议实现的


💗HTTP1.0、HTTP1.1、 HTTP2.0:基于TCP实现

💗HTTP3:基于UDP实现


💙目前我们主要使用的还是 HTTP1.1

(HTTP2.0都是非常少见的了,更不用说HTTP3.0)

三:HTTP协议的工作过程

①HTTP请求:客户端向服务器发送的消息,用于请求特定资源或执行特定操作

②HTTP响应:服务器对客户端请求的回应,包含了服务器返回的数据及相关的状态信息

(HTTP响应里包含了页面HTML、 CSS、 JavaScript、 图片、 字体等信息)


💓工作过程

浏览器输入网址➜浏览器给对应网址服务器发送HTTP请求➜网址服务器给浏览器返回HTTP响应➜浏览器最后解析这个HTTP响应,这个HTTP响应里就包含了页面HTML、 CSS、 JavaScript、 图片、 字体等信息,就展现在我们眼前

四:抓包工具

(1)抓包

🌟本质上就是一个代理


💗作用:可以获取到浏览器和服务器之间的信息以及具体的HTTP请求和HTTP响应


(2)代理分类

①正向代理:代理客户端


②反向代理:代理服务器

(3)Fiddler

1.概念

🌟Fiddler是一个常用的抓包软件

2.下载地址

点击下载Fiddler

(选择Fiddler Classic)


3.了解Fiddler页面


五:HTTP协议格式

(1)HTTP请求格式

①首行: [方法Method] + [URL] + [HTTP版本Version]


②Header:请求需要用到的属性,即用冒号分割的键值对
💙每组属性之间使用\n(换行)分隔

💙遇到空行表示Header部分结束


③Body:空行后面的内容都是Body
💜Body允许为空字符串
💜如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度


(1)首行:POST是方法;HTTP/1.1是版本号;中间的即是URL

(2)Header:属性有Host、Connection......

(3)Body:位于空行后面,图中最后红色框Body部分

(2)HTTP响应格式

①首行:[HTTP版本号Version] + [状态码] + [状态码描述]


②Header:请求需要用到的属性,即用冒号分割的键值对
💙每组属性之间使用\n(换行)分隔

💙遇到空行表示Header部分结束


③Body:空行后面的内容都是Body
💜Body允许为空字符串
💜如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度

💜如果服务器返回了一个html页面,那么html页面内容就是在body中


(1)首行:HTTP/1.1是版本号;200是状态码;OK表示状态码描述

(2)Header:属性有Server、Content-Type......

(3)Body:位于空行后面,图中最后红色框Body部分,里面是html、css、js代码

(3)HTTP协议总结

六:详解HTTP请求

(1)URL

1.URL概念

URL (Uniform Resource Locator):统一资源定位符

(即我们平常说的网址)

2.URL格式

①整体格式

(URL的详细规则由因特网标准RFC1738 进行了约定)


②格式解析

(1)协议方案名:常见的有http和https

(有其他的类型,例如访问mysql需要用的jdbc:mysql)


(2)登陆信息(认证):用于身份认证;现在一般用不到,可完全忽略


(3)服务器地址:指的就是域名;域名会通过 DNS 系统解析成一个具体的IP地址

(可以通过cmd查看相关域名对应的IP,方法:打开cmd➜输入ping 域名)


(4)端口号:用来区分程序,表示访问目标服务器的哪个端口;输入时可以忽略,这时浏览器会根据协议类型自动决定使用哪个端口

(MYSQL端口号是3306)


(5)带层次的文件路径:使得组织和管理文件更加方便;客户端可以准确地指定服务器上的资源位置,服务器会根据路径查找并返回对应的文件或资源

(如果忽略不写,就相当于访问的是“/”,这个称作根目录;访问根目录通常就是访问到对应服务器的主页;有时候访问“/”就会访问到/index.html)


(6)查询字符串(query string):本质上是一个键值对;键值对之间使用&分隔;键和值之间使用=分隔

(针对访问的资源进行补充说明)


(7)片段标识符:片段标识主要用于页面内跳转;可省略


3.URL可省略部分

4.URL encode

①符号规定:像 / ? : + 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现,如果出现了,就要进行转义


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

🌟例如下图:"+" 被转义成了 "%2B"

(2)Method

1.方法的含义

💗主要是用来描述HTTP请求具体要干什么

2.方法总表

3.GET方法

🌟所有方法中80%常见的HTTP方法


①作用:从服务器获取资源


②带有GET方法的请求一般没有Body


③如何触发带有GET方法的请求

(1)在浏览器中直接输入URL,此时浏览器就会发送出一个GET请求

(2)HTML中的link, img, script等标签,也会触发GET请求


④带有GET方法请求的特点

🌟GET方法请求的参数默认情况下从URL中的查询字符串获取


⑤关于GET请求的URL长度问题

4.POST方法

🌟所有方法中常见率仅次于GET的HTTP方法


①作用:登录和上传数据;上传个文件或者图片之类的


②带有POST方法的请求Body一般不为空


③带有POST方法请求的特点

🌟POST方法请求的参数默认情况下从Body获取

5.GET和POST的区别(面试题)

1.作用不同

①GET:用于从服务器获取资源

②POST:用于登录和上传数据


2.传递数据方式和Body不同

①GET:GET的Body一般为空, 通常将需要传递的数据通过查询字符串query string传递

(GET通常把数据放在查询字符串query string)

②POST:POST的查询字符串query string一般为空, 通常将需要传递的数据通过Body传递

(POST通常把数据放在Body中)

🌟注意:上述用了“通常”两字,所以这并不代表GET的数据就一定要放在query string,GET的数据也可以放在Body,POST也是如此,POST的数据也可以放在query string!但是并不常见


3.幂等性不同

①GET:GET请求一般是幂等的

②POST:POST请求一般是不幂等的

(💚幂等:如果多次输入或者请求得到的结果一样, 就视为是幂等的)


4.关于缓存不同

①GET:GET可以被缓存

②POST:POST不能被缓存

(💚缓存:有些操作计算比较耗时,缓存就是把结果保存下来,下次需要时就直接获取)

(💜缓存的前提是幂等)


5.获取参数方式不同

①GET:GET方法请求的参数默认情况下从URL的查询字符串获取

②POST:POST方法请求的参数默认情况下从Body获取


🌟6.总结:GET和POST本质上其实没啥区别,都是传输数据给服务器,但是对于登录的账号密码,更推荐使用POST;因为假如你使用GET就是把登录密码放在URL的查询字符串中,就会给人一种不安全的感觉;而当你使用POST,就会把账号密码放在Body中;两者最大的差别就在于GET的放在URL中用户是能直接看见的(包括浏览器收藏夹),POST的放在Body中用户是没法直接看见的


7.GET与POST的补充说明,有关一些网上言论的打假

6.其他方法

🌟其他方法用的比较少,面试可能考到,了解一下即可


(3)Header

1.报头的格式

①Header(报头)的整体的格式是 "键值对" 结构

🖤(1)查询字符串(query string)和Body的键值对是由程序猿根据需求自行定义的

🖤(2)而Header的键值对是有标准规定的


②每个键值对占一行


③键和值之间使用分号分割

💜如下图:Content-Length是键;36是值


④遇到空行代表Header结束

2.Host

①常见的报头类型之一


②作用:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上


🌟问题:URL里面不是已经有服务器的域名了吗?为什么还要在Host里?

答:通常情况下,Host里的内容和URL是一致的;也有例外情况,比如使用了代理就可能不一致了

3.Content-Length

①常见的报头类型之一


②作用:表示Body部分数据的长度


③如果请求里面没有Body,Content-Length可以没有

但是如果请求里面有Body,Content-Length必须得有

4.Content-Type

①常见的报头类型之一


②作用:表示请求的Body中的数据格式


③HTTP请求中Content-Type常见的三种类型

(1)表单提交的数据格式

🌟此时Body的格式与盘符字符串query string一样


(2)一般是用于上传文件/图片时的格式

🌟此时Body的格式形如下图


(3)大多网站都使用的json格式

🌟此时Body的格式形如下图

5.User-Agent

①常见的报头类型之一

(User-Agent简称UA)


②作用:表示浏览器/操作系统的属性


③Windows NT 10.0; Win64; x64:表示操作系统信息

④AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36:表示浏览器信息


⑤现如今的意义:主要用来区分PC端还是移动端

(1)PC端:显示Windows或者MAC之类的

(2)移动端:Android或者IOS之类的

6.Referer

①常见的报头类型之一


②作用:表示这个页面是从哪个页面跳转过来的


③注意:如果直接在浏览器中输入URL,或者直接通过收藏夹访问页面时是没有Referer的

(但如果你是点击了某个页面的内容,发生了跳转,就带了Referer)


🌟老早些年,Referer是明文传输的,这就代表传输过程可以篡改你的Referer;一般来说,一些广告商找到百度、搜狗这些浏览器给它们钱然后在网页发布广告,这个时候就可以通过Referer来统计跳转次数从而计算出有多少人点击广告,广告点击数越多,百度、搜狗等浏览器就赚得越多;但是吧,运营商(移动/电信/联通)他们其实也有广告商,运营商就通过篡改Referer来把本属于从百度网页跳转的广告转为自己的,这个时候,就需要HTTPS给Referer进行加密传输了(下文详细说明HTTPS)

7.Cookie

①浏览器本地存储数据的一种机制


②作用:实现 "身份标识" 的功能;每个不同的域名下都可以有不同的Cookie, 不同网站之间的Cookie并不冲突

🌟(Cookie会存储很多键值对,往往会有一个很重要的键值对是用来表示用户的“身份信息”,即标识当前请求是来自于哪个用户的;就会产生这么一种场景,比如你登陆一个网站,后续再访问这个网站页面,就无需登录了,而且就算关了电脑,第二天重开网页,依然不需要登录)


③原理:Cookie是按键值对的形式来存储了一些字符串,这些键值对往往都是由服务器返回回来的,浏览器把这些键值对按照“域名”维度进行分类存储,意思就是说不同网站就有不同的Cookie,例如百度有百度的Cookie,搜狗有搜狗的Cookie,这些Cookie的内容都是由程序猿自己定义的


④Cookie的保存机制:


⑤总结:

(1)Cookie从哪来?

答:Cookie是从服务器返回给浏览器的

(2)Cookie保存在哪?

答:Cookie保存在浏览器所在电脑的硬盘上,每一组域名都有自己的Cookie

(3)Cookie中的内容是啥?

答:Cookie中的内容是键值对结构的数据,这里的键值对是由程序猿自己定义的

(4)Cookie中的内容到哪里去?

答:后续访问该网站的各个页面,就都会在请求中带上Cookie,服务器就可以进一步知道客户端的详细情况 


🌟问:浏览器要保存数据为啥要保存到Cookie,而不能直接往硬盘写入一个文件保存?

答:往硬盘写入是绝对不行的!因为如果你让网页能够轻易的访问你的文件系统,这是一件非常危险的事情;想一下如果你上一种病毒网站,网站直接给你的电脑上下个病毒或者直接把你硬盘上已有的数据删除掉了,那不就完蛋了?

💓因此为了保证安全,浏览器会对网页的功能作出限制,禁止访问硬盘就是对网页的其中一个限制;所以为了既能保证安全也能保存数据,浏览器就提供了一个Cookie功能!

(4)Body

1.正文的格式
Body又称为正文

🌟Body中的内容格式和Header中的Content-Type密切相关

2.application/x-www-form-urlencoded

①如果Header中的Content-Type是"application/x-www-form-urlencoded"


②那么Body的格式形如:

3.multipart/form-data

 ①如果Header中的Content-Type是"multipart/form-data"


②那么Body的格式形如:

4.application/json

①如果Header中的Content-Type是"application/json"


②那么Body的格式形如:

七:详解HTTP响应

(1)状态码 (status code)

1.作用

💗状态码表示访问一个页面的结果(是访问成功, 还是失败, 还是其他的一些情况...)

2. 200(OK)

①作用:这是一个最常见的状态码, 表示访问成功


②解析:200表示状态码;OK表示状态码的描述

3. 404(Not Found)

①作用:表示没有找到资源

(浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个URL标识的资源不存在, 那么就会出现404)


②解析:400表示状态码;Not Found表示状态码的描述

4. 403(Forbidden)

①作用:表示访问被拒绝,即没有权限访问

(有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆 直接访问, 就容易见到403)


②解析:403表示状态码;Forbidden表示状态码的描述

5. 405(Method Not Allowed)

①作用:表示对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)

(上文学过的POST、GET等等方法)


②解析:405表示状态码;Method Not Allowed表示状态码的描述


🌟这种情况我们后面学习了Servlet再演示

6.500(Internal Server Error)

①作用:表示服务器出现内部错误;一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码


②解析:500表示状态码;Internal Server Error表示状态码的描述


🌟这种情况我们后面学习了Servlet再演示

7.504(Gateway Timeout)

①作用:表示服务器响应超时;当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况

(多半是服务器出问题了)


②解析:504表示状态码;Gateway Timeout表示状态码的描述


🌟这种情况在双十一等 "秒杀" 场景中容易出现,平时不太容易见到

8.302(Move temporarily)

①作用:表示临时重定向


②解析:302表示状态码;Move temporarily表示状态码的描述


🌟在登陆页面中经常会见到302,用于实现登陆成功后自动跳转到主页!

🌟响应报文的Header部分会包含一个Location字段,表示要跳转到哪个页面!

9.301(Moved Permanently)

 ①作用:表示永久重定向


②解析:301表示状态码;Move Permanently表示状态码的描述


🌟当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址!

🌟301也是通过Location字段来表示要重定向到的新地址!

10.状态码小结

(2)Header

1.报头的格式

①Header(报头)的整体的格式是 "键值对" 结构

🖤(1)查询字符串(query string)和Body的键值对是由程序猿根据需求自行定义的

🖤(2)而Header的键值对是有标准规定的


②每个键值对占一行


③键和值之间使用分号分割

💜如下图:Content-Length是键;36是值


④遇到空行代表Header结束

2.Content-Type

🌟HTTP响应的Header和HTTP请求的Header类似,这里就介绍比较重要的Content-Type

(HTTP响应中Header的Content-Type同样会影响Body)

①Content-Type格式:text/html


🌟此时Body的格式是HTML

②Content-Type格式:text/css


🌟此时Body的格式是CSS

③Content-Type格式:application/javascript


🌟此时Body的格式是JavaScript

④Content-Type格式:application/json


🌟此时Body的格式是JSON

(3)Body

1.正文的格式

Body又称为正文


🌟​​​​​​​Body的具体格式取决于Header中的Content-Type

 2.text/html

①如果Header中的Content-Type是"text/html"


②那么Body的格式形如HTML:

3.text/css

 ①如果Header中的Content-Type是"text/css​​​​​​​"


②那么Body的格式形如CSS:

4.application/javascript

 ①如果Header中的Content-Type是"application/javascript​​​​​​​"


②那么Body的格式形如JavaScript:

5.application/json

①如果Header中的Content-Type是"application/json​​​​​​​​​​​​​​"


②那么Body的格式形如Json:

八:通过form表单构造HTTP请求

(1)概念

💗form(表单)是HTML中的一个常用标签;可以用于给服务器发送GET或者POST请求


🌟作用:描述了要把数据按照什么方式, 提交到哪个页面中


(2)form的重要参数

①action:构造的HTTP请求的URL是什么


②method: 构造的HTTP请求的方法是GET还是POST

💚(form 只支持GET和POST)

(3)input的重要参数

①type: 表示输入框的类型

💙(text表示文本; password表示密码;submit表示提交按钮,点击按钮即可发送请求)

💜(一般点了submit的提交按钮后,就会转到action所写的URL页面)


②name: 表示构造出的HTTP请求的query string的key;query string的value就是输入框用户输入的内容


③value: input 标签的值

💙(对于type为submit类型来说,value就对应了按钮上显示的文本)

九:通过ajax构造HTTP请求

(1)概念

ajax:Asynchronous Javascript And XML


🌟一种通过JavaScript给服务器发送HTTP请求的方式


💜特点:不需要刷新页面/页面跳转;就能进行数据传输

(2)发送请求

①首先要在body标签内部创建一个<script src="  "></script>标签

🌟src的作用是可从网上加载一个js代码;这里需要填的是一个jQuery服务器地址

💚作用就在于可以调用jQuery方法,因为js原生的ajax的API使用起来不方便

💙CDN其实是一些大佬们搞的一组服务器,里面放一些常用资源

1.先点击这个网页➜jQuery CDN

2.跟着图片步骤


②再创建一个<script></script>标签;在标签内写正式的js代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src=""https://code.jquery.com/jquery-3.7.1.min.js""></script>
    <script>
        //$在js当中就相当于对象,这个对象里有很多方法,通过$.方法的形式调用相对应的方法
        //$.ajax()就是jQuery中封装好的用来发起ajax请求的方法
          $.ajax({
            type:"get",
            url:"www.sogou.com",
            success:function(body){
                console.log("ok");
            }
          });      
    </script>
</body>
</html>


十:通过Java socket构造HTTP请求

(1)概念

🌟使用Java构造,本质上就是一个TCP客户端,然后创建一个Socket对象,往里面按照HTTP请求协议格式写数据即可


💗关于网络编程可参考文章:Java初识网络编程

(2)GET代码

(3)POST代码

十一:通过第三方工具构造HTTP请求

🌟Postman官方下载

十二:HTTPS

(1)HTTPS概念

💗HTTPS也是一个应用层协议

(前面学过的HTTP相关知识,在HTTPS中同样适应,只不过HTTPS是加密了,HTTPS一旦解密,就是HTTP的内容)


🌟HTTPS是在 HTTP 协议的基础上引入了一个加密层

(2)HTTPS的重要性

💜典型案例:臭名昭著的 "运营商劫持",即HTTP的缺点


💙例如:下载一个天天动听的APP

①未被劫持的效果:

②运营商劫持效果:

(3)了解加密解密

①明文:实际要真正传输的数据


②密文:将明文进行一系列变换之后的数据


③加密:明文➜密文


④解密:密文➜明文


⑤密钥:辅助进行加密解密过程的数据

(4)对称加密

💗加密和解密使用同一个密钥


🌟通过这一个密钥,既可以加密也可以解密


💜通常对称加密密钥由客户端创建

(5)非对称加密

💗非对称加密要用到两个密钥;一个叫做公钥,一个叫做私钥



💜通常非对称加密的公钥和私钥由服务器创建

(6)证书

💗证书就好比人的身份证, 作为这个网站的身份标识

💙注:此处的公钥是公钥2,属于第二组非对称加密,是为了给对称密钥的加密(下文细说)


①通常来说,证书由第三方公正机构发布,在建立服务器的时候第三方公正机构会把证书给服务器


②同时,第三方公正机构也会产生公钥1和私钥1,公钥1会内置到客户端设备的系统中,而私钥1就会给服务器

(7)HTTPS整体流程

💗HTTPS工作过程中涉及到的密钥有三组


①第一组非对称加密

1.作用:用于校验证书是否被篡改

💚(如果没有校验证书是否被篡改,客户端就不能确定这个公钥2是不是黑客伪造的​​​​​​​)

2.过程:

(1)服务器持有私钥1(私钥在注册证书时获得);客户端持有公钥1(操作系统包含了可信任的CA认证机构有哪些, 同时持有对应的公钥)

(2)服务器使用这个私钥1对证书的签名进行加密;客户端通过这个公钥1解密获取到证书的签名, 从而校验证书内容是否是篡改过


②第二组非对称加密

1.作用:用于协商生成对称加密的密钥,相当于给对称密钥进行加密(套娃)

💚(若没给对称密钥进行加密,那么对称密钥会进行明文传输,如果黑客拿到了对称密钥,就能截取客户端服务器往来的很多信息)

2.过程:

服务器产生私钥2和公钥2,将公钥2放进证书,通过私钥1加密发给客户端,客户端再用公钥1解开,此时不但能拿到证书也能拿到公钥2,然后对对称密钥进行加密通过公钥2传给服务器,接下来服务器通过私钥2进行解密拿到对称密钥;这时客户端与服务器就都知道对称密钥是什么了,后续客户端和服务器就可以利用对称密钥进行加密解密传输数据;即使黑客截取了公钥2,也没用,因为没有私钥2解开,私钥2一直在服务器那边


③第三组对称密钥

作用:客户端和服务器后续传输的数据都通过这个对称密钥加密解密

💚(此时得益于前两组的非对称加密,对称密钥就得到了安全保障)

十三:Tomcat

(1)概念

💗Tomcat是一个HTTP服务器


💛HTTP服务器我们也同样可以通过Java Socket来实现;但Tomcat就是基于Java实现的一个开源免费,也是被广泛使用的 HTTP 服务器

(2)下载安装

①先去官方网站:Tomcat官方网站


②左侧这里有给DOWNLOAD,选择Tomcat8


③选择Core的第一个即可

(3)了解目录

①下载好之后,可以看到有以下目录


②理解目录


③重点理解webapps

(4)启动服务器

①在bin目录中, 双击startup.bat即可启动Tomcat服务器


②看到形如以下日志,说明启动成功


③注意事项


④启动服务器的目的在于让客户端对服务器发起请求,而HTTP的客户端就是浏览器

因此,在浏览器中输入 127.0.0.1:8080 即可看到 Tomcat 的默认欢迎页面

🌟(一定要先启动Tomcat,再输入网址,必须要先启动服务器才能接收请求)

(1)127.0.0.1:这个是环回IP,即表示本机

(2)8080:Tomcat的默认端口号

(5)Tomcat的默认端口

🌟Tomcat的默认端口一共有两个


①端口号8080:业务端口

💚(HTTP请求就是发在这个端口上)


②端口号8005:管理端口

💚(进行一些管理操作,比如远程控制Tomcat关闭)


💙可通过conf目录下的serve.xml来查看端口号,并且也可以修改端口号

(6)部署静态网页

①在webapps目录下创建一个新目录test


②再在新目录test下创建一个html文件,至于HTML内容,可自行写


③再双击这个html文件,此时它就会通过网络打开,意义就在于不但自己能访问,网络上的所有人也能访问

(如果只有内网IP那么就只有同一个局域网的人能看到,否则需要云服务器)

(7)Tomcat对于Java的作用

①Tomcat是方便Java程序员编写后端的程序


②Tomcat提供了一系列的API接口,这些API背后已经把一些基础工作做好了,比如像处理HTTP协议这样的工作,Java程序员,只需要调用上述的API,通过代码,就可以完成基本的HTTP服务器核心功能,Tomcat把这组API起名叫做“Servlet”


③关于Servlet,可自行查看主页文章​​​​​​​

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值