HTTP详解

引言

HTTP是超文本传输协议(Hyper Text Transfer Protocol)的简称,设计之初是为了将HTML(超文本标记语言)文档从Web服务器传送到客户端的浏览器,但现在HTTP已经不局限与HTML的传输。HTTP是万维网(World Wide Web,www,也简称Web)的基础。同时HTTP协议是TCP/IP协议栈的应用层协议。

事务

HTTP是面向事务的(transaction-oriented),HTTP事务=请求命令+响应结果(通过HTTP报文的格式化数据块进行的)。

客户端加载完成一个任务,如加载一个多图片的事务,需要多个事务,先完成加载页面的框架,然后完成加载图片的事务。

HTTP协议特点

1.支持Client/Server模式。
2.简单快速:客户端向服务器请求服务时,只需发送请求方法和路径,请求的常用方法有GET、POST、DELETE。每种方法规定了客户端与服务器连接的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而速度很快。
3.灵活:HTTP允许传输任意类型的对象。传输类型有Content-Type加以标记,使用MIME类型区分数据格式,能够传输MIME类型有text/html、text/plain、image/jpeg和image/gif等。
4.无连接:每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户的应答后,即断开连接。无连接的方式能够节省传输时间。但可以使用持续连接,即在传送完所请求的对象后,不释放TCP连接。
5.无状态:HTTP是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。可以使用Cookie保存HTTP服务器与客户端之间的状态信息。

URI与URL

URI(uniform resources identifier)为同一资源标识符,URL(uniform resource locator)为同一资源定位符,URI只是一个字符串的格式规范,于指定标识Web资源的字符串的各个不同部分,用于唯一标识一个资源。而URL是特定的URI,它是资源定位的规范,可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL格式: protocol://host[:port]/path/[;parameters][?query][#fragment]

  • protocol: 应用层常用协议,如ftp、http
  • host: HTTP服务器的主机的域名或IP地址
  • port: HTTP服务器的默认地址80,可省略,如果为其他端口,必须写明,如:http://localhost:8088
  • path: 访问资源的路径,有零个到多个”/“符号隔开的字符串
  • parameters: 指定特殊参数的可选项
  • query: 可选,用于给动态网页传递参数,由”?”开头,多个可由”&”隔开
  • fragment: 用于指定网络资源中片段,能够进行定位查看网页

URL示例

http://www.website.com/p/test:p=test?name=test#top
protocol: http
host: www.website.com
path: /p/test
parameters: p=test
query: name=test
fragment: top

HTTP请求

http请求由三部分组成,分别是:Request line(请求行)、http header(消息报头)、body(请求正文),如下图所示:(CRLF表示回车符+换行符,不同颜色之间用空格隔开


  1. 请求行:包括请求的方法,请求资源的路径及请求的版本。

    • GET和POST方法为常用的请求方法,当使用GET方法时,body(请求正文)为空。(GET只能读取服务器上的信息,POST能写入
  2. 消息报头:包括实体报头请求报头。实体报头下面会介绍。
    常用的请求报头

    • Accept
      Accept请求报头域用于指定客户端接受哪些类型的信息。
    • Accept-Charset
      Accept-Charset请求报头域用于指定客户端接受的字符集。
    • Accept-Encoding
      Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。
    • Accept-Language
      Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。
    • Authorization
      Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
    • Host
      Host请求报头域主要用于指定被请求资源的Internet主机和端口号。
    • Connection
      Connection表示是否保存连接,Keep-Alive是指底层的TCP仍保持连接。
  3. 请求正文:包含一些提交给服务器的参数,如用户名,用户密码,是否为移动端访问等。

--- GET请求的消息格式 ---
GET /s?ie=utf-8&f=8&tn=baidu&wd=test HTTP/1.1 //---请求行
---http消息报头---
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; TheWorld 6)
Accept-Encoding: gzip, deflate
Host: www.baidu.com
Connection: Keep-Alive
Cookie: ...
--- POST请求的消息格式 ---
POST /login HTTP/1.1 //---请求行
Accept: text/html,application/xhtml+xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 744
Content-Type: application/x-www-form-urlencoded
Cookie: ...
Host: passport.baidu.com
Origin: https://passport.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
 
---body---
charset: UTF-8
token: 326bc45afb8774977429e10e2c65b303
u: http://www.baidu.com/
isPhone:false
username: 12345678901
password: ...

    请求访问除了POST与GET请求方法外,还有其他的请求方法,常见的请求方法如下图所示:

HTTP响应

HTTP响应也是由三个部分组成,分为:状态行、消息报头、响应正文,如下图所示:


  1. 状态行格式如上图所示:其中,HTTP-Version表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应状态代码,Reason-Phrase表示状态代码的文本描述。

         状态码由三位数字组成,第一个数字定义了响应的类别,有5中取值:

状态码代表含义
1xx 指示信息–表示请求已接收,继续处理
2xx 成功–表示请求已被成功接收、理解、接受
3xx 重定向–要完成请求必须进行更进一步的操作
4xx 客户端错误–请求有语法错误或请求无法实现
5xx 服务器端错误–服务器未能实现合法的请求

         常见的状态码:

200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

       2. 消息报头,与请求的消息报头一样,包括实体报头与响应报头。

           常用的响应报头:

    • Location
      Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
    • Server
      Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。

      3. 响应正文,是服务器返回的资源的内容,如HTML文件与JSON文件、图片等。

--- 响应的消息格式 ---
HTTP/1.1 200 OK //---状态行
Content-Type: text/html
Content-Length: 42066
Connection: keep-alive
Date: Sat, 12 Mar 2016 12:43:49 GMT
Server: SWS
Vary: Accept-Encoding
Cache-Control: no-transform,
max-age=120
Expires: Sat, 12 Mar 2016 12:45:49 GMT
Last-Modified: Sat, 12 Mar 2016 12:30:08 GMT
Content-Encoding: gzip
 
<!DOCTYPE HTML>
<html>
<head>
...
</head>
</html>

HTTP实体报头

请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常见的实体报头:

  1. Content-Encoding,Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding主要用于记录文档的压缩方法。
  2. Content-Language,Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言
    阅读者。
  3. Content-Length,Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。即一个数字字符占一个字节,用其对应的ASCII码来存储传输。
  4. Content-Type Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。
  5. Expires,Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。
  6. Last-Modified,Last-Modified实体报头域用于指示资源的最后修改日期和时间。

HTTP版本

HTTP协议最开始版本为http 1.0,现在普遍使用的是http 1.1,下一代HTTP协议是HTTP 2.0。

HTTP与HTTPS

HTTP是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上传输的。简单来说,HTTPS是安全版的HTTP,将HTTP的数据进行加密,其所用的端口是443。

参考引用:http://www.cricode.com/1880.html

原文地址:https://www.cnblogs.com/codingexperience/p/5274221.html