目录

1.HTTP的基本介绍

2.HTTP的特点

3.认识URL

3.1 URL

3.2 URI和URL的区别

4.HTTP协议

4.1 请求消息Request

4.1.1 请求报头中Header中的属性

4.1.2 长连接和短连接

4.1.3 重定向 location

4.2 响应消息Response

4.3 HTTP的状态码

常见的状态码:

5.HTTP1.1

5.1 HTTP1.1的介绍

5.2 HTTP1.1和HTTP1.0的区别

6.HTTP2.0(了解)

7.HTTP的请求方法

8.HTTP的GET和POST方法

9.HTTPS的介绍以及和HTTP的区别

10.HTTP的Cookie和Session介绍

11.一次完整的HTTP请求过程


1.HTTP的基本介绍

  1. HTTP协议(超文本传输协议),它是一种详细规定了浏览器和万维网(WWW)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
  2. HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议;
  3. HTTP默认的端口号是80,HTTPS默认的端口号为443
  4. 浏览网页是HTTP的主要作用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵循这个协议,HTTP就能有用武之地。比如常用的QQ、迅雷这些软件,都会使用HTTP协议。

2.HTTP的特点

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路劲。请求方法常用的有GRT、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记;
  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理万客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间;
  4. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
  5. 支持B/S及C/S模式。

3.认识URL

HTTP使用统一资源标识符(URI)来传输数据和建立连接。URL(统一资源定位符)是一种特殊类型的URI,包含了用于查找某个资源的足够的信息,我们通常用的就是URL。

3.1 URL

全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL可以看出,一个完整的URL包括以下几部分:

  • 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
  • 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用
  • 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
  • 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
  • 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
  • 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
  • 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

(参考文章:https://blog.csdn.net/ergouge/article/details/8185219)

3.2 URI和URL的区别

URI(uniform resource identifier):是统一资源标识符,用来唯一的标识一个资源,web上可用的每种资源如HTML文档、图像、视频片段、程序等都是由一个URI来定位的。

URI有三部分组成:访问资源的命名机制;存放资源的主机名;资源自身的名称,由路径表示,着重强调于资源。

URL(uniform resource locator):是统一资源定位符,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。

采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:

①协议(或称为服务方式)

②存有该资源的主机IP地址(有时也包括端口号)

③主机资源的具体地址。如目录和文件名等

4.HTTP协议

作用:HTTP协议和TCP/IP协议族内的其他协议相同,,用于客户端和服务之间的通信。请求访问文本或图像等资源的一段称为客户端,而提供资源响应的一段称为服务端。

4.1 请求消息Request

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

HTTP请求消息结果如下:

请求行以一个方法符开头,以空格分开,后面跟着请求的URI和协议的版本

空行将报头和有效载荷分离

解释:

  • 请求行:说明请求方法+URL+版本
  • 请求报头(Header):请求的属性,冒号分割的键值对;每组属性之间使用\n分割;遇到空行表示Header部分已经结束
  • 空行:它用于区分报头和有效载荷
  • 正文(Boby):也叫请求数据,空行后面的内容都是Body,Body允许为空字符串,如果Body存在,则在Header中有一个Content-Length属性来标识Body的长度

4.1.1 请求报头中Header中的属性

冒号分隔的键值对 每组属性时间用\n分隔,遇到空行请求报头结束。

  • Host :客户端告知服务器,所请求的资源是在哪个主机的那个端口上
  • Content-length:正文长度 避免多读或者少读
  • Origin: 完整的url请求
  • Content-Type :正文类型
  • User-Agent:声明用户的操作系统和浏览器的版本信息
  • Accept:代表客户端所能接收的资源 如图片、html等
  • Referer: 当前页面是从哪个页面跳转过来的
  • Accept-Encoding、Accept-Language:客户端所有识别的编码语言

读到空行即把http请求的报头读完了,根据post、get方法了解此次协议有没有正文,根据Content-length获取正文的长度。

4.1.2 长连接和短连接

HTTP应用层,下层是TCP协议,TCP是面向连接的,想通信之前就得建立连接,即HTTP要通信就得建立连接,服务器响应连接,断开连接。

HTTP1.0中,默认使用的是短连接。即浏览器和服务器没进行一次HTTP操作,就建立一次连接,任务结束就断开连接。当浏览器访问的某个HTML或其他类型的Web页内包含有其他的Web资源(Js资源,css文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP链接。就导致一张HTML页面可能就会建立几十次连接,这种操作导致网页刷新速度变慢,影响用户的体验。

在HTTP1.1起,默认使用长连接。用以保持连接特性。(长连接通常在响应头会添加Connection:Keep-alive)使用长连接的情况下,当某个网页打开完毕之后,客户端和服务器之间的TCP连接不会关闭,如果客户单再次访问该服务器上的网页,会使用上一次已经建立的连接。长连接不是永久连接,他有一个保持时间。实现长连接的前提是客户端和服务端都需要支持长连接。

我们都知道,HTTP是基于TCP的应用层协议。HTTP的长连接和短连接,本质就上是TCP的长连接和短连接。基于TCP的协议,在数据通信之前要完成三次握手,结束通信需要完成四次挥手。每次建立连接都是需要时间代价的。

短连接:

过程:建立连接——数据传输——关闭连接……建立连接——数据传输——关闭连接

模拟一下TCP短连接的情况,Client向server发起连接请求,server接到请求,然后双方建立连接,Client向server发送消息,server回应client,然后一次读写就完成了,这是双方任意一放都可以发起close请求。一般都是client发起close请求。

短连接一般用于一点对多点通讯,C/S通信。

长连接:

过程:连接——传输数据——保持连接——传输数据——保持连接——关闭连接

长连接指三次握手建立连接后,完成一次读写操作,一段时间内,该连接不会关闭,之后如果还有向该server发起的数据读写,仍然使用该该连接。这与之前提到的TCP通信过程类似,因为要考虑在连接保持期间client始终处于正常状态(防止server端保存大量的半连接状态的socket),这就要牵扯到之前的TCP维护的四个定时器中的保活寄存器。相对于短连接而言,长连接安全性一般。

长连接和短连接的特点:

对于短连接而言,管理起来较为简单,因为短连接存在的连接都是有效的,不需使用额外的方法来维护;带来的缺点就是多次建立连接的请求,时间代价较大,占用的带宽也是一个很大的问题。

对于长连接而言,client端通常不会主动关闭连接,而是由服务器决定的。因此server需要提供一套机制来管理这些保持的连接。如果client连接server之后,长时间没有进行传递,大量的client连接会使server的负担加重,因此server需要提供一种机制,用来关闭即使client处于正常状态但长时间没有进行数据通信的连接,如果条件允许,可以在server端限制最大连接数,来避免个别客户端对服务器的拖累。

使用场合:

长连接多用于操作频繁,点对点的通信,且连接数不太多的情况。如数据库的连接使用长连接。短连接要求每次数据处理之前,都需要建立连接,对于需要大量访问数据库的操作,建立连接是对资源极大的浪费,而且容易导致socket错误。

短连接通常用于大型网站的访问。原因很简单,成千上万的client访问server,如果每个client保持一个连接,服务器是难以负荷的。即使可以调度,代价也是很大的。

(参考文章:https://blog.51cto.com/muhuizz/1912768)

4.1.3 重定向 location

客户端发起请求,响应中如果包含location字段,浏览器会自动跳转,常与3xx的状态码搭配使用,告诉客户端接下来访问哪里。

4.2 响应消息Response

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP相应的消息。

HTTP响应也由四个部分组成:状态行、消息报头、空行和响应正文。

空行将报头和有效载荷分离

  • 状态行:版本号+状态码+状态码解释
  • Header: 请求的属性, 用来说明客户端要使用的一些附加信息;冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • 空行:将报头和有效载荷分离
  • Body: 空行后面的内容都是Body.,服务器返给客户端的文本信息;Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中。

4.3 HTTP的状态码

状态码有三位数字组成,第一个数字定义了相应的类别,共分为五种类别:

  类别 原因
1xx Informational(信息性状态码) 请求已经接受,正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误状态码) 请求有语法错误或请求无法实现
5xx Server Error(服务器错误状态码) 服务器处理请求出错

常见的状态码:

2xx成功

  • 200:(OK) 客户端发过来的数据被正常处理
  • 204:(Not Content )正常响应,没有实体

3xx 重定向

  • 301:(Moved Permanently) 永久重定向
  • 302:(Found) 临时重定向,规范要求,方法名不变,但是都会改变
  • 303:(See Other )和302类似,但必须要用GET方法
  • 304:(Not Modified )状态未改变
  • 307:(Temporary Redirect) 临时重定向,不该改变请求方法

4xx 客户端错误

  • 400:(Bed Request) 请求报文语法错误
  • 401:(unauthorized)需要认证
  • 403:(Forbidden)服务器拒绝访问对应的资源
  • 404:(Not Found)服务器上无法找到资源

5xx 服务器端错误

  • 500:(Internal Server Error)服务器故障
  • 503:(Service Unavailable)服务器处于超负载或正在停机维护

(更多的状态码见:https://www.runoob.com/http/http-status-codes.html)

5.HTTP1.1

5.1 HTTP1.1的介绍

HTTP协议的初始版本中, 每进行一次 HTTP通信就要断开一次TCP连接,因为都是些容量很小的文本传输, 所以即使这样也没有多大问题。 但是随着HTTP的普及, 文档中包含大量图片的情况多了起来。

比如,使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTM页面里包含的其他资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。

为解决上述TCP连接的问题, HTTP/1.1和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections, 也称为 HTTPkeep-alive 或HTTP connection reuse)的方法。 持久连接的特点是, 只要任意一端没有明确提出断开连接, 则保持TCP连接状态。持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销, 减轻了服务器端的负载。 另外, 减少开销的那部分时间, 使HTTP请求和响应能够更早地结束, 这样 Web 页面的显示速度也就相应提高了。

在HTTP1.1中,所有的连接默认都是持久连接的。

持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应也可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。

5.2 HTTP1.1和HTTP1.0的区别

  1. 带宽优化及网络连接的处理:在HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持点续传功能;HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  2. 长连接:HTTP1.1支持长连接和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection:keep-alive,一定程度上弥补了HTTP1.0每次都要创建连接的缺点;
  3. 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  4. Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求信息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且他们共享一个IP地址。HTTP1.1的请求消息和响应消息都应该支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400)。
  5. 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Confllct)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

6.HTTP2.0(了解)

  • HTTP2.0的基本单位是二进制帧,HTTP1.0利用文本与服务器交互;
  • HTTP2.0中帧具有优先级,允许客户端提供排序思路,以让服务器优先处理一部分请求;
  • HTTP的多路复用:HTTP2中的请求与相应以耳机中南海帧的形式交错进行,只需建立一次连接,即一轮三次握手,实现多路复用(同一个连接并发处理多个请求);
  • HTTP2.0压缩消息头;
  • HTTP2.0服务端推送:HTTP2.0中服务器会主动将资源推送给客户端;
  • HTTP2.0只适用于HTTPS的场景;

7.HTTP的请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

  • HTTP1.0定义的三种请求方法:GET,POST,HEAD方法
  • HTTP1.1新增了五种请求方法:OPTIONS,,PUT,DELETE,,TRACE 和 CONNECT 方法
方法 说明
GET 获取资源,请求指定的页面信息,并返回实体主体
POST 传输实体主体,向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
DELETE 请求服务器删除指定的页面。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
LINK 建立和资源之间的联系
UNLINE 断开连接关系

8.HTTP的GET和POST方法

博客:https://blog.csdn.net/qq_43669007/article/details/106150556

9.HTTPS的介绍以及和HTTP的区别

博客:https://blog.csdn.net/qq_43669007/article/details/106167049

10.HTTP的Cookie和Session介绍

博客:https://blog.csdn.net/qq_43669007/article/details/106176296

11.一次完整的HTTP请求过程

博客:https://blog.csdn.net/qq_43669007/article/details/106217606

(注:因为后面的几个内容知识点较多且重要,所以,另起了博客;带来阅读不便了,请见谅(* ̄︶ ̄))

参考:https://www.cnblogs.com/ranyonsue/p/5984001.html

参考:图解HTTP

【网络】HTTP原理的简单理解相关推荐

  1. Android:安卓学习笔记之OkHttp原理的简单理解和使用

    Android OkHttp使用原理的简单理解和使用 OkHttp 0.前言 1.请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 1.4 请求的处理 2.拦截器 2.1 R ...

  2. mDNS 原理的简单理解

    转自:http://www.binkery.com/post/318.html mDNS 原理的简单理解 mDNS multicast DNS , 使用5353端口. 在局域网内,你要通过一台主机和其 ...

  3. 一次网络世界的旅行-简单理解网络通信

    一次网络世界的旅行 前言 简单理解网络通信 网络通信 mac地址 IP地址和子网掩码和网关 DHCP服务器 DNS服务器 前言 简要概述网络通信的简单原理,新手向,分享一下自己的理解 简单理解网络通信 ...

  4. Mysql的全文索引原理的简单理解

    Mysql的全文索引实际是通过 倒排索引 来实现的. 倒排索引实际就是将要插入的文本按照相应的词进行拆分,然后额外建立一张表,存储这些出现的单词,并做出相应的统计. 创建一张表: CREATE TAB ...

  5. 数据响应式的原理(简单理解 为了面试)

    首先 什么是数据响应式? vue里面的所谓的数据响应式指的是数据变了,视图跟着变 那么 数据响应式式的原理又是什么呢?(这里浅度剖析一下) 1.就是利用Object.defineProperty数据劫 ...

  6. mDNS原理的简单理解

    该文章由 Binkery 发布于 Binkery技术博客, 如转载请注明出处,该文章的链接地址为 https://www.binkery.com/archives/318.html mDNS mult ...

  7. 【Java ASQ队列同步器实现原理】简单理解

    ASQ 1.概念 2.核心结构 3.实现原理 3.1 同步状态的获取 3.2 同步队列 3.3 独占式同步状态的获取 3.4 独占式同步状态的释放 1.概念 队列同步器AbstractQueuedSy ...

  8. Generative Adversarial Networks 生成对抗网络的简单理解

    1. 引言 在对抗网络中,生成模型与判别相竞争,判别模型通过学习确定样本是来自生成模型分布还是原始数据分布.生成模型可以被认为是类似于一组伪造者,试图产生假币并在没有检测的情况下使用它,而判别模型类似 ...

  9. 深度剖析:CDN内容分发网络技术原理--转载

    1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...

  10. 入门启发:音视频的简单理解

    算机技术领域中,『音视频技术』应该说算是较复杂的小门类.较复杂的东西有个简单的入门指引,或者有前辈带路是很重要的. 前阵子,因为项目中急需音视频技术,虽然网上资料看似很丰富,但对初学者来说,很多资料都 ...

最新文章

  1. 【C++】 C++标准模板库(四) Set
  2. Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
  3. java学习(106):字符串tocharArray,tolowercase,touppercase方法
  4. 安装mysql最后一步第二个打叉_Mysql安装到最后一步时。出现start service红叉   亲朋好友帮忙指导一下!谢谢! 百...
  5. 工作中你都遇到哪些不要脸的同事?
  6. struck在c语言中的作用,C语言-选择题及答案.doc
  7. 认识position=fixed
  8. java se面试题_Java SE 8面试问答(第2部分)
  9. python json dumps 中文_Python下调用json.dumps中文显示问题解决办法
  10. 顺序队列为空的条件_C语言实现顺序队列
  11. 【游戏技术】建造防守 Build and Defense
  12. ES6的Map数据结构
  13. POP3 SMTP 协议分析
  14. 分析保镖人才网网站优化与搜索引擎相关建议
  15. Gameplay常用编写方法(持续更新)
  16. 【C++】模板类的友元函数
  17. 【数据结构与算法】期末复习刷题日寄Part02
  18. 怎么制作gif动态图 QQ动态表情包怎么制作
  19. Oracle bpm实现oa,Oracle BPM/SOA API 操作流程
  20. A045_jQuery案例实战_BootStrap

热门文章

  1. 智能解方程计算机在线使用,作业帮计算器在线使用
  2. 拯救微信多号党的超实用工具,电脑版PC微信双开、多开、防撤回补丁工具
  3. 噫吁嚱!文言文亦能编程!此诚年度最骚语言也
  4. [C#/DevExpress]VS2010使用CefSharp调用Chrome内核打开网页
  5. 三菱plcascll转换16进制_三菱ASCII码指令
  6. Android 计步器 - 手机自带系统级的 健康运动App 授权
  7. html新的页面打开新页面,javascript如何打开新窗口?
  8. html + js 上传 图片
  9. Android 四大组件之Activity
  10. 从零开始学习音视频编程技术