HTTP协议的主要特点:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议之URL
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用默认端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常浏览器会自动帮我们完成。
例如:
输入:www.cnblogs.com/undefined-w
浏览器自动转换成:http://www.cnblogs.com/undefined-w/
因此在nodejs中构建路由时,一般主页对应的是 “/”
nodejs中的核心模块URL有url.parse()方法可以解析url,有三个参数,第一个参数为url,为必须参数,第二个参数默认为false,为true时会将querystring解析成对象的形式,第三个参数是没有http时的配置,用法如下:
const url = require("url");
const urlObject = url.parse("http://www.cnblogs.com/undefined-w/",true);
console.log(urlObject);
HTTP请求由三部分组成,分别是:请求行、消息报头、请求正文
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
具体介绍下nodejs可能用到的状态行和消息报头
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码(常用的有200,304,404,500;200表示请求成功,304表示从缓存中加载,404表示路径错误未找到,500内部服务器错误);Reason-Phrase表示状态
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。
每一个报头域格式 : 名字+“:”+空格+值,名字是不区分大小的。
实体报头
请求和响应消息都可以传送一个实体。一个实体由 实体报头域和实体正文 组成,实体报头定义了关于实体正文和请求所标识的资源的元信息。
常用的实体报头
1、Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
2、Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读者
3、Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
4、Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Content-Type:image/jpg (图片格式)
5、Last-Modified实体报头域用于指示资源的最后修改日期和时间。
6、Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中的页面,我们可以使用Expires实体报头域指定页面过期的时间。
一个简单的示例:
1 const http = require('http');//引入http模块
2 const host = '127.0.0.1';//ip地址(回环地址)
3 const port = '1234';//端口
4 //创建服务
5 const server = http.createServer((req,res)=>{
6
7 // res.statusCode = 200;
8 // res.setHeader("Content-Type","text/plain")//输出为纯文本格式
9 // res.setHeader("Content-Type","text/html;charset=utf8")//charset表示字符,不然汉字会输出乱码
10 res.writeHead(200,{//以上的简写
11 "Content-Type":"text/html;charset=utf8"
12 })
13 res.end('示例');
14 }).listen(port)
HTTP 协议的主要不足:
1、通信使用明文( 不加密) , 内容可能会被窃听
2、不验证通信方的身份, 因此有可能遭遇伪装
3、无法证明报文的完整性, 所以有可能已遭篡改
通过使用HTTPS协议可以解决前两个不足:
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。
HTTPS和HTTP的区别:
1、https协议需要到ca申请证书,一般免费证书很少,需要交费。
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式用的默认端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的,
https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。