参考链接:Node.js 概述 -- JavaScript 标准参考教程(alpha)
url部分参考链接:node.js之Url & QueryString模块 -
HTTP:HTTP知识先填坑-慕课网
HTTP协议在使用场景中的流程流程流程流程流程:
1.首先,是对imooc.com域名解析,
(1.1)浏览器搜索浏览器自身的DNS缓存。
在Chrome浏览器下,通过chrome://net-internals/#dns就可以查看你曾经浏览过的网站DNS缓存记录。
(1.2)如果浏览器没有找到自身的DNS缓存或之前的缓存已失效,那么浏览器会搜索操作系统自身的DNS缓存。
(1.3)如果操作系统的DNS缓存也没有找到,那么系统会尝试在本地的HOST文件去找。(HOST文件:C:\Windows\System32\drivers\etc)
(1.4)如果在HOST里依然没有找到,浏览器会发起一个DNS的系统调用,即一般向本地的宽带运营商发起域名解析请求。请求分为以下步骤,1.宽带运营商服务器会首先查看自身的缓存,看是否有结果,如果没有,2.运营商服务器会发起一个迭代DNS解析请求【根域(获得com域顶级域IP地址)——>顶级域(获得imooc.com域的IP地址)——>域名注册商(将结果发给运营商的DNS服务器)】。运营商服务器把结果返回给操作系统内核(同时也缓存在自己的缓存区),操作系统内核把结果返回给浏览器,最终浏览器拿到了www.imooc.com对于的IP地址,DNS解析完成。
2.浏览器获得域名对应的IP地址后,发起HTTP“三次握手”,建立TCP/IP连接。(浏览器以一个随机端口向服务器的Web程序发起TCP连接请求,TCP连接请求通过层层的路由设备到达了服务器端以后进入了网卡,再进入内核的TCP/IP协议栈,还可能经过防火墙的过滤,最终进入了Web服务器,建立TCP和IP的连接。)
3.在TCP/IP连接建立起来后,浏览器就可以向服务器发送HTTP请求了。比如,用HTTP的GET方法请求一个根域里的某个域名,协议可以采用HTTP 1.0 。
4.服务器端接受这个请求,根据路径参数,经过后端的一些处理之后,把处理后的一个结果的数据返回给浏览器,如果是imooc.com网站的页面,服务器就会把完整的HTML页面代码返回给浏览器。
5.浏览器拿到了imooc.com这个网站的完整HTML页面代码,在解析和渲染这个页面的时候,里面的Javascript、CSS、图片等静态资源,它们同样也是一个个HTTP请求,都需要经过上面的步骤来获取。
6.浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现出来。
HTTP请求流程可拆分为:请求和响应,两者都会发送http头和正文信息。HTTP头发送的是一些附加的信息:内容类型,服务器发送响应的日期、HTTP状态码。
HTTP状态码:HTTP 状态消息
HTTP模块:①支持更多特性②不缓冲请求和响应③处理流相关
HTTP概念进阶:
1. 什么是回调?
什么是回调?回调是异步编程的基础方法,当需要按照顺序执行异步逻辑的时候,一般采取后续传递的方式,也就是将后续逻辑封装在回调函数中作为起始函数的参数,逐层去嵌套。
2. 什么是同步/异步?
同步就是执行一个任务,后一个任务等待前一个任务结束,然后再执行,程序执行的顺序与任务的排列顺序是一致的,比如js是单线程的,因此js代码是按照顺序执行的,即便是js同步下载多个文件,也得按照顺序执行,一旦js里面出现死循环的代码,那么页面就会被阻塞在这个地方,后面的js代码就不会被执行到 比如打电话预约座位,发现没有座位了,店员就挂电话开始查找有没有座位,查找,查找...等待一会儿之后,店员告诉你结果后,挂电话。
异步执行任务,每个任务都有一个或多个回调函数,前一个任务结束后不是执行后一个任务而是执行回调函数,后一个任务也不是等待前一个任务结束后执行,程序的执行顺序与任务的排列顺序无关。JS中最基本的异步函数就是setTimeout和setInterval。比如打电话预约座位,发现没有座位了,店员就挂电话开始查找有没有座位,查找,查找...查到之后,店员通过主动回电话。即执行回调函数来解决你的问题(是否有座位)。
3. 什么是I/O?
磁盘的写和读,在nodejs里面就是为文件系统,数据库资源提供接口,发送请求的时候,不用等待硬盘,当硬盘准备好了,非阻塞接口就会通知处理
4. 什么的单线程/多线程?
一次只能执行某一段代码叫做单线程
一次可以执行多段代码叫多线程,只要可以分配好资源
5. 什么是阻塞/非阻塞?
阻塞:某个程序执行时,未执行完就得一直等待
非阻塞:前一个程序未执行完时可以挂起,继续执行其他程序,等到前一个程序有结果再执行
6. 什么是事件?
一个触发动作(例如点击按钮)
7. 什么是事件驱动?
为了某个事件注册了回调函数,但这个回调函数不是马上执行,只有当这个事件发生的时候才会调用回调函数,这种函数执行的方式就叫事件驱动。也可以说是一个触发动作引起的操作(例如点击按钮后弹出一个对话框)
8. 什么是基于事件驱动的回调?
为了某个事件注册了回调函数,但是这个回调函数不是马上执行,只有当事件发生的时候,才会调用回调函数,这种函数执行的方式叫做事件驱动~这种注册回调就是基于事件驱动的回调,如果这些回调和异步I/O(数据写入、读取)操作有关,可以看作是基于回调异步I/O,只不过这种回调在nodejs中是有事件来驱动的
9. 什么是事件循环?
//事件循环Eventloop,倘若有大量的异步操作,一些I/O的耗时操作,甚至是一些定时器控制的延时操作,它们完成的时候都要调用相应的回调函数,从而来完成一些密集的任务,而又不会阻塞整个程序执行的流程,此时需要一种机制来管理,这种机制叫做事件循环.
Event Loop:回调函数队列。当异步函数执行的时候回调函数就会被压入到这个队列,对node.js来说,靠一个单线程不断地查询队列中是否有事件,当读取到一个事件的时候,将调取与这个事件关联的javascript函数。
如图,堆(heap)和栈(stack),栈中的代码调用各种外部API,它们在"任务队列"中加入各种事件(click,load,done)。只要栈中的代码执行完毕,主线程就会去读取"任务队列",依次执行那些事件所对应的回调函数。
node.js的核心思想非阻塞,单线程,和事件驱动。