HTTP是什么
打开百度,度娘告诉我
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当
上面的描述可能过于专业术语了,简单的说,HTTP是一个约定协议规范,规范约定,客户端(Firefox、IE、 chrome)通过发起一个请求到服务端,服务端根据客户端的请求
返回对应的响应结果
。
打个比方,我们去零售店买东西,1块可以买棒棒糖,2块可以买果冻,五块可以买冰淇淋,我相当于客户端,售卖员相当于服务端,我对售卖员说(发起一个请求),给我来一个棒棒糖,顺带递给了他一块钱,售卖员根据我的描述和金钱,递给了我一个棒棒糖(响应),整个过程就是一个请求
-相应
的过程。
上面的过程映射到我们日常用浏览器(Chrome)打开一个百度页面搜索http
这个关键字,当我们敲下回车键的同时
chrome会向百度的服务器发起了一个请求,请求的资源路径为https://www.baidu.com/s?wd=http… ,百度服务器根据我们请求的关键字http
返回给我们对应的搜索结果。
HTTP中的URL
说到HTTP就不得不说HTTP的产物URL,URL(Uniform Resource Locator,统一资源定位符) 其实就是我们常常说的网址,比如www.baidu.com/s/a/v/s
,对于URL的格式,HTTP协议有相对应的规范设计
协议 主机 端口 路径
- 协议,表示当前的传输协议,我们常用的有http协议,ftp协议,tcp协议,file协议,https协议等等
- 主机,主机指请求的服务器域名或IP地址,如果是域名,则需要先请求DNS服务器解析域名对应的ip,再对域名发起请求
- 端口,请求服务器的对应端口,可以省略,省略时默认80端口
- 路径,表示请求的资源路径
HTTP工作原理
上面简单的介绍了HTTP协议是什么,那么HTTP协议是如何工作的呢。首先大家需要知道的是,每一个网址比如www.baidu.com
都是对外提供了一个端口来进行响应HTTP请求的,如果在请求的时候不声明端口,默认就是80端口,也就是说我们经常请求的www.baidu.com
其实默认请求的是百度服务器的80端口,你也可以这样访问www.baidu.com:80
效果都是一样的。下面是具体的请求和响应的步骤
-
服务端开启一个端口监听的程序,比如80端口,当80端口有请求进来后,请求就被服务端捕获了
-
我们在客户端(浏览器)输入域名URL,回车请求
- 浏览器会向DNS服务器请求解析我们输入的域名对应的IP地址
- 浏览器获取到ip后,和服务端的80端口建立TCP连接
- 浏览器发送
请求报文
- 服务端根据请求报文,返回对应的
响应报文
- 释放TCP连接
- 客户端(浏览器)根据返回的结果渲染页面
HTTP报文格式
报文格式涉及到了两方面,请求报文格式和响应报文格式
请求报文格式
请求报文也就是发起请求时的数据格式,当我们用浏览器请求页面时,这个请求报文是由客户端帮我们默认实现的
整体请求报文格式分为三大块,请求行,请求头部,请求数据
- 请求行
- 请求方法, 目前请求方法支持
GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
- URL ,我们请求的地址
- 协议版本, 当前请求使用的HTTP的协议版本
- 请求方法, 目前请求方法支持
- 请求头部,头部字段名:值 ,请求携带的头部信息,可以自定义,一般的头部信息包括,Host,User-Agent,Cookie,Accept等等
- Host,当前请求的域名+端口
- Accept,客户端可识别的类型,识别到对应的格式后,浏览器会对返回的数据做对应的处理,比如html就对数据做渲染,javascript就当作脚本语言来识别
- text/html ,我们常见的html页面
- application/xml xml数据
- image/webp 图片数据,格式为webp, 当然也有更多的格式,如 image/png为png格式等等
- application/javascript ,我们很熟悉的javascript脚本
- application/json;charset=utf-8 ,json格式的数据
- text/css ,css样式文件
- **等等
- User-Agent,当前请求的客户端版本及操作系统,可以通过这个头部来识别是否是移动端
- Cookie,本质上cookie是多个key-value字符串的组合,cookie是存储在客户端本地的字段信息,是服务端用来标识用户信息的一种方式,后续会专门讲下cookie
- 其他自定义Cookie,服务端可以通过设置响应报文格式的响应头部Set-Cookie来设置Cookie
- 回车符 换行符,协议规范要求
- 请求数据,当请求方法为Post请求时,才有请求数据
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
响应报文格式
响应报文格式就是服务端响应时的数据格式,当我们在请求我们的Servlet时,响应报文是由tomcat帮我们默认实现的
与请求报文类似,响应报文主要包含,状态行,响应头部,响应主体内容
-
状态行
- 协议版本 当前响应的协议版本
- 状态码 表示当前请求的总体结果状态,下面会专门讲下状态码
-
响应头部,响应头部主要是响应请求的描述信息,比如content_length表示响应内容的长度,content_type响应数据的格式,date响应时间等等
-
Content-Type,contentType是响应头部很重要的信息,浏览器通过contentType来识别当前服务端返沪ide响应内容的格式,
- text/html,浏览器会去渲染响应内容,
- text/css,浏览器会认为这是一个样式文件,解析css,并且渲染页面
- application/json,浏览器会默认转化为json对象
- image/png,浏览器会将相应内容当作图片来进行处理展示
- 等等…
-
Set-Cookie,服务端在响应头部写入Set-Cookie,表示需要将当前Set-Cookie的值写入cookie,并且在下次请求的时候放入到请求头部带回服务端
-
Set-Cookie: userName=zhangsan; expires=Thu, 01-Jan-2020 00:00:01 GMT; path=/my 上面的头信息表示,将userName=zhangsan写入cookie, cookie的到期时间为2020年一月一日 path=/my,表示只有在请求/my,及/my的子目录的时带上这个cookie
-
-
Server,当前请求服务器的类型,常见有的Tengine,Nginx,Apache,PHP等等
-
Content-Length,当前响应内容的长度
-
等等…
-
-
响应主题,响应的主体内容信息
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
状态码的分类
在返回头的状态行的状态码表示当前请求结果的大致状态结果,状态码由三位数组成,常见的状态码有200,404,500,302等等,那么为什么需要这么多状态码呢,主要是为了区分各种各样的情况,HTTP状态码的前第一位数表示代表了响应的五种状态之一
- 1 消息 这一类型的状态码,代表请求已被接受,需要继续处理
- 2 成功 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受
- 3 重定向 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址
- 4 请求错误 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理
- 5 服务器错误 这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理
更多状态码的详细含义,https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660
HTTP各个版本
- 0.9 仅支持文本,不支持图片
- 1.0 丰富了支持协议,但是不支持长连接,无状态,消耗资源和性能
- 1.1 在1.0的基础上支持长连接指在一个tcp连接上发送多个http请求
HTTP与TCP的区别
知乎上有一个回答很形象,https://www.zhihu.com/question/38648948
HTTP是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。HTTP是用来收发数据,即实际应用上来的。
TCP是公路,HTTP是公路上跑的车。
所以,如果要把货物从a点运到b点,首先要在ab之间修路,这个工作由ip和tcp这俩伙伴完成(其实还有其它伙伴,但这俩出力最大,就由这俩代言了)。
路修好了以后,就可以“应用”了,公路应用于什么?当然是应用于车来车往了。跑啥车都行,比如跑http牌子的车,也可以跑mail牌的车
参考
https://www.runoob.com/http/http-messages.html
https://baike.baidu.com/item/HTTP/243074
我曾在银色平原漫步
也曾在青草之河垂钓
我即是平静的海面
又是汹涌的风暴
这片土地认识我