简介:

HTTP(HyperText Transfer Protocol) 超文本传输协议,是互联网上行应用最广泛的一种网络协议。

HTTP是一个客户端和服务器端请求和应答的标准(TCP),客户端是终端客户,服务器端是网站,通过web浏览器,网络爬虫或者其他工具,客户端发起一个到服务器上指定端口(默认为80)的HTTP请求,这个请求发起者称之为用户代理(User Agent)。应答的服务器上存储着一些资源,比如html文件或图片,这个服务器称之为源服务器(origin server)。


在用户代理和源服务器之间可能存在多个中间层,比如代理,网关,或者隧道(tunnels),尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没国定必须使用它和基于它支持的层。

HTTP协议可以在任何其他互联网协议上实现。


一、http协议版本:

http 0.9 仅用于传输html文档

http 1.0

MIME: Multipurpose Internet Mail Extensions 引入MIME机制,从而支持多媒体数据

引入keep-alive(持久连接): 必须显式注明使用,才可以启用 

缓存机制

http 1.1: 

更多请求方法,更加精细缓存控制;持久连接(persistent),原生支持

http 2.0: 

spdy  google开发的,还没有成为标准,但是已经有大量的开发簇拥


二、http协议的基本概念:


http事务:

一次请求及对应的响应的整个过程


http方法:

GET:请求获取一个资源,需要服务器发送

HEAD: 跟GET近似, 但其不需要服务响应请求的资源,而返回相应首部

POST基于HTML表单向服务器提交数据,服务器通常需要存储此数据 (位置:通常为关系型数据库)

PUT与GET相反, 向服务器发送资源: 服务器通常需要存储此资源:(位置:通常为文件系统)

DELETE删除URL指向的资源

OPTIONS探测服务器端对请求的URL所支持使用的请求方法

TRACE跟踪一次请求中间所经过的代理服务器、防火墙或网关等


http状态码:

1xx: 信息性状态码


2xx:成功状态码

200: OK

201: CREATED


3xx: 重定向类的状态码,返回一个新地址

301: Moved Permanently永久重定向 

302:Found,临时重定向,会在相应报文中使用"Location:新位置";

304:Not Modified, 诶做任何修改


4xx: 客户端类错误

403: Forbidden,请求被拒绝

404:Not Found,服务器找不到请求资源

405: Method Not Allowed, 不允许此方法请求此资源


5xx:服务器类的错误

500: Internal Server Error 服务器内部错误

502: Bad Gateway, 代理服务器从上游服务器收到一条伪响应

503: Service Unavailable,服务暂时不可用




http协议: 协议首部

是在应用层的首部,封装在应用层,在数据前段指定了状态码、指定资源等信息,可以分为以下几类:


1. 通用首部

2. 请求首部

3. 响应首部

4. 实体首部 

5. 扩展首部 非标准首部,可由程序员自行创建: X-Forward-For, X-Via


协议首部格式:

Name: Value

Content-Type: p_w_picpath/gif


http请求报文:

<method> <request-URL> <version>

<HEADERS>

           这个空白行是必须存在的

<entity-body>


http响应报文:

<version> <status> <reason-phrase>

<HEADERS>

         这个空白行是必须存在的

<entity-body>


解释:

<method>: 请求方法:

<request-URL>: 请求的资源,可以使相对路径,如/p_w_picpaths/log.jpg, 也可是对决路径,http://www.magedu.com/p_w_picpaths/banner.jpg

<version>: http协议版本,格式HTTP/<major>.<minor>, 例如 HTTP/1.0, HTTP/1.1

<headers>: 各种所可以使用的首部

<status>:  状态码

<reason-phrase>: 原因短语, 指状态码的易读信息

-

通用首部:

Connection:定义C/S之间关于请求、响应的有关选项

Connection: keep-alive


Cache-Control: 缓存控制



请求首部:

Client-IP:

Host: 请求的主机

Referer: 指明了请求当前资源原始资源的URL(跳转前的页面URL,可以用来防盗链)

User-Agent: 用户代理

Accept首部:

Accept: 服务端能够发送的媒体类型(通知服务端我支持什么)

Accpet-Charset:

Accept-Enconding:

Accpet-Language:


条件式请求:(仅HTTP1.1支持)

跟安全相关请求:

    Authorization:

    Cookie:


响应首部:

Age: 可以缓存的时长

Server: 向客户端说明自己用到的程序名称和版本(nginx/apache?)


协商首部:

vary: 首部列表,服务器会根据列表中的内容挑一个最适用的版本发送给客户端

跟安全相关:

WWW-Authentication: 

Set-Cookie


实体首部:

Location: 资源的新位置(302时会用到)

Allow: 允许对此资源适用的请求方法


内容相关的首部:

Content-Enconding: 内容的压缩格式

Content-Language: 内容的编码格式

Content-Length: 本次发送的长度

Content-Location: 内容位置

Content-Type: 内容类型 


缓存相关:

Etag

Expires

Last-Modified

二、 web通信原理

一次web资源请求的具体过程(从服务器角度考虑):


wKiom1WjHR_gM5POAAEJEbzIk9E400.jpg


建立连接

接受请求

处理请求

访问资源

构建响应

发送响应

记录日志

-

连接分为:

连接套接字:客户端随机端口 连接 服务器上的随机端口

监听套接字:80端口

-

wKioL1WjIEHyB22dAACWjBiysX8167.jpg

web服务器的I/O结构:


单进程模型:串行;一次只响应一个独立的请求

多进程模型: 每个进程响应一个用户请求,实现并发的效果 eg: apache; 有安全上下文切换,及进程的创建和回收,有大量的内核空间开销

复用的I/O机制:一个进程生成多个线程(线程会共享进程的很多数据,包括打开的文件等),每个线程响应一个用户请求

复用的I/O机制: 多个线程,每个线程同时响应多个用户请求:eg: nginx,