目录
1.HTTP协议是什么?
HTTP全称为超文本传输协议,是建立在应用层的协议.什么叫做超文本呢?其实大概意思就是不仅能传输字符串数据,还可以传输图片啊,视频等信息.我们平时打开一个网页,就是通过http协议来传输数据的,当我们在浏览器输入一个搜索的网址(URL)的时候,就会给浏览器的服务器发送一个http请求,然后浏览器的服务器会返回多个http响应,这就是http请求的主要作用,现在很多网站都升级成https了,我们拿CSDN举个例子
可以看到,CSDN已经升级成https协议了,具体为什么升级,是防止运营商劫持,如果感兴趣,可以百度一下
2.什么叫做应用层协议
所谓应用层协议,就是收发数据的两端锁遵守的协议,我们之前认识的TCP/IP协议是传输层和互联网层协议,是用来解决信息传输问题的,而应用层协议则是用来处理源端口和目的端口的一些细节的
3.HTTP协议的工作流程
我们用一张图,来理解一些http的工作流程,用csdn来举例子
这里其实我们访问一个网站的时候呢,并不一定只会发送一个请求.但是http是典型的一问一答模型的,这里我们可以用fiddler来抓包查看一下,这里fiddler是一个免费的抓包,当然如果有其它的也可以用其他的,这里我们抓一个包看一下
这个是我们抓到的向搜狗发送的https请求,fiddle就可以进行抓包 ,拿到请求的详细信息,
这个是我们对一个https响应抓到,得到的信息
4.HTTP报文格式
请求报文:
1第一行:方法,URL,版本号
2 请求头 header(每一行是一个键值对,通过:分隔键值)
3.空行
4.body
响应报文:
1.第一行:版本号,状态码,状态码的描述
2.响应头 header(每一行是一个键值对,通过:分隔键值)
3.空行
4.body
用一个图来理解,会更容易一些
空行的意义:http报文格式是依赖于TCP协议的,所以可能出现粘包问题,那么我们用一个空行来作为结束标志,就可以避免粘包问题
5.URL
URL就是我们平常说的网址,学名叫统一资源定位符
一个URL包含很多信息,我们来简单介绍即可
1.协议方案名:就是协议名,常见的有http,https
2.登录信息:就是那种需要登陆的网址对身份的认证,现在可能很少会有了
3.服务器地址:这里是一个域名,会通过DNS系统解析成为一个具体的IP地址,可以在我们的电脑cmd上进行ping + 网址,就可以得到真实的地址
可以看到,百度的地址就是[110.242.68.66]
4.端口号 标识了需要访问目标服务器的哪一个端口
5.带层次的额文件路径:服务器提供的资源,有可能在服务器中是一个真实的文件,但是也有可能是服务器中虚拟出来的文件,HTTP服务器一般不会吧所有电脑上的资源都提供到网上,通常会指定某个目录,把目录中的某些路径作为根路径,然后放到网上资源中
6.查询字符串:?后面的也是一些键值对,称为query string 相当于浏览器给服务器传递的一些参数
7.用来区分这个片段是当前页面的第几个部分,小说网站比较 常见
注意:
URL encode:在我们进行搜索的时候,会发现有的字符是我们在实现代码的时候使用到的,这样我们就无法区分哪些是客户端发来的数据,哪些是我们原本代码中的数据,这时候就需要用到URL encode来进行转义,把字符转换成别的字符,再在服务器端口使用URL decode,这里如果不进行转换的话,某些浏览器可能会自动转义,但是某些浏览器会不兼容,导致无法访问
6.方法的认识
在我们的HTTP请求中,有如上方法,我们简单介绍一些
1.GET
GET方法是我们HTTP请求中最常见的方法,主要作用是从服务器上获取某个资源,当我们在浏览器中输入URL的时候,这是浏览器就会发送一个GET请求
特点:
1.首行的第一部分是GET
2.URL的query string可以为空
3.header部分有一些键值对结构
4.body为空
注意:GET请求并没有长度限制
2.POST
POST也是较为常见的方法,通常用于提交用户的输入数据给服务器,比如登陆界面的账号密码信息
通过HTML中的from标签可以构造POST请求,或者JS中的ajax也可以用于构造POST请求
特点:
1.首行的第一部分为POST
2.query string一般不为空
3.header部分有一些键值对
4.body一般不为空,一般通过header中的Content-type来指定body中的数据类型,Content-length来指定body长度
3.GET和POST的区别
语义:GET的语义是获取数据,POST的语义是提交数据,但是两者可以颠倒
幂等性:GET请求一般建议幂等性,POST却没有就是通过同一个地址,访问到的结果是一样的,比如改密码了,再次用原密码登陆,就不会登陆成功,就会出现错误提示
安全性:二者并没有涉及到安全性,真正的安全是在于密码传输时是否加密
传输数据量:GET和POST两个并没有规定长度,传输的数据量完全取决于不同浏览器和服务器之间的实现区别
传输类型:GET的query string随人无法直接传输二进制数据,但是可以针对二进制数据进行URL encode
4.其他方法
PUT和POST相似,一般用于更新
DELETE用于删除服务器指定资源
OPTIONS 返回服务器所支持的请求方法
HEAD类似GET,但是响应体不返回,只返回响应头
TRACE会先服务器端收到的请求,一般测试会使用
CONNECT:预留位
7.报头的认识
header是键值对结构的,每个键值对独占一行
HOST:编制服务器主句的地址和端口
Content-Length:标识body的数据长度
Content-Type:标识body的数据类型
User-Agent:标识浏览器和操作系统的属性
Referer:标识当前页面的前置页面,也就是从哪个页面跳转过来的,前面说的运营商劫持也和这个有关系
Cookie:存储了一个字符串
通过浏览器可以看到当前持有的Cookie 这个一般存储到内存上,可以用于用户标识
用户登陆过程:
1.浏览器先给服务器发送一个获取登陆界面的请求
2.服务器做出响应,提供登陆页面的HTML
3.浏览器中,用户输入用户名和密码,并且发送请求
4.如果密码正确,服务器提供一个令牌给用户
5.用户拿着令牌去访问其他的页面,发出请求
6,服务器发出对应页面的HTML响应
8.状态码的认识
1.1xx
1xx是信息性状态码,标识请求正在处理
2.2xx
2xx是标识成功的状态码,标识请求正常处理完毕,比如200标识OK
3.3xx
3xx是重定向的状态码,平常见到的有301永久重定向和302临时重定向
4.4xx
4xx是客户端错误代码,比如403拒绝访问,也就是没权限访问某些页面,404没有找到资源,如果URL标识的资源不存在,那么就会出现404
5.5xx服务器错误代码,比如500表示服务器内部出现错误,也就是服务器崩溃,504,是表示服务器负荷过大了,就会504
9.HTTPS
9.1HTTPS是什么?
HTTPS是一个应用层的协议,是再HTTP的基础上面引入了加密层,防止像HTTP中传输的数据被篡改
9.2HTTPS的工作流程
9.2.1对称加密
对称加密就是通过一个"密钥",把明文加密成暗文,同样也可以反过来,把暗文变成明文
但是这种加密并不安全,当客户端向服务器发出获取密钥的请求之后,黑客在此时就监听劫持,就能得到密钥,从而破解密文,所以引入了非对称加密
9.2.2非对称加密
非对称加密通过使用两个密钥,公钥和私钥,公钥私钥是配对使用的,我们可以通过公钥加密,私钥解密,也可以反过来,私钥加密,公钥解密,这样私钥在服务器端,公钥是客户端发送请求,从服务器获取的,私钥并不会传输,公钥加密后,只能私钥解密,那么黑客就算劫持到了,也无法解密,这样的数据,就变得安全了,但是由于非对称加密需要的工作更多,导致速率和对称加密比较,就会慢了很多,所以在开始协商密钥的时候,也就是客户端请求获取公钥的时候,会用对称加密,这样就能提高一些速率.但是你以为这就结束了?并没有,如果黑客伪造一个公钥,发送给客户端,此时客户端并不知道是谁给的公钥,那么他就会直接加密并且发送过去,这是黑客就通过自己的私钥进行解密,然后把密文通过服务器端的公钥加密,发给送给服务器,这时,因为黑客是个中间人,那么就可以得到两边的传输数据,对此,我们引入了证书的概念
9.2.3引入证书
当我们客户端在刚和服务器创建链接的时候,服务器返回的数据捎带一个证书给客户端,这种证书是通过CA机构申请的一个证书,所以不用怕被伪造,然后后续客户端在收到响应的时候,就会去判断这个数据是否被篡改过,从而就使我们的数据安全了.建立连接返回的数据包括证书发布机构和有效期,还包括公钥,证书所有者签名等等