HTTP
HTTP 是日常开发中常用的协议之一,也是程序员面试中的常考题。今天我们就来聊聊HTTP协议。
Http是什么?
通俗来讲,是计算机通过网络进行通信的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑...)之间进行任何一种通信都必须按照HTTP协议进行,否则无法连接。(网络通信中极其重要的应用层协议)
四个基于:
-
请求与响应: 客户端发送请求,服务器端响应数据
-
无状态的: 协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,一刀两断!恩断义绝!下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。
-
应用层: Http是属于应用层的协议,配合TCP/IP使用。
-
TCP/IP: Http使用TCP作为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP。
其他的都好说,这个无状态的明显用起来不方便啊。不能我换个网页就要建一次连接,那效率也太低了。于是有了一些针对应用场景的解决办法:
- Cookie技术;
- HTTP/1.1的持久连接(HTTP keep-alive)方法,其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接;
- ......
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。如下图:
请求行
请求行分为三个部分:请求方法、请求地址和协议版本,最后由回车符+换行符结尾
请求方法:
HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
最常的两种GET和POST。
请求地址:
URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径> ( 端口和路径有时可以省略(HTTP默认端口号是80))
eg:http://www.baidu.com:80
协议版本:
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。
请求数据
这部分是可选部分,不一定有,比如GET请求就没有请求数据。
HTTP响应报文
HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。
状态行
状态行由3部分组成,分别为:协议版本,状态码,状态码描述。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
状态代码为3位数字。
状态码 | 说明 |
---|---|
1xx | 指示信息——表示请求已接收,继续处理。 |
2xx | 成功——表示请求已被成功接收、理解、接受。 |
3xx | 重定向——要完成请求必须进行更进一步的操作。 |
4xx | 客户端错误——请求有语法错误或请求无法实现。 |
5xx | 服务器端错误——服务器未能实现合法的请求 |
常用的状态码:
- 200 OK 一切正常;
- 400 Bad Request 请求报文中存在语法错误;
- 403 Forbidden 请求资源的访问被服务器拒绝。
- 404 Not Found 资源未找到;
响应头部
与请求头部类似,为响应报文添加了一些附加信息,也在最后会有一个空行,表示响应头部结束
响应数据
用于存放需要返回给客户端的数据信息。
POST和GET的区别
- GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
- 最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的;
- GET请求的URL传参有长度限制,而POST请求没有长度限制;
- GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制;
HTTPS
说完了HTTP,自然要聊聊它的进阶版HTTPS了。
HTTPS,全名“超文本传输安全协议”,即Hypertext Transfer Protocol Secure。
HTTP协议传输的数据都是未加密的,也就是明文,这传点个人隐私啥的肯定很不安全啊,拦截篡改都很容易。那么为了解决这个问题,就出现了HTTPS。HTTPS经由超文本传输协议(HTTP)进行通信,但利用SSL/TLS来加密数据包。
工作流程
1.客户端发起HTTPS请求
就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
2.服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。
3.传送证书
证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4.客户端解析证书
部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。
5.传送加密信息
传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6.服务端加密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥
7.传输加密后的信息
8.客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。
加密算法
HTTPS一般使用的加密与HASH算法如下:
- 非对称加密算法:RSA,DSA/DSS
- 对称加密算法:AES,RC4,3DES
- HASH算法:MD5,SHA1,SHA256
网友评论