Web应用
HTTP概况
Web的应用层协议是 超文本传输协议 ,HTTP由两个程序实现:一个客户程序和一个服务器程序,他们运行于不同的端系统中,通过交换HTTP报文进行会画
网页包含多个对象:
- 对象:HTML文件、JPEG图片、视频文件等
- 基本的HTML文件:包含对于对于其他对象的 引用
对象的寻址
HTML基本文件通过对象的URL地址引用页面中的其他的对象
URL:统一资源定位器
基本的寻址格式:Scheme://host:post/path -> www.someschool.edu/someDept/pic.gif
HTTP
万维网遵循的是超文本传输协议,其采用的是C/S结构:用户请求Web页面时,浏览器向服务器发送HTTP请求报文,服务器接受请求并将所对应的请求进行响应
在使用TCP中,一旦客户向它的套接字接口发送了一个请求的报文,该报文就脱离了客户的控制并且进入TCP的控制。其中传输采用分层体系结构,其优点就是:不懂担心数据的流失,也不用关注TCP从网络的数据丢失和乱序故障中恢复的细节
值得注意的是HTTP采用的是 无状态协议,即服务器向客户发送被请求的报文而不存储任何关于客户的 状态信息
为什么需要无状态协议呢?
- 有状态协议需要维护状态(历史 信息)
- 如果客户或者服务器失效了,那么它既然保存了以前状态就可能会与现在的出现不一致
- 解决上述问题代价高
非持续性连接和持续连接
当客户-服务器的交互是经过TCP进行的,就要选择连接方式
- 非持续性连接:每个请求/响应对是经过一个单独的TCP连接发送
- 持续性连接:所有的请求和响应都是经由相同的TCP连接发送
默认是采用持续连接但是也可以进行配置
采用非持续性连接
假定页面含有一个HTMl基本文件和10个图形,通过一个响应过程查看非持续性连接
简要分析一下从请求基本HTML文件到客户收到文件所花费的时间
RTT(Round Trip Time):从客户端发送一个很小的数据包到服务器端并返回所经历的时间
响应时间:
- 发起、建立TCP连接:一个RTT
- 发送HTTP请求消息到响应消息的前几个字节到达:一个RTT
- 响应消息中所含文件或者对象的传输时间
- 总时间就是2*RTT + 文件发送时间
这一个过程涉及了一次“三次握手”的过程:客户向服务器发送了一个小的TCP报文段,服务器用一个小的TCP报文段做出响应和确认,最后客户向服务器返回确认
采用持续性连接
很明显,非持续性连接具有两个显著的缺点
- 必须为每一个请求的对象建立和维护一个全新的连接
- 每一个对象经受两倍RTT的交付时延:一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象
那我们可不可以让服务器TCP保持连续的打卡,一次性多传送几个文件呢?这就是连续性连接
HTTP报文格式
HTTP有两种报文:请求报文和响应报文
1.HTTP请求报文
看一个典型的HTTP的请求报文例子:
HTTP请求报文的第一行叫做 请求行,后继的几行叫做 首部行
请求行有三个字段: 方法字段、URL字段、HTTP版本字段
首部行中host:…指明了对象所在的主机,那主机都建立了TCP连接了为什么还要声明主机名呢?
主要是因为该首部行提供的信息是Web代理高速缓存所要求的
User-agent:指明用户代理,就是返回浏览器的类型
Connection:close 告诉浏览器不要使用持续连接
Accept-language:用户得到的对象的语言版本
HTTP请求消息的通用格式:
和上述例子不同的就是有一个 实体体(Entity Body),使用GET方法的时候实体体为空,而使用POST方法的时候,实体体不为空。
例如,我们在登录一个网页的时候经常需要填写密码来实现登陆
类外,也可用GET方法,在(表单字段中)所请求的URL中包括输入的数据
HTTP响应报文
注意Data是服务器产生并且发送该响应报文的日期和时间
Last-Modified是对象创建或者最后修改的时间
HTTP响应状态码