当我们在浏览器中输入一个百度的"网址"(URL)时,浏览器就会给百度服务器发送一个HTTP请求,百度服务器返回了一个HTTP响应 这个响应结果被浏览器解析之后,就展示成我们看到的页面内容,(这个过程中浏览器可能会给服务器发送多个HTTP请求,服务器会对应返回多个响应,这些响应里就包含了页面HTML,CSS,JavaScript,图片,字体等信息) HTTPS可以认为是HTTP的升级版,区别在于引入了一个加密层,安全性更高一些 HTTP协议是一种典型的"一问一答模型"的协议 客户端->服务器 客户端发一个请求,服务器返回一个响应(一一对应),如打开网页这种场景
理解应用层协议 我们之前学过的TCP/IP,已经知道目前数据能够从客户端进程经过路径选择跨网络传送到服务器端进程(IP+Port) 当我们把数据从A端传送到B端,TCP/IP解决的是顺丰(传送+路径选择)的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,叫做应用层协议,其中经典协议之一就是我们所说的HTTP协议负责 “定义数据的用途和格式” 理解HTTP协议的工作过程 当我们在浏览器中输入一个"网址",此时浏览器就会给对应的服务器发送一个HTTP请求,对方服务器收到这个请求之后,经过计算处理,就会返回一个HTTP响应

事实上,当我们访问一个网站的时候,可能涉及不止一次的HTTP请求/响应的交互过程。 可以通过chrome的开发者工具,Fiddler抓包等观察到这个详细的过程



抓包程序也是一种代理,代理分为正向代理和反向代理
维度正向代理反向代理代理对象代理客户端(替客户端向服务器发送请求)代理服务器(替服务器接收客户端的请求)隐藏的身份隐藏客户端的真实 IP(服务器不知道客户端是谁)隐藏服务器的真实 IP(客户端不知道访问的是哪台服务器)典型场景- 科学上网(突破地域限制) - 客户端加速(缓存常用资源) - 企业内网客户端访问外网(统一出口管理)- 负载均衡(将请求分发到多台服务器) - 网站防护(WAF 作为反向代理过滤恶意请求) - 静态资源缓存(CDN 节点作为反向代理加速内容分发)示例工具 / 服务VPN(部分场景)、企业级代理服务器Nginx、HAProxy、CDN(如 Cloudflare)、负载均衡器客户端感知客户端需手动配置代理服务器地址(知道代理存在)客户端无需配置(不知道代理存在,以为直接访问服务器)
抓包前的注意事项:

启动Fiddler即可开始抓包




请求Request



响应Reponse




为什么HTTP报文中要存在"空行"? 因为HTTP协议并没有规定报头部分的键值对有多少个.空行就相当于是"报头的结束标记",或者是 “报头和正文之间的分隔符" HTTP在传输层依赖TCP协议,TCP是面向字节流的.如果没有这个空行,就会出现"粘包问题"
URL的基本格式
平时我们俗称的"网址"其实就是说的URL(UniformResourceLocator统一资源定位符). 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URI 唯一资源标识符,可以简单地理解成URL是URI的一种实现
协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

https://www.baidu.com/s?wd=苹果&rsv_spt=1
这里的 ?wd=苹果&rsv_spt=1 就是查询字符串。
转义,让"特殊字符"在网址中能正常传输
当我们使用搜狗浏览器搜索C++,用Fiddler进行抓包的时候,会得到以下URL
GET https://www.sogou.com/web?query=C%2B%2B&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sourceid=9_01_03&sessiontime=1752049959495 HTTP/1.1query=C%2B%2B,我们发现,++怎么变成了%2B%2B,我们通过url解码工具发现%2B对应的就是+
需要url encode的原因:
转义的规则:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。 但是现在网上有很多现成的可以进行转码的工具,因此需要的时百度寻找在线工具即可
方法就是描述了这个HTTP请求的"动作" 方法说明支持的 HTTP 协议版本GET获取资源1.0、1.1POST传输实体主体(提交数据)1.0、1.1PUT传输文件(一般用于上传)1.0、1.1HEAD获得报文首部(仅响应头)1.0、1.1DELETE删除文件 / 资源1.0、1.1OPTIONS询问服务器支持的方法1.1TRACE追踪请求 - 响应传输路径1.1CONNECT要求用隧道协议连代理1.1LINK建立与资源的关联1.0UNLINK断开资源关联关系1.0
最常用的HTTP方法,常用于获取服务器上的某个资源 在浏览器上直接输入一个URL,此时浏览器就会发出一个GET请求 另外,HTML中的 link,img,script等标签,也会触发GET请求. 特点:
关于GET请求的URL长度问题 没有对URL的长度有任何的限制. 实际URL的长度取决于浏览器的实现和HTTP服务器端的实现.在浏览器端,不同的浏览器最大长度是不同的,但是现代浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的. 搜狗页面的请求:

POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(如登录页面)/上传文件。以下几种方法都会触发 POST 方法的请求
特点:
教务系统登陆界面:

两个方法没有本质的区别,GET能用的场景换成POST也能用,POST能用的场景换成GET也可以
POST /buy 提交 “买 1 瓶可乐”,服务器会减库存、扣钱。如果重复发这个请求,可能会多扣钱、多发货 —— 结果变了。
这时候要是用缓存,就会出问题:比如第一次买成功了,缓存记成 “成功”,第二次其实又买了一次,但缓存还拿上次的结果告诉你 “成功”,但实际已经多买了 —— 这就是 “假结果”。
所以 POST 不能缓存,每次都得让服务器重新处理,保证结果准确。)幂等就是:不管操作执行 1 次还是 N 次,最终效果和结果都完全一样 。 开发里常用在接口设计(比如支付、删除、查询),保证重复调用不出幺蛾子~
POST 比 GET 更安全吗? 以登录为例,需要把用户名密码传递到服务器 POST登录,用户名密码是在body,从浏览器界面上是看不到的 GET登录,用户名密码是在url的querystring中,可能直接显示到浏览器地址栏的 此时就说明POST更安全吗?不一定 安全问题取决于是否加密以及加密算法的强度。这和将数据信息放到 query string 或 body 中无关,因为通过抓包,我们就可以得到这两部分的数据 GET只能传输文本数据吗? GET只能传输文本,POST可以传输文本也能传输二进制这种说法是有误解的 URL 的 query string(就是
?a=1&b=2这部分)只能存文本 GET也能传二进制 1)先转码再拼接:基于query string,可以把二进制进行urlencode/base64转码 2)给get添加body:确保使用的库(客户端,服务器)都能支持这种用法即可
这些方法的HTTP请求可以使用ajax来构造.(也可以通过一些第三方工具) 任何一个能进行网络编程的语言都可以构造HTTP请求.本质上就是通过TCPsocket写入一个符合HTTP协议规则的字符串。
header的整体的格式也是"键值对"结构 每个键值对占一行,键和值之间使用分号分割 6.1HOST 告诉服务器 “我要访问哪个域名” 表示服务器主机的地址和端口 6.2Content-Length 告诉服务器 “请求体的字节长度是多少” 表示body中的数据长度,单位是字节. 告诉我们http数据报到哪里就结束了 6.3Content-Type 告诉服务器 “请求体的数据格式是什么” 表示请求的body中的数据格式 一个请求/响应中,没有body,也就没有这俩字段,如果有body则必须有Content-Length和Content-Type这两个字段 教务系统登陆界面

Content-Type中常见的类型 一、文本类(纯文字数据)
text/plain
最基础的纯文本,没有特殊格式,比如 “你好,世界” 这种字符串。
text/html
HTML 格式的文本,浏览器看到这个类型就知道要按网页格式解析(比如渲染 <h1> 标题、<p> 段落等)。
text/css
CSS 样式表文本,浏览器用它来给 HTML 加样式(比如颜色、布局)。
text/javascript (或 application/javascript)
JavaScript 代码,浏览器看到这个会执行里面的脚本(比如点击按钮的逻辑)。
二、表单类(网页表单提交的数据)
application/x-www-form-urlencoded
表单默认的提交格式,数据会被转成 key1=value1&key2=value2 这种字符串(比如登录时的用户名和密码,会被拼接成 username=xxx&password=xxx)。
注意:特殊字符会被 urlencode 编码(比如空格变 + 或 %20)。
multipart/form-data
用于表单上传文件或二进制数据(比如上传图片、文档)。数据会被分成多个 “块”,每个块带自己的标识,避免不同数据混在一起解析错误。
例:网页上传头像时,表单的 enctype 通常设为这个类型。
三、JSON 类(前后端常用的结构化数据)
application/json
JSON 格式的字符串,是前后端接口交互最常用的类型之一。比如 {"name":"张三","age":18} 这种键值对结构,几乎所有编程语言都能轻松解析。User-Agent简称UA,表示浏览器或操作系统的属性,相当于客户端(比如浏览器、手机 App、爬虫程序)给服务器发的一张 “身份证”,告诉服务器:“我是谁,我用的啥工具访问你” 让服务器知道访问者的 “身份信息”
比如你用的是 Chrome 浏览器还是 Safari 浏览器?
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko)其中Windows NT 10.0;Win64;x64表示操作系统信息 AppleWebKit/537.36 (KHTML,like Gecko) Chrome/91.0.4472.77 Safari/537.36表示浏览器信息.
作用:
告诉服务器 “我从哪个页面跳过来的”。比如从百度搜索结果点进一个网页,服务器会收到
Referer: https://www.baidu.com,常用于统计流量来源。 Referer并不一定真的有,直接在地址栏输入url/点收藏夹就没有Referer Referer是在HTTP请求中,发给服务器的,这个东西是给服务器使用的, 比如在搜狗页面搜索河北并跳转

Cookie是什么? Cookie是属于浏览器给网站提供的一种"客户端存储数据"机制 Cookie是浏览器本地持久化存储数据的一种机制.按照键值对方式存储,键值对的内容都是程序员自定义的.按照域名为维度分别进行存储。

出于安全考虑,浏览器禁止网页直接访问本地文件系统(避免访问不安全网站,导致硬盘中的数据受损)。不过浏览器并未完全封堵数据存储的可能性,而是提供了键值对形式的存储机制。这种存储方式的具体实现由浏览器内部封装完成,网页无法干预其底层存储过程。 服务器通过Set-Cookie响应头将键值对写入浏览器,首次访问网站时可能不带Cookie。之后浏览器访问该网站时就会自动携带这些Cookie信息。 Cookie从哪里来? 服务器返回的数据中,包含Set-Cookie字段(服务器这边的程序员根据需要,编写代码生成) Cookie到哪里去? 后续浏览器访问同一个服务器的时候就会把之前存储的Cookie再带上,从而发送到服务器这边 举例登录Gitee 第一次登录访问服务器时无Cookie,访问成功后服务器返回set-cookie响应头,客户端收到cookie后就会存储到本地硬盘上,当再次访问服务器就会带上cookie 登陆成功之后,此时可以看到后续访问码云的其他页面(比如个人主页),请求中就都会带着刚才获取到的 Cookie信息

对于HTTP来说,针对同一个服务器,每次HTTP请求,彼此之前都是独立的 登录是前一个请求,后续的请求是如何知道我处于登录状态呢??

状态码表示访问一个页面的结果(如访问成功、失败,还是其它一些情况等等),它是一个3位的整数,从 1xx、2xx、3xx、4xx、5xx,分为五个大类,每个大类的含义都不同。以下介绍一些常见的状态码及它的状态码解释
表示访问成功
没有找到资源;当在浏览器输入一个URL,该URL表示的资源不存在就会出现 404 Not Found
表示访问被拒绝,有的页面需要用户一定的权限才能访问,如查看码云私有的仓库
表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法
表示服务器出现内部错误;一般是服务器的代码执行过程中遇到了一些特殊的情况,造成服务器崩溃可能会产生这个状态码
表示当前服务器负载比较大,服务器处理单条请求的时耗很长,就会出现超时情况
表示临时重定向 重定向相当于手机呼号的呼叫转移功能,如果我们换了一个手机号,就可以去办理该呼叫转移业务,使朋友拨打你的旧号码时,自动跳转到新号码
表示永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改成新的地址
状态码中2开头的,都是成功 4开头的,都是客户端这边出问题 5开头的,都是服务器端这边出问题 状态码范围类别(英文 / 中文)原因短语概括1XXInformational(信息性状态码)接收的请求正在处理2XXSuccess(成功状态码)请求正常处理完毕3XXRedirection(重定向状态码)需要进行附加操作以完成请求4XXClient Error(客户端错误状态码)服务器无法处理请求5XXServer Error(服务器错误状态码)服务器处理请求出错