HTTP协议— 基于 TCP 的请求-响应协议 相关交互过程详细介绍_http协议交互过程

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

为什么一般"登录功能"要用 POST

因为登录功能要给服务器传递用户名和密码,如果使用 GET 请求,用户名和密码习惯就会放到 URL 的 queue string 中来传递 (此时由于加密机制,浏览器地址栏里的路径就会变成很长的一串),这个时候就会影响用户的体现。
并且更早的很多网站,就是把密码明文提交的,当 URL 中显示出了用户登录密码,也是非常不可取的。(但是这不能是不安全的体现,因为无论是 GET 还是 POST 要想不被获取到重要信息,都必须使用加密,否则 POST 也是可以被抓包拿到的。)

经典面试题:GET 和 POST 的区别
  1. 首先先下定论:GET 和 POST 没有本质区别(可以相互替代使用),具体来说,相当于:GET 能使用的场景,也能替换成 POST;POST 使用的场景,也能替换成 GET。
  2. 语义上的区别:GET 通常是用来取数据的;POST 通常用来上传数据。
  3. 细节上:通常情况下,GET 是没有 body 的,GET 通过 query string 向服务器传递数据;通常情况下,POST 是有 body 的,POST 通过 body 向服务器传递数据。
  4. GET 请求一般是幂等的,POST 请求一般是不幂等的。
    幂等:每次你相同的输入,得到的输出结果是确定的,
    不幂等:每次你相同的输入,得到的结果是不确定的。
  5. GET 可以被缓存,POST 不能被缓存。(缓存:提前把结果记住)对应于第 4 条。

2.3 认识请求 “报头” (header)

header 的整体的格式也是 “键值对” 结构,每个键值对 占⼀行, 键和值之间使用分号分割。
不同的键值对表示了不同的含义,来描述请求报头在发送请求时的更多信息~ 以下介绍一些常见的键值含义。

Host

表示服务器主机的地址和端⼝。

在这里插入图片描述

Content-Length

表示 body 中的数据⻓度。

我们前面有提到过,在 HTTP 请求/响应 格式中,header 和 body 中间会有一个空行来分割,以避免出现在读取数据时的 “粘包” 问题。

而如果,我们当前有若干个 POST 请求,这个时候若干个请求一起到 TCP 的缓冲区了,就没有所谓的 “空行分割” 这样的格式了,所以要有 Content-Length 这样规定的长度,表明了这个 POST 请求的 body 长度,以保证正确读取。

Content-Type

表示请求的 body 中的数据格式。

常见选项:

  • application/x-www-form-urlencoded: form 表单提交的数据格式. 此时 body 的格式形如:
title=test&content=hello

  • multipart/form-data: form 表单提交的数据格式(在 form 标签中加上
    enctyped="multipart/form-data" ,通常用于提交图片/文件. body 格式形如:
Content-Type:multipart/form-data; boundary=----
WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

  • application/json: 数据为 json 格式. body 格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05cc
de64b16a861fa2bddfdcd15"}

User-Agent (简称 UA)

表示浏览器/操作系统的属性(用户是用什么样的设备来上网的)。

在这里插入图片描述
这些信息是提供给服务器的一些相关自己设备的信息,服务器会根据这些不同的设备信息,返回给用户设备最兼容的一套响应来展示出来。

Referer

表示这个页面是从哪个页面跳转过来的. 形如

Referer: https://v.baidu.vip/login

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

理解 Cookie

Cookie 是浏览器给页面提供了一种能够持久化(写到磁盘里)存储数据的机制。
Cookie 中存储了⼀个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据),往往可以通过这个字段实现 “身份标识” 的功能。

浏览器为了安全,默认情况下是不能让页面的 JS 访问到用户电脑上的文件系统的。但是这样的安全限制,也带来了一些麻烦,有时候又需要让页面持久化的存储一些数据(比如,记住用户名密码方便下次直接登录)。 因此,就会使用 Cookie 这种策略,比如:在用户登录页面完成身份验证之后,此时服务器就会给浏览器返回一个用户的身份信息,浏览器把这个信息就保存在一个特定的位置上,后续再访问同一网站的其他页面的时候,浏览器再自动的带上这个身份信息,服务器就可以直接识别了。

每个不同的域名下都可以有不同的 Cookie, 不同网站之间的 Cookie 并不冲突。

Cookie 具体组织形式:

在这里插入图片描述
Cookie 数据是从哪里来的:

其实是服务器返回给客户端的,我们用 Fiddler 抓包来观察一个登录请求的 服务器 响应:
在这里插入图片描述
在服务器返回给客户端的 header 中,包含这样一组键值对,其实就是服务器完成身份认证之后,就给客户端返回了一些具体的信息。信息就是通过 Set-Cookie 这样的"响应报头"来表示的,客户端就会根据服务器返回的这些之前保存过的用户信息去进行后续的访问了。

理解登陆过程:
在这里插入图片描述

理解会话机制 (Session)

服务器同⼀时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系。

  • 当用户登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId / token 返回给客户端. (例 如通过 HTTP 响应中的 Set-Cookie 字段返回).
  • 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求 中的 Cookie 字段带上).
  • 服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息, 再进行后续操作.
Cookie 和 Session 的区别
  • Cookie 是客户端的机制. Session 是服务器端的机制.
  • Cookie 和 Session 经常会在⼀起配合使用, 但是不是必须配合.
  • 完全可以用 Cookie 来保存⼀些数据在客户端. 这些数据不⼀定是用户身份信息, 也不⼀定是 token / sessionId
  • Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递.

2.4 请求正文(body)

请求正文中的内容一般是根据 Content-Type 规定的格式来返回信息的,不同的请求的需求都是不一样的,这里对内容就无法做过多讨论,下面是关于请求正文集中格式的介绍。大家都可以自己通过抓包来观察。

  • application/x-www-form-urlencoded: form 表单提交的数据格式. 此时 body 的格式形如:
title=test&content=hello

  • multipart/form-data: form 表单提交的数据格式(在 form 标签中加上
    enctyped="multipart/form-data" ,通常用于提交图片/文件. body 格式形如:
Content-Type:multipart/form-data; boundary=----
WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

  • application/json: 数据为 json 格式. body 格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05cc
de64b16a861fa2bddfdcd15"}

3.HTTP 响应详解

HTTP 响应和 HTTP 请求的大致格式都是相似的,这里我们主要介绍一下响应其他的重要信息。

3.1 认识 “状态码” (status code)

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

常见的状态码:
200 OK

最常见的状态码,表示访问成功,浏览器顺利的获取到需要的内容了。

404 Not Found

没有找到资源,表示要访问的资源不存在。

403 Forbidden

表示访问被拒;虽然资源存在,但是你没有权限访问。

405 Method Not Allowed

前面我们已经介绍了 HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等
但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法的情况)。

500 Internal Server Error

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

504 Gateway Timeout

服务器太繁忙,当服务器负载比较大的时候,服务器处理单条请求的时候消耗的时间就会很长,就可能会导致出现超时的情况。

502 Bad Gateway

网关错误

302 Move temporarily

临时重定向
在登陆页面中经常会见到 302,用于实现登陆成功后自动跳转到主页。

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

301 Moved Permanently

永久重定向
当浏览器收到这种响应时,后续的请求都会被自动改成新的地址。

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

小结:

在这里插入图片描述

3.2 认识响应 “报头” (header)

响应报头的基本格式和请求报头的格式基本一致。

Content-Type
  • text/html : body 数据格式是 HTML
  • text/css : body 数据格式是 CSS
  • application/javascript : body 数据格式是 JavaScript
  • application/json : body 数据格式是 JSON

在这里插入图片描述
关于 Content-Type 的详细情况

3.3 认识响应 “正文” (body)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

n/dd29714606cc4642a76a5247d9a31415.png)
关于 Content-Type 的详细情况

3.3 认识响应 “正文” (body)

[外链图片转存中…(img-eNdWwGZi-1715762704338)]
[外链图片转存中…(img-wfrwHZ0A-1715762704338)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值