1.前言

  最近在研究http,希望结合书本,对网上资料进行整合,用“人话”聊聊这个玩意儿~

  计划用近十篇文章,详尽的说清楚以下一些问题:

  1. URL和资源、HTTP报文是什么东西?
  2. HTTP是怎样进行链接管理的?
  3. HTTP有什么结构(web服务器、代理、缓存、网关、HTTP-NG)?
  4. 识别、认证和安全问题(客户端的识别、cookie机制、基本认证机制、摘要认证)是怎么做的?
  5. HTTP的编码和国际化的问题
  6. 内容的发布和分发(web主机托管、发布系统、重定向与负载均衡、日志使用与跟踪)是怎么运行的?

  废话就不多说了,这一章主要做一个简单概述HTTP,然后讲明白第一个问题!

2.  HTTP:web基础

  HTTP的作用就是把遍布全世界的web服务器上的信息(文本文件、HTML页面、mpeg电影、音频文件...资源)迅速搬迁到web浏览器(客户端)上去。简单做了个图,可看出,http也就是一个数据传输协议,桥梁的作用。

Fig1. HTTP,Client,Server

  有几个概念要弄清楚:

  1. MIME type:  HTTP会给每一种要通过web浏览器的对象打上MIME类型的数据格式标签;浏览器会根据不同的MIME类型来决定如何处理这个对象。
  2. URI:  (Uniform Resource Identifier)统一资源标识符;世界范围内唯一标识并且定位信息资源,有两种形式:URL与URI;
  3. URL:  (Uniform Resource Locator)统一资源定位符;(例如:https://www.cnblogs.com/Mairr/ 这就是一个URL啦!)
  4. URN:  (Uniform Resource Name)统一资源名称;(还在试用阶段,现在还是用URL,所以我们会不加以区分URI和URL,直接认为是同一个东西,其实URL只是URI的子集)

2.1  URL与资源

2.1.1  浏览互联网的资源

  举个例子,我们是怎么通过URL浏览互联网上的资源的,比如:https://pic.cnblogs.com/avatar/1194681/20171108220649.png

  URL三连:  怎么做?(方案http://)---->在哪呢?(服务器位置pic.cnblogs.com)---->什么东西?(资源路径/avatar/1194681/20171108220649.png);所以URL找到网上资源是通过上述三步完成的(方案---->主机---->路径)。当然,方案不止是时HTTP一种,比如文件传输协议(FTP)、流视频传输协议(rtsp)...

2.1.2  URL的语法

  讲的这么专业,其实也就是URL三连嘛~

  1. URL的方案----->使用什么协议(HTTP,FTP、SMTP(邮件的传输协议))
  2. 服务器的位置----->可以通过主机名:www.cctv.com,也可以通过IP地址加端口号:161.58.228.45:80(我随便写的一个,别介意)
  3. 路径

  要说明的是URL分为绝对URL和相对URL,刚才聊的都是绝对URL。而相对URL只是一小个片段会以基础的URL完成转换!如下图所示:

  下面做个常见方案方式的总结,方便自己以后回看用~

方案 描述
http

超文本传输协议方案,除了没有用户名和密码外其他与通用的URL格式相符。如果省略了端口,就默认为80。格式

http//<host>:<port>/<path>

https 与http基本一样,唯一区别是https使用了SSL(安全套接层),SSL为HTTP连接提供了端到端的加密机制。语法与http一致,默认端口号为443。
ftp

文件传输协议URL可以用来从FTP服务器上下载/上传文件,并且获取FTP服务器上的目录结构。基本格式:

ftp://<user>:<password>@<host>:<port>/<path>

mailto E-Mail地址传输协议,基本格式:mailto:<RFC-822-addr-spec>;示例: mailto:joe@joes-hardware.com
rtsp,rtspu

RTSP URL,是可以通过实时流传输协议解析音频、视频的媒体资源标识符。基本格式:

rtsp://<user>:<password>@<host>:<port>/<path>

files

files表示指定主机(本地磁盘、网络文件系统、)上可以直接访问的文件。如果省略主机名则表示本地主机;基本格式:files://<host>/<path>

news

方案news用来访问一些特定的文章或新闻组,他有一个独特的性质:news URL本身不足对资源进行定位。基本格式:

news:<newsgroup>

telnet

telnet用于访问交互式业务。他表示的并不是对象自身,而是可通过telnet协议访问的交互时应用程序(资源)。基本格式:telnet://<user>:<password>@<host>:<port>/

2.2  HTTP报文

2.2.1 web的结构组件

  HTTP报文就是HTTP应用程序之间发送的数据。之前介绍了2个web应用程序(浏览器、服务器),他们之间如何相互发送报文来实现基本事物处理。接下来先简单介绍(后面几篇文章会很详细的说明白)其他的几个比较重要的应用程序:

  (1) 代理:位于客户端与服务器之间的HTTP中间实体。代理用来接收所有客户端的HTTP请求,并将请求转发给服务器(可能会对请求修改之后进行转发)。此外,代理还可以对请求和响应进行过滤(比如,病毒检测,未成年人不能看的东西也要滤掉!!!)。

  (2) 缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。web缓存(Web cache)或者服务器缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受副本的服务了。

  (3) 网关(gateway):一种特殊的服务器。

  (4) 隧道(tunnel):对HTTP通信报文进行盲目转发的特殊代理。HTTP隧道的一种常见用途是通过HTTP链接承载加密安全套接字层(SSL,Secure Sockets Layer)流量,这样的SSL流量就可以穿过只允许Web流量通过的防火墙了。

  (5) agent代理:发起自动HTTP请求的半智能Web客户端。用户agent代理(简称:agent代理)是代表用户发起的HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理。例如:web浏览器就是一种HTTP Agent代理。

2.2.2  报文流和报文组成

  (1) 报文流

  报文是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,描述了报文内容和含义,后面跟着可选的数据部分。HTTP使用“流入”和“流出”来描述事务处理的方向。报文流入源端服务器,工作完成后流回用户的Agent代理中。HTTP报文像流水一般向下流动。如下图所示:

  (2) 报文的组成

  每条报文包含一条来自客户端的请求或者服务器端的响应。他们由三个部分组成:对报文进行描述的起始行、包含属性的首部块、包含主体部分。报文的主体是一个可选的数据块。与起始行和首部不同的是主体可以包含文本或者二进制数据,也可以为空。

  报文分为请求报文和响应报文。下面是格式:

请求报文格式

响应报文格式

<method> <request-URL> <version>

<version> <status> <reason-phrase>

<headers>

<headers>

<entity-body>

<entity-body>

  下面是对各个部分的简单描述:

  • 方法(method):客户端对服务器资源执行的动作。如GET,HEAD,POST。
  • 请求URL(request-URL):命名了所请求的资源路径。
  • 版本(version):报文所使用的HTTP版本,格式:HTTP/<major>.<minor>;其中,major是主版本号,minor是次版本号;都是整数。
  • 状态码(status-code):这三位数字描述请求过程中所发生的情况。(成功/出错等)
  • 原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的所有文本。
  • 首部(header):可以有0个或者多个首部,每个首部包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后一个CRLF(回车换行)。
  • 实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块。并不是所有报文都包含实体的主体部分,有时,报文只是以一个CRLF结束(后面文章会介绍实体)。

  下面展示两个请求和响应的报文demo:

2.2.3  报文的常用方法和状态码

  (1) 报文的常用方法

  • GET:请求服务器发送某个资源;
  • HEAD:与GET方法很类似,但是服务器在响应中只返回首部;
  • PUT:与GET相反,PUT方法向服务器写入文档;
  • POST:向服务器发送表单(html...);
  • TRACE:客户端发送的请求可能要穿过防火墙、代理、网关...TRACE方法允许客户端在最终将请求发送给服务器时,查看它变成的样子;
  • OPTIONS:OPTIONS方法请求WEB服务器告知其支持的各种功能。
  • DELETE:请服务器删除请求URL所指定的资源。

  (2) 状态码

  HTTP分为5类状态码,这里做一个简单总结:(比较重要的状态码,后边更新的文章会详细介绍)

  • 100~199---->信息性状态码
100 Continue 受到请求初始部分,请客户端继续。
101 Switching Protocols 服务器正在根据客户端指定,将协议切换成Update首部所列的协议
  • 200~299---->成功状态码
200 OK 请求没问题,实体的主体部分包含了所请求的资源
201 Created 已创建对象的URL
202 Accepted 请求已被接受,但服务器还未对其执行任何动作
203

Non-Authoritative

Information

实体首部包含的信息不是来源于源服务器,而是来自资源副本的一部分。
 204  No Content 没有实体的主体部分
205  Reset Content 另一个用于浏览器代码
 206  Partial Content 成功执行了一个部分或者Range(范围)的请求
  • 300~399---->重定向状态码 (比较重要)
300 Multiple Choices 返回这个状态码时会返回一个选项列表;供客户端选择其需要的文档页码/内容。
301 Moved Permenently 请求的URL已经被移除时使用。响应的Location首部中应该包含该资源现在所处的URL
302 Found 客户端使用首部给出的URL临时定位资源。将来的请求仍应使用老的URL
303 See Other 告诉客户端应该使用另一个URL来获取资源。
304 Not Modified 资源未被修改。带有这个状态码的响应不应该包含实体的主体部分。
305 Use Proxy 必须通过代理来访问资源
306 (未使用) 当前未使用
307 Temporary Redirect 临时定位资源。将来的请求应该使用老的URL
  • 400~499:客户端错误状态码
400 Bad request 告知客户端它发送了一个错误的请求
401 Unauthorized 与适当的首部一起返回,客户端在获取对资源的访问权之前,对自己进行认证。
402 Payment Required (已保留,但是未使用)
403 Forbidden 请求被服务器拒绝。
404 Not Found 服务器无法找到一个请求的URL
405 Method Not Allowed 发起请求中带有所请求的URL不支持的方法。
406 Not Acceptable 客户端可以指定参数来说明他们愿意接收什么类型的实体。
 407  proxy Authentication Required  对资源进行认证的代理服务器
 408  Request Timeout  客户端请求完成时间过长,服务器可以回送状态码关闭链接
 409 Conflict 请求冲突
410 Gone  服务器曾经拥有这个资源
 411  Length Required 服务器要求在请求报文中包含Content-Lenth首部时使用。
 412 Precondition Failed 条件请求,条件失败时候使用
 413  Request Entity Too Large  客户端发送实体主体部分比服务器能够处理的大。
 414 Request URL Too Long   客户端发送请求的URL比服务器能够处理的要长。
 415 Unsupported Media Type 服务器无法理解或者无法支持客户端请求
416 Requested Range Not Satisfiable 请求报文所请求资源不在指定范围,吃范围无效或者无法满足
 417 Exception Failed 服务器无法满足请求的首部包含的期望
  • 500~599:服务器错误状态码
500 Internal Server Error 服务器遇到一个妨碍为请求提供服务的错误
501 Not Implemented 客户端发起请求超出服务器的能力范围
502 Bad' Gateway 作为代理或者网关使用的服务器从请求响应链接上收到一条伪响应
503 Sevice Unacailable 服务器暂时无法为请求提供服务(将来可以)
504 Gateway TimeOut 响应来自网关或者代理,在等待另一服务器对其请求进行响应时超时了
505 HTTP Version Not Suppported 服务器收到的请求是其无法支持的版本(早期版本)

  今天更新到这里,最近准备期末考,考完会好好写学习笔记,一起加油~~~

HTTP协议------->资源和URL的更多相关文章

  1. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  2. .NET(C#):浅谈程序集清单资源和RESX资源

    原文:.NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  3. 网络基础 HTTP协议之http url简介

    HTTP协议之http url简介 by:授客 QQ:1033553122 http url简介 http url通过http协议,用于定位网络资源,是一种特殊类型的URI(统一资源定位) http_ ...

  4. Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署

    一,引言 上一篇讲解到利用 Azure DevOps 将整个 Azure Web App,Azure Traffic Manager profile,Azure Storage Account,Azu ...

  5. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。

    springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...

  6. HTTP协议----URI,URL,持久连接,管道与Cookie

    URI与URL有什么不同呢? URI:Universal Resource Identifier统一资源标志符 URL:Universal Resource Locator统一资源定位器 URI是用来 ...

  7. k8s系列---ingress资源和ingress-controller

    https://www.cnblogs.com/zhangeamon/p/7007076.html http://blog.itpub.net/28916011/viewspace-2214747/ ...

  8. Velero:备份、迁移Kubernetes集群资源和PV

    Velero基本介绍 官方文档:https://velero.io/docs/v1.4/ 基本工作原理: 不管需求是实现什么,比如:集群迁移.恢复.备份,其核心都是通过velero client CL ...

  9. [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效

    有个itellyou,更新了所有MSDN的软件包.如果自己有微软的注册账户,还是从微软官网下载比较好.而且对自己账户里的系统和itellyou里的做了对比.发现SHA1码不相同,估计官方分配的序列号也 ...

随机推荐

  1. hive Beeline plus HiveServer2简单使用

    HiveServer2是经常与beeline一起使用,可以用jdbc客户端远程连接,一般用于生产环境. 在提供传统客服端的功能之外,还提供其他功能: Beeline连接 1.先在hadoop集群启动H ...

  2. install plugin group_replication ERROR 1126 (HY000)

    在给MySQL安装插件的时候,你可能会遇到如题所示的报错. 更详细的错误输出如下: mysql> INSTALL PLUGIN group_replication SONAME 'group_r ...

  3. 这次真的忽略了一些ActiveMQ内心的娇艳

    好久没总结了,内心有点空虚了,所以今天主要给园里的朋友们分享一点儿这几天使用ActiveMQ过程中踩过的小坑,虽然说这东西简单易用,代码几行配置也就几行,问题不大但是后果有点严重,所以就要必要总结一下 ...

  4. ligerUI---下拉菜单(menubar)动态显示(从后台获取数据)

    写在前面: ligerui的下拉菜单是有点丑的,这也是没有办法的事........这里主要记录下,如何从后台获取数据进行菜单显示. 有两种方式:1.使用json数组来动态添加  2.字符串拼接.  其 ...

  5. wamp环境下如何安装redis扩展

    Redis安装 wamp环境安装redis扩展 首先在自己本地项目中phpinfo(); 查看php版本; (php版本是5.5, ts-vcll表示MSVC11 (Visual C++ 2012), ...

  6. websocket(三) 进阶!netty框架实现websocket达到高并发

    引言: 在前面两篇文章中,我们对原生websocket进行了了解,且用demo来简单的讲解了其用法.但是在实际项目中,那样的用法是不可取的,理由是tomcat对高并发的支持不怎么好,特别是tomcat ...

  7. 爬虫day 04_01(爬百度页面)

    import urllib.request import http.cookiejar from lxml import etree head = { 'Connection': 'Keep-Aliv ...

  8. 使用superMap实现点标注和区域着色

    1.定义html文件,引入superMap的js和theme文件: <script src='${_ctxPath }/statics/js/superMap/SuperMap.Include. ...

  9. Webpack3.0入门指南

    前言 本文是基于我厂基友的Webpack学习系列(一)初学者使用教程 这篇文章做构建.可能基友的文章是基于Mac环境,我是windows环境,在学习时遇到了很多坑,询问基友,他让我搞个基于window ...

  10. SpringCloud Feign对Hystrix(断路由)的支持

    第一步:首先开启Feign对Hystrix的支持,在properties文件中添加以下配置: feign.hystrix.enabled=true. 第二步:在上一篇Feign的基础上添加Hystri ...