https://antkillerfarm.github.io/
网络杂谈
集线器&交换机&路由器
1.集线器,又名HUB。一般只起增强信号的作用,并不对流经的数据进行处理。数据转发采用广播方式,只适合少量终端设备的情况。
2.交换机。它会对转发数据的数据链路层(OSI第二层)进行处理。
2.路由器。它会对转发数据的网络层(OSI第三层)进行处理。
以上都是一些原始定义,实际情况中,由于都是网络数据交换设备,跨界的情况随着硬件的升级,而屡见不鲜。比如现在的集线器,多数也有简单的数据处理能力;而现在的交换机,有的也有第三层处理能力(比如三层交换机)。
以我的经历为例,2003年左右,大学宿舍的兄弟们就使用集线器,进行联网游戏。
2007年,换用交换机,和合租的同事,一起上网。
2010年,换用无线路由器,手机也可以wifi上网了。
XMPP
XMPP(Extensible Messaging Presence Protocol)和SIP(Session Initiation Protocol)都是应用层的数据交换协议。作为它们前辈的HTTP虽然取得很大成功,但也存在如下问题:
1.内容形式主要限定为html,对于传输非界面数据的应用来说,效率不高,也不专业。
2.HTTP基于Client发送请求,Server响应的模式。对于VOIP这样的应用来说,Server主动发送数据的能力显然更关键。
XMPP和SIP的特点如下表所示:
XMPP | SIP | |
---|---|---|
核心协议的目的 | 服务于结构化的数据交换 | 服务于连接的建立 |
核心外扩展 | 添加Jingle协议支持面向连接的业务 | 添加SIMPLE协议支持即时通信业务 |
应用支持和扩展性 | 优 | 一般 |
数据格式 | XML,易解析 | 文本,不易解析。 |
通道方式 | 控制和数据通道是一体的,Clent只与Server建立连接,而Client与client之间是没有连接的。Client之间传送的通道是:Client1–>Server1–>Server2–>Client2。这种方式看起来扩展性差,Server压力很大,但是能够实现很好的业务功能,比如留言、广播、群聊、状态更新、Blog、微博、数据共享等等。 | 连接建立通道与数据传送通道是各自独立的,连接建立在Client与Server之间,而数据传送通道是在Client–>Client之间直接进行的。这个对视频、语音和文件传送业务很合适,但是不适合其他形式的应用。 |
底层协议 | TCP and TLS only | UDP, TCP and TLS |
连接方式 | 单向连接,只有Client可以向Server发起连接请求,Server不会向Client发起连接。这样便于NAT和firewall的穿越。 | 双向对称,客户端和服务器都可以主动发起连接请求并响应,这种对称连接的方式在穿越NAT和firewall的时候,带来很大的复杂性,无法保证穿越NAT。 |
前景 | 开源实现众多,应用广泛。且被Google、MS、Facebook等巨头支持,前景乐观。 | 核心外业务没有起色。核心业务也遭到Jingle协议的挑战。 |
参考文献:
http://my.oschina.net/linuxhunter/blog/35370
基于loudmouth的XMPP客户端DEMO
http://xmpp.org/xmpp-software/
这个网页列出了XMPP的各种客户端、服务器以及库的实现。在我们的项目中,服务端使用Openfire,嵌入式客户端使用gloox。
http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html
Openfire的聊天记录插件开发。
Openfire
安装
Openfire的官网是:
http://www.igniterealtime.org/projects/openfire/
从官网可下载源代码包和可执行文件包,这里选用deb格式的安装包。安装之后的文件主要在:
1./etc/openfire。配置文件目录
2./usr/share/openfire。可执行文件及jar库的目录。
运行
可以使用以下命令:
/etc/init.d/openfire {start|stop|restart|status|condrestart|reload}
设置
web设置可访问以下网址:
Spark
Spark和Openfire都是Ignite Realtime的产品。Spark是一个Java写的XMPP客户端。注意,这个Spark和Hadoop生态圈的Spark不是同一个软件。
我一开始直接下载二进制包,但无法运行,原因不详。
于是改用源代码编译的方式。源代码地址:
https://github.com/igniterealtime/Spark
编译方法:
cd build
ant
可执行程序:arget/build/bin/startup.sh
登陆时的“服务器”一栏,要填写服务器名称,填IP地址是不行的。
osip & eXosip
osip是SIP协议的一个开源实现。其官网为:
http://savannah.gnu.org/projects/osip
eXosip在osip上封装了一层,简化了在多媒体会话方面SIP协议的使用。其官网为:
http://savannah.nongnu.org/projects/exosip/
IRC
最近,由于捣鼓VNC剪贴板没有结果,我不得不寻找它的替代方案,这时IRC进入了我的视线。
IRC虽然没有XMPP那么强的功能,但毕竟是20年前的东西了,各种资料和支持都比较完善,使用配置也没有后者那么复杂,是个不错的东西。
IRC Server
这里推荐两款:
1.ircd-hybrid
2.unrealircd
安装教程:
http://soft.dog/2016/03/25/unrealircd-basic/
IRC Client
开始使用的是hexchat。官网:
Windows版本做的不错,但Linux版本老是运行不起来。。。
最后一气之下,想到了emacs,而后者也不负所望。
M-x erc
IRC命令
常用IRC命令参见:
https://en.wikipedia.org/wiki/List_of_Internet_Relay_Chat_commands
注意细节如下:
1.join命令中输入的channel名如果不存在,则会创建channel。相当于该命令既是加入命令,也是创建命令。
NTP
Network Time Protocol,是用来让计算机之间实现时间同步的协议。
网上可用的NTP Server列表,可参见:
NTP的Client有很多,这里使用ntpclient软件。它的官网:
http://doolittle.icarus.com/ntpclient/
调试的时候,可以使用如下命令设置时间:
sudo date -s 10:00:00
修改之后,可用date
命令查看系统当前时间,确认修改的效果。
ntpd是NTP的另一个实现,既可以当Server,也可以当Client,已经被集成进busybox。
socket通信基本流程
TCP
服务器端 客户端
1.创建socket 1.创建socket
2.bind 2.listen
4.accept
----等待客户端连接---- 3.connect
5.读数据(recv) 4.写数据(send)
6.写数据(send) 5.读数据(recv)
7.关闭socket(closesocket) 6.关闭socket(closesocket)
UDP
服务器端: 客户端
1.创建socket 1.创建socket
2.bind 2.bind
3.recvfrom
----等待连接---- 3.sendto
4.sendto 4.recvfrom
5.关闭socket(closesocket) 5.关闭socket(closesocket)
WIFI WPS
WPS分为PBC(BUTTON)和PIN两种方式
PBC
按WPS按钮实现WPS安全连接。
在AP中,在WPS设置中,设置为启用。
按一下客户端(无线网卡)上的WPS按键,搜索WPS网络。
按一下AP上的WPS按键,WPS开始链接协商,片刻后WPS安全连接成功建立。
PIN
1.PIN(Internal Registra, 相对于AP而言):通过在路由器中输入客户端PIN码来实现WPS安全连接。
在WPS设置中,把状态设置为启用。
打开客户端WPS设置软件,选择在路由器中输入PIN的方式连接,同时软件上还会显示客户端当前的PIN码。
打开路由器界面,在WPS模式里选择PIN模式,然后输入客户端的PIN码, 点添加新设备,一会儿后,WPS安全连接成功建立。
2.PIN(External Registra, 相对于AP而言):通过输入AP的PIN码实现WPS安全连接。
在AP中,在WPS设置中,设置为启用。
记住AP的PIN码,然后打开客户端(无线网卡)WPS设置软件,选择以AP的PIN码来进行连接。
输入完PIN码后,点下一步,一会儿后,WPS安全连接成功建立。
Zookeeper
bin/zkServer.sh status
http://www.cnblogs.com/lpshou/archive/2013/06/14/3136904.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html
Jetty
Jetty是一个Java Servlet容器。官网:
https://www.eclipse.org/jetty/
它与Tomcat的差异在于:
1.Jetty是Eclipse基金会的项目,而Tomcat是Apache基金会的项目。
2.Jetty是轻量级的Web Server,系统开销小,而Tomcat是重量级的Web Server,功能更强大。
3.启动方式不同。Jetty一般是嵌入Java程序中,在程序启动之后,再启动Jetty。而Tomcat是首先启动自己作为后台服务,然后再加载功能性的应用。
参考:
https://github.com/jasonish/jetty-springmvc-jsp-template
一个Jetty+Spring MVC+JSP的demo。
Docker
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
官网:
下图显示了Docker和VM之间的差别:
参考:
http://blog.csdn.net/colorant/article/details/20608157
快速理解Docker
http://www.cnblogs.com/zhangmingcheng/p/5730070.html
Docker数据管理
https://mp.weixin.qq.com/s/E4wKaIddq8_jRVx9q08qtg
Docker入门
MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
官网:
安装:
https://docs.mongodb.com/getting-started/shell/tutorial/install-mongodb-on-ubuntu/
参考:
https://docs.mongodb.com/manual/reference/sql-comparison/
这里提供了MongoDB查询语法和SQL查询之间的对应关系表。
https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/
这是上面表格的高级版本,专门处理group by的情况。这种情况也叫做Aggregation。
Robomongo
Robomongo是一个开源的MongoDB的前端工具,基于Qt编写。官网:
WebSocket
在浏览器中通过http仅能实现单向的通信。AJAX通过轮询方式,达到全双工通信,但效率不高。
面对这种状况,HTML5定义了WebSocket协议(基于TCP),能更好的节省服务器资源和带宽并达到实时通讯。
浏览器请求
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://www.sohu.com
Sec-WebSocket-Version: 13
服务器回应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=