HTTP 协议

简介

HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
注意:客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。
HTTP 是一种无状态 (stateless) 协议, HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
然而,在许多应用场景中,我们需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie

正文

HTTP URL

HTTP URL 包含了用于查找某个资源的详细信息, 格式如下:
http://host[":"port][abs_path]

HTTP请求

下图是在网上找的一张图,觉得能很好的表达HTTP请求的所发送的数据格式。
由上图可以看到,http请求由请求行,消息报头,请求正文三部分构成。

HTTP请求状态行

请求行由请求Method, URL 字段和HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:
GET /example.html HTTP/1.1 (CRLF)
复制代码
HTTP协议的方法有:
  • GET: 请求获取Request-URI所标识的资源
  • POST: 在Request-URI所标识的资源后增加新的数据
  • HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
  • PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识
  • DELETE: 请求服务器删除Request-URI所标识的资源
  • TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT: 保留将来使用
  • OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

HTTP请求头

消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:
Header解释示例
  1. Accept指定客户端能够接收的内容类型    Accept: text/plain, text/html
  2. Accept-Charset浏览器可以接受的字符编码集    Accept-Charset: iso-8859-5,utf-8
  3. Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型    Accept-Encoding: compress, gzip
  4. Accept-Language浏览器可接受的语言    Accept-Language: en,zh
  5. Accept-Ranges可以请求网页实体的一个或者多个子范围字段    Accept-Ranges: bytes
  6. AuthorizationHTTP授权的授权证书类型    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  7. Cache-Control指定请求和响应遵循的缓存机制    Cache-Control: no-cache
  8. Connection表示是否需要持久连接(HTTP 1.1默认进行持久连接)Connection: close
  9. Cookie:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器    Cookie: $Version=1; Skin=new;
  10. Content-Length请求的内容长度    Content-Length: 348
  11. Content-Type请求的与实体对应的MIME信息    Content-Type: application/x-www-form-urlencoded
  12. Date请求发送的日期和时间    Date: Tue, 15 Nov 2010 08:12:31 GMT
  13. Expect请求的特定的服务器行为    Expect: 100-continue
  14. From发出请求的用户的Email    From: user@email.com
  15. Host指定请求的服务器的域名和端口号    Host: www.zcmhi.com
  16. If-Match只有请求内容与实体相匹配才有效    If-Match: “737060cd8c284d8af7ad3082f209582d”
  17. If-Modified-Since如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码    If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
  18. If-None-Match如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变    If-None-Match: “737060cd8c284d8af7ad3082f209582d”
  19. If-Range如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag    If-Range: “737060cd8c284d8af7ad3082f209582d”
  20. If-Unmodified-Since只在实体在指定时间之后未被修改才请求成功    If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
  21. Max-Forwards限制信息通过代理和网关传送的时间    Max-Forwards: 10
  22. Pragma用来包含实现特定的指令    Pragma: no-cache
  23. Proxy-Authorization连接到代理的授权证书    Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  24. Range只请求实体的一部分,指定范围    Range: bytes=500-999Referer先前网页的地址,当前请求网页紧随其后, 即来路
  25. TE客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息TE: trailers,deflate;q=0.5
  26. Upgrade向服务器指定某种传输协议以便服务器进行转换(如果支持)Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
  27. User-AgentUser-Agent的内容包含发出请求的用户信息    User-Agent: Mozilla/5.0 (Linux; X11)
  28. Via通知中间网关或代理服务器地址,通信协议    Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
  29. Warning关于消息实体的警告信息    Warn: 199 Miscellaneous warning

HTTP请求正文

只有在发送POST请求时才会有请求正文,GET方法并没有请求正文。

HTTP请求报文

HTTP响应

与HTTP请求类似,先上一张图:
HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。

HTTP响应状态行

状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK (CRLF)
复制代码

HTTP响应状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
  • 1xx指示信息 - 表示请求已接收,继续处理
  • 2xx成功 - 表示请求已被成功接收、理解、接受
  • 3xx重定向 - 要完成请求必须进行更进一步的操作
  • 4xx客户端错误 - 请求有语法错误或请求无法实现
  • 5xx服务器端错误 - 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
  • 200OK - 客户端请求成功
  • 400Bad Request - 客户端请求有语法错误,不能被服务器所理解
  • 401Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403Forbidden - 服务器收到请求,但是拒绝提供服务
  • 404Not Found - 请求资源不存在,eg:输入了错误的URL
  • 500Internal Server Error - 服务器发生不可预期的错误
  • 503Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

HTTP响应状态码说明

StatusCodeStatusCode语义中文描述
  1. 100Continue继续。客户端应继续其请求
  2. 101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议

  3. 200OK请求成功。一般用于GET与POST请求
  4. 201Created已创建。成功请求并创建了新的资源
  5. 202Accepted已接受。已经接受请求,但未处理完成
  6. 203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
  7. 204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
  8. 205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
  9. 206Partial Content部分内容。服务器成功处理了部分GET请求

  10. 300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
  11. 301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
  12. 302Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
  13. 303See Other查看其它地址。与301类似。使用GET和POST请求查看
  14. 304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
  15. 305Use Proxy使用代理。所请求的资源必须通过代理访问
  16. 306Unused已经被废弃的HTTP状态码307Temporary Redirect临时重定向。与302类似。使用GET请求重定向

  17. 400Bad Request客户端请求的语法错误,服务器无法理解
  18. 401Unauthorized请求要求用户的身份认证
  19. 402Payment Required保留,将来使用
  20. 403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
  21. 404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
  22. 405Method Not Allowed客户端请求中的方法被禁止
  23. 406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
  24. 407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
  25. 408Request Time-out服务器等待客户端发送的请求时间过长,超时
  26. 409Conflict服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
  27. 410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
  28. 411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
  29. 412Precondition Failed客户端请求信息的先决条件错误
  30. 413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
  31. 414Request-URI Too Larg请求的URI过长(URI通常为网址),服务器无法处理
  32. 415Unsupported Media Type服务器无法处理请求附带的媒体格式
  33. 416Requested range not satisfiable客户端请求的范围无效
  34. 417Expectation Failed服务器无法满足Expect的请求头信息

  35. 500Internal Server Error服务器内部错误,无法完成请求
  36. 501Not Implemented服务器不支持请求的功能,无法完成请求
  37. 502Bad Gateway充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
  38. 503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
  39. 504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
  40. 505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

HTTP响应报文

HTTP协议详解

HTTP的五大特点

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

非持久连接和持久连接

在实际的应用中,客户端往往会发出一系列请求,接着服务器端对每个请求进行响应。对于这些请求|响应,如果每次都经过一个单独的TCP连接发送,称为非持久连接。反之,如果每次都经过相同的TCP连接进行发送,称为持久连接
非持久连接在每次请求|响应之后都要断开连接,下次再建立新的TCP连接,这样就造成了大量的通信开销。例如前面提到的往返时间(RTT) 就是在建立TCP连接的过程中的代价。
非持久连接给服务器带来了沉重的负担,每台服务器可能同时面对数以百计甚至更多的请求。持久连接就是为了解决这些问题,其特点是一直保持TCP连接状态,直到遇到明确的中断要求之后再中断连接。持久连接减少了通信开销,节省了通信量。
 
posted @ 2019-03-30 10:56  studyMore  阅读(251)  评论(0编辑  收藏  举报