IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络学习笔记(二)---HTTP协议 -> 正文阅读

[网络协议]计算机网络学习笔记(二)---HTTP协议

HTTP 是超文本传输协议,也就是HyperText?Transfer?Protocol。超文本就是超越了普通文本的文本,它是文字、图片、视频等的混合体。关键是超链接,能从一个超文本跳转到另外一个超文本。HTTP 是一个在计算机网络里两点之间传输文字、图片、音频、视频等「超文本」数据的约定和规范。HTTP使用TCP协议,是一种无状态协议。TCP 为HTTP 提供可靠数据传输服务 。服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息 。

一、HTTP报文格式

客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。每一行数据通过"\r\n"分割。

请求报文结构

  • 请求行:method、 URL、version

    • method:请求方法,一共有9种,GET和POST的使用频次最高。

    • URL:请求的文件。

    • version:HTTP协议的版本,该字段有HTTP/1.0和HTTP/1.1两种。

  • 请求头(多行):在HTTP/1.1中,请求头除了Host都是可选的。

    • Host:指定请求资源的主机和端口号。端口号默认80。
    • Connection:值为keep-alive和close。keep-alive使客户端到服务器的连接持续有效,不需要每次重连,此功能为HTTP/1.1预设功能。
    • Accept:浏览器可接收的MIME类型。假设为text/html表示接收服务器回发的数据类型为text/html,如果服务器无法返回这种类型,返回406错误。
    • Cache-control:缓存控制,Public内容可以被任何缓存所缓存,Private内容只能被缓存到私有缓存,non-cache指所有内容都不会被缓存。
    • Cookie:将存储在本地的Cookie值发送给服务器,实现无状态的HTTP协议的会话跟踪。
    • Content-Length:请求消息正文长度。

    另有User-Agent、Accept-Encoding、Accept-Language、Accept-Charset、Content-Type等请求头。由此可见,请求报文是告知服务器请求的内容,而请求头是为了提供服务器一些关于客户机浏览器的基本信息,包括编码、是否缓存等。

  • 空行

  • 实体( entity body )(多行): 使用 GET 方法时实体为空,使用POST 方法时才使用该实体 。?

示例:

GET http://www.example.com/ HTTP/1.1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Host: www.example.com
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947+gzip"
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 xxx

entity body

响应报文结构

响应报文是服务器对请求资源的响应,同样也是以"\r\n"来分割。

  • 报文头:version status_code status_message

    • version:HTTP版本。

    • status_code 状态码

    • status_message 相应状态信息(与状态码对应)状态码及其相应的短语指示了请求的结果 。

  • 响应头(多行)

    • Date:表示信息发送的时间。
    • Server:Web服务器用来处理请求的软件信息。
    • Content-Encoding:Web服务器表明了自己用什么压缩方法压缩对象。
    • Content-Length:服务器告知浏览器自己响应的对象长度。
    • Content-Type:告知浏览器响应对象类型。
  • 空行

  • 实体(多行)

    实际有效数据,通常是HTML格式的文件,该文件被浏览器获取到之后解析呈现在浏览器中。

示例:

HTTP/1.1 200 OK
Age: 529651
Cache-Control: max-age=604800
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 648
Content-Type: text/html; charset=UTF-8
Date: Mon, 02 Nov 2020 17:53:39 GMT
Keep-Alive: timeout=4
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Proxy-Connection: keep-alive

<!doctype html>
<html>
<head>
    <title>Example Domain</title>
	// 省略... 
</body>
</html>

二、HTTP方法

HTTP支持几种不同的请求命令,这些命令被称为HTTP方法。每条HTTP请求报文都包含一个方法。这个方法会告诉服务器要执行什么动作(获取一个Web页面、运行一个网关程序、删除一个文件等)。下表列出了常见的HTTP方法。

  • GET :通过URL从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等。浏览器会把 http header 和 data 一并发送出去, 服务器响应200(返回数据)。
  • POST:向服务器提交数据,数据就放在报文的 body 里,浏览器先发送 header, 服务器响应 100 Continue,浏览器再发送 data, 服务器响应 200 OK(返回数据)。

区别

  • GET 通过 url 传递参数, POST 放在 request body 中。因此GET不适合用来传递敏感信息。

  • GET 提交的数据最大是2k( 限制实际上取决于浏览器), POST 理论上没有限制。

  • GET 请求会被浏览器主动 cache, 而 POST 不会。

  • GET 和 POST 本质上就是 TCP 链接, 并无差别。 但是由于 HTTP 的规定和浏览器/服务器的限制, 导致他们在应用过程中体现出一些不同。

  • GET 产生一个 TCP 数据包; POST 产生两个 TCP 数据包。

三、HTTP 首部

有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

四、HTTP 状态码

服务器返回的?响应报文?中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。

状态码类别含义
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

五、Cookie与Session

HTTP作为无状态协议,必然需要在某种方式保持连接状态。

Cookie是客户端保持状态的方法。

Cookie简单的理解就是存储由服务器发至客户端并由客户端保存的一段字符串。为了保持会话,服务器可以在响应客户端请求时将Cookie字符串放在Set-Cookie下,客户机收到Cookie之后保存这段字符串,之后再请求时候带上Cookie就可以被识别。

Cookie在客户端的保存形式可以有两种,一种是会话Cookie一种是持久Cookie,会话Cookie就是将服务器返回的Cookie字符串保持在内存中,关闭浏览器之后自动销毁,持久Cookie则是存储在客户端磁盘上,其有效时间在服务器响应头中被指定,在有效期内,客户端再次请求服务器时都可以直接从本地取出。存储在磁盘中的Cookie是可以被多个浏览器代理所共享的。

Session是服务器保持状态的方法。

Session保存在服务器上,可以保存在数据库、文件或内存中,每个用户有独立的Session用户在客户端上记录用户的操作。可以理解为每个用户有一个独一无二的Session ID作为Session文件的Hash键,通过这个值可以锁定具体的Session结构的数据,这个Session结构中存储了用户操作行为。

大多数的应用都是用Cookie来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在Cookie里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。如果客户端的浏览器禁用了Cookie,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如sid=xxxxx这样的参数,服务端据此来识别用户,这样就可以帮用户完成诸如用户名等信息自动填入的操作了。

HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。H TTP/1.1 引 入 Cookie 来保存状态信息。 在浏览器之后向同一服务器再次发 起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销。
用途
会话状态管理(如用户登录状态、购物车、等其它需要记录的信息)
个性化设置(如用户自定义设置、主题等)
浏览器行为跟踪(如跟踪分析用户行为等)
分类
会话期 Cookie :浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
持久性 Cookie :指定过期时间( Expires )或有效期( max-age )之后就成为了持久性的 Cookie
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Cookie Session 选择
Cookie 只能存储 ASCII 码字符串,而 Session 则可以存储任何类型的数据,因此在考虑数据复杂 性时首选 Session
Cookie 存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;
对于大型网站,如果用户所有的信息都存储在 Session 中,那么开销是非常大的,因此不建议将所 有的用户信息都存储到 Session 中。

创建过程

服务器发送的响应报文包含 Set-Cookie 首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。
HTTP/1.0 200 OK 
Content-type: text/html 
Set-Cookie: yummy_cookie=choco 
Set-Cookie: tasty_cookie=strawberry 

[page content]
客户端之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器。
GET /sample_page.html HTTP/1.1 
Host: www.example.org 
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

六、URL与URI

HTTP 使用 URL(?Uniform?Resource?Locator,统一资源定位符)来定位资源,它是 URI(Uniform?Resource?Identifier,统一资源标识符)的子集,URL 在 URI 的基础上增加了定位能力。URI 除了包含 URL,还包含 URN(Uniform Resource Name,统一资源名称),它只是用来定义一个资源的名称,并不具备定位该资源的能力。例如 urn:isbn:0451450523 用来定义一个书籍名称,但是却没有表示怎么找到这本书。

?七、Web缓存

Web 缓存器 ( Web cache )也叫?代理服务器 ( proxy server),是能够代表初始 Web 服务器来满足 HTTP 请求的网络实体 。 Web 缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本 。Web 缓存器可以大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与 Web 缓存器之间的瓶颈带宽时更是如此。如果在客户与 Web 缓存器之间有一个高速连接(情况常常如此),并且如果用户 请求的对象在 Web 缓存器上,则 Web 缓存器可以迅速将该对象交付给用户。Web 缓存器能够大大减少一个机构的接入链路到因特网的通信量 。 通过减少通信量,该机构(如一家公司或者一所大学)就不必急于增加带宽,因此降低了费用 。 此外Web 缓存器能从整体上大大减低因特网上的 Web流量,从而改善了所有应用的性能。

?客户通过 Web 援存器请求对象的过程:

  • 浏览器建立一个到 Web 缓存器的 TCP 连接,并向 Web 缓存器中的对象发送一个HTTP 请求 。
  • Web 缓存器进行检查,看看本地是否存储了该对象副本 。 如果有, Web 缓存器就向客户浏览器用 HTTP 响应报文返回该对象。
  • 如果 Web 缓存器中没有该对象,它就打开一个与该对象的初始服务器的 TCP 连接 。 Web 缓存器则在这个缓存器到服务器的 TCP连接上发送一个对该对象的 HTTP 请求 。 在收到该请求后,初始服务器向该 Web缓存器发送具有该对象的 HTTP响应 。
  • 当 Web 缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用HTTP 响应报文发送该副本(通过现有的客户浏览器和 Web 缓存器之间的TCP 连接)。

HTTP 比较严重的缺点就是不安全,可以用 HTTPS 的方式解决,也就是通过引入 SSL/TLS 层,提高了安全性。

八、HTTP1.0与HTTP1.1

HTTP1.0是第一个得到广泛使用的HTTP版本。HTTP1.0最早在网页中使用是在1996年,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

  1. 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

  2. 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

  3. 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  4. Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

  5. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:33:32  更:2021-09-26 10:35:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:21:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码