应用层之HTTP
文章目录
- 应用层之HTTP
-
- 一、前言
- 二、应用层之HTTP
-
- [2.1 概述](#2.1 概述)
- [2.2 HTTP连接行为](#2.2 HTTP连接行为)
-
- [2.2.1 HTTP/1.0](#2.2.1 HTTP/1.0)
- [2.2.2 HTTP/1.1(应用最多)](#2.2.2 HTTP/1.1(应用最多))
- [2.3 HTTP报文格式](#2.3 HTTP报文格式)
-
- [2.3.1 总体](#2.3.1 总体)
- [2.3.2 HTTP请求](#2.3.2 HTTP请求)
- [2.3.3 HTTP响应](#2.3.3 HTTP响应)
- 三、小结
一、前言
关于万维网有一个重要的数据传输协议------HTTP,这在我们的日常生活中也很常见:浏览器的各种网页,几乎都遵循HTTP协议。
二、应用层之HTTP
2.1 概述
Web的应用层协议就是HTTP(HyperText Transfer Protocol,HTTP),超文本传输协议 ,它是Web的核心协议。下面是HTTP协议中的几个核心概念。
HTML是超文本标记语言,针对的对象是浏览器
HTTP定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及万维网服务器怎样把万维网文档传送给浏览器。

借助浏览器访问对应的服务,大部分都是80端口,我以什么格式表示我要什么,你怎么知道是我要,都是需要双方需要约定的。客户端请求服务,不管成功与否,浏览器都会进行一个响应
HTTP是一个专门在计算机世界里专门在两点之间 传输文字、图片、音频、视频等超文本数据的约定和规范 。HTTP是一种应用层协议 ,它使用TCP 作为传输层协议,因为文档、数据这些信息在我们看来是一种重要的信息,不可丢失
2.2 HTTP连接行为
按照历史进程
2.2.1 HTTP/1.0
概述 :HTTP/1.0采用非持续连接 的方式。在该方式下,每次浏览器要请求一个文件都要与服务器建立TCP连接,当收到响应后就会立即关闭连接
浏览器访问资源,一个资源连接一次。
什么叫资源呢?
a.ttml就是一个资源
a.html是主文件,href,src也是资源,浏览器接收到该文本,开始解析,解析到对应的资源,就会向服务器请求对应的资源
有3个资源,就要建立3次链接,这样就会有一个缺点------效率很差

弊端 :每请求一个文档就要有2倍的RTT的开销。若一个网页上有很多引用对象(例如图片等),那么请求每一个对象都需要花费2RTT的时间。为了减小时延,浏览器通常会建立多个并行的TCP连接同时请求多个对象。但是,这会大量占用万维网服务器的资源,特别是万维网服务器往往要同时服务于大量客户的请求,这会使其负担很重
因为经过3次握手后,服务器希望客户端立即发送请求,然后自己回复一个响应就结束连接。但是这并不可控,为了节省时间,客户端就会在第三次握手(只有一个ACK,没有正文,
len = 0)的时候,就顺便发送请求报文(信息复用)。
2.2.2 HTTP/1.1(应用最多)
鉴于1.0版本的HTTP协议,每次都有一个开始握手的时延,响应完立马断掉,于是1.1应运而生~
概述 :HTTP/1.1采用持续连接 方式。在该方式下,万维网服务器在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上引用的对象,而是只要这些文档都在同一个服务器上就行
优势:节省了很多个RTT时间,使TCP连接的空闲时间减少,提高了下载文档的效率
在浏览器请求主页时,请求了很多html文档,在解析属性时,会链接很多资源,如果每个资源都要握手,就会消耗很多资源。
重要字段:
Connection:keep-alive(保持长久的连接关系)
2.3 HTTP报文格式
我们上面描述了一下HTTP的理念,那么HTPP的报文格式是怎样的?
报文类型分为请求报文 和响应报文 。按理说请求和响应的格式不一致,但是为了提供统一化管理,HTTP报文在定义时,将这两种格式设计成了通用的格式。
2.3.1 总体
HTTP协议主要由三大部分组成:
- 起始行(start line):描述请求或响应的基本信息
- 头部字段(header):使用key-value形式更详细地说明报文。
- 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
其实起始行和头部字段并称为请求头或响应头,统称为Header(请求和响应格式一样,内容不一样 );消息正文也叫做实体,称为body。HTTP协议规定每次发送的报文必须要有Header,但是可以没有body,也就是说头信息是必须的,实体信息可以没有。而且在header和body之间必须要有一个空行(CRLF)。如图:

起始行后面一定有一个\r\n(回车换行,二进制格式:0D0A)
mac:\n
windows:\r\n
协议头和正文之间应该有一个分隔标志(图中空白部分,空行),不然分不清楚协议头和正文(都是二进制流)
HTTP的格式(更通俗的版本)请求/响应:
起始行\r\n
k-v对的头部字段(\r\n)
\r\n(空行)
正文
2.3.2 HTTP请求
概述:

- 方法:告诉服务器要做什么,具有严格的规范(双方共同约定的)
- URL(资源)一定是从/开始的
首部字段:后面一定有空格实例:
重要的字段:
- accept:接收,我(客户端)发出请求,表示我能接收什么类型的文本
- Connection:keep-alive(保持长久的连接关系-1.1版本);closed(表示只发一次请求-1.0版本)
- User-Agent:用户代理,表示请求者(用户)的机器是怎样的
- Host:主机(常用于验证)

如果使用GET 方法,是没有实体 的,如果使用的是POST 方法,才会有实体 。当用户提交表单时,HTTP客户端通常使用POST方法;与此相反,HTML表单的获取通常使用GET方法。HEAD方法使用类似于GET方法,只不过HEAD方法不会返回对象
主要目的:让服务器识别出"我(客户端)是谁"
2.3.3 HTTP响应
概述:

状态码:非常关键(见下文)
状态响应:对状态码进行进一步解释
重要的字段:
Server:服务器
nginx:C/C++写的
Connection:和请求头一样
Content-Length:界定TCP数据粘包

重定向:网站开发中,很久之前维护的链接------http://.../a.html,后来这个资源的架构变了,网址也变了,但是用户收藏了这个网址,再次点开时,发现"404"了,最终服务器会让已过期的URL转向新的URL,因此就会返回一个3xx的状态码,进行重定向
3xx :还有一个行为,本地浏览器会对已访问的链接进行缓存,下次访问时,尽管仍然需要往远程服务器发送请求,就会发现一个
timestamp,当本地服务器和远程服务器的时间戳进行对比,就会返回3xx,表明已经有缓存了,不需更新
练习:

解析:
A:GET。。确实是请求报文 A√
B:由Host可知:B√
C:持续连接应该是keep-alive C×
D:有Cookie(身份证),说明此前访问过才会有身份证 D√

解析:
1.1版本,是持续连接的,一次请求-响应是一个RTT,本题考查一共是请求多少资源,由题目可知:1个页面 + 2个JPEG = 3个资源,HTTP是建立在TCP基础上,浏览器建立连接也需要一个RTT,并且第3次握手和第1个资源请求是同步的,因此最终是4个RTT。
三、小结
HTTP利用TCP保证了稳定传输,协议定义保证了持续连接,格式上也具有严格的划分,真正为万维网的数据传输保驾护航。



