HTTP详解

写在前面

写了好几篇关于http的博文了,但是仍然感觉零零散散的,不怎么满意,今天就来总结一个较完整版的。

1.什么是URI和URL

URI全称:Uniform Resource Identifier,即统一资源标识符
URL全称:Uniform Resource Locator,即统一资源定位符

URL是URI的子集,也就是说每个URL都是URI,但不是每个URI都是URL。URI还包括一个子类叫作URN(Universal Resource Name),即统一资源名称,它只命名资源并不指定如何定位资源。但是目前互联网中URN使用的非常少,所以几乎所有的URI都是URL,一般情况下我们都可以认为URL=URI

2.什么是超文本

超文本又称超文本标记语言(HyperText Markup Language),简称HTML。之所以叫超文本,是因为页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。

3.什么是超文本传输协议

我们访问网站的时候,地址栏的URL开头会都http或者https,有些虽然你看着没有,其实是有的,不信你复制出来,粘贴到别的地方看看。有时我们还会看到ftp,sftp,smb开头的URL买这些都是传输协议。我主要讲解最常用的HTTP和HTTPS:

3.1HTTP

HTTP全称超文本传输协议(Hyper Text Transfer Protocol),HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,目前使用最广泛的是HTTP 1.1 版本,默认端口80端口。由此可见,我们有超文本HTML的存在,那么也存在一套传输协议HTTP来传输HTML。

3.2HTTPS

HTTPS全称Hyper Text Transfer Protocol over Secure Socket Layer,默认443端口,是以安全为目的的HTTP通道,就是HTTP的安全版,即HTTP下加入SSL层,简称HTTPS。但是由于在HTTP下加入了SSL(安全套接字层),也使得HTTPS的性能稍微比HTTP降低了一些。

4.HTTP请求过程

  • 现在我有一台计算机,通过 ISP(Internet Service Provider 互联网服务提供商), 接入了互联网,那么 ISP 就会给我分配一个DNS(Domain Name System,域名系统)服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的DNS解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到 IP 返回给你。
  • 现在我的计算机要发起请求查询 www.baidu.com 这个域名,代理DNS解析服务器拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直 接返回。这个时候拿到的 ip 地址,会被标记为非权威服务器的应答。
  • 找不到就去查询Hosts文件和本地DNS缓存,如果hosts和本地DNS缓存都没有找到域名对应的IP,则自动进入路由器的缓存中检查;
  • 以上均为客户端DNS缓存,若在客户端DNS缓存还是没找到,则进入ISP DNS缓存中查询;
  • 还是找不到,最终才向根DNS 服务器发出 DNS 查询报文,如过以上查询过程查询到了域名对应的ip,就立马停止查询,把结果返回给客户端,并且把这个域名对应的IP地址保存在高速缓存中,以便下次直接在缓存中查询。
  • 如果以上都找不到这个域名对应的ip就报错。

5.请求

请求包括请求方法(Request Method),请求的网址(Request URL),请求头(Request Headers),请求体(Request Body)
5.1.请求方法
1 GET 请求指定的页面信息,并返回实体主体。

2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。

5 DELETE 请求服务器删除指定的页面。

6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

7 OPTIONS 允许客户端查看服务器的性能。

8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

9 PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别

10 COPY 请求服务器将指定的页面拷贝至另一个网络地址。

5.2.请求的网址

请求的网址,即统一资源定位符URL,它可以唯一确定我们想请求的资源。

请求头

请求头用来说明服务器要使用的附加信息。比较重要的有Cookie、Referer、User-Agent等

Cookie:这是网站为了辨别用户进行回话跟踪而存储在本地的数据。主要功能是维持当前访问会话。例如我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,我们再去刷新界面,发现都是登录状态,这就是cookie的作用。

Referer:此内容用来标识这个请求是从哪里发过来的,服务器可以拿到这个信息并做相应的处理。如做来源统计、防盗链处理等。

User-Agent:这个内容可以使服务器识别客户使用的操作系统以及版本、浏览器及版本等信息,它决定了不同操作系统访问统一网址,返回不同的界面效果。

  1. Host (主机和端口号)
  2. Connection (链接类型)
  3. Upgrade-Insecure-Requests (升级为HTTPS请求)
  4. User-Agent (浏览器名称)
  5. Accept (传输文件类型)
  6. Referer (页面跳转处)
  7. Accept-Encoding(文件编解码格式)
  8. Cookie (Cookie)
  9. x-requested-with :XMLHttpRequest (是Ajax 异步请求)

可以看出来,Request Headers 里面的是数据格式可我们上图的请求形式是保持一致的。

5.3.请求体
请求体一般承载的内容是POST请求中的表单数据,对于GET请求来书,请求体为空。

6.响应

响应是由服务器返回给客户端,包括响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)

6.1.响应状态码

1xx 消息相关的
代表请求已经收到,继续处理。

这个状态码的分类意味着一个临时的响应,仅有状态行和可选的头部信息组成,并且有一个空行结尾。因为HTTP/1.0并没有定义任何1xx相关的状态码,所以服务器应该发出一个1xx的响应给一个HTTP/1.0的客户端除非在实验条件下。

100 Continue 继续
这意味着服务器已经收到请求的头部信息了,客户端应该继续发送请求的主体部分。如果请求的主体部分很大,可能会出现服务器因为不匹配的头部信息的原则拒绝了请求。因此,为了让服务器只通过请求的头部信息就检查请求能否被接受,客户端必须将 Extpect: 100-continue作为初始化请求并且监测100-continue状态码是否被服务器收到在继续发送请求体之前(或者收到417 Expectation Failed状态码并且不再继续)

101 Switching Protocols 切换协议
这意味着请求者要求服务器切换协议并且服务器也确认将会那么做。

102 Processing 处理中
作为一个WebDAV的请求可能包含多个子请求包括文件操作等,这将可能花费很长时间去完成操作。这个状态码意味着服务器已经收到了请求,并且正在处理中,所以当前暂无响应。这样将避免客户端因为超时而认为当前请求丢失。

2XX 成功
这一类状态码意味着请求的行为已经被客户端收到、理解接受而且被成功地处理。

200 OK 成功
成功HTTP请求的标准响应状态码。不过实际的响应取决于请求者所使用的方法。如果在一个GET的请求中,响应将会包含对应资源的实体。而在一个POST请求中,响应将会包含一个实体的描述或者是请求行为的结果。

201 Created 已创建
请求已经被满足,并且一个新的资源将会被创建。

202 Accepted接受
请求已经被接受并被处理,但是处理还没有完成。请求可能最终不会采取行动,因为在执行过程中可能会被打断。

203 Non-Authoritative Information 非权威的信息
服务器成功处理请求,但是返回信息可能来自其它源。

204 No Content 无内容
服务器成功处理请求,但是没有返回任何内容。通常被用来被作为成功删除的请求的响应。

205 Reset Content 重置内容
服务器成功处理请求,但是没有返回任何内容。和204不同的是,响应需要请求者重置文档视图。

206 Partial Content 部分内容
服务器只返回了一部分资源因为客户端发送了一系列的请求头。这些请求头被像wget的工具去恢复已经被中断的下载,或者将下载分成多个同步的流。

207 多状态
紧跟消息体后面的是xml消息并且包含了多个单独的响应状态码,响应的数量取决于子请求的个数。

208 已经报告
一个DAV的绑定成员被前一个请求枚举,并且没有被再一次包括。

3XX跳转
这一类状态码意味着客户端必须执行额外的动作去完成请求。大部分这些状态码被用于url重定向。只有当第二请求方法是GET或者是HEAD的情况下,用户代理可能会执行额外的动作在没有用户交互的情况下。一个用户代理不能自动地重定向请求超过5次,因为这样的重定向经常意味着一个死循环。

300 Multiple Choices多重选择
意味着对于这个资源有多个选项需要客户端注意。例如,可以用来展示不同格式的视频,使用不同的扩展名列出文件,或者消除文字的歧义。

301 Moved Permanently 永久移动
当前以及未来的所有请求应该被定位到指定的url上去。

302 Move temporarily发现
这是工业实践和标准相矛盾的例子。HTTP/1.0规范需要客户端执行一个临时的跳转(原始的描述短语是”临时移动”),但是流行的浏览器使用303查看其它的功能去实现302.因此,HTTP/1.1添加了状态码303和307去分辨这两个操作。然而,一些web程序和框架使用302状态码就好像它是303一样。

303 See Other查看其它
当前请求的响应能够在其它的URI地址上使用GET方法发现。当接收到一个POST响应的请求,则应该假设服务器已经收到数据而且跳转应该发出一个单独的GET消息。

304 Not Modified 未修改
意味着资源没有被修改因为请求头指定的版本跟本地保存的版本并未修改或没有匹配。这说明没有必要重新传输资源,因为客户端仍然有一个以前下载的副本。

305 Use Proxy 使用代理(自从HTTP/1.1)
请求的资源只能通过代理才能访问,并且访问的地址由响应提供。很多HTTP客户端(像火狐和IE)因为安全问题,不能正确地处理该响应。

307 Temporary Redirect 临时跳转(自从HTTP/1.1)
在这种情况下,当前请求应该被另一个URI地址重新发送,然而未来的请求仍然应该使用原始的URI地址。和302不同的是历史实现,请求方法不允许改变当重新发送原始请求。例如,一个POST请求应该被另一个POST请求重新发送。

4XX 客户端错误
4XX类别的状态码是为了预防客户端出现错误的情况。除了响应请求头的情况,服务器应该包括错误情形解释的实体无论是临时的还是永久的条件。这些状态码可以和任何请求方法匹配。用户代理应该展示可以被包括的实体给用户。

400 Bad Request 错误请求
服务器因为一些事情感知到客户端的错误而不继续处理请求(例如不正确的请求语法,无效的请求消息框架,以及虚假的请求路由)。

401 Unauthorized 未授权
和403禁止相似,但是明确用于需要授权的、失败的或者是不支持的。响应必须包括适用于请求资源的WWW-认证头字段。查看基本访问认证和数字访问认证。

402 需要付款
为以后保留使用。原意是该状态码可被用于一些数字货币或者是微支付,但是目前还没有普及,所以这些代码不经常被使用。YouYube使用这个状态如果某个IP地址发出了过多的请求,并要求用户输入验证码。

403 Forbidden 禁止访问
这个请求是一个有效的请求,但是服务器拒绝响应它。和401未授权的响应不同,是否授权并没有区别。

404 Not Found 找不到
请求资源无法被找到但是可能以后会再次有效。客户端以后发出的请求也是被允许的。

405 Method Not Allowed 方法不允许
请求由不支持该方法的资源发出。例如,使用GET方法在一个需要数据通过POST展现的表单或者是使用PUT在一个只读的资源中。

406 Not Acceptable 不可接受的
被请求的资源只能用于生成内容而不会接收发送请求中的头。

407 Proxy Authentication Required 需要代理认证
客户端必须首先使用代理认证自己。

408 Request Timeout 请求超时
服务器超时等待请求。根据HTTP规范:”客户端在服务器等待期间没有发出任何请求”。客户端可能会在未来的某个时候重复请求而不做任何修改。

409 Conflict冲突
意味着请求不能被处理因为存在冲突,例如多个更新的情况下存在修改冲突。

410 Gone 遗失的
当前状态意味着被请求的资源不再有效并且以后也不会再次生效。一般用于一个资源被有意地删除或者资源需要被清除。一旦接收410状态码,客户端将不应该再次请求该资源。例如搜素引擎应该从它们的下表中移除资源。大部分用例并不需要客户端和搜索引擎清空资源,而是使用404找不到来代替。

411 Length Required 长度要求
请求没有指定内容的长度,但是请求的资源需要指定。

412 Precondition Failed 前置条件失败
服务器不满足请求者所请求的预置条件。

413 Request Entity Too Large 响应实体太大
请求超过服务器所能处理和允许的最大值。

414 Request-URI Too Long 请求-URI太长
被提供的URI对服务器的处理来说太长。经常出现在太多被编码的数据被作为查询字符串的GET请求的结果,因此需要被转换为POST请求。

415 Unsupported Media Type 不被支持的媒体类型
请求实体的媒体类型不被服务器或者资源支持。例如,客户端上传一个image/svg+xml的图片,但是服务器需要图片使用不同的格式。

416 Requested Range Not Satisfiable 请求范围不能满足
客户端要求文件的部分(字节服务),但是服务器不能提供那部分的内容。例如,如果客户端要求的部分超过文件的底端。

417 Expectation Failed期望失败
服务器期望请求头字段的要求。

418 我是一个茶壶
这个代码是在1998年作为传统的IETF April Fools‘ jokes被定义的在RFC2324,超文本咖啡罐控制协议,但是并没有被实际的HTTP服务器实现。RFC指定了这个代码应该是由茶罐返回给速溶咖啡。

419 认证超时
并不是HTTP标注的一部分,419认证超时表示以前的有效证明已经失效了。同时也被用于401未认证的替代选择为了从其它被拒绝访问的已认证客户端中指定服务器的资源。。

422 Unprocessable Entity 不可处理的实体(WebDAV)
请求符合要求但是不能接受错误由于语法错误。

423 Locked锁定的
资源访问被锁定。

424 Failed Dependency 失败的依赖
请求由于上一个请求的失败而失败。

426 Upgrade Required需要升级
客户端应该切换不同的协议例如TLS/1.0在指定的升级的头字段里。

5XX 服务器错误
服务器似乎不能满足有效的请求

以数字5开头的响应状态码意味着服务器已经意识到遇到了一个错误或者是无法发送请求。除了响应HEAD请求的时候,服务器应该包含一个保存错误情形解释的实体,并且标识这个情况是暂时的还是永久的。同样地,用户代理也应该展示任何被包含的实体给用户。这些响应码适用于任何请求方法。

500 Internal Server Error 服务器内部错误
一个普通的错误信息,当一个意外的情况出现并且没有其它明确的消息是合适的。

501 Not Implemented 没有实现
服务既不能识别请求方法,也缺少满足请求的能力。一般会在将来可用(例如一个新的web-service接口特性)

502 Bad Gateway 错误的网关
服务器作为一个网关或者代理,从上游的服务器中接收到无效的响应。

503 Service Unavailable 服务不可用
服务当前不可用(因为过载或者下线维护)。一般而言,只是一种暂时的状态。

504 Gateway Timeout 网关超时
服务器作为一个网关或者代理,但是没有从上游服务器收到即时的响应。

505 HTTP Version Not Supported HTTP版本不支持
服务器不支持在请求中使用的HTTP协议。

506 Variant Also Negotiates 变量也是导航
对于请求是透明的内容导航导致循环参照。

507 Insufficient Storage 存储不足
服务器不能存储需要的内容去完成请求。

508 发现环路
服务器发现了一个无限的循环档处理请求的时候。

509 Bandwidth Limit Exceeded 频带宽度超出限制(Apache的扩展)
这个状态码没有在任何RFCS中指定。使用方法是未知的。

511 需要网络授权
客户端需要授权去火的网络的访问权限。一般用于代理交互中被用来进行网络的访问控制。

520 未知错误
这个状态码也没有被指定在任何RFC中,并且只会被一些服务器返回,例如微软的Azure和CloudFlare服务器:”520错误本质上是一个捕获全部的响应当原始服务器返回一些未知的或者一些不能被忍受或者被解释的(协议违反或者空响应)”。

598 网络读取超时异常(未知)
这个状态码也没有在任何RFC中指定,但是被用在微软的HTTP代理中去标注一个网络读取超时在一个客户端之前的代理的后面。

599 网络连接超时异常(未知)
这个状态码也没有在任何RFC中指定,但是被用在微软的HTTP代理中去标注一个网络连接超时在一个客户端之前的代理的后面。

6.2.响应头

响应头包含了服务器对请求的应答信息。

  • Date:标识响应产生的时间
  • Last-Modified:资源最后的修改时间
  • Content-encoding:指定响应内容的编码
  • Server:包含服务器的信息,如服务器名称、版本等
  • Content-Type:文档类型,指定返回的数据类型是什么
  • Set-Cookie:设置Cookies。告诉浏览器需要将此内容放在Cookies中,下次请求携带Cookies请求。
  • Expires:指定响应的过期时间。

6.3.响应体

响应体就是我们获取到的内容所在之处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值