JavaWeb~http协议/网络通信传输模型/借助工具来监测http请求和响应/正向代理/反向代理/URL统一资源定位符

HTTP协议介绍

什么是http

HTTP是计算机网络通信中非常重要的一个协议,全称是超文本传输协议(Hypertext Transfer Protocol)

根据名称我们可以将http进行分割:超文本(Hpertext)、传输(Transfer)、协议(Protocol)

在这里插入图片描述
超文本:
文本就是我们通常所说 的文本,即一种简单字符的存在,能够计算机解析的有意义的二进制数据包。在早期的计算机中,我们输入的信息只能能保存在本地,以文本的形式储存。随着互联网的发展,人们不满足于只在两台电脑之间传输文字,还想要传输图片、视频、音频、甚至点击后能进行跳转的超链接。那么文本的语义就被扩大了,语义扩大后的文本就被成为超文本(Hypertext)
传输:
两台计算机之间互相联系,将二进制数据包通过物理传输载体(光缆、电话线、同轴电缆)等由一台计算机终端传输到另一台计算机终端的过程,称为传输(transfer)
协议:
网络协议就是网络中传递、管理信息的一些规范,计算机之间进行通信时需要共同遵守的规则,称为协议(Protocol).

在网络模型中,HTTP协议本身属于应用层协议
是基于传输层的TCP协议实现的。
(HTTP 1.0 HTTP1.1 HTTP2.0 基于TCP, HTTP 3基于UDP)
在这里插入图片描述
当前主要使用的是HTTP 1.1和HTTP2.0。

在网络通信中几个核心的概念

浏览器
类比各大邮箱使用电子邮箱传输协议SMTP一样,浏览器是使用http协议的主要载体。浏览器正式 的名字称为 Web Broser,即检索和查看互联网网页资源的应用程序。(这里的Web,指的是World Wide Web,万维网,即网址中的 www

浏览器发起请求和响应的过程
当我们在浏览器地址栏输入URL(网址),浏览器会向DNS(域名服务器)提供网址,由它完成URL到IP地址的映射,然后将浏览器的请求提交给具体的服务器,然后服务器将请求结果以HTML编码的形式返回给浏览器,然后浏览器执行HTML文件显示在浏览器正文中。
服务器(Client)
存放网页和数据库数据的服务器,所有的动态网页都是在服务器端执行成HTML,CSS,JS等文件,然后下载到客户端进行显示。
客户端(Server)
即我们使用的电脑,包括常用的一些浏览器。也可以理解为用户操作的终端,能够向用户提供本地服务的程序。

Web服务器:
Web服务器正式的名称是Web Server,此服务器一般指的是网站服务器,在本地电脑中,浏览器是http请求的发起方,那么Web 服务器就是http请求的应答方。

服务器和客户端之间存在多种传输模型
1.一发一收,一次请求就有一个响应,是一一对应的关系。这种模型也是Web开发中最常见的一种模型
在这里插入图片描述
2.多发一收,多个请求对应一个响应,像一些大文件的上传等都类似的场景。
在这里插入图片描述
3.一发多收,一次请求,对应多层响应,比如看直播。
在这里插入图片描述
4.多发多收,多个请求对应多个响应,比如steam link,通过手机操作电脑,电脑又不断的向服务器发送请求和接受数据。
在这里插入图片描述

借助工具来观察http的请求和响应

两种方式:1.chrome 开发者工具,浏览器自带。信息看的不太全,看不到请求和响应 的完整格式
在这里插入图片描述

2.wireshark 抓包工具
直接从网卡上拿到数据(很全面,甚至能包括以太网数据帧)
3.fiddler抓包工具
专门捕获HTTP/HTTPS请求的工具

在这里插入图片描述
在右侧inspectors界面,点击raw可以看到具体的请求内容信息,如果是HTTPS加密请求,fiddler抓包工具会自动解密。
在这里插入图片描述

清空请求/响应数据:全选(ctrl+a) 按delete清空

http协议和https协议的不同:

https只是在http的基础上进行了一层加密操作。

正向代理和反向代理

正向/反向代理指的是在客户端和服务器中间,有一些中间服务器或者第三方工具等的运行模式。
正向:从服务器的角度来观察,存在第三方来帮助客户端发送请求,服务器将响应直接返回给第三方,而不关心客户端是谁,我们常用的网游加速器,vpn等都是正向代理。
在这里插入图片描述
反向: 从客户端的角度来观察,存在第三方帮助服务器端发送响应,即第三方代理服务器接受请求,然后发送给真正的服务器,再将服务器响应发送给客户端。
在这里插入图片描述
二者区别:
在这里插入图片描述

http请求和响应的格式

在http请求中的数据都是文本模式的数据。

数据有两种格式: 文本模式和二进制模式。判断方法,用记事本打开,能看懂,不是乱码,就是文本模式 。看不懂,是乱码,那就是二进制模式数据。

如下图:
在这里插入图片描述
请求格式

1.首行
第一行就分为三个部分:HTTP method(方法 )、请求的url、版本号

2.首部(请求头) header:一堆键对值,一个键值对就是一行
键在前,值在后,中间用冒号+空格分割。

3.空行
表示header 部分结束

4.正文body:可有可无,一般是文件内容

响应格式:
1.首行:三个部分:协议版本号,状态码,状态码的描述
2.协议头 header:和请求格式一样,也是一系列的键值对
3.空行:结束的标志
3.正文body :可以有也可以没有,与请求类似,是响应的文件内容

http协议总结

http协议是数据为文本模式的协议,协议分为两部分:请求和响应。

请求
方法 URL 版本号
请求报头 key:value
请求报头key:value

[空行]
正文

响应
版本号 状态码 状态码描述
响应报头key:对应的value
响应报头key:对应的value

[空行]
正文

如下图:
在这里插入图片描述
请求和响应的格式很类似,但信息差别很大。

HTTP请求(request)

URL

所谓的网址,就是url(统一资源定位符。)

网络的很多协议,都是有相关的标准文档来描述他们的RFC系列文档
各种协议 ,各种细节规范,都是由RFC系列文档来描述的。
RFC7939标准
在这里插入图片描述
URL不仅仅是给HTTP服务的,还能够给很多协议提供服务。
如HTTPS、jdbc:mysql://、file://

url的组成
最前面的是协议名称 http 或者https
后面的://是固定内容,然后是服务器地址。
域名,本质上就是一个ip地址。
地址的后面可以带一个冒号,冒号后面可以写一个具体的端口号,就表示要访问的服务器端口。
如果不写端口号,浏览器会给一个默认的端口号,对于HTTP协议来说,默认的端口号就是80,对于https来说,默认的端口号就是443

端口号后面就是一段路径。
URL中的路径 表示访问服务器上的不同的资源~
一个服务器程序上有很多的资源

路径的后面是参数。
也叫做查询字符串
query string
这些参数 就是浏览器给服务器传递的一些信息。

这些参数可有可无,一般都是以键值对的方式组织起来的,
键值对之间,使用&分割
键和值之间,使用=分割
query string 使用? 来作为起始标志
每个键值对都表示啥意思?这是程序员自己约定的。
不同的网站,这里查询到的字符串中的键值对,就截然不同。

URL中 的片段标识符
不常见,用于定位一个HTML页面的具体位置
在“文档类”网站中很常见

URL格式总结:
1.协议名称:URL支持很多种协议
2.用户名密码:先在已经废弃了,不再使用
3.服务器地址,可以是域名,也可以是IP地址。
4.端口号:如果不写端口号,就会有一个默认值(浏览器自动加的)
HTTP默认值 80,HTTPS默认值 443
5.路径:表示服务器上面具体的哪个资源
6.查询字符串:浏览器给服务器传递的一些参数,程序员自定义的
7.片段标识:定位到页面中的某个部分。

URL的初心就是用来区分一个网络上的唯一资源~
1)先通过服务器地址,定位到一个具体的服务器
2)再通过 端口号,定位到一个具体的应用程序
3)再通过路径 定位到这个应用程序管理的一个具体资源。
4)再通过 查询字符串,对这个具体的资源的要求做出进一步的解释
5)最后 通过 片段标识 来确定定位到这个资源的哪个部分

对于URL来说,这几个部分,都不是必须要有的,有些部分是能够省略的。
协议名称 可以省略,
用户名密码,可以省略。
服务器地址,可以省略
端口号,可以shenglue
路径,可以省略
查询字符串,可以省略
片段标识,可以省略。

/path 这个URL 就相当于只有 路径,其他的都省略了。 此时,服务器地址,就是当前服务器地址(需要有上下文)
端口号,也就是和当前服务器地址匹配,协议名称也是一样
查询字符串和片段标识本来就是可以没有的。

URL encode

在用户输入的查询字符串中,可能会包含各种特殊字符 (? /等等)为了避免 浏览器在解析的时候产生歧义,浏览器会自动的将查询字符串中的特殊字符进行转义,
把特殊字符,转成转义字符=> URL encode
把转义字符,还原成原来的字符=> URL decode
除了特殊符号之外,像汉字之类的,也是需要url encode 的

所谓的转义 其实就是把这个特殊字符里面的值,按照十六进制来表示,每个字节在前面放一个%

注意:但我们自己手动构建网页请求的时候,在查询字符串中,千万不能直接在代码中写汉字。而是要手动 的eccode.

HTTP请求中的方法

http 的初心是设置这些方法,将请求根据不同 功能进行一个划分。
例如GET 是从服务器获取数据,而POST方法是往服务器提交数据,

但实际上,GET 和POST 都可以用来获取,也可以用来提交,一切取决于程序员的代码是如何实现的。
因此,在现在2022年来看,这些方法已经失去了实质意义,不同的方法之间都是可以相互替换的。
再进一步讲,这些方法和方法之间,没有“本质区别”

面试官经常问的一道题就是:HTTP协议中 的GET 和POST 两个方法有啥区别??
第一句话就要回答:没有本质区别! (理论上是可以相互替换的)只是在开发的时候,可能有一些约定俗成的习惯,使用习惯不同.

哪些方式会触发http请求

1.直接在浏览器中输入URL,就会触发HTTP请求
2.HTML页面中的一些特殊标签,link,img,script(前面三个是在页面加载时触发),a标签(用户点击时触发)等也会触发HTTP的GET请求。
3.form表单
4.ajax
5.使用java 代码/其他的库
6.通过linux 下的wget /curl命令
7.通过第三方工具,postman 这类工具~

文章参考:
https://blog.csdn.net/qq_36894974/article/details/103930478?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164704532016780271585425%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164704532016780271585425&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-103930478.pc_search_result_control_group&utm_term=http&spm=1018.2226.3001.4187

猜你喜欢

转载自blog.csdn.net/Merciful_Lion/article/details/123431454
今日推荐