HTTP协议

应用层协议 HTTP

  1. Web的应用层协议是HTTP
  2. HTTP由两个程序实现:客户程序和服务器程序
  • 服务器和客户端通过TCP三次握手之后建立连接
  • 客户端发送请求,请求的格式:统一资源标识符URL、协议版本号、MIME信息
  • 服务器给予响应,格式是状态行包括:信息的协议版本号、一个成功或错误的代码、后面是MIME信息
  • 客户端接收到服务器返回的信息通过浏览器显示在用户的显示器上
  1. HTTP使用TCP作为支撑运输协议,HTTP客户首先发起一个与服务器的TCP连接,连接建立起来之后,浏览器和服务器进程就可以通过套接字接口访问TCP,TCP为HTTP提供可靠的数据传输服务
  2. 服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息,所以HTTP是一个无状态协议
  3. HTTP默认持续连接,但是HTTP客户和服务器可以被配置成非持续连接
  4. 非持续连接:每个TCP连接服务器发送一个对象后关闭,每个TCP连接只传输一个请求报文和一个响应报文
  5. 浏览器可以打开5-10个并行的TCP连接,并行连接可以缩短响应时间
  6. 往返时间RTT,是指一个短分组从客户到服务器然后再返回客户所花的时间。一次TCP连接涉及三次握手过程,三次握手的前两个部分消耗时间占用了一个RTT。客户结合第三部分向TCP连接发送一个HTTP请求报文,请求报文到达服务器,服务器就在该TCP连接上发送HTML文件,这个HTTP请求/响应用去了另一个RTT
  7. 持续连接的HTTP:服务器在发送响应后保持该TCP连接打开,在相同的用户和服务器之间,后续的响应的请求报文能够通过相同的连接进行传送
  8. 在持续连接中,一个完整的Web页面可以通过单个持续的TCP连接完成
  9. 如果一条连接经过一段时间间隔没有被使用,HTTP服务器就关闭该连接
  1. cookie有四个组件分别在请求报文、响应报文、用户端系统、Web站点的后端服务器中保存
  2. cookie用于标识一个客户,Web站点为每一个客户分配一个唯一的标识码,作为索引后端数据中的表项
  3. cookie允许对用户进行追踪或根据访问信息投放广告,被人为是侵犯用户隐私的
  4. const char *cookie=getenv("HTTP_COOKIE");获得Cookie

Web缓存

  1. Web缓存器又称为代理服务器
  2. Web缓存器既是服务器又是客户,浏览器请求对象,Web缓存器先检查本地有没有这个对象,如果有就返回这个对象,如果没有就向对象的初始服务器打开TCP连接,Web缓存器在本地保存对象的副本,然后向客户的浏览器用HTTP响应报文发送副本
  3. Web缓存器可以减少客户请求的响应时间,可以减少一个机构的接入链路到因特网的通信量,改善所有用户的性能
  4. 通过使用内容分发网络,Web缓存器在因特网中发挥着巨大作用

HTTP请求报文和响应报文

  1. 报文由普通ASCII码书写
  2. 协议分为以下四个部分:
  • 报文头GET http://www.baidu.com/favicon.ico HTTP/1.1表示用GET方法请求这个文件,用的是HTTP/1.1协议
  • 0或者多个请求头
  • 空行
  • 可选的消息体
  1. HTTP定义了9中方法表明Request_URI指定的资源的不同操作方式
  • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向Web服务器发送*请求测试服务器的功能性
  • HEAD:向服务器索要GET请求一致的响应,响应体不会被返回
  • GET:向特定的资源发送请求
  • POST:向指定的资源提交数据进行处理请求,数据被包含在请求体中
  • PUT:向指定资源位置上传其最新内容
  • DELETE:请求服务器删除Request-URI所标识的资源
  • TRACE:回显服务器收到的请求
  • CONNECT:HTTP/1.1协议预留给能够将连接改为管道方式的代理服务器
  • PATCH:将局部修改应用于某一资源
  1. HTTP常见请求头:
  • Host:请求头,请求资源的Internet主机和端口号
  • Connection:有两个值keep-alive和close,keep-alive实现客户端和服务器之间的持续连接
  • Accept:浏览器可以接受的MIME类型,如果服务器无法返回这个类型的数据,返回406(no acceptable),通配符*表示任何类型
  • Cache-Control:指定请求和响应遵循的缓存机制,缓存指令是单向的,Public表示可以被任何缓存所缓存,private只缓存到私有缓存中,no-cache指所有内容都不会被缓存,no-store防止信息被无意发布…
  • Accept-Encoding:浏览器声明自己可接受的编码方法,表明是否支持压缩并指定压缩方法
  • Accept-Language:浏览器声明自己接收的语言
  • Accept-Charset:浏览器声明可接受的字符集
  • User-Agent:告诉HTTP浏览器,客户端使用的操作系统和浏览器的名称和版本
  • If-Modified-Since:将浏览器端缓存页面的最后修改时间发送到服务器,服务器将这个时间和实际文件的修改时间做对比,时间一致返回304,时间不一致返回200和新文件内容
  • If-None-Match:和ETag合作,在HTTP Response中添加ETag信息,验证资源的ETag有没有改变,返回304或者200
  • Pragma:指定no-macth表示服务器必须返回一个刷新后的文档
  • Content-Type:
  • Referer:包含一个URL,用户从URL代表的页面出发访问当前请求的页面
  • Cookie:将cookie的值发送给HTTP服务器
  • Content-Length:表示请求信息正文的长度
  • Authorization:授权信息,401表示未授权
  • UA-Pixels:屏幕大小
  • UA-Color:颜色深度
  • UA-OS:操作系统
  • UA-CPU:CPU类型
  • From:请求发送者的Email地址
  • Range:请求实体的一个或多个子范围,如bytes=0-499表示头500个字节
  1. HTTP常见的回应报文
  • Request Version:表示HTTP协议版本
  • Status Code:表示返回码,1xx表示请求已接受继续处理,2xx表示请求已被成功接收,继续处理,3xx表示重定向,要完成请求需要更进一步的操作,4xx客户端错误,5xx服务器端错误
  • Date:表示消息发送的时间
  • Server:指明Web服务器用来处理请求的软件信息
  • Accept-Range:Web服务器表示自己是否接收某个实体的一部分,bytes表示接收,none表示不接收
  • Vary:表示在什么条件下才能用本响应所返回的对象响应后续的请求
1
2
3
4
5
6
7
8
9
10
11
12
#HTTP响应报文
HTTP/1.1 200 OK #初始状态行有三个字段,HTTP协议版本,状态码和响应的状态信息
#200 OK 请求成功 301 Moved Permanently 请求对象已经被永久转移了 ...
#下面是6个首部行
Connection: close #发送完报文后关闭TCP连接
Date: Tue, 18 Aug 2015 15:44:04 GMT
Sever: Apache/2.2.3 (CentOS) #指示产生报文的服务器
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821 #被发送对象的字节数
Content-Type: text/html #指示实体体中的对象是HTML文件

(data data data...) #实体体

HTTPS

  1. HTTP是基于TCP协议的,HTTPS是基于TLS、SSL协议层之上的协议
  2. HTTPS是URI scheme(抽象标识符体系),句法类同HTTP体系,用于安全的HTTP数据传输
  3. TLS握手协议实现客户和服务器之间的身份认证
  • 客户端产生的秘钥只有客户端和服务器端才能得到
  • 加密数据只有客户端和服务器端才能得到
  • 客户端和服务器端的通信是安全的
  1. HTTPS协议需要CA申请证书
  2. HTTP是超文本传输协议,信息是明文传输的。HTTPS是具有安全性的ssl加密传输协议
  3. HTTP和HTTPS使用户的不同的连接方式,HTTP的默认端口号是80,HTTPS的默认端口号是443
  4. HTTP连接是无状态的,HTTPS是SSL协议加HTTP协议构建的可进行加密传输、身份认证的网络协议比HTTP安全

CGI 通用网关接口

  1. Web服务器通过CGI接口获取客户端提交的信息,转交给服务器端的CGI程序处理,然后把结果返回给客户端
  2. CGI通信系统由两个部分组成:客户端浏览器的HTML页面和运行在服务器上的CGI程序
  3. CGI环境变量在CGI程序启动时初始化,结束时销毁
  4. CGI相关的环境变量有三种:与请求相关的环境变量、与服务器相关的环境变量和与客户端相关的环境变量
  5. 请求相关的环境变量中的REQUEST_METHOD,通常有两种,POST和GET
  6. 获取环境变量要用到getenv()函数,依赖的 头文件是stdlib.h
  7. CGI是一个进程,在处理完一个请求之后退出,在下一个请求到来时再创建一个新的进程
  8. GET方法下,CGI无法从服务器的标准输入中获取数据,服务器将它从标准输入接收到的数据编码到环境变量QUERY_STRING或PATH_INFO,采用GET方法时,只需要将这些数据添加到URL的末尾
  9. POST方法下,CGI程序直接从服务器的标准输入中获取数据,要先从CONTENT_LENGTH这个环境变量中得到POST参数的长度,然后在读取相应长度的内容
  10. 获取用户IP地址有两个环境变量:HTTP_VIA和REMOTE_ADDR
  • 用户使用代理代理服务器访问时,HTTP_VIA环境变量的值不为空,用户的IP就是代理服务器的IP
  • 用户没有用代理服务器时,IP地址就在REMOTE_ADDR环境变量中

FastCGI

  1. FastCGI是一个常驻的CGI,可以一直执行,只要激活后就不需要在花时间去fork
  2. FastCGI的整个工作流程
  • Web服务器启动时载入FastCGI进程管理器
  • FastCGI进程管理器自身初始化,启动多个CGI进程并等待来自Web服务器的连接
  • 当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到一个FastCGI进程,Web服务器将CGI环境变量和标准输入发送到FastCGI进程
  • FastCGI子进程完成处理后将标准输出和错误信息从同一个连接返回Web服务器,当FastCGI子进程关闭连接时,请求便被告知处理完成。FastCGI进程接着等待并处理FastCGI进程管理器的下一个连接
WhitneyLu wechat
Contact me by scanning my public WeChat QR code
0%