计算机网络之HTTP协议

news2024/11/15 19:41:15

目录

一、HTTP的含义

1.1 理解超文本

1.2 理解应用层协议

1.3 理解HTTP协议的工作过程

二、HTTP协议格式

2.1 抓包工具的使用

2.2 理解协议格式

2.2.1 请求协议格式

2.2.2. 响应格式请求

一、HTTP的含义

HTTP(全称为“超文本传输协议”),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。

注意:客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。

Ps:HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP实现)

虽然当下最新的http版本已经到3.0,但是平时我们最常见的还是http 1.1,因此本章主要介绍1.1版本。

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

当我们在浏览器输入搜狗搜索 的网址(URL)的时候,浏览器就给搜狗的服务器发送一个HTTP请求,搜狗的服务器返回一个HTTP响应。

这个响应结果呗浏览器解析后,就展示铖我们看到的页面内容(这个过程中浏览器可能会被服务器发送多个HTTP请求,服务器会对应返回多个响应,这些响应里就包含了页面HTML,CSS,JavaScript,图片,字体等信息)。

1.1 理解超文本

所谓超文本的含义,就是传输的内容,不仅仅是文本(比如html,css这个就是文本),还可以是一些其他资源,比如图片,视频,音频等二进制的数据。

1.2 理解应用层协议

我们已经学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程[ IP+Port ].
可是,仅仅把数据从A点传送到B点就完了吗。

这就好比,在淘宝上买了一部手机,卖家[ 客户端 ]把手机通过顺丰[ 传送+路径选择 ] 送到买家 [
服务器 ] 手里就完了吗?
当然不是,买家还要使用这款产品,还要在使用之后,给卖家打分评论。

所以,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节!
这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议之一的HTTP就是其中的佼佼者.

再回到我们刚刚说的买手机的例子,顺丰相当于 TCP/IP 的功能,那么买回来的手机都附带了说明书【产品介绍,使用介绍,注意事项等】,而该说明书指导用户该如何使用手机【虽然我们都不看,但是父母辈有部分是有看说明书的习惯的】,此时的说明书可以理解为用户层协议。

1.3 理解HTTP协议的工作过程

当我们在浏览器中输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应。

二、HTTP协议格式

HTTP是最典型的“一问一答”模型的协议我们学习HTTP协议,主要就是学习其报文格式,

报文格式:描述了HTTP请求是啥样的,响应是啥样的。

2.1 抓包工具的使用

HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节.这里我们主要以Fiddler来讲解:

  • 左侧窗口显示了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
  • 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
  • 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
  • 请求和响应的详细数据, 可以通过右下角的 View in Notepad 通过记事本打开

进一步理解抓包

抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。

而抓包工具,是一个特殊的软件,相当于是一个“代理程序”,浏览器给服务器发的请求,就会经过这个代理程序,进一步就能分析出请求和响应的结果,从而理解发送端和接受端的交互细节。

何为代理?

浏览器访问 sogou.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器.当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器.
因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的。

2.2 理解协议格式

2.2.1 请求协议格式

请求协议格式主要包括:请求行+请求头部(header)+空行+请求体(body)。

一下为随机抓取的一个 访问搜狗搜索的 数据包。

因为是GET方法,所以没有请求体部分(body)。

//首行
GET https://www.sogou.com/ HTTP/1.1
//header
Host: www.sogou.com
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="8"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.1.1171 SLBChan/103
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://cn.bing.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

请求行

首行包含三个元素,之间使用空格来区分:[方法] + [url] + [版本] 

  • GET : HTTP的方法。
  • URL(俗称网址):https://www.sogou.com/
  • 版本号:HTTP/1.1

方法

 以下为方法大全。实际开发中,这里的方法其实大多用不到,最常见的有两个:GET,POST。

GET方法

GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.
另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求,另外,使用 JavaScript 中的 ajax 也能构造 GET 请求。

这是一条GET请求:

GET 请求的特点

  • 首行的第一部分为 GET
  • URL 的 query string 可以为空, 也可以不为空.
  • header 部分有若干个键值对结构.
  • body 部分为空.

另外,关于 GET 请求的 URL 长度问题
网上有些资料上描述: get请求长度最多1024kb 这样的说法是错误的.
HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明: "Hypertext Transfer Protocol --
HTTP/1.1," does not specify any requirement for URL length.
没有对 URL 的长度有任何的限制.
实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最大长
度是不同的, 但是现代浏览器支持的长度一般都很长; 在服务器端, 一般这个长度是可以配置的

POST方法

POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求

这是一条POST请求:

POST 请求的特点 

  • 首行的第一部分为 POST
  • URL 的 query string 一般为空 (也可以不为空)
  • header 部分有若干个键值对结构.
  • body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由 header 中的 Content-Length 指定.

POST与GET的区别(经典面试题)

其实GET和POST并没有本质上的区别(在大部分场景下,彼此之间都能相互替代),但是在使用习惯上是存在差异的:

  • 语义不同: GET 一般用于从服务器获取数据, POST 一般用于提交数据.
  • GET 的 body 一般为空, 需要传递的数据通过 query string 传递, POST 的 query string 一般为空, 需要传递的数据通过 body 传递
  • GET 请求一般是幂等的, POST 请求一般是不幂等的. (如果多次请求得到的结果一样, 就视为请求是幂等的)
  • GET可以被缓存,POST则一般不能被缓存(把请求的结果保存下来,下次请求时候就可以直接读取缓存的数据)。(Ps:能够被缓存的前提是幂等的。)

补充说明:

  • 关于语义: GET 完全可以用于提交数据, POST 也完全可以用于获取数据.
  • 关于幂等性: 标准建议 GET 实现为幂等的. 实际开发中 GET 也不必完全遵守这个规则(主流网站都有 "猜你喜欢" 功能, 会根据用户的历史行为实时更新现有的结果.
  • 关于安全性: 有些资料上说 "POST 比 GET 请安全". 这样的说法是不科学的. 是否安全取决于前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关.
  • 关于传输数据量: 有的资料上说 "GET 传输的数据量小, POST 传输数据量大". 这个也是不科学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别.
  • 关于传输数据类型: 有的资料上说 "GET 只能传输文本数据, POST 可以传输二进制数据". 这个也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据进行 url encode

认识URL

平时我们俗称的 "网址" 其实就是说的 URL (Uniform Resource Locator 统一资源定位符).
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

Ps:需要注意的是,URL非HTTP协议专属,很多协议都在使用URL。

URL最关键的四个部分:

  1. 域名
  2. 端口号
  3. 带层次的路径
  4. 查询字符串

举例,搜狗搜索的网址:https://www.sogou.com/

这里就省略了端口号(省略的话,浏览器就会提供默认端口,对于http来说,默认端口号是80,对于https来说,默认端口号是443)。

需要注意的是这里com后面的/也是路径,这里没省略,只是有点短,代表的是HTTP服务器的根目录。

查询字符串(query string)

以?开头,以键值对的方式组织,其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器. 键值对之间使用&分割,键和值之间使用 = 分割。

URL encode

我们随机找一个带query string的url,会发现搜索如果是带有特殊符号的比如# ?: 等,会被转义为其他字符。

这时一位 这些符号本先被url当特殊意义理解了,所以当某个参数带有这些特殊字符的时候就必须先对这些特殊字符进行转义:

 urldecode就是urlencode的逆过程;

URL和URI的区别

URI是唯一资源标识符,是一种身份标识——用来区分其他资源区,其可能不是固定的,比如找一本书,这本书放在建设路aa图书馆的bb层的cc书架上;

其中的aa图书馆相对于aa图书馆相对于建设路就是一个标识符,bb层相对于aa图书馆就是一个标识符。

唯一资源标识符不是固定的,而是相对的。主要作用就是用于与其他资源区别开来的一个标识符。

URL是唯一资源定位符,标识互联网上唯一的资源位置。

实际开发中,经常会将两个词混用,不必做过多纠结。

header部分

header 的整体的格式也是 "键值对" 结构.
每个键值对占一行. 键和值之间使用:分割。

1.HOST 

表示服务器主机的地址和端口,用来描述最终要访问的目标。这个内容大概率是和URL中一样,也有一定的情况是不同的。

2.Content-Length

表示body中的数据长度

3.Content-Type

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

响应中的 Content-Type 常见取值有以下几种:

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

需要注意的是:如果是GET请求,没body,请求中没有上面这两个字段(Content-Type,Content-Length),如果是POST请求,有body,则必须有这两个字段(Content-Length,Content-Type)。

4.user-Agent(简称UA)

表示浏览器/操作系统的属性. 形如

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.1.1171 SLBChan/103

其中 Windows NT 10.0; WOW64 代表操作系统信息,、

其中 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.1.1171 SLBChan/103 表示浏览器信息。

user-Agent 存在的原因很大部分是因为历史原因,因为早期的浏览器只支持文本,后来浏览器支持图片,视频,音频,js等。

互联网发展至今,User-Agent现在的用途主要是用来区分PC和移动端了。

5.Refer

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

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

6.Cookie(重点)

HTTP cookie,简称cookie,是用户浏览网站时由网络创建并由用户的网页浏览器存放在用户计算机或其他设备上的小文本文件。

Cookie使Web服务器能够在用户的设备上存储状态信息(如添加到在线商店购物车中的商品)或跟踪用户的浏览活动(如点击特定按钮、登录或记录历史)

其作用就像是服务器在浏览器中设置了一个寄存器一样。

Cookie是从哪里来的?

Cookie中的数据来自于服务器,服务器会通过HTTP响应的报头Set-Cookie字段来决定浏览器的Cookie要存什么。

Cookie是在哪存的?

可以认为存于浏览器中,存在于硬盘的。

Cookie在存的时候是按照 浏览器+域名的形式来进行细分。不同的浏览器各自存各自的Cookie,同一个浏览器不同的域名,对应的不同的Cookie。

需要注意的是:Cookie里面不止存键值对,可能还存储着过期时间。

越敏感的网站,对Cookie的保存时间就越短。

Cookie要到哪里去?

回到服务器中,客户端在同一时刻是很多的,客户端这边会通过Cookie来保存当前用户使用的中间状态,当客户端访问浏览器的时候,就会自动的把Cookie的内容带入到请求中,服务器就能够知道现在的客户端是啥样了。

空行

表示header结束的标志。

2.2.2. 响应格式请求

认识 "状态码" (status code):状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况...)

200 OK

这是一个最常见的状态码, 表示访问成功.

404 Not Found

没有找到资源
浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存
在, 那么就会出现 404
例如, 在浏览器中输入 https://cn.bing.com/sai.html , 此时就在尝试访问 sogou 上的
/sal.html 这个资源.如果输入正确, 则可以正确访问到. 但是如果输入错误, 比如 https://cn.bing.com/sai.html, 就会看到 404 这样的响应

 403 Forbidden

表示访问被拒绝. 有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆直接访问, 就容易见到 403.
例如: 查看码云的私有仓库, 如果不登陆, 就会出现 403

405 Method Not Allowed

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

500 Internal Server Error

服务器出现内部错误. 一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码.咱们平时常用的网站很少会出现 500 (但是偶尔也能看到)

504 Gateway Timeout

当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况.这种情况在双十一等 "秒杀" 场景中容易出现, 平时不太容易见到.

302 Move temporarily

临时重定向.

在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页.
响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面

何为重定向?

可以理解为电话的呼叫转移业务,当呼叫一个办理转移业务的手机号时候,会自动将你的电话转移到另外一部电话上。

301 Moved Permanently

永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.
301 也是通过 Location 字段来表示要重定向到的新地址

状态码小结

在响应协议的格式中,响应报头和正文与请求协议格式相同,这里就不作过多赘述。

以下为小结:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WAMP搭建靶场

WAMP W:windows A:apache M:mysql,mariadb P:php 1. 下载phpstudy Windows版phpstudy下载 - 小皮面板(phpstudy) 2. 安装phpstudy 默认安装即可 3. 下载DVWA靶场 https://github.com/digininja/DVWA/archive/…

C++回顾(十五)—— 类模板

15.1 为什么要有类模板 类模板用于实现类所需数据的类型参数化类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响 15.2 单个类模板语法 注意:类模板的创建对象一定要显示调用(指明类型…

虹科分享 | 网络安全评级 | 突破能够让您变得更加强大

有两种CISO:入侵前和入侵后。入侵前的CISOs过于关注工具,并考虑投资于预防技术。在这样做的时候,他们几乎没有考虑一旦发生了不好的事情,恢复和及时恢复服务的问题。不好的事情会发生;这不是是否的问题,而是…

手把手教你如何做数据报表

数据报表是一种数据可视化形式,它将复杂的数据信息通过图形、表格等形式进行展示和解释,让人们更加直观地理解和分析数据。数据报表已成为现代企业决策的必备工具之一。对企业来说,数据报表有很多用处。首先,数据报表可以帮助企业…

基于BiLSTM+CRF医学病例命名实体识别项目

研究背景 为通过项目实战增加对命名实体识别的认识,本文找到中科院软件所刘焕勇老师在github上的开源项目,中文电子病例命名实体识别项目MedicalNamedEntityRecognition。对其进行详细解读。 原项目地址:https://github.com/liuhuanyong/Med…

一小时轻松掌握Git,看这一篇就足够

文章目录序言:版本控制分类一、Git环境配置下载卸载安装二、常用linux命令三、基本配置四、Git基本操作0.原理图1.项目创建及克隆方式一:本地仓库搭建方式二:克隆远程仓库2.文件操作3.配置ssh公钥4.分支5.push代码参考序言:版本控…

ORB_SLAM2+kinect稠密建图

下载代码:https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map 运行代码: 解压代码后,删掉作者自己编译的build文件夹(下面三个都删除): ~/ORB_SLAM2_modified/build, ~/ORB_SLAM2_modified/T…

【上传项目代码到Git详细步骤】

1.下载安装Git到电脑上(这里我之前已经安装好了,就不细说了)2.进入控制台安装好后右键点击桌面空白部分会多出两个菜单选项,点击第二个Git Bash Here(点击第一个你会爆炸)会弹出一个git控制台,如…

华为OD机试用Python实现 -【分解质因数】 2023Q1A

华为OD机试题 本篇题目:分解质因数题目示例 1输入输出示例 2输入输出Code代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南

从0-1搭建交付型项目管理体系流程(上)【宝芝林2】

很多项目经理在这个阶段,由于经验不足及整个项目管理体系涉及的环节和内容比较庞杂,往往无法有效思考,无从下手。笔者有幸在最近几年的工作实践中,实际搭建并迭代了2-3次项目管理体系流程框架,期间也经历过很多迷茫&am…

C++基础了解-21-C++ 继承

C 继承 一、C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,不需要重新编写新的…

mes系统如何管理企业生产

随着市场竞争的日趋激烈,很多企业都开始意识到生产管理的重要性。mes系统如何管理企业生产?下面,我们通过一个实例来说明。 案例简介: 一、客户需求快速增长 随着市场竞争的加剧,越来越多的客户提出了个性化需求。同…

人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术

随着现今智能时代的发展,酒店也越来越趋于智能化,也在不断地推行智慧酒店,这也给人们入住酒店提供了良好的体验。 人体存在感知是智能酒店中极其重要的一项应用技术,只有智能设备通过精准地感知人体存在,才能更好地做…

2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

目录前言C左值和右值二、右值引用二、右值引用前言 对于C的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接在这,话不多说讲解一…

C++ ,JNI, Java 数据传递全解(一)

在讲正题之前,先说一下C,JNI和Java 对应的数据类型对比吧,废话不多说,直接上图上面为C,Java,JNI 三者只见对应的数据类型好了,现在我们有了上面的数据类型比对,下面就讲讲从C如何将数…

MySQL的下载及安装详细教程

提示:本文仅为MySQL初学者的安装MySQL过程提供参考,创作不易,请多点赞支持! MySQL的下载及安装前言一、MySQL的下载及安装1.MySQL的下载2.MySQL的安装3.配置环境变量4.连接MySQL4.1 方式一4.2 方式二前言 本文内容主要是帮助初学…

OpenWrt 制作软件包05

文章目录 OpenWrt 制作软件包05软件包目录结构分析软件包顶层Makefile分析OpenWrt一些常用的变量一些默认的变量Package宏定义Build宏定义构建自己的软件系统软件包工程目录文件内容分析编译安装卸载OpenWrt 制作软件包05 软件包目录结构分析 如下图所示 :

4N65-ASEMI高压MOS管4N65

编辑-Z 4N65在TO-220封装里的静态漏极源导通电阻(RDS(ON))为2.5Ω,是一款N沟道高压MOS管。4N65的最大脉冲正向电流ISM为16A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。4N65功耗&#xff08…

[工控自动化]信捷PLC与威纶通HMI以太网通讯的连接设置

在工业自动化领域,PLC和触摸屏是经常使用的元器件,其中PLC是处理逻辑与数据的核心,而触摸屏HMI则是显示与操作的必备。 工控领域虽然是外国品牌的天下,但近些年来,国产PLC和HMI品牌也在成长,例如汇川、信捷、威纶通等。 本文以实际使用经验,介绍一下信捷PLC与威纶通HMI的…

java实用小技巧:判断list是否有重复项

在项目中经常会遇到这样的场景,就是一个list,根据某种规则,我要去判断里面是不是有重复的项。 难度不高,但有点烦,所以专门开一篇文章来记录一下,争取弄一个相对简洁的写法。 先看一个简单的例子&#xf…