分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

HTTP协议详解

发布时间:2023-09-06 02:02责任编辑:苏小强关键词:暂无标签

一、引子

????????HTTP,即超文本传输协议,是Internet上最主要的Web应用层标准。B/S架构的应用系统用HTTP在客户端与服务器之间的传送数据。HTTP可以传送任何格式的数据,从文本到图像甚至视频流都可以通过HTTP进行传输。

二、HTTP流程

???????? Http是Web浏览器与Web服务器之间通信的标准协议,是Internet上能够可靠地交换文件的重要基础。

???????? 每个HTTP站点都有一个服务器进程监听着TCP的HTTP端口,HTTP端口默认为80,也可由服务器进程设置为其他端口。当服务器发现有客户端建立连接并提交了一个HTTP请求(Request)后,就根据请求的内容执行相应的操作,并将结果返回给客户端(Response)。通常客户在浏览器中发起一次网络访问的步骤如下:

  1. 输入网址并按Enter键,比如访问http://mysite:8080/app/index.html
  2. 浏览器通过域名系统查询mysite的真实IP,比如212.34.98.20
  3. 向服务器212.34.98.20的8080端口发起TCP连接请求并建立连接
  4. 发送HTTP请求的内容,包括访问的地址/app/index.html,访问方式GET,浏览器本身的产品名等
  5. 服务器返回/app/index.html中的数据作为Response发送给客户端。如果请求的不是一个文件,则服务器需要执行相应的代码,动态生成且返回给客户端
  6. 浏览器接收到结果后关闭与服务器的TCP连接
  7. 浏览器将接收到的结果呈现在显示器上

注意:域名解析本身不是HTTP的一部分,客户端应在向服务器建立TCP连接之前就通过DNS服务器完成域名解析工作

???????? 以上是最典型的HTTP流程,当今的HTTP版本还允许客户端在一次HTTP请求完成后不关闭TCP连接,以便之后第2次发送HTTP请求时复用该连接,以达到减少系统整体开销的目的,此技术在HTTP中叫做keep-alive.

三、HTTP消息结构

Request 消息结构

???????? HTTP的两种消息(Resquest和Response)采用不同的消息结构,Request的格式如下:

[请求方法] [URL] [协议版本][头字段1]:值1。。。[头字段n]:值n[消息体]

???????? 结构格式由两部分组成:消息头(HTTP HEAD),消息体(HTTP BODY)。X消息体则没有固定格式:HEAD与BODY之间以一个空行分隔。上述格式中的请求方法,URL,协议版本,头字段等都属于消息头。常用的消息体格式包括HTML,XML,JSON等。

HTTP/1.1 200 OKDate: Wed, 04 Jul 2018 08:30:38 GMTContent-Type: text/html; charset=utf-8Content-Length: 8092Connection: keep-aliveVary: Accept-EncodingCache-Control: private, max-age=10Expires: Wed, 04 Jul 2018 08:30:48 GMTLast-Modified: Wed, 04 Jul 2018 08:30:38 GMTX-UA-Compatible: IE=10

Response 消息结构

???????? Response是服务器根据客户的的请求包做相应处理后向客户端返回的结果,Response的格式如下:

【协议版本】 【错误代码】【错误字符串】【头字段1】: 值1。。。。。【头字段N】: 值N【消息体】

常用头字段

Accept 设置接受的内容类型Accept: text/plainAccept-Charset 设置接受的字符编码Accept-Charset: utf-8Accept-Encoding 设置接受的编码格式Accept-Encoding: gzip, deflateAccept-Datetime 设置接受的版本时间Accept-Datetime: Thu, 31 May 2007 20:35:00 GMTAccept-Language 设置接受的语言Accept-Language: en-USAuthorization 设置HTTP身份验证的凭证Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Cache-Control 设置请求响应链上所有的缓存机制必须遵守的指令Cache-Control: no-cacheConnection 设置当前连接和hop-by-hop协议请求字段列表的控制选项Connection: keep-aliveConnection: UpgradeContent-Length 设置请求体的字节长度Content-Length: 348Content-MD5 设置基于MD5算法对请求体内容进行Base64二进制编码Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==Content-Type 设置请求体的MIME类型(适用POST和PUT请求)Content-Type: application/x-www-form-urlencodedCookie 设置服务器使用Set-Cookie发送的http cookieCookie: $Version=1; Skin=new;Date 设置消息发送的日期和时间Date: Tue, 15 Nov 1994 08:12:31 GMTExpect 标识客户端需要的特殊浏览器行为Expect: 100-continueForwarded 披露客户端通过http代理连接web服务的源信息Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43Forwarded: for=192.0.2.43, for=198.51.100.17From 设置发送请求的用户的email地址From: user@example.comHost 设置服务器域名和TCP端口号,如果使用的是服务请求标准端口号,端口号可以省略Host: en.wikipedia.org:8080Host: en.wikipedia.orgIf-Match 设置客户端的ETag,当时客户端ETag和服务器生成的ETag一致才执行,适用于更新自从上次更新之后没有改变的资源If-Match: "737060cd8c284d8af7ad3082f209582dIf-Modified-Since 设置更新时间,从更新时间到服务端接受请求这段时间内如果资源没有改变,允许服务端返回304 Not ModifiedIf-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMTIf-None-Match 设置客户端ETag,如果和服务端接受请求生成的ETage相同,允许服务端返回304 Not ModifiedIf-None-Match: "737060cd8c284d8af7ad3082f209582d"If-Range 设置客户端ETag,如果和服务端接受请求生成的ETage相同,返回缺失的实体部分;否则返回整个新的实体If-Range: "737060cd8c284d8af7ad3082f209582d"If-Unmodified-Since 设置更新时间,只有从更新时间到服务端接受请求这段时间内实体没有改变,服务端才会发送响应If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMTMax-Forwards 限制代理或网关转发消息的次数Max-Forwards: 10Origin 标识跨域资源请求(请求服务端设置Access-Control-Allow-Origin响应字段)Origin: http://www.example-social-network.comPragma 设置特殊实现字段,可能会对请求响应链有多种影响Pragma: no-cacheProxy-Authorization 为连接代理授权认证信息Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Range 请求部分实体,设置请求实体的字节数范围,具体可以参见HTTP/1.1中的Byte servingRange: bytes=500-999Referer 设置前一个页面的地址,并且前一个页面中的连接指向当前请求,意思就是如果当前请求是在A页面中发送的,那么referer就是A页面的url地址(轶事:这个单词正确的拼法应该是"referrer",但是在很多规范中都拼成了"referer",所以这个单词也就成为标准用法)Referer: http://en.wikipedia.org/wiki/Main_PageTE 设置用户代理期望接受的传输编码格式,和响应头中的Transfer-Encoding字段一样TE: trailers, deflateUpgrade 请求服务端升级协议Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocketUser-Agent 用户代理的字符串值User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0Via 通知服务器代理请求Via: 1.0 fred, 1.1 example.com (Apache/1.1)Warning 实体可能会发生的问题的通用警告Warning: 199 Miscellaneous warning常用非标准请求头字段X-Requested-With 标识Ajax请求,大部分js框架发送请求时都会设置它为XMLHttpRequestX-Requested-With: XMLHttpRequest

常用错误代码

200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200。201:表示资源被正确的创建。比如说,我们 POST 用户名、密码正确创建了一个用户就可以返回 201。202:请求是正确的,但是结果正在处理中,这时候客户端可以通过轮询等机制继续请求。203:请求的代理服务器修改了源服务器返回的 200 中的内容,我们通过代理服务器向服务器 A 请求用户信息,服务器 A 正常响应,但代理服务器命中了缓存并返回了自己的缓存内容,这时候它返回 203 告诉我们这部分信息不一定是最新的,我们可以自行判断并处理。300:请求成功,但结果有多种选择。301:请求成功,但是资源被永久转移。比如说,我们下载的东西不在这个地址需要去到新的地址。303:使用 GET 来访问新的地址来获取资源。304:请求的资源并没有被修改过。308:使用原有的地址请求方式来通过新地址获取资源。400:请求出现错误,比如请求头不对等。401:没有提供认证信息。请求的时候没有带上 Token 等。402:为以后需要所保留的状态码。403:请求的资源不允许访问。就是说没有权限。404:请求的内容不存在。406:请求的资源并不符合要求。408:客户端请求超时。413:请求体过大。415:类型不正确。416:请求的区间无效。500:服务器错误。501:请求还没有被实现。502:网关错误。503:服务暂时不可用。服务器正好在更新代码重启。505:请求的 HTTP 版本不支持。

四、HTTP 请求方法

  • DELETE : 从给定的地址中删除信息
  • GET : 从访问的地址中获取信息,即获取信息头,也获取信息体。这是互联网上最主要的一种HTTP访问方式
  • HEAD : 从访问的地址中呢获取信息,它与GET的区别是:HEAD只获取信息头,不获取信息体。在Flask路由中如果声明了GET访问方式,则无须显示地声明HEAD访问方式
  • OPTIONS : 为客户端提供一种查询“本URL地址中有哪些可用的访问方式”的方法
  • POST : 客户端通过POST访问向服务器提交新数据,服务器必须保证数据被完整地保存,并且服务器不允许出现重复的POST数据提交。这是HTML中通过表单(Form)提交数据所使用的URL访问方式。
  • PUT : 与POST访问方法类似,POST也是一种使客户端可用想服务器提交数据的方式,但是PUT允许客户端提交重复主键的数据,当通过PUT访问方式在服务器中发现重复主键的数据时,它会用新提交的数据覆盖服务器中已有的数据。

HTTP协议详解

原文地址:https://www.cnblogs.com/baishuchao/p/9264128.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved