文章目录
- Http
- Http协议
- 网络模型
- Http协议的工作流程
- Http请求报文
- 请求行
- 请求方法
- 请求资源
- 协议版本
- 请求头
- 空行
- 请求体
- 抓包软件:Fiddler
- Http响应报文
- 响应行
- 状态码
- 响应头
- 响应体
- 请求完整的处理流程
- Https
整体流程图:
- 前端:负责获取数据,展示数据
- 程序:负责监听端口,并对请求作出响应,这中间需要从数据库获取数据
- 数据库:数据仓库。通过标准化语言SQL进行操作,在Java代码中,是通过JDBC进行操作。
Http
网络协议:通讯双方传递信息时,传递的信息应当具有的格式。只有共同遵循一致的格式,那么双方才可以正常进行通讯。
Http协议
- HTTP:
Hyper Text Transfer Protocol
。超文本传输协议。- 超文本:超越了普通的文本,资源类型是丰富的,比如文本、音视频、图片等资源。
- 传输:通讯的双方。客户端、服务器
- 协议:通讯双方应该在传递时遵循的规则
网络模型
Http协议的工作流程
-
域名解析
- 域名:jd.com、taobao.com,可以用来指代网络中的一台计算机主机,对应ip地址。
- jd.com----------解析 xxx.xxx.xxx.xxx
- 浏览器缓存
- 从浏览器缓存里去拿域名到ip的映射
- 操作系统缓存
- hosts文件(127.0.0.1,localhost指的是本机)
- DNS服务器解析
- 浏览器缓存
-
建立TCP连接
-
浏览器发送HTTP请求
-
HTTP请求经过中转到达服务器之后,被服务器接收到,服务器解析HTTP请求,并且做出HTTP响应。
-
HTTP响应经过中转再次返回给客户端,客户端接收到HTTP响应,并且加以解析、渲染
-
如果解析的过程中,发现需要去加载其他的css、js、img等资源,那么会自行再次发送请求,整个过程同上
-
最终浏览器渲染出来页面,呈现页面给用户。
Http请求报文
- 发送的HTTP请求一般称之为HTTP请求报文,分为请求行、请求头、空行、请求体四部分
- 其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行(CRLF即
\r\n
)隔开
请求行
Accept:浏览器可接受的
MIME类型 / (大类型)/(小类型)。浏览器可以接收的类型,言外之意是服务器做出响应时,应当优先响应我可以接收处理的类型。
MIME:使用一种大类型/小类型的方式将互联网上面的资源加以分类。比如text/html、text/txt、audio/mp3、video/mkv、image/jpeg、image/png
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。浏览器利用该头告诉服务器,如果返回的资源需要进行压缩,那么应该使用浏览器可以支持的压缩算法。
Accept-Language: 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到,
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8;q代表权重,没有q代表默认为1
可以在浏览器中进行设置。twitter.com
Host:初始URL中的主机和端口
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 (防盗链)
Content-Type:内容类型
If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT 服务器利用这个头与服务器的文件进行比对,如果一致,则告诉浏览器从缓存中直接读取文件。
User-Agent:浏览器类型.
Content-Length:表示请求消息正文的长度。表示的是体的长度。
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接
Cookie:这是最重要的请求头信息之一
Date: Mon, 22 Aug 2011 01:55:39 GMT请求时间GMT。常见的请求方法 GET
、POST
分为三个部分:
- 请求方法
- 请求资源
- 协议版本
请求方法
怎么发get和post请求:
get
请求可以通过浏览器以及form表单发送<form></form>
post
请求只能form表单发送
GET和POST区别:
本质的区别在于语义的不同。
- GET的语义是用来进行查询、获取数据。99%的情况下通过浏览器访问网站都是get请求。比如查询商品信息
- POST的语义是用来进行提交数据。注册、登录、文件上传(微信更换头像)等
eg:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>以post请求方法访问baidu.com,不可以直接在浏览器地址栏直接输入网址
如果希望使用post方法访问baidu.com,需要:
1.先访问1.html(当前页面),将form表单加载出来
2.点击form表单的提交按钮<form action="http://www.baidu.com" method="post"><input type="text" name="username"><br><input type="submit"></form>
</body>
</html>
请求资源
指的是访问服务器上面的哪个资源(访问不同页面时,区别主要在于请求资源的不同)
eg:
http://www.baidu.com/forum-280-1.htmlhttp://www.baidu.com/forum-279-1.html
协议版本
HTTP/1.1:当前使用的是HTTP 1.1的版本
- 在1.1之前的上一个版本是1.0.他们两者之间的区别主要在于是否支持长连接。
长连接:在一个TCP连接内,是否允许发送多个HTTP请求。如果支持就是长连接。
-
1.0版本不支持长连接
-
1.1默认支持长连接
请求头
- 请求头可以理解为是对于请求信息的额外补充,类似于合同的附加合同、补充条款。
- 主要是
key-value
数据
Accept:浏览器可接受的
MIME类型 */* (大类型)/(小类型)。浏览器可以接收的类型,言外之意是服务器做出响应时,应当优先响应我可以接收处理的类型。MIME:使用一种大类型/小类型的方式将互联网上面的资源加以分类。比如text/html、text/txt、audio/mp3、video/mkv、image/jpeg、image/png
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。浏览器利用该头告诉服务器,如果返回的资源需要进行压缩,那么应该使用浏览器可以支持的压缩算法。
Accept-Language: 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到,
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8;q代表权重,没有q代表默认为1可以在浏览器中进行设置。twitter.com
Host:初始URL中的主机和端口
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 (防盗链)
Content-Type:内容类型
If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT 服务器利用这个头与服务器的文件进行比对,如果一致,则告诉浏览器从缓存中直接读取文件。
User-Agent:浏览器类型.
Content-Length:表示请求消息正文的长度。表示的是体的长度。
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接
Cookie:这是最重要的请求头信息之一
Date: Mon, 22 Aug 2011 01:55:39 GMT请求时间GMT
空行
请求体
- 可以用来大量放置数据的地方。客户端希望提交大量的数据到服务器,那么就把数据放置在请求体里面。
- 例如:微信更换头像。
抓包软件:Fiddler
Http响应报文
- 服务器发送的HTTP响应信息,一般情况下也称作HTTP响应报文。
- 分为响应行、响应头、空行、响应体四部分,其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行(CRLF即
\r\n
)隔开
响应行
响应行主要是三部分组成:
- 版本协议
- 状态码
- 原因短语
状态码
- 200:代表一切访问过程是正常的
- 301、302、307:重定向。
- 当前的地址不可用,服务器需要将请求重新定向到一个新的地址。
- 重定向一定会搭配着Location响应头一起来发挥作用。
- eg:
首先请求 http://www.bing.com/ ---------------> 307 Location: https://www.bing.com/然后根据Location网址去请求 https://www.bing.com/ ---------------> 302 location: https://cn.bing.com/然后根据上一次Location网址请求 https://cn.bing.com/ ---------------> 200
-
304:未修改。使用缓存。
-
404:没有找到。
-
500:服务器异常。
- 有bug。如果出现500状态码,那么一定有bug,但是200状态码不一定没有bug。
响应头
Location: http://www.baidu.com/指示新的资源的位置.需要搭配着重定向状态码(301、302、307)一起来使用。
Server: apache tomcat 指示服务器的类型
Content-Encoding: gzip 服务器发送的数据采用的编码格式。
Content-Length: 80 告诉浏览器正文的长度
Content-Language: zh-cn服务发送的文本的语言
Content-Type: text/html; 服务器发送的内容的MIME类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最后修改时间
Refresh: 1;url=http://www.cskaoyan.com指示客户端刷新频率。单位是秒
Content-Disposition: attachment; filename=aaa.zip指示客户端保存文件
Set-Cookie: SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie
Expires: 0
Cache-Control: no-cache (1.1)
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
响应体
- 用来存放服务器返回给客户端大量的数据。响应体里面的数据会最终出现在浏览器的窗口界面中。
- 可以响应文本类型,也可以响应二进制类型;如果响应二进制类型,那么需要返回特定的
Content-Type
- 比如,现在写回了一张图片,但是
content-type
写的是text/html
,浏览器得到的信息是我现在拿到了一个网页,然后获取它的响应体,会按照网页进行解析,就会乱码(乱码的本质:编解码不一致)
- 比如,现在写回了一张图片,但是
请求完整的处理流程
以访问http://www.xxxx.com为例:
-
域名解析。首先尝试使用浏览器缓存查找,再次通过操作系统缓存查找,借助于hosts文件,最终利用DNS服务器来进行解析。
- eg:
xxxx.com------225.171.182.79
- eg:
-
建立TCP连接。
-
浏览器会代理用户发送HTTP请求报文(GET /1.html HTTP/1.1…),请求报文在网络中中转传输到达服务器之后,会服务器接收到,进行解析
-
服务器产生HTTP响应报文(HTTP/1.1 200 OK …),响应报文在网络中中转传输返回给客户端之后,客户端会将响应报文进行解析、渲染
-
如果发现需要再次加载新的资源文件,那么浏览器会自行再次发起请求,过程同上
-
加载获取到所有的资源文件之后,最终渲染,将页面呈现在用户面前。
Https
- 目前主流的网站使用的都是https协议了。
- HTTPS = HTTP + Secure/SSL
http协议存在的问题:
-
传输过程全程明文传输
-
不验证通讯另一方的身份
-
没有完整性校验,可能报文在中途已经被篡改,但是无从得知
https针对http进行的改进:
-
加密
- 加密算法:对称加密(加密解密使用的是同一把秘钥;效率高,但是安全性不高)、非对称加密(公钥加密,私钥解;公钥加密,公钥无法解;安全程度非常高,但是效率低)、混合加密
-
证书:证书颁发者(一般是一个权威机构)颁发给当前网站的一个凭证。
-
完整性校验:哈希