HTTP(Hyper Text Transfer Protocol,超文本传输协议)
HTTP协议是应用层的一种协议,是一种C/S架构服务,基于TCP/IP协议来通信,监听在TCP的80端口上。下面就开始介绍HTTP协议的相关内容,在开始之前先简单的介绍一下端口类型、TCP协议的功能和状态、Socket通信时的系统调用。
一、常见的端口类型
- 众所周知:
0~1023:管理员才有权限使用,永久地分配给某应用使用。
- 注册端口:
1024~41951:只有一部分被注册,分配原则上非特别严格。
- 动态端口或私有端口:
41952~65535:这些端口是客户端平时使用最多的
在linux中,可以通过 /proc/sys/net/ipv4/ip_local_port_range 文件来定义临时端口的起始数字和结束数字。
二、TCP协议的功能
- 连接建立
主要是指TCP/IP的三次握手来建立连接
- 将数据打包成段
这主要是实在网络传输过程中的MTU(最大传输单元)决定的,数据必须打包成段才可以传送
- 确认、重传以及超时
- 排序
数据打包成段后,需要按序列号排序来发送,保证数据的连贯性
- 流量控制
通过滑动窗口来进行流量的控制。
- 拥塞控制
解决拥塞控制的办法是:采用慢启动和拥塞避免算法结合使用来控制拥塞
三、TCP的状态
常见的TCP状态有:CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED。tcp协议通过tcp状态来标记当前处于通信过程的哪个阶段。
四、socket 通信机制
Socket是IPC通信的一种方式,用于实现在同一主机或者不同主机之间的通信。socket通信在domain中实现,所谓的 domain 是识别一个socket的方法(socket地址格式)。
1、常见的domain:
- Unix Domain: 基于socket机制实现同一主机不同进程间通信的一种方式;AF_UNIX, AF_LOCAL,地址是一个路径名(文件)
- IPv4 Domain: AF_INET, 基于socket机制借助于ipv4协议实现不同主机(也可以是同一主机)上的进程间通信的机制; 地址是32位的ipv4地址+16位的端口号
- IPv6 Domain: AF_INET6, 地址是128位的Ipv6地址+16位的端口号
2、socket的类型:
- TCP:流式socket,SOCK_STREAM 提供可靠、双向、面向字节流
- UDP:数据报式socket, SOCK_DGRAM
3、相关的系统调用:
- socket( ): 创建一个新的socket
- bind( ):绑定于一个套按字地址和端口上
- listen( ): 监听套接字
- accept( ): 接收连接请求
- connect( ): 发起连接请求
- close( ): 关闭连接
- read( ):从套接字向缓冲区读入数据
- write( ): 从缓存区向套接字中写入数据
客户端和服务端建立TCP会话的系统调用如下:(图片来自于《HTTP权威指南》书籍)
下面正式开始介绍HTTP协议的相关内容:
五、web资源
HTTP协议实现的是客户端可以向服务端获得资源,称为web资源。在 HTTP1.0 协议中引入了MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展),使得我们请求的资源不再只是文本资源了。
1、常见资源类型:使用MIME来标记
- text/html html文本
- text/plain 纯文本
- image/jpeg jpeg格式的图片
- image/gif gif格式的图片
- vedio/mpeg4 mpeg4格式的视频
- application/vnd.ms-powerpoint 一些应用程序
2、资源名称:URI(Uniform Resource Identifier,统一资源标识)
实际上,我们使用最多的是URL(统一资源定位符),用来描述一个特定服务器上某资源的特定位置,分为三部分:
例如:http://www.magedu.com:80/download/bash-4.3.1-1.rpm
- scheme(方案):http://
- 服务器地址:www.magedu.com:80
- 特定服务器上的资源:/download/bash-4.3.1-1.rpm
六、常见的HTTP的方法
在这里的方法可以理解为服务端和客户端之间的通信的API,也可以理解为函数。(博主自己的理解)
- GET:向服务器发送资源申请,请求获得资源
- HEAD:向服务器发送资源申请,请求获得资源,服务器只返回请求资源的首部信息
- PUT:基于HTML表单向服务器提交数据,服务器通常需要存储此数据(位置一般为关系型数据库)
- POST:与GET相反,向服务器端发送资源,服务器通常需要存储此资源(位置一般为文件系统)
- DELETE:删除URL指向的资源
- TRACE:跟踪一次请求所经过的代理服务器,防火墙,网关等
- OPTIONS:探测服务器端对请求的URL多支持的请求方法
七、HTTP状态码:(常见的)
所谓的状态码就是一些状态信息的编号,来表示各种不同的状态信息。
1、1xx:信息状态码,在HTTP 1.1协议中引入的
2、2xx:成功状态码
- 200:OK 请求没有问题,实体的主体部分包含了所请求的资源
- 201:CREATED 用于创建服务器所请求的资源
3、3xx:重定向类的状态码
- 301:Moved Permanently 永久重定向,在请求的URL被删除时,相应的Location首部中应该包含资源现在所处的URL
- 302: Found, 临时重定向,会在响应报文中使用“Location: 新位置”
- 304: Not Modified 客户端可以通过所包含的请求首部,使其请求变为有条件的。
4、4xx:客户端类的错误
- 403:Forbidden 用于说明请求陪服务器拒绝了。
- 404:Not Found 用于说明服务器无法找到所请求的URL
- 405:Method Not Allowed 发起的请求中带有所请求的URL不支持的方法时,会使用此状态码。
5、5xx:服务器类的错误
- 500:Internal Server Error 服务器内部错误
- 502:Bad Gateway 作为代理或网关使用的服务器从请求相应链的下一条链路上收到了一条伪相应。
- 503:Service Unavailable 说明服务器现在无法为请求提供服务,暂不可用。
八、一次Web资源请求的具体过程(服务器的角度)
- 建立连接:接受一个客户端的连接
- 接收请求:从网络中读取一条HTTP的请求报文
- 处理请求:对请求报文进行解释,并采取行动
- 访问资源:访问报文中指定的资源
- 构建响应:创建带有正确正确首部的HTTP响应的报文
- 发送响应:将响应发送回客户端
- 记录日志:将已完成的事物有关的内容记录到一个日志文件中去
大致流程如下图:(图片来源与《HTTP权威指南》书籍)
九、web服务器的I/O结构
- 单进程模型:一个进程串行响应一个请求
- 多进程模型:个进程响应一个用户请求实现并发的效果,prefork 模型
- 复用I/O机制:
一个进程生成多个线程,每个线程响应一个用户请求,worker 模型
多个线程,每个线程响应多个用户请求,event 模型
十、httpd相关的特性
httpd在这里指的是 apache 这个实现http协议的开源工具。apache历史悠久,在如今同类工具中使用率在50%左右。常见的还有 ngnix,lighttpd,gws等。
1、httpd的特性:
- 高度模块化:core + modules
- DSO: Dynamic Shared Object,可以实现动态的加载模块
- MPM:Multipath Processing Module
统称,事实上有多个实现:
prefork: 每个进程响应一个用户请求,预先生成多个空闲进程;
worker: 启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;
event: 启动多个线程,每个线程响应N个请求;靠 event-driven这个事件驱动来实现。
2、httpd的功能特性:
- 丰富用户认证:基本认证和摘要认证
- CGI:原生支持perl CGI
- 虚拟主机:基于端口、IP、主机名实现虚拟主机
- 反向代理
- 负载均衡
- 用户站点
- 路径别名:支持路径别名
- 支持第三方模块:依赖于钩子函数(HOOK)来实现
十一、HTTP协议的首部
1、常见的首部类型有:
- 通用首部
- 请求首部
- 响应首部
- 实体首部
- 扩展首部:非标准首部,可由程序员自行创建
2、具体说明
(1)通用首部
这是客户端个服务端都可以使用的首部。
通用的信息性首部:
在HTTP/1.0 中引入了第一个允许HTTP应用程序缓存对象本地副本的首部,这样就不需要总是直接从源服务端获取了。所以出现了缓存首部。
(2)请求首部
请求首部只是定义在请求报文中的首部。用来说明是谁在发送什么请求,请求来源何处等。服务端可以根据请求首部给出最好的响应。
下图是请求的信息性首部:
Accept首部:
条件请求首部:
安全请求首部:
代理请求首部:
(3)响应首部
响应报文也有自己的首部集。目的是为了提供给客户端一些额外的信息。
下图是响应的信息性首部:
协商首部:
安全响应首部:
(4)实体首部
有很多首部可以用来描述HTTP报文的负荷。由于请求和响应的报文中都可能包含实体部分。所以,在这2种类型的报文中都可能出现这些首部。
实体首部提供了有关实体及其内容的大量信息,能够对资源的使用的各种有效的请求方法。
实体的信息性首部:
实体缓存首部:
内容首部:
至此,HTTP的相关理论知识,介绍完毕。更多详细介绍没课参考《HTTP权威指南》。