0
点赞
收藏
分享

微信扫一扫

Excel模板1:彩色甘特图

老北京的热干面 2024-02-19 阅读 12

网络原理HTTP

前言

如图:HTTP/3.0之前 是基于TCP实现的。到了HTTP3.0版本,则是基于UDP实现的

![[Pasted image 20240203093906.png]]


HTTP

HTTP,全称为 “超文本传输协议”,现在最新版本为 HTTP/3.0,但主流使用的仍然是HTTP/1.1版本。


HTTP的工作流程

HTTP/1.1 采用 持续连接 方式。服务器在发送响应后,仍然保持这条连接,使同一个客户端(浏览器)和该服务器可以继续在这条连接上传输后续的HTTP请求报文和响应报文。

HTTP的交互是非常经典的 “一问一答” 模式:


抓包工具

借助一个抓包工具fiddler 来学习HTTP的报文格式

注:打开一个网站,浏览器和服务器之间的 HTTP 交互并不是只有一次,通常会有很多次。第一次交互是拿到这个页面的 HTML,HTML还会依赖CSS和JS等,HTML被浏览器加载后,又会触发一些其他的http请求,获取到CSS、js等,当执行js时,js代码里又可能触发很多的http请求。经过多次这样拉扯之后,才会呈现浏览器里所看到的内容。


抓取HTTP报文

随便进入一个网站:
蓝色的表示返回的是一个 html,这个往往是访问一个网站的入口请求,选中这个请求并双击

![[Pasted image 20240203130905.png]]

这个是HTTP请求
![[Pasted image 20240203131041.png]]

这是请求的响应报文
![[Pasted image 20240203131100.png]]

用记事本打卡响应报文内容:会看到乱码

![[Pasted image 20240203131218.png]]

解压缩之后就能看到正常的响应内容数据了
![[Pasted image 20240203131230.png]]

注:这种灰色的请求与响应,是由于浏览器和服务器之间要进行多次网络交互,为了提升效率,就会把一些固定不变的内容在浏览器本地的硬盘上进行缓存(如css、图片、js很少发生改变的数据)。保存到硬盘上后,后续再请求,就可以直接从硬盘上读取数据,减少了网络交互的开销。(可以使用 ctrl + F5 强制刷新,强制读取服务器数据)
![[Pasted image 20240204123611.png]]


HTTP报文格式

HTTP请求报文格式,包含4个部分:

  1. 首行。首行分为三个部分:方法(method)、URL、HTTP的版本号,三者用空格分割
    ![[Pasted image 20240203131937.png]]

  2. 请求头(Header)
    从第二行开始,红框圈住部分就叫请求头。类似于TCP报头/IP报头,携带了重要的属性信息(只不过TCP/IP是以二进制携带的,HTTP是以文本内容携带
    HTTP的请求头部分是通过键值对来组织的Key-Value),每个键值对占一行。键和值之间使用 : 加上 (空格) 来分割的。键值对有哪些,分别是什么含义,都是HTTP协议规定的,后续详解。
    ![[Pasted image 20240203132051.png]]

    ![[Pasted image 20240203132521.png]]

  3. 空行:表示一个报文的结束标记
    ![[Pasted image 20240203132716.png]]

  4. 正文(body)http的载荷部分(有的http请求有body,有些则没有,这很正常)


HTTP响应报文格式,包含4个部分:

  1. 首行:三个部分(版本号状态码状态码描述

    ![[Pasted image 20240203133012.png]]

  2. 响应头。也是由键值对组成(Key-Value),通过冒号+空格来分割(:

    ![[Pasted image 20240203133937.png]]

  3. 空行:报文结束标记

    ![[Pasted image 20240203133923.png]]

  4. 正文(body):数据载荷部分
    可以看到响应的载荷是html
    ![[Pasted image 20240203134005.png]]


请求报文具体细节

首行
URL

URL(唯一资源定位符):描述一个网络上的资源位置

URI(唯一资源标识符):只是一个标识,用来区别于其他资源的标识。(角度不同,有时URI也可以表示URL)

这两个东西表示的含义是差不多的,严格说URI的范围比URL更广一些。URL特指你这个东西在网络的哪里。


URL的基本格式

![[Pasted image 20240203162244.png]]

协议方案名:顾名思义,指该网站所用的协议

登录信息(已弃用):毕竟将用户名、密码直接放在这上面是很不安全的操作

服务器地址:由于DNS域名解析系统,这里显示的是域名,用对应的IP地址也可以访问到

服务器端口号:可以指定,也可以不写。不带端口号,浏览器就会取默认值(因为这些服务器都很有名,http: 80;https: 443)

带层次的文件路径:标识资源在网络上的位置

查询字符串:针对请求的内容做的补充说明

![[Pasted image 20240203163303.png]]

结合上述的 IP地址、端口号、路径、查询字符串,就可以 “精确” 描述出一个网络资源的位置了

片段标识符:标识当前页面的某个部分,通过不同的片段标识可以完成页面内的跳转。


URL encode

查询字符串(query string):是程序员自动义的键值对。但在URL中,本身有些符号具有特殊含义(如 /: 等),如果两者的符号冲突,就会导致一些很严重的bug(比如网页跳转失败!)

所以我们就需要对这类特殊符号,在自定义的时候,将其 “转义”

给一个特殊符号的例子:打开包含 C++ 字样的网站,可以看到 %2B%2B,因为 + 在ASCII码表中,用 16进制 表示,就是 2B,并且加上 % 表示这是转义后的内容
![[Pasted image 20240203164332.png]]

再来看看汉字的情况:


方法

![[Pasted image 20240204111446.png]]


报头(header)

header 的整体格式是 “键值对” 结构

Host

Host:表示服务器主机的地址和端口(URL里其实也已经有Host了)

![[Pasted image 20240204121412.png]]

这里的 Host 与 URL 中的 IP地址、端口等信息,绝大部分情况下都是一样的。

少数情况可能不同。


Content-Length 和 Content-Type

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

Content-Type:表示请求中的 body数据格式body 可以传输很多种格式,包括程序员也可以自己约定任意的格式,但有些格式是非常常见的,需要去了解。

请求中的常见格式:

响应中的常见格式:

注:正常来说,响应报文只要有 body,都会有 Content-Type;但也有例外,如果响应报文确实没有 Content-Type,也没有 body,此时有些容错能力很强的浏览器,也能尽可能将这些数据正确显示出来(如 Chrome 浏览器)。


User-Agent(UA)

![[Pasted image 20240204132819.png]]

显而易见:UA描述了用户使用啥样的设备进行上网


Referer

Referer:描述了这个页面是从哪个页面跳转过来的。(也就是能知道当前页面的上一级页面是啥)


Cookie(重要)

Cookie:一种浏览器本地持久化存储数据的机制(即将数据存到硬盘里)

Cookie 也是按照键值对的格式来保存信息。

Cookie最大的作用,就是让服务器对这个客户端有一个清楚的认识。

关于 Cookie 的几个重要结论:

PS:浏览器中保存的账户密码,是另一个保存机制,并不是 Cookie。

举报

相关推荐

0 条评论