计算机网络-应用层篇-HTTP协议

发布于:2022-10-21 ⋅ 阅读:(313) ⋅ 点赞:(0)

目录

前菜

与其相关组件

Web服务器

这就是一个浏览器发起请求和接受响应的过程

CDN

CDN的关键技术主要有内容存储和分发技术

WAF

Web 页面

与 HTTP 有关的协议

TCP/IP

DNS

URI / URL

URI的全称是(Uniform Resource Identifier)

URL的全称是(Uniform Resource Locator)

HTTPS

HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全为目标的 HTTP 通道

HTTP 协议格式

HTTP 请求格式:

首行:

协议头(header):

空行:

正文(body):

HTTP 响应格式:

首行:

协议头(header):

空行:

正文(body):

为什么 HTTP 报文中要存在空行呢?

HTTP 请求(Request)

URL

URL 基本介绍

URL 的标准格式如下:

URL 的完整格式如下:

URL 参数介绍

URLencode

方法

虽然 HTTP 中的方法很多,但是最常用的就两个 GET 和 POST

GET

POST

GET 和 POST 的区别

关于 GET 请求的 URL 长度问题

关于 POST 比 GET 更安全

关于 GET 只能传输文本数据

认识请求“报头”(header)

以下介绍几个常见的报头

HTTP 响应(Response)

认识“状态码”(status code)

状态码表示访问一个页面的结果(如访问成功、失败,还是其它一些情况等等)

含义

HTTP 的优点和缺点

HTTP 的优点

简单灵活易扩展

应用广泛、环境成熟

无状态

HTTP 的缺点

无状态

明文

性能


  • 前菜

  • HTTP(HyperText Transfer Protocol:超文本传输协议)
  • 可以进行文字分割理解:
  • 超文本(Hypertext)、传输(Transfer)、协议(Protocol)
  • 它们之间的关系如下
  • 按照范围的大小 协议 > 传输 > 超文本
  • HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
  • 是基于 TCP/IP 通信协议来传递数据的,所以是可靠的
  • 其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现
  • HTTP3.0 基于 UDP 实现
  • 现主流使用 HTTP1.0 和 HTTP3.0
  • 协议:
  • 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则
  • 这套规则称为协议,它最终体现为在网络上传输的数据包的格式
  • 通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号
  • HTTP 协议的重要特点: 一发一收,一问一答
  • 网络编程中,除了一发一收之外,还有其它的模式
  • 多发一收:例如上传大文件
  • 一发多收:例如看直播时,搜索一个词条可以得到多个视频源
  • 多发多收:例如串流(steam link、moonlight 等等)
  • 与其相关组件

  • Web服务器

  • 在地址栏输入URL(即网址),浏览器会向DNS(域名服务器,后面会说)提供网址,由它来完成 URL 到 IP 地址的映射
  • 然后将请求你的请求提交给具体的服务器
  • 在由服务器返回我们要的结果(以HTML编码格式返回给浏览器),浏览器执行HTML编码,将结果显示在浏览器的正文
  • 这就是一个浏览器发起请求和接受响应的过程

  • 浏览器是 HTTP 请求的发起方,那么 Web 服务器就是 HTTP 请求的应答方
  • Web 服务器可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览;
  • 可以放置数据文件,让全世界下载
  • 目前最主流的三个Web服务器是Apache、 Nginx 、IIS
  • CDN

  • 全称是Content Delivery Network
  • 即内容分发网络
  • 它应用了 HTTP 协议里的缓存和代理技术,代替源站响应客户端的请求
  • CDN 是构建在现有网络基础之上的网络,它依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块
  • 使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率
  • CDN的关键技术主要有内容存储和分发技术

  • 打比方说你要去亚马逊上买书,之前你只能通过购物网站购买后从美国发货过海关等重重关卡送到你的家里,现在在中国建立一个亚马逊分基地,你就不用通过美国进行邮寄,从中国就能把书尽快给你送到
  • WAF

  • 是一种 Web 应用程序防护系统(Web Application Firewall,简称 WAF)
  • 它是一种通过执行一系列针对HTTP / HTTPS的安全策略来专门为Web应用提供保护的一款产品
  • 它是应用层面的防火墙,专门检测 HTTP 流量,是防护 Web 应用的安全技术
  • WAF 通常位于 Web 服务器之前
  • 可以阻止如 SQL 注入、跨站脚本等攻击
  • 目前应用较多的一个开源项目是 ModSecurity,它能够完全集成进 Apache 或 Nginx
  • Web 页面

  • (Web page)也叫做文档,是由一个个对象组成的
  • 一个对象(Objecy) 只是一个文件
  • 比如一个 HTML 文件、一个 JPEG 图形、一个 Java 小程序或一个视频片段,它们在网络中可以通过 URL 地址寻址
  • 多数的 Web 页面含有一个 HTML 基本文件 以及几个引用对象
  • 与 HTTP 有关的协议

  • TCP/IP

  • HTTP 使用 TCP 作为通信协议,这是因为 TCP 是一种可靠的协议,而可靠能保证数据不丢失
  • IP 协议的全称是 Internet Protocol 的缩写,它主要解决的是通信双方寻址的问题
  • DNS

  • 它作为将域名和 IP 地址相互映射的一个分布式数据库
  • 能够使人更方便地访问互联网
  • URI / URL

  • 输入的地址格式必须要满足 URI 的规范
  • URI的全称是(Uniform Resource Identifier)

  • 中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源
  • URL的全称是(Uniform Resource Locator)

  • 中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是 URI 的一个子集
  • URI 不仅包括 URL,还包括 URN(统一资源名称)
  • HTTPS

  • HTTP 一般是明文传输,很容易被攻击者窃取重要信息
  • 鉴于此,HTTPS 应运而生
  • HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全为目标的 HTTP 通道

  • 在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性
  • HTTPS 在 HTTP 的基础上增加了 SSL 层,也就是说 HTTPS = HTTP + SSL
  • HTTP 协议格式

  • HTTP 请求格式:

  • 首行:

  • 请求方法,URL,版本号
  • 协议头(header):

  • 协议头里面是键值对结构,每个键值对占一行,键和值之间用冒号+空格分割
  • 空行:

  • 空行是协议头结束的标志
  • 正文(body):

  • 空行后面的部分就是正文,正文允许为空字符串
  • 如果正文存在,则协议头中会出现一个 Content-Length 属性来标识正文的长度
  • HTTP 响应格式:

  • 首行:

  • 版本号,状态码,状态码解释
  • 协议头(header):

  • 协议头里面是键值对结构,每个键值对占一行,键和值之间用冒号+空格分割
  • 空行:

  • 空行是协议头结束的标志
  • 正文(body):

  • 空行后面的部分就是正文,正文允许为空字符串
  • 如果正文存在,则协议头中会出现一个 Content-Length 属性来标识正文的长度
  • 如果服务器返回一个HTML页面,那么HTML页面的内容就是在正文中
  • 为什么 HTTP 报文中要存在空行呢?

  • 因为 HTTP 协议并没有规定报头部分的键值对有多少个,使用空行就相当于是报文的结束标记或报文和正文之间的分隔符
  • HTTP 在传输层依赖 TCP 协议,TCP 是面向字节流的
  • 如果没有这个空行,就会出现”粘包问题“
  • HTTP 请求(Request)

  • URL

  • URL 基本介绍

  • 平时我们俗称的”网址“,其实就是 URL(Uniform Resource Locator)
  • 翻译为统一资源定位符互连网上的每个文件都有一个唯一的 URL
  • 它包含的信息指出文件的位置以及浏览器应该怎么处理它
  • URL 的标准格式如下:

  • 协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
  • URL 的完整格式如下:

  • 协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
  • URL 参数介绍

  • 协议类型
  • 常见的协议类型有http和https,访问mysql时的协议类型为jdbc:mysql
  • 可以省略,省略后默认为http://
  • 访问资源需要的凭证信息
  • 一般就是登录信息(用户名、密码等),但是现在的网站进行认证一般不再通过URL进行,故一般省略
  • 可以省略
  • 服务器地址
  • 服务器的地址可以是一个IP地址,也可以是一个域名(域名会通过DNS系统解析成一个具体的IP地址,可以使用ping 域名来得到该域名的IP地址)
  • IP地址用来描述网络上的一个具体位置,能够用来定位一个具体的主机
  • 在HTML中可以省略(比如img、link、script、a标签的src或者 href属性),省略后表示服务器的ip或域名与当前HTML所属的ip或域名一致
  • 端口号
  • 端口号的主要作用是表示一台计算机中的特定进程所提供的服务,即用来区分一个主机上的不同程序
  • 每个程序在访问网络的时候,都会关联上一个或多个端口号,通过端口号就能区分出当前的请求要给谁
  • 可以被省略,当端口号省略时,浏览器会根据协议类型自动决定使用哪个端口号(如http协议默认使用80端口,https 协议默认使用443端口)
  • 资源层级UNIX文件路径
  • 表示访问该服务器程序上某个资源的路径
  • 可以省略,省略后相当于/
  • 文件名
  • 表示访问该服务器上的哪个资源(如html、图片等等)
  • 不能省略
  • 查询字符串
  • 查询字符串(query string)本质是一个键值对结构
  • 且键值对之间使用&分割,键和值之间使用 = 分割
  • 表示客户端给服务器传递的参数
  • 该参数是 web 开发的一个重要参数,给前后端交互提供了很多可能性
  • 该参数 key 和 value 的取值和个数,完全都是由程序员自己约定,因此可以通过这样的方式来自定制我们需要的信息给服务器
  • 可以省略
  • 片段标识符
  • 片段标识符主要用于页面内跳转
  • 例如跳转到当前页面的某个部分、章节等等
  • URLencode

  • 需要 urlencode 的原因:
  • 这是因为像 /、?、: 等这样的字符,已经被 url 当做特殊意义理解了
  • 因此这些字符不能随意出现
  • 如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义,即 urlencode
  • 一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,虽然在 URL 中没有特殊含义,但是仍然需要进行转义
  • 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号
  • 转义的规则如下:
  • 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成 %XY 格式
  • 方法

  • HTTP 中的方法,就是 HTTP 请求报文中的首行的第一个部分
  • 虽然 HTTP 中的方法很多,但是最常用的就两个 GET 和 POST

  • GET
    • 获取资源 HTTP 1.0、HTTP 1.1
  • POST
    • 传输实体主体 HTTP 1.0、HTTP 1.1
  • PUT
    • 传输文件 HTTP 1.0、HTTP 1.1
  • HEAD
    • 获得报文首部 HTTP 1.0、HTTP 1.1
  • DELETE
    • 删除文件 HTTP 1.0、HTTP 1.1
  • OPTIONS
    • 访问支持的方法 HTTP 1.1
  • TRACE
    • 追踪路径 HTTP 1.1
  • CONNECT
    • 要求用隧道协议连接代理 HTTP 1.1
  • LINK
    • 建立和资源之间的联系 HTTP 1.1
  • UNLINE
    • 断开连接关系 HTTP 1.1
  • GET

  • GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源
  • 以下几种方式都会触发 GET 方法的请求
  • 在浏览器中直接输入 URL 回车或点击浏览器收藏夹中的链接,此时浏览器就会发送出一个 GET 请求
  • HTML 中的 link、img、script 等标签的属性中放的 URL,浏览器也会构造出 HTTP GET 请求
  • 使用 Javascript 重点 ajax,也能构造出 HTTP GET 请求
  • 各种编程语言(只要能够访问网络),都能够构造出 HTTP GET 请求
  • GET 请求的特点:
  • 首行里面的第一个部分就是 GET
  • URL 里面的 query string 可以为空,也可以不为空
  • GET 请求的 header 有若干个键值对结构
  • GET 请求的 body 一般是空的
  • POST

  • POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(如登录页面)
  • 以下几种方法都会触发 POST 方法的请求
  • 通过 HTML 中的 form 标签可以构造 POST 请求
  • 使用 JavaScript 的 ajax 可以构造 POST 请求
  • POST 请求的特点:
  • 首行第一个部分就是 POST
  • URL 里面的 query string 一般是空的
  • POST 请求的 header 里面有若干个键值对
  • POST 请求的 body 一般不为空(body 的具体数据格式,由 header 中的 Content-Type 来描述;body 的具体数据长度,由 header 中的 Content-Length 来描述)
  • GET 和 POST 的区别

  • GET 和 POST 其实没有本质区别,使用 GET 的场景完全可以使用 POST 代替,使用 POST 的场景一样可以使用 GET 代替
  • 但是在具体的使用上,还是存在一些细节的区别
  • GET 习惯上会把客户端的数据通过 query string 来传输(body 部分是空的);
  • POST 习惯上会把客户端的数据通过 body 来传输(query string 部分是空的)
  • GET 习惯上用于从服务器获取数据;
  • POST 习惯上是客户端给服务器提交数据
  • 一般情况,程序员会把 GET 请求的处理,实现成“幂等”的;
  • 对于 POST 请求的处理,不要求实现成“幂等”
  • GET 请求可以被缓存,可以被浏览器保存到收藏夹中;
  • POST 请求不能被缓存
  • 幂等
  • 一个 HTTP 方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的
  • 换句话说,幂等的方法不应该具有副作用
  • 在正确的条件下,GET、HEAD、PUT 和 DELETE 等方法是幂等的;
  • POST 方法不是幂等的
  • 幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同
  • 关于 GET 请求的 URL 长度问题

  • 没有对 URL 的长度有任何限制
  • URL 的长度取决因素:
  • 实际上 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现
  • 在浏览器端,不同的浏览器最大的长度是不同的,但是现在浏览器支持的长度一般都很长;
  • 在服务器端,一般这个长度是可以配置的
  • 关于 POST 比 GET 更安全

  • 不会
  • 安全问题取决于是否加密以及加密算法的强度
  • 这和将数据信息放到 query string 或 body 中无关,因为通过抓包,我们都可以得到这两部分的数据
  • 关于 GET 只能传输文本数据

  • GET 也可以传输二进制数据
  • 虽然不能直接在 query string 中传输二进制数据,但是可以针对二进制数据进行 urlencode,转码后就可以放到 url 中;
  • GET 还可以直接将二进制数据放到 body 中
  • 认识请求“报头”(header)

  • header 的整体格式是键值对结构
  • 每个键值对占一行,键和值之间使用 冒号+空格 进行分割
  • 以下介绍几个常见的报头

  • HOST 的值表示服务器主机的地址和端口(地址可以是域名,也可以是 IP;端口号可以省略或者手动指定)
  • Content-Length 表示 body 的数据长度,长度单位是字节
  • Content-Type 表示 body 的数据格式
  • Content-Language 实体报头描述了客户端或者服务端能够接受的语言
  • Content-Encoding 指示对实体应用了何种编码
  • User-Agent 表示浏览器或者操作系统的属性
  • UA 在早年是一个非常有用的字段,网站的开发者可以根据它来检测页面的“兼容性”
  • Referer 表示这个页面是从哪个页面跳转过来的
  • 注意: 如果直接在浏览器中输入 URL 或直接通过收藏夹访问页面时,是没有 Referer 的
  • Connection 决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接
  • Cookie
  • Cookie 是什么?
  • Cookie 是浏览器提供的一种让程序员在本地存储数据的能力
  • 为什么需要 Cookie?
  • 如果没有 Cookie,直接将要存储的数据保存在客户端浏览器所在的主机的硬盘上,那么就会出现很大的安全风险
  • 比如当你不小心打开某个不安全的网站,该网站就可以在你的硬盘上写一个病毒程序,结果可想而知
  • 因此浏览器为了保证安全性,就禁止网页中的代码访问主机的硬盘(无法在 JS 中读写文件)
  • 因此也就失去了持久化存储的能力,故 Cookie 就很重要
  • Cookie 里面存的是什么?
  • Cookie 中存储了一个字符串,是键值对结构的,键值对之间使用 ;分割,键和值之间使用 = 分割
  • Cookie 来自哪里,如何往 Cookie 中存储数据?
  • Cookie 这个数据可能是客户端(网页)自行通过 JS 写入的
  • 也可能来自于服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据
  • Cookie 要到哪里去?
  • Cookie 字段会在后续的请求中,把浏览器本地存储的这些键值对再发送回服务器
  • Cookie 的一个经典应用就是保持客户端的登录状态
  • Cookie 的缺陷:
  • 每次请求都要把该域名下所有的 Cookie 通过 HTTP 请求传给服务器
  • 因此 Cookie 的存储容量是有限的
  • HTTP 响应(Response)

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

  • 状态码表示访问一个页面的结果(如访问成功、失败,还是其它一些情况等等)

  • 它是一个3位的整数,从 1xx、2xx、3xx、4xx、5xx,分为五个大类,每个大类的含义都不同
  • 含义

  • 200~299
  • 成功状态码
  • 300~399
  • 重定向状态码
  • 400~499
  • 客户端错误状态码
  • 500~599
  • 服务端错误状态码
  • 200 OK
  • 表示访问成功
  • 301 Moved Permanently
  • 表示永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改成新的地址
  • 302 Move temporarily
  • 表示临时重定向
  • 403 Forbidden
  • 表示访问被拒绝
  • 404 Not Found
  • 表示没有找到资源
  • 405 Method Not Allowed
  • 表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法
  • 500 Internal Server Error
  • 表示服务器出现内部错误
  • 504 Gateway Timeout
  • 表示当前服务器负载比较大,服务器处理单条请求的时耗很长,就会出现超时情况
  • HTTP 的优点和缺点

  • HTTP 的优点

  • 简单灵活易扩展

  • HTTP 最重要也是最突出的优点是 简单、灵活、易于扩展
  • HTTP 的协议比较简单,它的主要组成就是 header + body,头部信息也是简单的文本格式,而且 HTTP 的请求报文根据英文也能猜出来个大概的意思,降低学习门槛,能够让更多的人研究和开发 HTTP 应用
  • 所以,在简单的基础上,HTTP 协议又多了灵活 和 易扩展 的优点
  • HTTP 协议里的请求方法、URI、状态码、原因短语、头字段等每一个核心组成要素都没有被制定死,允许开发者任意定制、扩充或解释,给予了浏览器和服务器最大程度的信任和自由
  • 应用广泛、环境成熟

  • 因为过于简单,普及,因此应用很广泛
  • 因为 HTTP 协议本身不属于一种语言,它并不限定某种编程语言或者操作系统,所以天然具有跨语言、跨平台的优越性
  • 而且,因为本身的简单特性很容易实现,所以几乎所有的编程语言都有 HTTP 调用库和外围的开发测试工具
  • 无状态

  • 无状态其实既是优点又是缺点
  • 因为服务器没有记忆能力,所以就不需要额外的资源来记录状态信息,不仅实现上会简单一些,而且还能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务
  • HTTP 的缺点

  • 无状态

  • 既然服务器没有记忆能力,它就无法支持需要连续多个步骤的事务操作
  • 每次都得问一遍身份信息,不仅麻烦,而且还增加了不必要的数据传输量。由此出现了 Cookie 技术
  • 明文

  • HTTP 协议里还有一把优缺点一体的双刃剑,就是明文传输
  • 明文意思就是协议里的报文(准确地说是 header 部分)不使用二进制数据,而是用简单可阅读的文本形式
  • 对比 TCP、UDP 这样的二进制协议,它的优点显而易见,不需要借助任何外部工具,用浏览器、Wireshark 或者 tcpdump 抓包后,直接用肉眼就可以很容易地查看或者修改,为我们的开发调试工作带来极大的便利
  • 当然缺点也是显而易见的,就是不安全,可以被监听和被窥探
  • 因为无法判断通信双方的身份,不能判断报文是否被更改过
  • 性能

  • HTTP 的性能不算差,但不完全适应现在的互联网,还有很大的提升空间

网站公告

今日签到

点亮在社区的每一天
去签到