网络杂谈, Docker, MongoDB
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的特點如下表所示:
| 核心協議的目的 | 服務于結構化的數據交換 | 服務于連接的建立 |
| 核心外擴展 | 添加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設置可訪問以下網址:
http://127.0.0.1:9090
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
http://ircd-hybrid.org/
2.unrealircd
https://www.unrealircd.org/
安裝教程:
http://soft.dog/2016/03/25/unrealircd-basic/
IRC Client
開始使用的是hexchat。官網:
https://hexchat.github.io
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列表,可參見:
http://www.pool.ntp.org/en/
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
http://zookeeper.apache.org/
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機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
官網:
https://www.docker.com/
下圖顯示了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://www.mongodb.com/
安裝:
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編寫。官網:
https://robomongo.org/
WebSocket
在瀏覽器中通過http僅能實現單向的通信。AJAX通過輪詢方式,達到全雙工通信,但效率不高。
面對這種狀況,HTML5定義了WebSocket協議(基于TCP),能更好的節省服務器資源和帶寬并達到實時通訊。
瀏覽器請求
GET /webfin/websocket/ HTTP/1.1Host: localhostUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==Origin: http://www.sohu.comSec-WebSocket-Version: 13服務器回應
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8= 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的网络杂谈, Docker, MongoDB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java构建工具, ZeroC ICE,
- 下一篇: 深度学习(三)——Autoencoder