基于 Node.JS 的网络编程
面向网络而生
事件驱动, 无阻塞, 单线程
非常轻量
Node 的 API 十分贴合网络, 适合用来构建灵活的网络服务
传统的 web 平台大多数都需要专门的 Web 服务器作为容器, 如 asp,ASP.NET 需要 IIS 作为服务器, PHP 需要搭载 Apache 或 Nginx 环境等.
node 可以非常方便的搭建网络服务器和客户端
node 提供了 net,dgram,http,https 四个模块, 分别用于处理 TCP,UDP,HTTP,HTTPS, 适用于服务器和客户端.
Node.JS 网络通信概述
OSI 网络的七层模型:
应用层: 为应用程序提供服务
表示层: 数据格式转化, 数据加密
会话层: 建立, 管理和维护会话
传输层: 建立, 管理和维护端到端的连接
网络层: IP 选址及路由选择
数据链路层: 提供介质和链路管理
物理层: 物理层
层与协议:
每一层都是为了完成一种功能, 为了实现这些功能, 就需要大家都遵守共同的规则. 大家都遵守的规则就叫做 "协议(protocol)".
互联网的每一层, 都定义了很多协议, 这些协议的总称, 就叫做 "互联网协议"(internet Protocol), 他们是互联网的核心.
实体层
电脑要组网, 第一件事就是把电脑连起来, 可以用光缆, 电缆, 双绞线, 无线电波, 量子等方式. 它是把电脑连接起来的物理手段, 它主要规定了网络的一些电气特性, 作用是负责传送 0 和 1 的电信号.
链接层
单纯的 0 和 1 没有任何意义, 必须规定解读方式, 多少个电信号算一组? 每个信号位有何意义?
这就是 "链接层" 的功能, 它在 "实体层" 的上方, 确定了 0 和 1 的分组方式.
链接层 - 以太网协议
早起的时候, 每家公司都有自己的电信号分组方式, 逐渐的, 一种叫做 "以太网" 的协议占据了主导地位.
以太网规定, 一组电信号构成一个数据包, 叫做 "帧", 每一帧分成两个部分, 标头 (Head) 和数据(Data).
"标头" 包含数据包的一些说明项, 比如发送者, 接受者, 数据类型等等."数据" 则是数据包的具体内容.
"标头" 的长度, 固定为 18 字节,"数据的长度", 最短为 46 字节, 最长为 1500 字节.
因此, 整个帧最短为 64 字节, 最长伟 1518 字节, 如果数据很长, 就必须分割成多个帧进行发送.
链接层 - Mac 协议
以太网数据包的 "标头", 包含了发送者和接受者的信息, 那么, 发送者和接受者是如何标呢?
以太网规定, 连入网络的所有设备, 都必须具有 "网卡" 接口(物理), 数据包必须是从一块网卡, 传送到另一块网卡.
网卡的地址, 就是数据包的发送地址和 接受地址, 这叫做 Mac 地址.
每一块网卡出厂的时候, 都有一个全世界独一无二的 Mac 地址, 长度是 48 个二进制位, 通常用 12 个 16 进制数表示.
例如: 00-B0-D0-86-BB-F7
前 6 个十六进制数是厂商编号, 后 6 个是该厂商的网卡流水号, 有了 Mac 地址, 就可以定位网卡和数据包的路径了.
链接层 - 广播
以太网数据包必须知道接受方的 Mac 地址, 然后才能发送.
首先, 一块网卡怎么会知道另一块网的 Mac 地址呢?
答案是以太网采用了很原始的方式, 它不是吧数据包准确的送到接收方, 而是向本网络内所有计算机发送, 让每台计算机自己判断, 是否为接收方.
举例:
A 计算机向 B 计算机发送一个数据包, 同一个子网络的 C,D,E 计算机都会收到这个包, 它们读取这个包的 "标头", 招到接受方的 Mac 地址, 然后与自身的 Mac 地址做比对, 如果相同就接受这个包, 做进一步处理. 否则就丢弃这个包. 这种发送方式就叫做 "广播"
网络层
由来: 以太网协议依靠 Mac 地址发送数据. 理论上, 单单依靠 Mac 地址, 上海的网卡就可以访问到洛杉矶的网卡了, 技术上是可以实现的.
但是, 这样做有一个重大的缺点, 以太网采用广播方式发送数据包, 所有成员人手一 "包", 不仅效率低, 而且局限在发送者发在的子网络中. 也就是说, 如果两台计算机不再同一个子网络, 广播是传不过去的, 这种设计是合理的, 否则互联网上每一台计算机都会收到所有包, 那会引起灾难.
互联网是无数子网络共同组成的一个巨型网络, 很难想象从上海到洛杉矶的电脑会在同一个子网络, 这几乎是不可能的.
因此, 必须要找到一种方法, 能够区分哪些 Mac 地址属于同一个子网络, 哪些不是. 如果是同一个子网络, 就采用广播发送方式, 否则就采用路由方式发送.(路由的意思就是指如何向不同的子网络分发数据包, 这是一个很大的主题, 本文不涉及), 遗憾的是, Mac 地址本身无法做到这一点, 它只与厂商有关, 与所处网络无关.
这就导致了 "网络层" 的诞生. 它的作用是引用一套新的地址, 使得我们能够区分不同的计算机是否属于同一个子网络. 这套地址就叫做 "网络地址", 简称 "网址".
于是,"网络层" 出现以后, 每台计算机有了两种地址, 一种是 Mac 地址, 另一种是网络地址, 两种地址之间没有任何联系, Mac 地址是绑定在网卡上的, 网络地址则是管理员分配的, 它们只是随机组合在一起.
网络地址帮助我们确定计算机所在的子网络, Mac 地址则将数据包送到该子网络中的目标网卡. 因此, 从逻辑上可以推断, 必定是先处理网络地址, 然后再处理 Mac 地址.
构建 TCP 服务
构建 UDP 服务
构建 HTTP 服务
构建 WebSocket 服务
适用于服务器与客户端的实时通讯.
构建 HTTPS 服务
来源: http://www.bubuko.com/infodetail-3280919.html