javaEE-6.网络原理-http

目录

什么是http?

http的工作原理:

抓包工具

fiddler的使用

HTTP请求数据:

1.首行:​编辑

2.请求头(header)

3.空行:

4.正文(body)

HTTP响应数据

1.首行:​编辑

2.响应头

3.空行:

4.响应正文(body)

请求首行:

URL:

URLencode:

方法(method):

1.GET方法:常用于获取服务器上的某个资源。

2.POST方法:多用于提交用户输入的数据给服务器。

GET和POST的区别:

还有一些描述关于GET和POST的区别,但都不是很准确:

请求头(header)内容:

1.host:​编辑

2.Content-Length,Content-Type

3.User-Agent(UA)

4.referer

5.Cookie

状态码:

常见的状态码:

构造HTTP请求工具:

Postman


什么是http?

http是"超文本传输协议",是应用层的协议。

(文本,就是字符串,能在utf8/gbk表中找到的合法字符,超文本就是不仅是字符串,还包含图片,视频,音频等,html就是超文本;还有富文本格式,就是类似于word,可以设置字体大小,行间距等)

HTTP诞⽣与1991年.⽬前已经发展为最主流使⽤的⼀种应⽤层协议.HTTP协议是基于TCP实现的。

http发展至今,已经有了好多个版本,已经到了http 3.0,但目前主推的还是http 1.0

2.0之前的版本是基于TCP实现的,3.0是基于UDP实现的,

2.0和3.0版本引入了很对新的特性,对传输效率和安全性都做了提高。

http的工作原理:

我们平时打开一个网站,就是通过http协议来传输数据的。

http最常见的应用场景就是 网站,浏览器和服务器之间的数据传送,客户端和服务器之间传送数据。

http请求:指要访问哪个网页

http响应:返回指定网页,(这里的网页是通过HTML来实现的)

当我们在浏览器中输⼊⼀个搜狗搜索的"⽹址"(URL)时,浏览器就给搜狗的服务器发送了⼀个HTTP请求,搜狗的服务器返回了⼀个HTTP响应.这个响应结果被浏览器解析之后,就展⽰成我们看到的⻚⾯内容.(这个过程中浏览器可能会给服务器发 送多个HTTP请求,服务器会对应返回多个响应,这些响应⾥就包含了⻚⾯HTML,CSS,JavaScript,图 ⽚,字体等信息).

http是典型的"一问一答"类型。

抓包工具

抓包工具就是一些"代理程序",通过捕获网络上传输的数据,并显示出来,给程序员一些参考.

fiddler专注于对http的转包,下载地址:

Download Fiddler Web Debugging Tool for Free by Telerik

可以选择classic版本,是免费的

首次下载需要填一些信息,填完之后就可以下载了,安装也和简单,一直next就可以了.

下载之后,要简单设置一下:

1.先打开fiddler,

点击tools

点击options

选择https,将里面的都给勾选上,第一次勾选时,会弹出来一个"是否安装证书",选择 是.

此外,有的电脑上带有/下载的 代理程序(浏览器插件/单独的程序),需要关闭电脑上的代理程序.fiddler也是一个代理,可能会产生冲突.

(打开fiddler后,可能会出现浏览器卡顿或者打不开的情况,关闭fidller就可以了)

fiddler的使用

配置完成之后,就能看到fiddler上抓到很多程序的数据包.

电脑上还有很多感知不到的程序在背后操作,fiddler都能抓到,并显示出来.

打开一个百度界面,在fiddler中就能被抓到

双击百度,在右侧就会出现两个框

上面是请求框,下面是响应框,选择raw,raw里是http请求/响应的原始数据.

若在这里看着内容比较小,在右下角,有一个View in Noteoad,点击后,可以在记事本中查看:

在记事本中打开:

响应的raw也可以在记事本中打开,但能看到,有的响应数据是乱码,

乱码是响应数据被压缩了(为了节省带宽),进行解压就可以了.

可以通过点击:Responsebody is encoded.Click to decode来解压:

HTTP请求数据:

1.首行:

方法(method) ;

url(网址) ;

版本号 .

这三个部分使用 空格 进行分隔

2.请求头(header)

请求头包含从第二行到最后一行,包含了一些键值对,每个键值对占一行,键和值之间用:和空格进行分隔。这些键值对类似以TCP的报头,包含了一些重要的连接信息。

3.空行:

请求头下面有一行空行,表示请求头结束标记。

4.正文(body)

HTTP的载荷部分,有的http请求有正,有的没有正文

HTTP响应数据

1.首行:

包含三部分,分别是:版本号 状态码 状态码描述,用空格分开

2.响应头

响应头是从第二行到一个空行,也是由一些键值对构成,每个键值对占一行,键和值之间用:和空格分隔。

3.空行:

响应头结束标志。

4.响应正文(body)

HTTP的载荷部分,响应的载荷是html。

请求首行:

URL:

URL描述一个网络上的资源位置,是唯一的资源定位符。

一个url的完整结构:

协议方案名:HTTP

登录信息:用户名,密码...,(写在这里不是很安全,现在都是通过网页来登录认证).

服务器地址:域名,IP协议

端口号:要访问的端口号,若url中没有带端口号,浏览器会给一个默认的服务器端口号,并不是系统随机分配的,

文件路径:网络上的资源位置,

查询字符串(query string):

这是一个百度的网址url,

URLencode:

在url中存在很多有特殊意义符号,有? / : & .....,查询字符串(query string )是一些自定义的键值对,

这些键值对的内容中也有可能涉及到这些符号,若直接写进去,就有可能解析失败,因此需要对特定符号(包括汉字)进行转义,将特殊字符对照ascii码表进行转义,再通过%进行分隔.

通过百度搜索鲜花:

鲜花对应ascii码表的16进制就是 E9 B2 9C E8 8A B1,

方法(method):

位于首行中的第一部分,用来描述这次请求的目的,要干什么。

有这些类型:

1.GET方法:常用于获取服务器上的某个资源。

GET方法非常常见。

fiddler抓包得到的一条:

这条数据包对应的请求数据:

2.POST方法:多用于提交用户输入的数据给服务器。

常用于登录和上传。

这是一条登录功能的数据包:

对应的请求数据:

GET方法通常没有body部分,POST有body部分,GET方法一般会把需要传送非服务器的补充信息放到URL中,通过query String传递,POST中的query string一般为空,将数据放到body中,通过body传递.

这是POST中的body部分,是JSON格式的数据,使用的是base64编码的方式,

base编码一般带有一个"==",使用四个字节代,对原来的三个字节进行重新编码.

这是为了原始数据中的二进制内容,因为有些场合只能存储文本文件.

base64编码的编码规则 有标准版,也有自定义版.标准版就属于明文传输,属于透明的,无法作为加密方法,自定义版就可以自己约定编码规则,进行加密操作.

GET和POST最常用,别的用的比较少,虽然对上面的这些方法的使用有一各自的说明,但这些规定都属于标准文档创作者的"一厢情愿",开发者在实际开发程序的时候,他们都是可以相互使用的。

GET和POST的区别:

GET和POST本质上是没有区别的,使用GET的场景可以替换成POST,使用POST的场景也可以替换成GET;这些都取决于代码实现时是怎样写的。

但GET和POST在使用习惯上有一些不同

1.GET的body一般为空,更习惯把数据放到URL的query String中;POST的URL的query String一般为空,更多把数据放到body中

(当然,这两个的存放方式通常是可以交换位置的,GET也可以将数据放到body中,POST也可以将数据放到URL中)

2.语义上:在标准文档中,GET的语义是用来获取数据;POST的语义是用来给服务器传输数据。

3.幂等性:在表针文档中,建议GET请求实现幂等的;POST没有要求。

幂等性指的是:若每次输入的内容一样,返回的结果是一样的,则是幂等的;

若每次输入的内容一样,返回的结果不是一样的,则不是幂等的。

4.GET请求可以被浏览器收藏夹收藏,POST请求不能。

还有一些描述关于GET和POST的区别,但都不是很准确

1**.POST比GET更安全**:

因为在登录的时候,GET的信息是在URL中,能直接在屏幕上看到,但POST是在body中,无法直接看到。

这是不准确的,因为POST的即时是在body中,使用抓包工具,同样也能获取到数据,要想让数据安全,最根本的是对数据加密。

2**.POST比GET存储的数据更多**:

这是在之前的时候,现在没有这一区别了,GET的数据存储是在URL中,之前URL的长度有限制,现在没有了。

3.GET只能携带文本数据,POST只能携带二进制数据

GET通过URL的query String携带数据,query String确实只能携带文本数据,但可以将二进制数据通过urlencode转换成文本数据来实现存储数据,到服务器在进行urlencode,转换成二进制文件就可以了;

POST将数据存放到body中,body部分不是只是二进制数据的,也可以存放别的数据。

请求头(header)内容:

请求头,就相当于报头,有很多 键值对 组成,下面是一些常见的键值对:

1.host:

表示服务器主机的地址和端口.大部分情况下和url中的地址和端口是一样的,少数会有不同,

2.Content-Length,Content-Type

Content-Length: 表示body中的数据长度,

Content-type: 表示body中的数据格式,

若数据包中没有body部分,在请求头中也就没有这两个键值对了.

HTTP的底层是TCP,Content-Length用来解决数据的粘包问题,

body中可以有很多种数据格式,程序员也可以自己任意定义格式,就要通过Content-type来确定,

有一些常见的请求数据格式:

application/json:body 就是JSON

application/x-www-form-urlencoded:

multipart/form-data:上传文件时使用的.

常见的响应数据格式:

1.text/plain: 纯文本格式

2.text.html: html 格式

3.text/css: css格式

4.application/javascript: js格式

5.image/png: 图片

6.image/jpd: 音频

在fiddler中,抓到的包中

可以看到,有一些是灰色的,表示是在本地机器硬盘的缓存中,

当主机发出请求时,浏览器和服务器之间要进行多次的网络交互,整体的效率是比较低的.

为了提升交互效率,会在首次访问的时候,将一些不变的内容在浏览器本地的机器硬盘中进行缓存;当再次访问时,直接从缓存中读取就可以了,减少了网络交互的开销.

若想让浏览器不从缓存中读取,直接从服务器中获取,点击这个,让后按ctrl+f5,就能重新获取数据了.

3.User-Agent(UA)

表示浏览器/操作系统的信息/属性.

:这一部分表示操作系统的信息,

:这些是多个浏览器的信息.

浏览器的信息和操作系统的信息描述了用户使用什么样的设备上网,

对于浏览器新老特性的兼容,设备的不同,呈现的页面的格式的差异,通过UA都能很好的解决,

4.referer

描述当前页面从哪个页面跳转过来的.

早期的referer是可以被随意修改的,现在使用的https都进行了SSL加密,就很难被他人修改了.

5.Cookie

保存了一些 报头中的重要属性.

Cookie本质上是一个浏览器本地持久化保存数据(存储在硬盘中)的机制.

Cookie的来源:服务器首次访问/登录成功浏览器后,返回给浏览器的.

Cookie的去向:Cookie会保存在浏览器本地本机的硬盘中,后续每次访问服务器都会带上Cookie; 不同的客户端,保存的Cookie是不同的,就算相同的客户端,访问不同的浏览器,Cookie也是不同的.

**Cookie的内容:**键值对格式的数据,由程序员自定义

不同网站的Cookie是不相同的.

Cookie在浏览器中的组织形式:在本地的硬盘保存,按照不同域名为维度分别存储

**Cookie的用途:**用来保存客户端的数据,

主要是用来保存客户端的身份标识,方便服务端通过身份标识来区分用户.(其他的数据信息一般不会保存到Cookie中,Cookie是随时可以删掉的)

状态码:

状态码存在响应中,用来表示响应的结果.

http中的状态码都是标准约定好的,

常见的状态码:

常见的几个状态码:

200 OK : 表示成功!

404 Not Found: 表示要访问的资源没找到.

在gitee中,当要访问abc.html时,就会显示这样的页面:

405 Method Not Allowed: 表示你的服务器只支持GET请求,但你发送的是POST请求.

500 Internal Server Error: 服务器内部错误.

504 GateWay Timeout:访问服务器超时

301:永久重定向

302:临时重定向

要访问网站A,访问A之后,浏览器自动跳转到了网站B.

一般用于某个网站,发布使用了很长时间,想要修改域名,但可能有很多用户已经保存了原网站的域名在收藏夹中了,若突然修改,原来的域名就没法用了,这样就降低了用户的使用观感.

为了不影响用户的使用,可以把访问老域名的请求定向到访问新域名的请求,当访问原来的网址时,就能顺利跳转到新的网址了.

若是永久重定向,浏览器会将重定向的结果记录下来,保存到浏览器本地的缓存中,下次再访问时,就没有跳转的步骤了,直接定向到新的网站中.

临时重定向就无法缓存了.

构造HTTP请求工具:

Postman

是一个经典的,广泛使用的工具.

相关推荐
Bruce_Liuxiaowei10 小时前
权限维持:操作系统后门技术分析与防护
网络·安全·web安全
利刃大大12 小时前
【高并发服务器:HTTP应用】十六、HttpContext上下文模块 && HttpServer服务器模块&& 服务器测试
运维·服务器·http·高并发·项目
是专家不是砖家12 小时前
rk3562 udp发送带宽500Mbps出现丢包问题
网络·网络协议·udp·rk3562·udp丢包·t507
wanhengidc12 小时前
云手机通常使用什么架构
服务器·网络·安全·游戏·智能手机·云计算
在路上看风景13 小时前
5.1 路由选择算法
网络
xiaoxiongip66613 小时前
假设两个设备在不同网段,网关怎么设置才能通呢
网络·爬虫·python·https·智能路由器
Full Stack Developme13 小时前
java.net.http 包详解
java·http·.net
Li zlun14 小时前
TCP/IP协议:互联网的基石与通信灵魂
网络·网络协议·tcp/ip
SSL店小二14 小时前
IP SSL证书申请全过程及注意事项
服务器·网络·网络协议·https·ssl
NewCarRen15 小时前
自动驾驶与联网车辆网络安全:系统级威胁分析与韧性框架
网络·网络安全·自动驾驶