版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
從分布式到微服務(wù)第1章 大話分布式系統(tǒng)第2章 “知識(shí)木桶”中的短板——網(wǎng)絡(luò)基礎(chǔ)第3章 分布式系統(tǒng)的經(jīng)典基礎(chǔ)理論第4章 聊聊RPC第5章 深入淺析內(nèi)存第6章 深入解析分布式存儲(chǔ)第7章 聊聊分布式計(jì)算第8章 全文檢索與消息隊(duì)列中間件第9章 微服務(wù)架構(gòu)第1章大話分布式系統(tǒng)分布式世界是一個(gè)很復(fù)雜的世界,任何技術(shù)都不是孤立的存在,任何技術(shù)都無法適應(yīng)所有場景。作為一名分布式系統(tǒng)架構(gòu)師或資深研發(fā)人員,你必須盡可能多地學(xué)習(xí)與之相關(guān)的各種知識(shí),掌握各種技術(shù)的演進(jìn)路線,從一名編程狂人逐漸升級為一名博學(xué)的IT專家,實(shí)踐與理論并行、代碼與頁碼齊飛,唯有如此,你才能更好地成就未來。IT爭霸戰(zhàn)劃時(shí)代的第一臺(tái)計(jì)算機(jī)在的時(shí)代是如此令人著迷,以至于直到現(xiàn)在,好萊塢導(dǎo)演們也不忘和我們IT界的同行攜手,用先進(jìn)的IT技術(shù)制造出一個(gè)個(gè)在視覺上令人震撼的史前怪獸。有趣的是,計(jì)算機(jī)領(lǐng)域也呈現(xiàn)出與侏羅紀(jì)時(shí)代的恐龍同樣的發(fā)展軌跡:從早期個(gè)體的強(qiáng)大逐漸發(fā)展為群體的強(qiáng)大。據(jù)記載,世界上第一臺(tái)電子數(shù)字式計(jì)算機(jī)于1946年情人節(jié)(2月14日)誕生并在美國賓夕法尼亞大學(xué)正式投入運(yùn)行,它的名字是ENIAC,其主要設(shè)計(jì)制造者毛克利申請獲得了美國專利。ENIAC有17468個(gè)真空電子管,并使用電容器進(jìn)行數(shù)值存儲(chǔ),以電量表示數(shù)值,數(shù)據(jù)輸入時(shí)采用打孔讀卡,并采用二進(jìn)位制計(jì)算,耗電174千瓦,占地170平方米,重達(dá)30噸,每秒鐘可進(jìn)行5000次加法運(yùn)算??铸埖耐跽摺酝觚埖捏w重最大為14噸,第一臺(tái)巨無霸電子計(jì)算機(jī)重30從重量上已經(jīng)完勝霸王龍。雖然每秒只能進(jìn)行5000次加法運(yùn)算,現(xiàn)在任意一臺(tái)PC的計(jì)算能力都超過它千倍,但看看下面這段記錄,作為IT人,你應(yīng)該為這個(gè)鼻祖的誕生感到驕傲:中國的古代科學(xué)家祖沖之利用算籌,耗費(fèi)15年心血,才把圓周率計(jì)算到小數(shù)點(diǎn)后7位數(shù)。一千多年后,英國人香克斯以畢生精力計(jì)算圓周率,才計(jì)算到小數(shù)點(diǎn)后707位。而使用ENIAC進(jìn)行計(jì)算,僅用了40秒就達(dá)到了這個(gè)記錄,還發(fā)現(xiàn)香克斯的計(jì)算中,第528位是錯(cuò)誤的。水落石出的真相:依俄華州立大學(xué)物理系約翰·文森特·阿坦那索夫和研究生克利福德·貝里在1939年制造出一臺(tái)完整的具備現(xiàn)代計(jì)算機(jī)4個(gè)核心要素(二進(jìn)制、內(nèi)存、I/O、計(jì)算單元)的樣機(jī)ABC(AtanasoffBerryComputer),該樣機(jī)后來被銷毀而沒有流傳下來。1973年美國明尼蘇達(dá)地區(qū)法院正式宣判,吊銷毛克利的專利,并肯定了阿坦那索夫才是真正的現(xiàn)代計(jì)算機(jī)的發(fā)明人。如下所示是ABC的復(fù)制品,即使該復(fù)制品是人們靠回憶還原的,它也是世界上第一臺(tái)現(xiàn)代計(jì)算機(jī),讓我們默默地瞻仰1分鐘……但凡新的學(xué)科出現(xiàn),總有天才人物披荊斬棘地做開路先鋒,他們有著常人所不具備的敏銳洞察力和想象力。讓我們再看看奠定了現(xiàn)代計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的經(jīng)典理論——馮·諾依曼體系:計(jì)算機(jī)硬件由運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備和輸出設(shè)備五大部分組成。直到今天,計(jì)算機(jī)仍沒有跳出該體系的范疇。馮·諾依曼洋洋灑灑的101頁關(guān)于計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的技術(shù)報(bào)告,奠定了他在計(jì)算機(jī)領(lǐng)域的地位,但他卻親手把“計(jì)算機(jī)之父”的頭銜戴在了同時(shí)代的天才阿蘭·圖靈的頭上,可見圖靈對計(jì)算機(jī)發(fā)展所做出的貢獻(xiàn)。圖靈是罕見的天才數(shù)學(xué)家和計(jì)算機(jī)科學(xué)家,天生悟性過人,16論,并能運(yùn)用那深?yuàn)W的理論,獨(dú)立推導(dǎo)力學(xué)定律。1935年,圖靈年僅23歲且剛剛大學(xué)畢業(yè),就被劍橋大學(xué)國王學(xué)院甄選為研究員,成為劍橋大學(xué)有史以來最年輕的研究員。性問題中的應(yīng)用》,在該論文中首次提出了奠定現(xiàn)代計(jì)算機(jī)的理論基礎(chǔ)的“圖靈機(jī)”理論。在曼徹斯特大學(xué),圖靈度過了其短暫生命的最后幾年,“人工智能”是他發(fā)出的最后的生命1951年,圖靈39歲,被英國皇家學(xué)會(huì)選為會(huì)員,成為其家族中第4位皇家學(xué)會(huì)會(huì)員。曼徹斯特大學(xué)也因?yàn)閳D靈的存在,被英國皇家學(xué)會(huì)認(rèn)定為國家計(jì)算機(jī)科學(xué)的最高學(xué)術(shù)機(jī)構(gòu)。天才或許真的只是為了拯救我們這些碌碌無為的凡人而落入凡間的靈魂吧,他們在人間綻放了無與倫比的耀眼光芒后,就匆忙離去,只留下我們無限悵惘?!狶eader-us1954年6月8日,42歲的圖靈吃了一小口含有氰化鉀的蘋果,絕世而去。1998年6月22日,世界各地的計(jì)算機(jī)大師齊聚倫敦紀(jì)念他們的“創(chuàng)業(yè)領(lǐng)袖”,英國下議院向科學(xué)家們道歉,承認(rèn)在44年前對圖靈做出了不公正的審判,并且當(dāng)即修改法律,同性戀不再非法。至于那個(gè)被咬了一小口的蘋果,則又被另一個(gè)IT奇才——喬布斯發(fā)揚(yáng)光大,國外媒體通過蘋果自iPhone上市后的每一個(gè)季度財(cái)報(bào)的相關(guān)統(tǒng)計(jì)得知,這款革命性的移動(dòng)設(shè)備目前的全球銷量已經(jīng)超過5億臺(tái)。第一臺(tái)電子計(jì)算機(jī)誕生以后,一個(gè)日新月異的IT時(shí)代到來了。一方面單臺(tái)計(jì)算機(jī)的性能每年都在提升:從最早的8位CPU到現(xiàn)在的64位CPU;從最早的MB級內(nèi)存到現(xiàn)在的GB級內(nèi)存;從慢速的機(jī)械硬盤存儲(chǔ)到現(xiàn)在的固態(tài)SSD硬盤存儲(chǔ)。另一方面,分布式架構(gòu)技術(shù)讓我們把單臺(tái)計(jì)算機(jī)的計(jì)算能力、內(nèi)存、I/O等傳統(tǒng)部件“分布”到聯(lián)網(wǎng)的各個(gè)單獨(dú)的計(jì)算機(jī)節(jié)點(diǎn)上,最終組成一個(gè)超級計(jì)算網(wǎng)格。而如今在虛擬化和云計(jì)算技術(shù)的推動(dòng)下,我們又開始實(shí)現(xiàn)另一個(gè)極致的新技術(shù):一臺(tái)計(jì)算機(jī)通過軟件方式被虛擬化為幾個(gè)相互獨(dú)立的計(jì)算機(jī)(虛機(jī)),從而使得一臺(tái)計(jì)算機(jī)變成了N臺(tái)計(jì)算機(jī),形成一個(gè)局部的計(jì)算機(jī)集群,許多個(gè)這樣的集群互聯(lián)進(jìn)而形成一個(gè)規(guī)模更大的計(jì)算機(jī)集群,在這個(gè)集群里,我們可以安裝、部署多種不同的操作系統(tǒng),彼此相互獨(dú)立地完成各種任務(wù),而當(dāng)某個(gè)虛機(jī)發(fā)生故障后,我們可以立即自動(dòng)轉(zhuǎn)移到其他機(jī)器上重建,也可以根據(jù)系統(tǒng)的負(fù)載情況動(dòng)態(tài)創(chuàng)建和消耗虛機(jī)。通過虛擬化管理軟件,僅僅需要幾十秒,一個(gè)完全虛擬的Linux機(jī)器便可以立即使用,也僅僅只需幾十秒,一個(gè)安裝好了MySQL、Tomcat、JDK的虛機(jī)鏡像被啟動(dòng),你可以部署你的Java程序,供別人使用,這是怎樣一個(gè)神奇的世界呢?本書將為你揭露上述神奇表象背后的密碼,使你也擁有實(shí)現(xiàn)上述目標(biāo)的魔力。IT界的恐龍時(shí)代ENIAC之后,電子計(jì)算機(jī)便進(jìn)入了IBM主導(dǎo)的大型機(jī)時(shí)代,IBM大型機(jī)之父吉恩·阿姆達(dá)爾被認(rèn)為是有史以來最偉大的計(jì)算機(jī)設(shè)計(jì)師之一。1964年4月7日,在阿姆達(dá)爾的帶領(lǐng)下,歷時(shí)三年,耗費(fèi)50億美元,第一臺(tái)IBM大型機(jī)SYSTEM/360(簡稱S/360)誕生。這項(xiàng)50億美元的投資甚至超過了原子彈的研究資費(fèi),但最終被證實(shí)這是一次改變了商業(yè)運(yùn)作的歷史性變革,這使得IBM在20世紀(jì)50~60年代統(tǒng)治整個(gè)大型計(jì)算機(jī)工業(yè),奠定了IBM計(jì)算機(jī)帝國的江山。IBM的大型機(jī)過去曾支撐美國航天登月計(jì)劃,而近50年以來,IBM主機(jī)一直服務(wù)于金融等核心行業(yè)的關(guān)鍵業(yè)務(wù)領(lǐng)域,IBM更是集中精力研發(fā)大型機(jī)和小型機(jī)。由于高可靠性和超強(qiáng)的計(jì)算能力,即便在目前X86和云計(jì)算飛速發(fā)展的情況下,IBM的大型機(jī)仍然牢牢占據(jù)著一定的高端市場份額?!舅伎碱}】為何在長達(dá)60年的漫長時(shí)間內(nèi),古董級別的大型機(jī)仍然沒有退出舞臺(tái)?【標(biāo)準(zhǔn)答案】:根本原因是“錢”。據(jù)QualixGroup統(tǒng)計(jì),服務(wù)器1分鐘的宕機(jī)平均會(huì)使運(yùn)輸業(yè)損失15萬美元,銀行業(yè)損失27萬美元,通信業(yè)損失35萬美元,制造業(yè)損失42萬美元,而證券業(yè)損失高達(dá)45萬美元。如果銀行系統(tǒng)中斷1小時(shí),則將直接影響其基本支付業(yè)務(wù);中斷1天,則將對其聲譽(yù)造成極大傷害;中斷2~3天以上不能恢復(fù),則將直接危及其他銀行乃至整個(gè)金融系統(tǒng)的穩(wěn)定。另外在故障恢復(fù)方面,40%的公司每年需要1天或者更長的時(shí)間進(jìn)行數(shù)據(jù)恢復(fù),7%的公司需要超過1天。以證券業(yè)為例,若需要1天進(jìn)行系統(tǒng)恢復(fù),則損失的金錢為24×60×45萬美元!這就印證了大型機(jī)的客戶都不缺錢,同時(shí)我們稍微推理和思考就能得出一個(gè)讓IBM很難堪的結(jié)論:作為單機(jī)系統(tǒng)來說,無論設(shè)計(jì)得如何精妙,維護(hù)得如何穩(wěn)定,都不可能保證100%的無宕機(jī)。至此,你也就明白了設(shè)計(jì)分布式系統(tǒng)的重要目標(biāo)之一是“避免單點(diǎn)故障,提升系統(tǒng)的可靠性”。2012年情人節(jié)的前一天,NASA終結(jié)了其IT史上的重要一章:關(guān)閉了最后一臺(tái)大型機(jī)IBMZ9,它曾被用于計(jì)算和解決與太空飛行有關(guān)的復(fù)雜數(shù)值計(jì)算問題,如下所示為這張珍貴的照片。有趣的是,NASA是目前人氣指數(shù)第一的云計(jì)算平臺(tái)OpenStack的創(chuàng)始者之一。正如恐龍時(shí)代早已過去,哺乳動(dòng)物主宰了我們現(xiàn)在的星球,大型機(jī)輝煌的時(shí)代也早已過去,取而代之的是X86系列的PC機(jī)。讓我們再回到侏羅紀(jì)公園,在恐龍稱霸的那個(gè)年代,1927年美國著名古生物學(xué)家喬治·辛普森在美國西部發(fā)現(xiàn)了它的化石,并將其命名為Laolestes。那個(gè)時(shí)代的一只恐龍有可能活100~200年之久,而Laolestes的壽命則可能只有幾個(gè)月。盡管Laolestes短命、弱小,生命之旅充滿艱辛,這種哺乳動(dòng)物卻有著讓人意想不到的優(yōu)勢:短促的生命周期使Laolestes更新?lián)Q代的能力遠(yuǎn)遠(yuǎn)超過了恐龍,Laolestes的優(yōu)秀環(huán)境的哺乳動(dòng)物。這一切,都發(fā)生在恐龍年代。的各個(gè)部落里,影響著這個(gè)星球上規(guī)模龐大的哺乳動(dòng)物種群。這個(gè)種群雖然可能膚色不71億人口中有68億手機(jī)用戶,國際電信聯(lián)盟2013人口使用網(wǎng)絡(luò)。貴族的沒落與平民的勝利20世紀(jì)80年代,在大型機(jī)霸主的時(shí)代,計(jì)算機(jī)架構(gòu)同時(shí)向以下兩個(gè)方向發(fā)展。以X86CPU為架構(gòu)的價(jià)格便宜的面向個(gè)人的PC。以RISCCPU為架構(gòu)的價(jià)格昂貴的面向企業(yè)的小型UNIX服務(wù)器。我們對X86太熟悉了,因?yàn)槲覀兯_發(fā)的絕大多數(shù)程序都運(yùn)行在PC上(含PC服務(wù)器),我們當(dāng)中有90%以上的人在擁有X86芯片的PC上寫代碼,用著說不清是否嚴(yán)格意義上的正版Windows。作為當(dāng)今IT世界的絕對王者,我們有必要在這里回顧下X86芯片的歷史和主宰它的大哥——Intel。1971年,Intel為一家日本計(jì)算器廠商制造了其歷史上的第一塊處理器——4位處理器4004,4004含有2300個(gè)晶體管,也是第一款個(gè)人有能力購買的計(jì)算機(jī)處理器,當(dāng)時(shí)它功能相當(dāng)有限,速度還很慢,被當(dāng)時(shí)的藍(lán)色巨人IBM及大部分商業(yè)用戶不屑一顧。IBM:在增加一個(gè)程序員而不增加燃料的情況下,能計(jì)算出航天飛機(jī)抵達(dá)預(yù)期目標(biāo)的概率是多大嗎?Intel:不能……摩根:能預(yù)測納斯達(dá)克股票的漲幅嗎?Intel:不能……記者:能用來PS照片嗎?Intel:不能……報(bào)紙頭條:《多一個(gè)屌絲又能改變什么?》但4004畢竟是劃時(shí)代的產(chǎn)品,很快,在1975年,Intel又推出了8位處理器8008和8080。1979年,Intel公司推出了8088芯片,它屬于16位微處理器,內(nèi)含29000個(gè)晶體管,時(shí)鐘頻率為4.77MHz,地址總線為20位,可使用1MB內(nèi)存。當(dāng)看到個(gè)人微計(jì)算機(jī)蓬勃發(fā)展時(shí),IBM坐不住了,它開始進(jìn)入這個(gè)新領(lǐng)域,老將出馬果然不負(fù)眾望,IBM實(shí)現(xiàn)了其愿望,領(lǐng)頭主導(dǎo)制定了個(gè)人PC的行業(yè)標(biāo)準(zhǔn)——IBM兼容機(jī),在1981年將Intel的8088芯片首次用于IBMPC機(jī)中,并與微軟合作研發(fā)新一代操作系統(tǒng)OS/2,從此開創(chuàng)了全新的微機(jī)時(shí)代,將初出茅廬的蘋果計(jì)算機(jī)雄霸天下的夢想無情地打碎,從此蘋果與IBM初意氣風(fēng)發(fā)的少年英雄IBM折兵,在PC領(lǐng)域什么好處都沒撈到,卻造就了兩個(gè)超級對手:硬件方面,造就了最強(qiáng)的敵手——Intel;軟件方面,則造就了讓無數(shù)軟件公司恐懼的共同敵人——微軟。然而這還不是最可怕的,最可怕的是這兩個(gè)超級強(qiáng)者的聯(lián)姻——Wintel,這個(gè)聯(lián)盟打遍天下無敵手,最終壓制和消滅了其他巨頭的冒泡,稱霸IT界數(shù)十年。IBM則一步步退出PC領(lǐng)域,最近開始變賣X86服務(wù)器,轉(zhuǎn)而退守其有高端RISE芯片的高端服務(wù)器的研發(fā)陣地。IT界里與微軟、Intel合作的公司貌似都沒有“好下場”,IBM第一個(gè)領(lǐng)教過,其中的滋味恐怕只有后來的惠普體會(huì)最深。惠普一開始擁有自己的CPU和操作系統(tǒng),與Intel合作的結(jié)果是最后耗資10億元人民幣,并花數(shù)十年共同研發(fā)的安騰64位處理器,事實(shí)上已經(jīng)“壽終正寢HP-UNIX也隨之“安樂死”。PC時(shí)代的崛起直接導(dǎo)致了Windows操作系統(tǒng)統(tǒng)治了世界上絕大多數(shù)的PC,讓其他操作系統(tǒng)一直處于陰影中。微軟作為Windows的主人,一路過來消滅了很多對手,包括眾多程序員心目中的偶像公司——Borland,最終也倒在微軟的屠刀下。蓋茨親自登門拜訪,最終才將這個(gè)公司的軟件天才程序員、Delphi之父——AndersHejlsberg收歸旗下,后來成為VisualJ/.NET/C#之父,他是目前全世界頂尖的軟件技術(shù)人員之一。論實(shí)現(xiàn)技術(shù),Anders可能是目前的第一高手,因?yàn)樗ǔ绦蛘Z言、編譯器技術(shù)、開發(fā)工具、Framework及系統(tǒng)架構(gòu),并且在每個(gè)領(lǐng)域都是頂級專家。有興趣的同學(xué)可以想想,當(dāng)年微軟的VisualJ虛擬機(jī)在性能上甚至超過了Sun的JVM,最終引發(fā)兩個(gè)巨頭的決裂,若當(dāng)時(shí)兩家攜手,那么今天的Java會(huì)是怎樣一番盛景。制造X86的CPU廠商曾經(jīng)三足鼎立,如今只剩Intel一家獨(dú)大,AMD苦苦支撐,而當(dāng)年的小弟Citrix后來被中國臺(tái)灣的威盛公司收購。UNIX服務(wù)器方面,當(dāng)年有IBM的Power系列、Sun的SPARC系列、MIPS授權(quán)的RISC架構(gòu)系列、惠普的PA-RISC及DEC的Alpha系列。MIPS處理器是20世紀(jì)80年代中期RISCCPU設(shè)計(jì)的一大熱點(diǎn)。MIPS是賣得最好的RISCCPU,可以從任何地方如Sony、Nintendo的游戲機(jī)、Cisco的路由器和SGI超級計(jì)算機(jī)中看見其身影。目前RISC體系結(jié)構(gòu)被X86芯片所挑戰(zhàn),MIPS有可能是起初RISCCPU設(shè)計(jì)中唯一在21世紀(jì)盈利的產(chǎn)品(本世紀(jì)的國產(chǎn)龍芯也采用了它的授權(quán))。和Intel相比,MIPS的授權(quán)費(fèi)用比較低,被除Intel外的大多數(shù)芯片廠商所采用。這里不得不說的是DEC公司Alpha系列的一個(gè)經(jīng)典傳奇,Alpha是RISC處理器中速度最快的一種,于1992年2月25日在東京召開的一次會(huì)議上被正式推介,擁有諸多先進(jìn)設(shè)計(jì)和技術(shù),而且是唯一得到了WindowsNT繼續(xù)支持的RISC處理器(1995年,NT中斷了對MIPS和PowerPC的支持),后來蘋果也希望把其CPU放入蘋果計(jì)算機(jī)中,但被拒絕了。Intel剽竊了Alpha的大量專利,后來對簿公堂達(dá)成和解,Intel拿到了專利和工廠,DEC支持Intel的IA-64處理器計(jì)劃。后來DEC被康柏收購,隨后又被惠普收購,Intel在這個(gè)過程中卻沒有成為最大的贏家。DEC才華橫溢的工程師們的去向如下:DerrickMeyer加入了AMD公司,設(shè)計(jì)了K7;JamesKeller也去了AMD,不過是Kubernetes權(quán)威指南的架構(gòu)師;DanielLeibholz到Sun開發(fā)了UltraSPARCV。Intel遠(yuǎn)沒有想象中如此幸運(yùn),雖然在DEC公司的最后關(guān)頭得到了很多好處,卻只能看著StrongARM架構(gòu)胎死腹中,因?yàn)楫?dāng)初設(shè)計(jì)StrongARM-110的首席架構(gòu)師DanielDobberpuhl、RichardWitek、GregoryHoeppner和LiamMadden沒有一個(gè)愿意加入Intel。而第一個(gè)提出Alpha架構(gòu)的RichardSites則一蹶不振,一直沒有找到像樣的工作。在處理器方面,Sun的SPARC處理器是RISC領(lǐng)域中非常重要的一個(gè)產(chǎn)品,從1984年SPARC架構(gòu)的提出,到1987年的第一款SPARC處理器(比當(dāng)時(shí)的復(fù)雜指令集計(jì)算機(jī)CISC處理器速度要快三倍)的誕生,到獲得巨大成功的UltraSPARC-III,再到8核心32線程的UltraSPARC-T1和中途被廢止的16核心“Rock”,SunSPARC沉浮25年,奠定了Sun在高端微處理器市場中的領(lǐng)先地位,成就了一段硅谷傳奇。Sun公司作為世界上數(shù)一數(shù)二的技術(shù)巨頭之一,是曾經(jīng)唯一可以與IBM比肩的科技公司,從1982年成立到2010年被數(shù)據(jù)庫巨頭Oracle收購,Sun在短暫又驚艷的28年里,創(chuàng)造了一個(gè)又一個(gè)奇跡,如今Sun雖然不存在了,但是它帶給硅谷的深遠(yuǎn)影響是永存的。讓我們一起來回憶一下Sun的輝煌歷史吧。30年前,Sun的第5位雇員JohnGage就提出了“云計(jì)算”的概念——網(wǎng)絡(luò)即計(jì)算機(jī)。Gage是加州大學(xué)伯克利分校的一位數(shù)學(xué)講師,他預(yù)言了“云計(jì)算”的出現(xiàn),后來,“云計(jì)算”一直是Sun的工作理念和方向之一。在操作系統(tǒng)方面,Sun貢獻(xiàn)給世界的是第一個(gè)工業(yè)級的優(yōu)秀UNIX操作系統(tǒng)Solaris,它與SunSPARC處理器的硬件體系結(jié)構(gòu)緊密結(jié)合,在設(shè)計(jì)和市場上經(jīng)常捆綁在一起,整個(gè)軟硬件系統(tǒng)的可靠性和性能也因此大大增強(qiáng),它曾經(jīng)是Sun最得意的產(chǎn)品,不亞于當(dāng)今的iPhone。Sun留給世界的最后一個(gè)至今仍然很重要的瑰寶非Java莫屬,于1990年誕生的它,如今已經(jīng)24歲了,幾乎無處不在,它也是分布式企業(yè)應(yīng)用開發(fā)的首選語言。在與X86對抗的過程中,RISC芯片的廠家一個(gè)個(gè)地退出舞臺(tái),目前僅剩的有影響力的只有兩家:IBMPowerPC聯(lián)盟與ARM聯(lián)盟。PowerPC是1991年蘋果、IBM、Motorola組成的AIM聯(lián)盟所發(fā)展出的微處理器架構(gòu),這個(gè)意欲打破由Intel壟斷個(gè)人計(jì)算機(jī)市場的決定,立刻在華爾街股市引起相當(dāng)大的震蕩,但在微軟和Intel這個(gè)IT界最為強(qiáng)大的雙劍合璧的“霸天虎”的逼迫下,AIM聯(lián)盟無疾而終。不過,IBM的Power芯片仍然在發(fā)展,在全球排名前10位的超級計(jì)算機(jī)中,共有5臺(tái)采用了Power架構(gòu)。ARM新貴的爆發(fā)ARM聯(lián)盟可以說是目前X86的唯一強(qiáng)勁敵手,從下面這組數(shù)字就能知道了:目前全球95%以上的手機(jī)及超過四分之一的電子設(shè)備都在使用ARM技術(shù)。PC出貨量一直在緩慢下降,智能手機(jī)、平板計(jì)算機(jī)已經(jīng)開始成為我們生活中不可或缺的一部分。雖然微軟一直雄霸PC桌面,但在智能終端這個(gè)領(lǐng)域,蓋茨很早就盯上了,而且全新開發(fā)了WinCE操作系統(tǒng),當(dāng)年酷派手機(jī)的崛起也是依托了個(gè)系統(tǒng)。在新一代智能手機(jī)流行之前,諾基亞靠著塞班這個(gè)手機(jī)操作系統(tǒng)雄霸天下,無視微軟的存在,讓蓋茨恨之入骨,但后來微軟收購并“打敗”了諾基亞,看來“君子報(bào)仇,十年不晚”。ARM聯(lián)盟與Intel的路線不同,其經(jīng)營思路是“有錢大家一起賺”,通過設(shè)計(jì)低能耗的ARM芯片架構(gòu)并低價(jià)授權(quán)眾多的制造商去制造,ARM芯片占據(jù)了移動(dòng)和嵌入式領(lǐng)域的絕大部分份額,并且在云計(jì)算崛起的今天,又開始搶奪Intel的重要領(lǐng)地——服務(wù)器市場。IBM、Google、NVIDIA結(jié)盟,企業(yè)版Linux領(lǐng)域的領(lǐng)頭羊——RedHat發(fā)起ARM合作伙伴早期使用計(jì)劃,其目標(biāo)客戶是芯片制造商和服務(wù)器制造商,最初的成員包括AMD、AmericanMegatrends、AppliedMicro、博通、Cavium、戴爾、惠普、Linaro和ARM控股公司自己,戴爾在2014年2月推出了采用AppliedMicro公司X-Gene芯片的微服務(wù)器原型機(jī),惠普在其低功耗服務(wù)器MoonShot中使用德州儀器的ARM芯片,功耗降低80%。另外,X86領(lǐng)域的老二、Intel的老對手AMD也很意外地于2014年1月發(fā)布了首款商用64位ARM處理器OpteronA1100,頻率可超過2GHz,只用略高的功耗,就得到了將近三倍的性能,核心性能也增加了40%以上。另外一個(gè)與本書主題密切相關(guān)的重要消息是虛擬化技術(shù)也開始發(fā)力ARM芯片了——2014年3月10日,Linux基金會(huì)中的非營利組織“XenProject”發(fā)布了采用開源技術(shù)的Xen4.4,提升了ARM服務(wù)器平臺(tái)性能,考慮到虛擬化技術(shù)的迅猛發(fā)展和應(yīng)用,未來大量的ARM服務(wù)器承擔(dān)高密度數(shù)據(jù)中心的可能性越來越大。有關(guān)機(jī)房功耗的小知識(shí):IDC機(jī)房中,由服務(wù)器、存儲(chǔ)和網(wǎng)絡(luò)通信等設(shè)備產(chǎn)生的功耗約占數(shù)據(jù)中心機(jī)房所需總功耗的50%左右,其中服務(wù)器所占的總功耗為40%左右,空調(diào)系統(tǒng)的功耗約占數(shù)據(jù)中心機(jī)房所需總功耗的37%左右。2009年,聯(lián)通150個(gè)IDC機(jī)房一年的電費(fèi)為5.2億元人民幣?,F(xiàn)在可以理解Google為何很早就開始自己進(jìn)行風(fēng)力發(fā)電了吧。再考慮機(jī)房的占地面積有限,機(jī)柜位置有限,而ARM架構(gòu)的服務(wù)器可以做到很高密度而低功耗的耗電能力,誰知道未來的世界會(huì)不會(huì)是ARM的天下呢?是不是到了買ARM股票的時(shí)機(jī)了呢?從2013年起就有輿論稱Google也開始染指CPU了,考慮到其早在2005年就自己組裝超大規(guī)模的服務(wù)器集群:服務(wù)器上裝電池,使用技嘉主板,數(shù)據(jù)中心以貨柜為單位,每箱有1160臺(tái)服務(wù)器,后來又通過Android打敗了諾基亞,占了蘋果的便宜,現(xiàn)在出CPU也是可能的,畢竟Google籠絡(luò)了一大批天才程序員。不過最近公開的消息是Google設(shè)計(jì)了一款可以采用IBM的Power芯片的主板!作為Intel全球第五大服務(wù)器芯片客戶,這叫Intel情何以堪!百度兄,你可要更努力了。超級計(jì)算機(jī)的絕地反擊除了大型機(jī)、小型機(jī)、個(gè)人計(jì)算機(jī)、服務(wù)器,計(jì)算機(jī)世界里另外一個(gè)小眾群體就是“白富美”的“超級計(jì)算機(jī)”了,它們每一個(gè)都是高端私人定制的緊密耦合的分布式計(jì)算機(jī)集群,每一個(gè)計(jì)算能力都超過每秒1萬億次,每一個(gè)都很貴,每一個(gè)都帶著榮耀而生,代表著“國家實(shí)力”。我們最熟悉的一個(gè)超級計(jì)算機(jī)就是由IBM制造的,它的名字叫深藍(lán),是專門用于分析國際象棋的超級計(jì)算機(jī),它有480顆特別制造的VLSI象棋芯片,下棋程式以C語言寫成,運(yùn)行AIX操作系統(tǒng),運(yùn)算速度為每秒2億步棋,可搜尋及預(yù)估隨后的12步棋,而一名人類象棋好手大約可預(yù)估隨后的10步棋。1997年5月11日,該計(jì)算機(jī)擊敗國際象棋世界冠軍加里·卡斯帕羅夫,這是一次轟動(dòng)世界的事件:計(jì)算機(jī)第一次擊敗人腦。典型的超級計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)如下。并行向量處理(PVP)。對稱式多處理器(SMP)。(DSM)。(MPP)。集群式超級計(jì)算機(jī)。其中MPP系統(tǒng)是由成百上千計(jì)算節(jié)點(diǎn)組成的分布式并行處理計(jì)算機(jī)系統(tǒng),每個(gè)計(jì)算節(jié)點(diǎn)配置一個(gè)或多個(gè)處理器,各個(gè)節(jié)點(diǎn)相對獨(dú)立,有各自獨(dú)立的內(nèi)存模塊和操作系統(tǒng),MPP系統(tǒng)的特點(diǎn)是有很高的峰值運(yùn)算速度。機(jī)群系統(tǒng)采用高速網(wǎng)絡(luò)將大量的節(jié)點(diǎn)相互連接,每個(gè)機(jī)群節(jié)點(diǎn)都是一個(gè)配置有處理器、內(nèi)存、I/O設(shè)備、網(wǎng)卡和操作系統(tǒng)的計(jì)算機(jī),各個(gè)節(jié)點(diǎn)以協(xié)同方式并行完成計(jì)算任務(wù)。機(jī)群系統(tǒng)與MPP一樣,也屬于分布式內(nèi)存結(jié)構(gòu),因而具有很強(qiáng)的可擴(kuò)展性。具體而言,機(jī)群系統(tǒng)主要由節(jié)點(diǎn)計(jì)算機(jī)、高速互聯(lián)網(wǎng)、操作系統(tǒng)、單一系統(tǒng)映像等中間件、并行編程環(huán)境和應(yīng)用程序等部分組成。如今全球超級計(jì)算機(jī)500強(qiáng)排名中,機(jī)群式系統(tǒng)所占的比例達(dá)到83%以上,在最新的排名中,就GPU而言,500強(qiáng)中有39套系統(tǒng)目前使用GPU作為加速器(3/5使用中國臺(tái)灣Nvidia的GPU),有85%的上榜系統(tǒng)采用了Intel至強(qiáng)處理器,有超過200套系統(tǒng)采用了Infiniband網(wǎng)絡(luò)方案,美國持續(xù)以263套入榜系統(tǒng)居冠,中國有75套系統(tǒng)。2014年,來自中國的天河二號超級計(jì)算機(jī)終于上了頭條,成為500強(qiáng)超級計(jì)算機(jī)中計(jì)算能力最強(qiáng)的一個(gè)。Nvidia有望在超級計(jì)算機(jī)領(lǐng)域繼續(xù)擴(kuò)展其勢力,田納西州立大學(xué)計(jì)算機(jī)科學(xué)系教授JackDongarra評價(jià)該公司為“第一個(gè)針對該市場并提供良好軟件基礎(chǔ)及行銷策略的企業(yè)”。天河二號由280人歷時(shí)兩年多研制完成,耗資約1億美元。它已經(jīng)在國家超級計(jì)算廣州中心正式投入運(yùn)行,為120多家用戶提供了300多項(xiàng)典型應(yīng)用計(jì)算。借助天河二號,國產(chǎn)C919大型客機(jī)開展了高精度外流場氣動(dòng)計(jì)算,中科院上海藥物研究所開展了75萬個(gè)小分子化合物的結(jié)合親和力評估,完成了600多個(gè)各類藥物的體內(nèi)外活性測試評價(jià)。天河二號適配了廣州市電子政務(wù)數(shù)據(jù)管理系統(tǒng)和云盤存儲(chǔ)系統(tǒng)等,為智慧城市的建設(shè)搭建了高效可靠的承載平臺(tái)。無論從理論還是技術(shù)來看,現(xiàn)代的超級計(jì)算機(jī)系統(tǒng)都是當(dāng)今最先進(jìn)的分布式系統(tǒng),有目前最高性能的Infiniband網(wǎng)絡(luò)方案、最強(qiáng)的計(jì)算芯片、最大的內(nèi)存帶寬、最好的I/O、優(yōu)化定制的集群控制系統(tǒng)和操作系統(tǒng)。對于這樣一個(gè)龐然大物,目前唯一可以與其匹敵的就是蓬勃發(fā)展的公有云。作為云計(jì)算領(lǐng)域無可厚非的先行者,亞馬遜的公有云按照其計(jì)算能力,已經(jīng)能在TOP500超級計(jì)算機(jī)系統(tǒng)中進(jìn)入前50名,若按照實(shí)用價(jià)值和投入產(chǎn)出來計(jì)算,則大概是當(dāng)之無愧的第1名了。云計(jì)算這個(gè)當(dāng)前最熱門的新型領(lǐng)域,引來無數(shù)英雄競折腰,CPU、GPU開始支持虛擬化指令,軟件定義存儲(chǔ)的概念撼動(dòng)人心,大二層虛擬網(wǎng)絡(luò)標(biāo)準(zhǔn)最終會(huì)鹿死誰手?云計(jì)算的IAAS基礎(chǔ)平臺(tái)OpenStack目前如日中天,惠普高調(diào)宣布投入10億美元啟動(dòng)HPHellion戰(zhàn)略,引得OpenStack之父欣然前往掌帥。IBM、微軟、Intel、RedHat、Oracle、惠普、思科及中國的華為、浪潮等紛紛投奔開源OpenStack聯(lián)盟,這個(gè)領(lǐng)域中原先的領(lǐng)導(dǎo)者VMWare、Citrix等也紛紛擁抱開源。英雄所見略同,只能用這句話來解釋當(dāng)前云計(jì)算的局勢了?;仡櫼幌卤菊碌膬?nèi)容,若你記住了幾個(gè)重要的名字:大型機(jī)、X86、RISC、ARM、Windows、UNIX、虛擬化、云計(jì)算、OpenStack,了解了IBM、惠普、微軟、Intel、Google、蘋果這些巨頭們的恩怨情仇,感悟了IT世界的風(fēng)云變幻與日新月異,領(lǐng)悟了當(dāng)今我們所面對的IT系統(tǒng)的技術(shù)多樣性和復(fù)雜性,你就初步具備了一名架構(gòu)師必備的基本能力——“哲學(xué)觀”。最后,借用狄更斯的名句來總結(jié)我們當(dāng)前的“IT時(shí)代”。這是明智的時(shí)代,這是愚昧的時(shí)代;我們面前應(yīng)有盡有,我們面前一無所有;我們都將直上天堂,我們都將直下地獄?!腋埂峨p城記》分布式系統(tǒng)的開國元?jiǎng)自谟?jì)算機(jī)世界里,大型機(jī)一步步喪失了自己的領(lǐng)地,分布式的微機(jī)集群無處不在,而集群中至關(guān)重要的一個(gè)組成部分——網(wǎng)絡(luò),不僅改變了IT世界,也改變了我們的生活。網(wǎng)絡(luò)作為連接分布式系統(tǒng)的信息傳輸通道,也是分布式系統(tǒng)的“神經(jīng)網(wǎng)絡(luò)”,可以說沒有網(wǎng)絡(luò),就沒有分布式系統(tǒng)。分布式系統(tǒng)的初衷是解決系統(tǒng)的可靠性問題,避免“單點(diǎn)故障”,這也與最早的互聯(lián)網(wǎng)的目標(biāo)不謀而合:在20世紀(jì)60瘓狀態(tài),其后果不堪設(shè)想,因此有必要設(shè)計(jì)一個(gè)分散的、網(wǎng)絡(luò)化的指揮通信系統(tǒng)。1969年,美國國防部高級研究計(jì)劃署ARPA資助建立了世界上第一個(gè)分組交換試驗(yàn)網(wǎng)ARPANET,連接美國四個(gè)大學(xué)。隨后各種私有小規(guī)模網(wǎng)絡(luò)蓬勃發(fā)展,從而產(chǎn)生了網(wǎng)絡(luò)互聯(lián)的需求,1980年TCP/IP研制成功,兩年后ARPANET開始采用IP。1986年美國國家科學(xué)基金會(huì)NSF資助建成了基于TCP/IP技術(shù)的主干網(wǎng)NSFNET,連接美國的若干超級計(jì)算中心、主要大學(xué)和研究機(jī)構(gòu),世界上第一個(gè)互聯(lián)網(wǎng)由此誕生。1987年我國的互聯(lián)網(wǎng)向世界發(fā)出第一封E-mail,主題是“AcrosstheGreatWallwecanreacheverycornerintheworld(越過長城,走向世界)”,1994年中國建設(shè)了CERNET示范網(wǎng)工程,這是中國第一個(gè)全國性TCP/IP互聯(lián)網(wǎng),即現(xiàn)在的教育網(wǎng)。1995年美國NSFNET開始商業(yè)化運(yùn)行,互聯(lián)網(wǎng)迅速連接到世界各地,短短30年,如今有電的地方就有計(jì)算、有計(jì)算的地方就有智能、有智能的地方就有聯(lián)網(wǎng),而且這個(gè)網(wǎng)絡(luò)上不僅僅是人和人、人和物、物和物,若一只狗和一個(gè)聊天機(jī)器人在網(wǎng)絡(luò)中愛得死去活來,則也不是讓人匪夷所思的事情了。以太網(wǎng)技術(shù)從誕生那一刻起,就注定要主宰網(wǎng)絡(luò)世界,它來自于施樂的一個(gè)先鋒研究項(xiàng)目,在1976年,梅特卡夫和他的助手DavidBoggs發(fā)表了一篇名為《以太網(wǎng):局域計(jì)算機(jī)網(wǎng)絡(luò)的分布式包交換技術(shù)》的文章。1979年,梅特卡夫成立了3Com公司,3Com對迪吉多、Intel和施樂進(jìn)行游說,希望與它們一起將以太網(wǎng)標(biāo)準(zhǔn)化、規(guī)范化,這個(gè)通用的以太網(wǎng)標(biāo)準(zhǔn)于1980年9月30日發(fā)布。當(dāng)時(shí)業(yè)界有兩個(gè)流行的非公有網(wǎng)絡(luò)標(biāo)準(zhǔn)令牌環(huán)網(wǎng)和ARCNET,在以太網(wǎng)大潮的沖擊下很快萎縮并被取代。而在此過程中,3Com也成為一個(gè)國際化的大公司。梅特卡夫曾經(jīng)開玩笑說,JerrySaltzer為3Com的成功做出了貢獻(xiàn)。Saltzer在一篇與他人合著的很有影響力的論文中指出,在理論上令牌環(huán)網(wǎng)要比以太網(wǎng)優(yōu)準(zhǔn)配置,這樣3Com才有機(jī)會(huì)從銷售以太網(wǎng)網(wǎng)卡中大賺,可惜3Com后來經(jīng)營不善,面臨破產(chǎn),其與華為合作的H3C后來在美國的干預(yù)下,被賣給了惠普,從此3Com消失在歷史的舞臺(tái)中。雖然3Com倒下了,但這并不影響以太網(wǎng)的發(fā)展,自從1982年以太網(wǎng)協(xié)議被IEEE采納成為標(biāo)準(zhǔn)以后,已經(jīng)歷了30年的風(fēng)風(fēng)雨雨。在這30年中,以太網(wǎng)技術(shù)作為局域網(wǎng)鏈路層標(biāo)準(zhǔn)戰(zhàn)勝了令牌總線、令牌環(huán)等技術(shù),成為局域網(wǎng)事實(shí)標(biāo)準(zhǔn)。以太網(wǎng)技術(shù)當(dāng)前在局域網(wǎng)范圍的市場占有率超過90%,1999年千兆以太網(wǎng)誕生,2002年萬兆以太網(wǎng)誕生,隨后萬兆以太網(wǎng)在城域網(wǎng)中也開始橫掃對手,迅速占領(lǐng)老式的同步光纖網(wǎng)的陣地。網(wǎng)絡(luò)中的第1個(gè)重要協(xié)議是Telent協(xié)議,它實(shí)現(xiàn)了兩臺(tái)計(jì)算機(jī)的點(diǎn)對點(diǎn)控制訪問;第2個(gè)重要協(xié)議是郵件協(xié)議,實(shí)現(xiàn)了人與人的網(wǎng)絡(luò)通信;第3個(gè)重要協(xié)議是文件傳輸協(xié)議,解決一臺(tái)計(jì)算機(jī)從另外一臺(tái)計(jì)算機(jī)批量獲取文件的通信要求。但這3個(gè)協(xié)議在IT界的影響力都遠(yuǎn)不如后來的HTTP,它直接造就了我們當(dāng)今的萬維網(wǎng)(WWW)。正如英文中的ABC三個(gè)字母的含義,WWW在很多人眼里是網(wǎng)絡(luò)的代表,它造就了一個(gè)前所未有的奇幻世界,讓我們一起來追憶下這個(gè)偉大物誕生的過程吧。泰德·尼爾森于1965年發(fā)起了著名的ProjectXanadu項(xiàng)目來研究超文本技術(shù),Xanadu是真正意義上的網(wǎng)絡(luò)超文本系統(tǒng),該系統(tǒng)的部分功能在20世紀(jì)80年代后期得以實(shí)現(xiàn),憑借ProjectXanadu項(xiàng)目,泰德·尼爾森被譽(yù)為超文本領(lǐng)域的先驅(qū)和萬維網(wǎng)創(chuàng)造者之一。而早在1945年,美國政府科學(xué)研究與發(fā)展辦公室主任VannevarBush就已提出了一個(gè)Memex(存儲(chǔ)擴(kuò)充器)系統(tǒng),Memex建立在這樣一種思想上,即“機(jī)械化圖書館將各種信息存儲(chǔ)在縮微膠片中,各書目之間的鏈接可以自由轉(zhuǎn)移”。盡管這一思想從未得到實(shí)現(xiàn),但Bush仍被公認(rèn)為是超文本的鼻祖,他在1945發(fā)表的論文Aswemaythink一直是一個(gè)參考標(biāo)準(zhǔn),在某種意義上,Bush在超文本發(fā)展中所起的作用相當(dāng)于圖靈對于計(jì)算機(jī)技術(shù)的貢獻(xiàn)。歷史再次印證了一個(gè)淺顯的道理:理論和思想的提出永遠(yuǎn)高于其實(shí)現(xiàn)。直到20世紀(jì)80年代后期,超文本協(xié)議仍然是熱門課題,每年都有幾百篇論文發(fā)表,但距離我們的生活還很遠(yuǎn)。直到1989年夏天的一個(gè)晚上,英國的一名天才程序員在研究所里獨(dú)自成功開發(fā)了一套程序——世界上第一個(gè)Web服務(wù)器和第一個(gè)Web客戶機(jī),他就是互聯(lián)網(wǎng)之父——提姆·伯納斯·李,因?yàn)樗慕艹鲐暙I(xiàn),我們終于步入了“Xanadu”仙境。1999年提姆·伯納斯·李在他風(fēng)靡全球的傳記《一千零一網(wǎng)》中再次提到泰德·尼爾森和他的ProjectXanadu,他在書中寫道:“網(wǎng)絡(luò)的社會(huì)化作用遠(yuǎn)遠(yuǎn)大于其在技術(shù)層面的作用。當(dāng)初我創(chuàng)立網(wǎng)絡(luò)的初衷就是發(fā)揮它的社會(huì)化作用,加強(qiáng)人們彼此協(xié)作的能力,而不是出于對技術(shù)的狂熱”。而把互聯(lián)網(wǎng)之父的話實(shí)踐到極致的國內(nèi)互聯(lián)網(wǎng)企業(yè),則非BAT三巨頭莫屬了:2013年,國內(nèi)互聯(lián)網(wǎng)100強(qiáng)企業(yè)營收總規(guī)模超過2000億元人民幣,而到了2015年,100強(qiáng)企業(yè)營收總規(guī)模就超過了7500億元人民幣!僅騰訊、阿里巴巴、百度這三家巨頭的年?duì)I收就超過了千億元人民幣。因?yàn)樵诨ヂ?lián)網(wǎng)技術(shù)上的杰出貢獻(xiàn),伯納斯·李被業(yè)界公認(rèn)為“互聯(lián)網(wǎng)之父”。他的發(fā)明改變了全球信息化的傳統(tǒng)模式,帶來了一個(gè)信息交流的全新時(shí)代。然而比他的發(fā)明更偉大的是,伯納斯·李并沒有像其他人那樣為“WWW”申請專利或限制它的使用,而是無償?shù)叵蛉澜玳_放。伯納斯·李本來可以在金錢上與蓋茨一較高低,但他的這一舉措為互聯(lián)網(wǎng)的全球化普及翻開了里程碑式的篇章,讓所有人都有機(jī)會(huì)接觸到互聯(lián)網(wǎng),也圓了那些.com公司創(chuàng)建者的富翁夢。即便如此,伯納斯·李仍然十分謙虛,總是以一種平靜的口氣回應(yīng):“我想,我沒有發(fā)明互聯(lián)網(wǎng),我只是找到了一種更好的方法?!蓖瑯邮窃?990年,微軟完善了自己的操作系統(tǒng)微軟視窗3.0,1996年微軟“全心全意”地?fù)肀Я薎ntel,于是本來很簡潔的網(wǎng)頁瀏覽器,如今成了每位界面工程師的夢魘,這么多年來無數(shù)天才程序員努力想要破解瀏覽器兼容性的難題,但面對層出不窮的JavaScript框架,我們還是經(jīng)常束手無策。即使在今天,伯納斯·李(TimBerners-Lee)的名字對于大眾來說多少還有些陌生,但對于那些互聯(lián)網(wǎng)公司的CEO們,伯納斯·李永遠(yuǎn)是他們心中的偶像。Lotus公司主席兼CEOJeffPapows這樣評價(jià)到:“伯納斯·李是這個(gè)星球上最有資格被寫入互聯(lián)網(wǎng)編年史的人物。他用自身的智慧和像父母一樣的無私為這個(gè)產(chǎn)業(yè)創(chuàng)造了另一個(gè)神話,他告訴人們網(wǎng)絡(luò)是多么美好、多么富有吸引力,又一個(gè)新事物在他的手中誕生了?!盢ovell公司CEOEricSchmidt在接受《時(shí)代》周刊采訪時(shí)表示:“如果‘計(jì)算機(jī)和互聯(lián)網(wǎng)’是一門傳統(tǒng)科學(xué)的話,那么伯納斯·李無疑將獲得一枚諾貝爾獎(jiǎng)?wù)?。?999年,伯納斯·李入選《時(shí)代》雜志20世紀(jì)最重要的100位人物。2004年4月,芬蘭技術(shù)獎(jiǎng)基金會(huì)將全球最大的科技類獎(jiǎng)“千禧年技術(shù)獎(jiǎng)”授予伯納斯·李。2012倫敦奧運(yùn)會(huì)開幕式上,伯納斯·李亮相,并打出了“ThisisforEveryone”字樣,言外之意是“互聯(lián)網(wǎng)獻(xiàn)給所有人”。作為同時(shí)代的IT英雄——富可敵國的蓋茨,還成立了慈善基金,與他人分享財(cái)富,可是人們這么描述他:“他像一只青蛙,瞪著雙眼,緊盯著浮在水面上的所有昆蟲,看準(zhǔn)時(shí)機(jī),迅即下手。這位技術(shù)的追星族,是在合適的時(shí)間和地點(diǎn)露面的天才?!盚TML作為一個(gè)有點(diǎn)年份的技術(shù),始終在不斷發(fā)展,目前HTML5已經(jīng)開始普及,相信在應(yīng)用移動(dòng)化、云化的主流方向里,會(huì)走得更遠(yuǎn),以后有沒有Windows不好說,但HTML將無所不在。世界里,TCP/IP族正是擔(dān)負(fù)起龐大帝國的默默無聞的勞動(dòng)者。不管是萬維網(wǎng)的HTML、即時(shí)通信、視頻電話、網(wǎng)絡(luò)游戲還是智能家居、物聯(lián)網(wǎng),底層都離不開TCP/IP通信。接下來,我們來了解下這個(gè)龐大族群的發(fā)展歷史。分布式系統(tǒng)的基石:TCP/IPTCP/IP(TransmissionControlProtocol/InternetProtocol,傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議)是Internet的基本協(xié)議,簡單地說,由底層的IP和TCP組成。TCP/IP的開發(fā)工作始于20世紀(jì)70年代,是用于互聯(lián)網(wǎng)的第一套協(xié)議。TCP/IP結(jié)合DNS、路由協(xié)議等一系列相關(guān)協(xié)議,最終實(shí)現(xiàn)了網(wǎng)絡(luò)之間任意兩點(diǎn)間的數(shù)據(jù)通信問題。我們來看看訪問百度首頁時(shí),數(shù)據(jù)包是如何從計(jì)算機(jī)傳送到百度的服務(wù)器上的。在命令行運(yùn)行ipconfig/all,查看到當(dāng)前計(jì)算機(jī)配置的TCP/IP參數(shù),可以看到默認(rèn)網(wǎng)關(guān)和DNS服務(wù)器的信息,如下所示。當(dāng)你在瀏覽器中輸入時(shí),瀏覽器發(fā)現(xiàn)URL的主機(jī)部分有一個(gè)域名(domainname),它就查找你的本機(jī)配置的DNS服務(wù)器2,用UDP協(xié)議向DNS服務(wù)器發(fā)送DNS查詢命令,DNS服務(wù)器獲取到查詢命令并從數(shù)據(jù)庫中查詢該域名所對應(yīng)的主機(jī)的IP地址,你可以通過在命令行運(yùn)行nslookup來完成同樣的查詢結(jié)果。下圖解釋了直到目前依然被廣泛使用的基于DNS的負(fù)載均衡機(jī)制的原理。當(dāng)瀏覽器獲知5是的IP地址時(shí),就向這個(gè)地址的80端口發(fā)起TCP連接,由于5這個(gè)地址不是計(jì)算機(jī)所在的局域網(wǎng),而是廣域網(wǎng)的一個(gè)地址,此時(shí),另外一個(gè)重要概念“路由”產(chǎn)生了。互聯(lián)網(wǎng)是多個(gè)相互隔離的小網(wǎng)絡(luò)無限延伸而組成的一個(gè)大網(wǎng),路由器負(fù)責(zé)將多個(gè)網(wǎng)絡(luò)連接,并相互交換路由表信息來確定一個(gè)IP報(bào)文要經(jīng)過哪個(gè)路由器的端口發(fā)出到另外一個(gè)互聯(lián)的子網(wǎng)。為了防止一個(gè)數(shù)據(jù)包在轉(zhuǎn)發(fā)過程中形成死循環(huán),IP包中的TTL的字段每經(jīng)過路由器轉(zhuǎn)發(fā)一次,就會(huì)減一,當(dāng)TTL為零時(shí)則被丟棄,認(rèn)為網(wǎng)絡(luò)不可達(dá),一般默認(rèn)最大跳數(shù)為30。通常情況下,只有網(wǎng)絡(luò)管理員和路由器知道一個(gè)報(bào)文應(yīng)該轉(zhuǎn)發(fā)給哪一個(gè)互聯(lián)的下一個(gè)路由器,但當(dāng)網(wǎng)絡(luò)產(chǎn)生問題以后,我們需要追蹤是哪里出了問題,此時(shí),一個(gè)必備的基礎(chǔ)工具tracert就成了排查此問題的重要工具。tracert利用ICMP協(xié)議來確定一個(gè)IP報(bào)文到達(dá)目標(biāo)地址所經(jīng)過的路由器節(jié)點(diǎn),程序發(fā)出的前3個(gè)數(shù)據(jù)包的TTL值是1,之后3個(gè)是2,依此類推,它便得到一連串?dāng)?shù)據(jù)包路徑,路徑上的每一個(gè)IP地址是一個(gè)路由器的IP。從上圖來看,包首先被發(fā)往網(wǎng)關(guān)(本機(jī)發(fā)現(xiàn)百度的IP地址不是本機(jī)所在局域網(wǎng)的網(wǎng)絡(luò),就將報(bào)文發(fā)給網(wǎng)關(guān)處理),網(wǎng)關(guān)之后繼續(xù)進(jìn)行轉(zhuǎn)發(fā)。但不幸的是遍布網(wǎng)絡(luò)的很多防火墻、路由器等設(shè)備屏蔽了ICMP報(bào)文,于是我們看到7以后的跳數(shù)都是未知的。另外,我們廣泛使用的Ping命令也是采用ICMP協(xié)議來實(shí)現(xiàn)的,因此,Ping不通主機(jī)不代表主機(jī)不是存活的,但大多數(shù)時(shí)候,兩者還是等價(jià)的,特別是在企業(yè)內(nèi)部的網(wǎng)絡(luò)中。通過上面的解釋,我們初步明白了IP報(bào)文的路由問題,接下來著名的Socket出場了。Socket是一個(gè)IP地址與端口的組合,代表計(jì)算機(jī)上的一個(gè)遠(yuǎn)程通信接口,本地的一個(gè)Socket與遠(yuǎn)程的一個(gè)Socket建立連接的過程,就是著名的3次握手過程,一旦連接建立,數(shù)據(jù)流就可以穿越網(wǎng)絡(luò)并進(jìn)行雙向通信了。以上面的例子來說,百度的Web服務(wù)器有一個(gè)進(jìn)程綁定在80端口的Socket上,用來接收我們發(fā)起的HTTP請求并將請求的響應(yīng)轉(zhuǎn)換為HTML文本流返回給瀏覽器,瀏覽器則通過解析HTML標(biāo)簽,完成可視化的頁面展現(xiàn),最終我們看到百度搜索的主頁。但實(shí)際上,這個(gè)過程還是極為復(fù)雜的,一個(gè)面向公眾的搜索服務(wù),也不是少數(shù)公司能夠?qū)崿F(xiàn)的。從無奈到崛起的CDN網(wǎng)說到我們的互聯(lián)網(wǎng),不能不提的是另一詞——“互聯(lián)互不通”,一個(gè)看似矛盾的詞,卻透漏出東方人獨(dú)有的“智慧”。2008年5月,我國電信業(yè)開始了第三次大規(guī)模重組,重組后,三業(yè)的格局自此開始發(fā)生重大變革,經(jīng)過此次重組,中國互聯(lián)網(wǎng)骨干網(wǎng)互聯(lián)單位由10了7家,分別包括3家經(jīng)營性互聯(lián)單位——中國電信、中國聯(lián)通和中國移動(dòng),4家非經(jīng)營性互聯(lián)單位——教育網(wǎng)、經(jīng)貿(mào)網(wǎng)、長城網(wǎng)和科技網(wǎng),原中國衛(wèi)通的互聯(lián)網(wǎng)資源并入中國電成了目前電信與聯(lián)通兩家獨(dú)大的局勢。是通過交換中心互聯(lián),各互聯(lián)單位之間只實(shí)現(xiàn)雙邊互聯(lián),不向?qū)Ψ教峁┕歉删W(wǎng)的穿越服個(gè)道理:網(wǎng)站越多越好,但網(wǎng)多了不是什么好事?;ヂ?lián)互不通的問題,導(dǎo)致了大家熟知的“雙線機(jī)房”這個(gè)名詞的誕生,雙線機(jī)房實(shí)際是一個(gè)機(jī)房有電信、網(wǎng)通兩條線路接入,通過雙線機(jī)房內(nèi)部路由器設(shè)置,通過BGP自動(dòng)路由的分析,實(shí)現(xiàn)電信用戶可以快速訪問電信線路,網(wǎng)通用戶可以快速訪問網(wǎng)通線路。常見的雙線機(jī)房只能解決網(wǎng)通和電信互相訪問慢的問題,其他ISP(譬如移動(dòng)網(wǎng)、教育網(wǎng)、科技網(wǎng))互通的問題還是沒有得到解決,因此后來誕生了CDN(ContentDeliveryNetwork,內(nèi)容分發(fā)網(wǎng)絡(luò)),CDN是一種基于C/S結(jié)構(gòu)的分布式媒體服務(wù)技術(shù)平臺(tái),其節(jié)點(diǎn)遍布各ISP,CDN將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)“邊緣”,訪問者就近獲取數(shù)據(jù),從而保證了網(wǎng)站到任意ISP的訪問速度,另外CDN因?yàn)槠淞髁糠至鞯礁鞴?jié)點(diǎn)的原理,天然獲得了抵抗網(wǎng)絡(luò)攻擊的能力。在運(yùn)營商方面,2000年年初,中國電信建設(shè)了自己的CDN網(wǎng)絡(luò),2004年中國電信組建了自己的CDN流媒體分發(fā)網(wǎng)絡(luò)。隨后中國電信在推廣IPTV業(yè)務(wù)時(shí),為了使用戶獲得良好的視頻業(yè)務(wù)體驗(yàn),又建設(shè)了部分CDN節(jié)點(diǎn)。目前,中國電信的CDN網(wǎng)絡(luò)一方面為電信內(nèi)部業(yè)務(wù)提供加速服務(wù),另一方面為中國電信的互聯(lián)星空,以及寬帶和IPTV業(yè)務(wù)提供良好的資源和服務(wù)保障。早在2005年,亞馬遜推出的“CloudFront”的CDN服務(wù)便為中小型客戶帶來了前所未有的便捷和實(shí)用,該服務(wù)將IDC、CDN和云計(jì)算融合,為全球的互聯(lián)網(wǎng)企業(yè)起到了示范作用。而在國內(nèi)企業(yè)市場,CDN網(wǎng)絡(luò)受到大型互聯(lián)網(wǎng)網(wǎng)站的青睞,新浪、搜狐、騰訊等大型門戶網(wǎng)站及淘寶都采用了第三方的CDN加速服務(wù)。目前,藍(lán)汛、網(wǎng)宿是國內(nèi)領(lǐng)先的CDN服務(wù)提供商,建設(shè)了遍布全國范圍的CDN網(wǎng)絡(luò)節(jié)點(diǎn)。隨著云計(jì)算技術(shù)的發(fā)展,CDN又有了新的發(fā)展方向:虛擬化技術(shù)的采用,使得CDN系統(tǒng)可以根據(jù)用戶需要快速調(diào)整服務(wù)器的設(shè)備數(shù)量和處理能力,可以提升資源配置能力和優(yōu)化部署方法;將云存儲(chǔ)引用到CDN的邊緣節(jié)點(diǎn)和中心節(jié)點(diǎn),利用云計(jì)算的虛擬化,實(shí)現(xiàn)文件動(dòng)態(tài)分布存儲(chǔ),這需要邊緣域與中心域的全部服務(wù)器資源的設(shè)備相互配合,從而根據(jù)文件訪問的頻率和用戶需求自動(dòng)調(diào)整存儲(chǔ),而高清視頻存儲(chǔ)的成功應(yīng)用表明了云存儲(chǔ)適合大文件的讀取密集型訪問的特點(diǎn)完全符合CDN的應(yīng)用需求;采用了云計(jì)算技術(shù)的CDN系統(tǒng)還具備智能化的日志處理能力,可以綜合運(yùn)用統(tǒng)計(jì)分析、數(shù)據(jù)挖掘及時(shí)跟進(jìn)用戶的需求,有針對性地進(jìn)行資源調(diào)配;如果在CDN系統(tǒng)的邊緣節(jié)點(diǎn)部署分布式的云系統(tǒng)架構(gòu),則能夠?qū)Σ杉暮A糠墙Y(jié)構(gòu)化數(shù)據(jù)進(jìn)行并行處理,從而使整個(gè)系統(tǒng)具備強(qiáng)大的大數(shù)據(jù)處理能力和更優(yōu)化的擴(kuò)展性。這是一個(gè)最好的時(shí)代互聯(lián)網(wǎng)時(shí)代造就了一批新的IT巨頭,同時(shí)終結(jié)了一些傳統(tǒng)的IT巨頭和相關(guān)企業(yè),并正在深入地改變著越來越多的行業(yè),極大地影響著我們的生活。若有一天,Google的無人駕駛飛機(jī)在你家門口投下一個(gè)來自非洲的包裹,然后機(jī)艙里一個(gè)操著四川口音的卡哇伊機(jī)器人拿著Android相機(jī)向你打招呼:“嘿,帥老頭,你的粉絲給你寄來的禮物,抬頭笑一個(gè),簽收吧!”你也不必驚訝,這就是互聯(lián)網(wǎng),一個(gè)神奇的世界!這個(gè)世界目前被新勢力所主宰,它們是Google、蘋果、亞馬遜和FaceBook。在它們之前,世界上從未有過成長這么快、普及面這么廣的公司:蘋果成了資本主義的龐然大物,市值占了標(biāo)準(zhǔn)普爾500的4.3%、全球證券市場的1.1%,使用該公司iTunes網(wǎng)上商店的有4.25億人,iPhone手機(jī)銷售超過5億臺(tái);Google是全球搜索及在線廣告方面無可爭議的領(lǐng)先者,其安卓軟件驅(qū)動(dòng)著世界上80%以上的智能手機(jī);亞馬遜則統(tǒng)治了多個(gè)國家的在線零售及電子圖書市場,其不事聲張的云計(jì)算業(yè)務(wù)目前沒有對手;FaceBook當(dāng)前的月活躍用戶量超過10億,若這是一個(gè)國家的話,則人數(shù)位居世界第三。而當(dāng)今最領(lǐng)先的分布式架構(gòu)的基礎(chǔ)技術(shù)的研發(fā)和應(yīng)用,多來自這幾個(gè)巨頭:Hadoop來自Google;Thrift來自FaceBook;當(dāng)今影響力最大的開源IaaS云平臺(tái)OpenStack大量借鑒了亞馬遜的AWS;iCloud云系統(tǒng)是蘋果目前運(yùn)營的最先進(jìn)的耗資巨大的系統(tǒng),據(jù)說這個(gè)系統(tǒng)是國人捐獻(xiàn)的,大部分資金來自iPhone手機(jī)銷售所得。個(gè)體的渺?。晃覀儫o法割舍網(wǎng)絡(luò),我們又難以把握平衡。相對于分布式技術(shù)中的其他部式架構(gòu)和云計(jì)算的領(lǐng)域里做到游刃有余,談笑間,Bug灰飛煙滅。求神賜我萬能銀彈,求神賜我尚方寶劍,讓我威震所有藐視我者,如若不能,請賜我一個(gè)不會(huì)被屏蔽的Google網(wǎng)址。——Leader-us第2章“知識(shí)木桶”中的短板——網(wǎng)絡(luò)基礎(chǔ)如果沒有網(wǎng)絡(luò),就沒有所謂的分布式系統(tǒng)。網(wǎng)絡(luò)之于分布式系統(tǒng),就好像雙翼之于飛鳥,江河之于大海。雖然網(wǎng)絡(luò)這么重要,但有趣的是,我們中的大多數(shù)軟件工程師和系統(tǒng)架構(gòu)師,甚至于公司里最強(qiáng)的技術(shù)達(dá)人,都缺乏必要的網(wǎng)絡(luò)知識(shí)和技能,也很少有人真正重視它們。所以,在虛擬化、云計(jì)算和大數(shù)據(jù)這些新技術(shù)不斷涌現(xiàn)的當(dāng)下,我們忽然發(fā)現(xiàn),原來我們的“知識(shí)木桶”中最短的一塊木板就是網(wǎng)絡(luò)知識(shí),因?yàn)椴欢W(wǎng)絡(luò),所以,我們束手無策。即使高手也不大懂的網(wǎng)絡(luò)為了更加感性地理解網(wǎng)絡(luò),讓我們從我們所處的這個(gè)“國際互聯(lián)網(wǎng)”開始說起吧。如下所示是國際互聯(lián)網(wǎng)的一個(gè)示意圖,這是一個(gè)分層匯聚網(wǎng)絡(luò),位于頂端的是“國際骨干網(wǎng)”,負(fù)責(zé)連接各個(gè)國家的“國家骨干網(wǎng)”,而重要的一些大國之間則又有直達(dá)通道。對于每個(gè)獨(dú)立的“國家”來說,其內(nèi)部通常有一個(gè)全國性的高速“國家骨干網(wǎng)”貫穿全國,這個(gè)骨干網(wǎng)只能在某些點(diǎn)上對接“國際骨干網(wǎng)”,同時(shí)它負(fù)責(zé)將分布在各個(gè)城市里的“城域網(wǎng)”連接起來,而每個(gè)“城域網(wǎng)”則負(fù)責(zé)將本區(qū)域眾多“園區(qū)網(wǎng)”接入進(jìn)來,這些“園區(qū)網(wǎng)”可以是省內(nèi)某些高新產(chǎn)業(yè)園的網(wǎng)絡(luò)、一些大的IT公司的網(wǎng)絡(luò)等。正是通過這樣一層層的匯聚接入模式,實(shí)現(xiàn)了全球龐大的互聯(lián)網(wǎng)網(wǎng)絡(luò)。首先,我們來說說位于頂端的“國際骨干網(wǎng)”。為了將地球上的各個(gè)大洲互聯(lián),人類建設(shè)了很多海底光纜,可以說海底光纜構(gòu)成了“國際骨干網(wǎng)”骨架,而一國海底光纜的數(shù)量,也代表著一國與國際互聯(lián)網(wǎng)聯(lián)系的密切程度。下圖給出了這些海底光纜與登錄站的位置(2015年版)。從這個(gè)圖里,我們看到,美國才是國際互聯(lián)網(wǎng)的中心,它周邊有最為豐富的海底光纜,直達(dá)各個(gè)大洲。而中國即使要訪問俄羅斯的網(wǎng)站,也需要繞一個(gè)很大的彎(如果不信,可以Traceroute俄羅斯網(wǎng)站試試,看看經(jīng)過哪些國家的IP地址),這是因?yàn)橹袊箨懙貐^(qū)的海底光纜連接點(diǎn)只有三個(gè):青島、上海和汕頭,總共只有6條光纜通向全球,好處是非常容易對出入境的信息進(jìn)行控制。接下來,我們來分析下“國家骨干網(wǎng)”。以中國為例,中國的全國性骨干網(wǎng)是CHINANET,它是前郵電部經(jīng)營管理的網(wǎng)絡(luò),1995年年初與國際互聯(lián)網(wǎng)連通并向社會(huì)提供服務(wù)。類似“國際互聯(lián)網(wǎng)”的架構(gòu),CHINANET網(wǎng)絡(luò)也是分層網(wǎng)絡(luò),由“骨干網(wǎng)”和“匯接層”兩部分組成,其中,“骨干網(wǎng)”層則是用來連接各省(區(qū))的城域網(wǎng)。CHINANET骨干網(wǎng)由8個(gè)核心節(jié)點(diǎn)所組成,這8個(gè)核心節(jié)點(diǎn)分別是北京、上海、廣州、沈陽、南京、武漢、成都、西安。毫無懸念,“北上廣”3個(gè)節(jié)點(diǎn)成為了“超級節(jié)點(diǎn)”,同時(shí)是CHINANET網(wǎng)的3個(gè)國際出口,這3個(gè)超級節(jié)點(diǎn)之間形成大三角電路,而其他5則與每個(gè)超級節(jié)點(diǎn)互聯(lián),如下圖所示。為了保證國內(nèi)企業(yè)用戶訪問國外網(wǎng)站的速度和帶寬,中國電信后來啟動(dòng)了另外一個(gè)精品網(wǎng)絡(luò),即CN2網(wǎng)絡(luò),從下圖中我們看到CN2網(wǎng)絡(luò)專門增加了海外直連線路,以保證海外站點(diǎn)的帶寬和品質(zhì)。接下來我們說說CHINANET的“匯接層”網(wǎng)絡(luò),這一層由54個(gè)匯接節(jié)點(diǎn)組成,除甘肅、山西、新疆、寧夏、貴州、青海、西藏、內(nèi)蒙古等8個(gè)省份的單匯接節(jié)點(diǎn)外,每個(gè)省都有兩匯聚接入CHINANET的網(wǎng)絡(luò)示意圖。最后,我們來說說“城域網(wǎng)”。城域網(wǎng)也是一個(gè)分層匯聚網(wǎng)絡(luò),由于城域網(wǎng)主要用來提供寬帶接入服務(wù),因此存在一種特殊設(shè)備,即寬帶遠(yuǎn)程接入服務(wù)器BRAS(BroadbandRemoteAccessServer),它是用來完成各種寬帶接入方式的寬帶網(wǎng)絡(luò)用戶的接入、認(rèn)證、計(jì)費(fèi)、控制、管理的網(wǎng)絡(luò)設(shè)備,是寬帶網(wǎng)絡(luò)可運(yùn)營、可管理的基石。我們?nèi)绻诩疑暇W(wǎng),通常會(huì)通過當(dāng)?shù)啬硞€(gè)寬帶運(yùn)營商的網(wǎng)絡(luò)接入城域網(wǎng)里,最終實(shí)現(xiàn)“全球互聯(lián)”,這是我們大家都熟悉的方式。另一方面,我們開發(fā)的互聯(lián)網(wǎng)應(yīng)用被部署到IDC機(jī)房里的某個(gè)服務(wù)器上,從而完成了應(yīng)用互聯(lián)網(wǎng)的接入。由于IDC機(jī)房與我們所開發(fā)的分布式應(yīng)用密切相關(guān),所以,接下來我們一起了解IDC機(jī)房的相關(guān)知識(shí)。IDC機(jī)房又被稱為互聯(lián)網(wǎng)數(shù)據(jù)中心(InternetDataCenter)或者數(shù)據(jù)中心,IDC不僅是數(shù)據(jù)存儲(chǔ)的中心,還是數(shù)據(jù)流通的中心。IDC機(jī)房是標(biāo)準(zhǔn)化的電信專業(yè)級機(jī)房,為企業(yè)、政府提供服務(wù)器托管、租用及相關(guān)增值等方面的全方位服務(wù)。一開始,IDC機(jī)房主要是電信、聯(lián)通等運(yùn)營商建設(shè)的,后來很多企業(yè)也有了自己的IDC機(jī)房,BAT都自建IDC機(jī)房,比如騰訊先后自建了深圳寶安、深圳騰大、天津三個(gè)IDC機(jī)房。由于2002年5月國內(nèi)電信業(yè)大重組,原中國電信北方10個(gè)省份正式劃入中國網(wǎng)通集團(tuán),南方21個(gè)省份重組為新的中國電信。這次“大分家”國特色的“互聯(lián)互不通”,這樣直接導(dǎo)致了國內(nèi)的IDC機(jī)房往往具備雙線接入這一奇特特性。如下所示是IDC機(jī)房的網(wǎng)絡(luò)架構(gòu)圖,一般分為出口路由區(qū)、核心交換區(qū)、接入網(wǎng)絡(luò)區(qū)及增值業(yè)務(wù)區(qū)四個(gè)區(qū)域。出口路由區(qū)的主要功能是作為IDC機(jī)房的出口,與國干網(wǎng)(CHINANET骨干網(wǎng))和本身的城域網(wǎng)互聯(lián),完成外部網(wǎng)絡(luò)和IDC內(nèi)網(wǎng)的三層互通,通常由兩臺(tái)CR路由器組成。對于某些大型省份,通常會(huì)建設(shè)多個(gè)IDC機(jī)房,若每個(gè)IDC機(jī)房之間都與國干網(wǎng)和城域網(wǎng)互聯(lián),則會(huì)浪費(fèi)國干網(wǎng)和城域網(wǎng)設(shè)備的端口資源和線路資源,因此通常會(huì)再建設(shè)一個(gè)路由骨干層網(wǎng)絡(luò)。骨干層中的兩臺(tái)CR路由器直接與國干網(wǎng)和城域網(wǎng)互聯(lián),各機(jī)房IDC出口CR路由器則與骨干層出口路由器互聯(lián)。核心交換區(qū)則由一組核心交換機(jī)組成,作為接入層與出口路由區(qū)的互聯(lián)設(shè)備,起到匯聚流量的作用,同時(shí)IDC內(nèi)部流量互通也可以通過核心交換機(jī)完成。在云計(jì)算業(yè)務(wù)興起平化組網(wǎng),不再設(shè)置匯聚層。而為了實(shí)現(xiàn)高密接入,核心交換機(jī)通常采用數(shù)據(jù)中心級設(shè)備,具有高吞吐、大緩存等特點(diǎn),同時(shí)通過IRF2網(wǎng)絡(luò)虛擬化技術(shù),將多臺(tái)核心交換機(jī)虛擬成一臺(tái),既提高接入密度,又方便管理。接入網(wǎng)絡(luò)區(qū)下連物理服務(wù)器,上連核心交換機(jī),主要部署千兆或萬兆交換機(jī)。由于密接入。當(dāng)前,在IDC網(wǎng)絡(luò)中,接入交換機(jī)通常以TOR方式在每個(gè)機(jī)柜部署兩臺(tái),實(shí)現(xiàn)本機(jī)柜的服務(wù)器接入。接入交換機(jī)通常采用千兆下行(連接服務(wù)器)、萬兆上行(交換機(jī))的連接方式,并通過IRF2技術(shù)進(jìn)行虛擬化部署。增值業(yè)務(wù)區(qū)部署與增值業(yè)務(wù)相關(guān)的設(shè)備,包括防火墻、IPS、負(fù)載均衡等設(shè)備。這些增值業(yè)務(wù)區(qū)處理。對于云主機(jī)等業(yè)務(wù),由于規(guī)劃使用私網(wǎng)IP網(wǎng)段,因此必須使用防火墻實(shí)現(xiàn)NAT轉(zhuǎn)換,該防火墻設(shè)備通常也以旁掛方式部署在核心交換機(jī)上。IDC機(jī)房里通常采用傳統(tǒng)的VLAN技術(shù)實(shí)現(xiàn)租戶網(wǎng)絡(luò)的隔離,VLAN基于IEEE的802.1Q協(xié)議,在該協(xié)議的幀格式里面定義了VLANID的位數(shù)為12比特,因此最多只能支持4094個(gè)VLAN。而隨著云數(shù)據(jù)中心的各種業(yè)務(wù)應(yīng)用的規(guī)模落地,業(yè)務(wù)量不斷增長,就可能需要成千上萬個(gè)VLAN,傳統(tǒng)VLAN的數(shù)量不能滿足云數(shù)據(jù)中心日后業(yè)務(wù)規(guī)模發(fā)展的需求。另級的增加,與之對應(yīng)的虛擬機(jī)虛擬網(wǎng)卡的MAC地址數(shù)量也相應(yīng)增加,這對云數(shù)據(jù)中心接MAC地址表溢出,從而導(dǎo)致數(shù)據(jù)幀的丟棄或者產(chǎn)生大量的廣播幀,嚴(yán)重影響網(wǎng)絡(luò)的性能。最后,云數(shù)據(jù)中心中虛擬機(jī)通常需要在一定范圍內(nèi)遷移,在傳統(tǒng)的VLAN網(wǎng)絡(luò)下,虛擬機(jī)只能在二層網(wǎng)絡(luò)下遷移,并且為了能夠支持虛擬機(jī)的遷移,需要在二層網(wǎng)絡(luò)中對VLAN進(jìn)行預(yù)配置,這造成了VLAN配置混亂,影響了VLAN廣播域的隔離,降低了網(wǎng)絡(luò)的效率。VXLAN(VirtualeXtensibleLocalAreaNetwork)虛擬擴(kuò)展局域網(wǎng)是一種“VLAN升級技術(shù)”,它是一種大二層虛擬網(wǎng)絡(luò)擴(kuò)展的隧道封裝技術(shù),可以很好地解決上述問題,目前該技術(shù)已經(jīng)成為各種規(guī)?;\(yùn)營的云數(shù)據(jù)中心不可忽視的關(guān)鍵應(yīng)用技術(shù)。VXLAN是VMware、思科、Arista、Broadcom、Citrix和RedHat共同提出的IETF草案,可以通過軟件的方式來實(shí)現(xiàn)支持,其中最重要的開源軟件交換機(jī)是OpenvSwitch,它也是虛擬化網(wǎng)絡(luò)解決方案中最重要的一個(gè)開源軟件,OpenStack、Docker都可以用它實(shí)現(xiàn)虛擬網(wǎng)絡(luò)。NIO,一本難念的經(jīng)我們知道,分布式系統(tǒng)的基礎(chǔ)是網(wǎng)絡(luò)。因此,網(wǎng)絡(luò)編程始終是分布式軟件工程師和架構(gòu)師的必備高端基礎(chǔ)技能之一,而且隨著當(dāng)前大數(shù)據(jù)和實(shí)時(shí)計(jì)算技術(shù)的興起,高性能RPC框架與網(wǎng)絡(luò)編程技術(shù)再次成為焦點(diǎn)。不管是RPC領(lǐng)域的ZeroCIce、Thrift,還是經(jīng)典分布式框架Actor模型中的Akka,或者實(shí)時(shí)流領(lǐng)域的Storm、Spark,又或者開源分布式數(shù)據(jù)庫中的Mycat、VoltDB,這些高大上產(chǎn)品的底層通信技術(shù)都采用了NIO(非阻塞通信)通信技術(shù)。而Java領(lǐng)域里大名鼎鼎的NIO框架——Netty,則被眾多的開源項(xiàng)目或商業(yè)軟件所采用。相對于它的老前輩BIO(阻塞通信)來說,NIO模型非常復(fù)雜,以至于苦學(xué)了很久以后也很少有人能夠精通它,難以編寫出一個(gè)沒有缺陷、高效且適應(yīng)各種意外情況的穩(wěn)定的NIO通信模塊。之所以會(huì)出現(xiàn)這樣的問題,是因?yàn)镹IO編程不是單純的一個(gè)技術(shù)點(diǎn),而是涵蓋年,也仍然不大懂NIO,這不怪你,只怪當(dāng)初Sun那幫精英架構(gòu)師高估了我們這幫“混飯吃”的普通程序員。于是后來,Sun又來了一波架構(gòu)師,弄了一套先進(jìn)的AIO(異步通信)模型,這套編程框架看起來很美,真正體現(xiàn)了“簡單即美”的設(shè)計(jì)理念。但很可惜的是Linux里的AIO模塊半死不活地停滯在那里好多年,所以,這么美好又簡單還能體現(xiàn)我們程序員高水平的新技術(shù),就這么遺憾地待字閨中。JavaNIO雖然提供了非阻塞的網(wǎng)絡(luò)通信編程框架,但它的設(shè)計(jì)帶來了很多編程難題。難懂的ByteBufferJavaNIO拋棄了我們所熟悉的Stream、byte[]等數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)了一個(gè)全新的數(shù)據(jù)結(jié)構(gòu)的主要使用場景是保存從Socket中讀取的輸入字節(jié)流,并循環(huán)利用,以降低GC的壓力。第一眼看到它的廣告介紹后,你會(huì)感覺它功能強(qiáng)大,美不勝收,作為一個(gè)單純的程序員,你可能會(huì)瞬間愛上它,但當(dāng)你認(rèn)真地去學(xué)習(xí)它的API時(shí),你可能就把自己搞暈了。以經(jīng)典的Echo服務(wù)器為例,其核心是讀入客戶端發(fā)來的數(shù)據(jù),并且回寫給客戶端,這段代碼用ByteBuffer來實(shí)現(xiàn),大致就是下面的邏輯:byteBuffer=ByteBuffer.allocate(N);//讀取數(shù)據(jù),寫入byteBufferreadableByteChannel.read(byteBuffer);//讀取byteBuffer,寫入ChannelwritableByteChannel.write(byteBuffer);如果你一眼就發(fā)現(xiàn)了上述代碼中存在一個(gè)嚴(yán)重缺陷且無法正常工作,那么說明你可能的確精通了ByteBuffer的用法。這段代碼的缺陷是在第6行之前少了一個(gè)byteBuffer.flip()調(diào)用。之所以ByteBuffer會(huì)設(shè)計(jì)一個(gè)這樣奇怪名字的Method,是因?yàn)樗c我們所熟悉的InputStream&OutStream分別操作輸入輸出流的傳統(tǒng)I/O設(shè)計(jì)方式不同,它是“二合一”的設(shè)計(jì)方式。我們可以把ByteBuffer設(shè)想成內(nèi)部擁有一個(gè)固定長度byte數(shù)組的對象,屬性capacity為數(shù)組的長度(不可變),position變量保存當(dāng)前讀(或?qū)懀┑奈恢?,limit變量為當(dāng)前可讀或可寫的位置上限。當(dāng)byte被寫入到ByteBuffer中的時(shí)候,position++,而0到position之間的字符就是已經(jīng)寫入的字符。如果后面要讀取之前寫入的這些字符,則需要將position重置為0,而limit則被設(shè)置為之前position的值,這個(gè)操作恰好就是flip要做的事情,這樣一來,從postion到limit之間的字符剛好是要讀的全部數(shù)據(jù)。ByteBuffer有三種實(shí)現(xiàn)方式:第一種是堆內(nèi)存儲(chǔ)數(shù)據(jù)的HeapByteBuffer;第二種是堆外存儲(chǔ)數(shù)據(jù)的DirectByteBuffer;最后一種是文件映射(數(shù)據(jù)存儲(chǔ)到文件中)的MappedByteBuffer。HeapByteBuffer是將數(shù)據(jù)保存在JVM堆內(nèi)存中,我們知道64位JVM的堆內(nèi)存最大為32GB時(shí)候的內(nèi)存利用率最高,一旦堆超過了32GB,你就進(jìn)入到64位的世界里了,應(yīng)用程序的可用堆的空間就會(huì)減小。另外,過大的JVM堆內(nèi)存也容易導(dǎo)致復(fù)雜的GC問題,因此最好的辦法是采用堆外內(nèi)存,堆外內(nèi)存的管理由程序員自己控制,類似C語言的直接內(nèi)存管理,而DirectByteBuffer就是采用堆外內(nèi)存來存放數(shù)據(jù)的,因此在訪問性能提升的同時(shí)帶來了復(fù)雜的動(dòng)態(tài)內(nèi)存管理問題。而動(dòng)態(tài)內(nèi)存管理是一項(xiàng)高端編程技術(shù),涵蓋了內(nèi)存分配性能、內(nèi)存回收、內(nèi)存碎片化、內(nèi)存利用率等一系列復(fù)雜問題。面對內(nèi)存分配性能這個(gè)問題,我們通常會(huì)在Java里采用ThreadLocal對象來實(shí)現(xiàn)多線程本地化分配的思路,即每個(gè)線程擁有一個(gè)ThreadLocal類型的ByteBufferPool,然后每個(gè)線程管理各自的內(nèi)存分配和回收問題,避免共享資源導(dǎo)致的競爭問題。下面這段來自大名鼎鼎的GrizzyNIO框架中的ByteBufferThreadLocalPool,就采用了ThreadLocal結(jié)合ByteBuffer視圖的動(dòng)態(tài)內(nèi)存管理技術(shù)。上面的代碼很簡單也很經(jīng)典,可以分配任意大小的內(nèi)存塊,但存在一個(gè)問題,即它只能從的當(dāng)前位置持續(xù)往下分配空間,而中間被回收的內(nèi)存塊是無法立即被分配的,因此內(nèi)存利用率不高。另外,當(dāng)后面分配的內(nèi)存沒有被及時(shí)釋放的時(shí)候,會(huì)發(fā)生內(nèi)存溢出,即使前面分配的內(nèi)存早已釋放大半。其實(shí)上述問題可以通過一個(gè)環(huán)狀的結(jié)構(gòu)(Ring)來解決,即分配到頭以后,回頭重新繼續(xù)分配,但代碼會(huì)稍微復(fù)雜點(diǎn)。Netty則采用了另外一種思路。首先,Netty的作者認(rèn)為JDK的ByteBuffer設(shè)計(jì)得并不好,其中ByteBuffer不能繼承,以及API難用、容易出錯(cuò)是最大的兩個(gè)問題,于是他重新設(shè)計(jì)了一個(gè)接口ByteBuf來替代官方的ByteBuffer。如下所示是ByteBuffer的設(shè)計(jì)示意圖,它通過分離讀寫的位置變量(readerindex及writerindex)簡單、有效地解決了ByteBuffer難懂的flip操作問題,這樣一來ByteBuf也可以實(shí)現(xiàn)同時(shí)讀與寫的功能了。由于ByteBuf是一個(gè)接口,所以可以繼承與擴(kuò)展,為了實(shí)現(xiàn)分配任意長度的Buffer,Netty設(shè)計(jì)了一個(gè)CompositeByteBuf實(shí)現(xiàn)類,它通過組合多個(gè)ByteBuf實(shí)例的方式巧妙實(shí)現(xiàn)了動(dòng)態(tài)擴(kuò)容能力,這種組合擴(kuò)容的方式存在一個(gè)讀寫效率問題,即要判斷當(dāng)前的讀寫位置是否要移到下一個(gè)ByteBuf實(shí)例上。Netty的ByteBuf實(shí)例還有一個(gè)很重要的特征,即記錄了被引用的次數(shù),所有實(shí)例都繼承自AbstractReferenceCountedByteBuf。這點(diǎn)非常重要,因?yàn)槲覀冊趯?shí)現(xiàn)ByteBufPool時(shí),需要確保ByteBuf被正確地釋放和回收,由于官方的ByteBuffer缺乏這一特征,因此很容易因?yàn)槭褂貌划?dāng)導(dǎo)致內(nèi)存泄露或者內(nèi)存訪問錯(cuò)誤的嚴(yán)重Bug。由于使用ByteBuffer時(shí)用得最多的是堆外DirectByteBuffer,因此一個(gè)功能齊全、高效的BufferPool對于NIO來說相當(dāng)重要,官方JDK并沒有提供這樣的工具包,于是Netty的作者順便也把這部分功能實(shí)現(xiàn)了,基于ByteBuf實(shí)現(xiàn)了一套可以在Netty之外單獨(dú)使用的BufferPool框架,如下圖所示。我們再來說說MappedByteBuffer,說得通俗一點(diǎn)就是Map把一個(gè)磁盤文件(整體或部分內(nèi)容)映射到計(jì)算機(jī)虛擬內(nèi)存的一塊區(qū)域,這樣就可以直接操作內(nèi)存當(dāng)中的數(shù)據(jù),而無須每次都通過I/O從物理硬盤上讀取文件,所以在效率上有很大提升。想要真正理解MappedByteBuffer的原理和價(jià)值,需要掌握一點(diǎn)操作系統(tǒng)內(nèi)存、文件系統(tǒng)、內(nèi)存頁與內(nèi)存交換的基本知識(shí)。如下圖所示,每個(gè)進(jìn)程有一個(gè)虛擬地址空間,也被稱為邏輯內(nèi)存地址,其大小由該系統(tǒng)上的地址大小規(guī)定,比如32位Windows的單進(jìn)程可尋址空間是4GB,虛擬地址空間也使用分頁機(jī)制,即我們所說的內(nèi)存頁面。當(dāng)一個(gè)程序嘗試使用虛擬地址訪問內(nèi)存時(shí),操作系統(tǒng)連同硬件會(huì)將該分頁的虛擬地址映射到某個(gè)具體的物理位置,這個(gè)位置可以是物理RAM、頁面文件(Pagefile是Windows的說法,對應(yīng)Linux下的swap)或文件系統(tǒng)中的一個(gè)普通文件。盡管每個(gè)進(jìn)程都有其自己的地址空間,但程序通常無法使用所有這些空間,因?yàn)榈刂房臻g被劃分為內(nèi)核空間和用戶空間。大部分操作系統(tǒng)將每個(gè)進(jìn)程地址空間的一部分映射到一個(gè)通用的內(nèi)核內(nèi)存區(qū)域。被映射來供內(nèi)核使用的地址空間部分被稱為內(nèi)核空間,其余部分被稱為用戶空間,可供用戶應(yīng)用程序使用。MappedByteBuffer使用mmap系統(tǒng)調(diào)用來實(shí)現(xiàn)文件內(nèi)存映射過程,如下圖中的過程1所示。此外,在內(nèi)存映射的過程中,只是邏輯上被放入了內(nèi)存,具體到代碼,就是建立并初始化了相關(guān)的數(shù)據(jù)結(jié)構(gòu)(structaddress_space),并沒有實(shí)際的數(shù)據(jù)復(fù)制,文件沒有被載入內(nèi)存,所以建立內(nèi)存映射的效率很高。僅僅當(dāng)此文件的內(nèi)容要被訪問的時(shí)候,才會(huì)觸發(fā)操作系統(tǒng)加載內(nèi)存頁,這個(gè)過程中可能涉及當(dāng)物理內(nèi)存不足時(shí)內(nèi)存交換的問題,即過程4。通過上面的原理分析,我們就不難理解JDK中關(guān)于MappedByteBuffer的一些方法的作用了。fore():當(dāng)緩沖區(qū)是READ_WRITE模式時(shí),此方法對緩沖區(qū)內(nèi)容的修改強(qiáng)行寫入文件。load():將緩沖區(qū)的內(nèi)容載入內(nèi)存,并返回該緩沖區(qū)的引用。isLoaded()MappedByteBuffer的主要使用場景有如下兩個(gè)?;谖募蚕淼母咝阅苓M(jìn)程間通信(IPC)。大文件高性能讀寫訪問。正因?yàn)樯鲜鰞蓚€(gè)獨(dú)特的使用場景,MappedByteBuffer有很多高端應(yīng)用,比如Kafka采用MappedByteBuffer來處理消息日志文件,而來自伯克利分校的AMPLab開發(fā)的分布式文件系統(tǒng)Tachyon也采用了MappedByteBuffer加速文件讀寫。高性能IPC通信技術(shù)在當(dāng)前大數(shù)據(jù)和實(shí)時(shí)計(jì)算方面越來越重要,原因很簡單,當(dāng)前服務(wù)器的核心數(shù)越來越多,而且都支持NUMA技術(shù),在這種情況下,單機(jī)上的多進(jìn)程架構(gòu)能最大地提升系統(tǒng)的整體吞吐量。于是,國外有人基于MappedByteBuffer實(shí)現(xiàn)了一個(gè)DEMO性質(zhì)的高性能IPC通信例子,項(xiàng)目地址為/caplogic/Mappedbus,其作者受到了Java高性能編程領(lǐng)域的大神peter-lawrey的著名項(xiàng)目JavaChronicle的啟發(fā),也采用了內(nèi)存映射文件來實(shí)現(xiàn)Java多進(jìn)程間的數(shù)據(jù)通信,其原理圖如下所示。一個(gè)進(jìn)程負(fù)責(zé)寫入數(shù)據(jù)到內(nèi)存映射文件中,其他進(jìn)程(不限于Java)則從此映射文件中讀取數(shù)據(jù),經(jīng)筆者測試,采用這種方式的性能極高,在筆者的筆記本計(jì)算機(jī)上可以達(dá)到每秒4000萬的傳輸速度,消息延遲僅僅只有25ns。受此項(xiàng)目的啟發(fā),筆者也發(fā)起了一個(gè)更為完善的IPC開源框架,項(xiàng)目地址為/MyCATApache/Mycat-IPC,此項(xiàng)目的關(guān)鍵點(diǎn)在于用一個(gè)MappedByteBuffer模擬了N組環(huán)形隊(duì)列的數(shù)據(jù)結(jié)構(gòu),用來表示一個(gè)進(jìn)程發(fā)送或者讀取的消息隊(duì)列。如下所示是MappedByteBuffer內(nèi)存結(jié)構(gòu)圖,內(nèi)存起始位置記錄了當(dāng)前定義的幾個(gè)RingQueue,隨后記錄每個(gè)RingQueue的長度以確定其開始內(nèi)存地址與結(jié)束內(nèi)存地址,RingQueue類似ByteBuffer的設(shè)計(jì),有記錄讀寫內(nèi)存位置的變量,而放入隊(duì)列的每個(gè)“消息”都有兩個(gè)字節(jié)的長度、消息體本身,以及下個(gè)消息的開始位置Flag(繼續(xù)當(dāng)前位置還是已經(jīng)掉頭、從頭開始)。筆者計(jì)劃未來將Mycat拆成多進(jìn)程的架構(gòu),一個(gè)進(jìn)程負(fù)責(zé)接收客戶端的Socket請求,然后把數(shù)據(jù)通過IPC框架分發(fā)給后面幾個(gè)獨(dú)立的進(jìn)程去處理,處理完的響應(yīng)再通過IPC傳回給Socket監(jiān)聽進(jìn)程,最終寫入客戶端。MappedByteBuffer還有另外一個(gè)奇妙的特性,“零復(fù)制”傳輸數(shù)據(jù),它的transferTo方法能節(jié)省一次緩沖區(qū)的復(fù)制過程,直接寫入另外一個(gè)Channel通道上,如下圖所示。Netty傳輸文件的邏輯就用到了transferTo這一特性,下面的代碼片段給出了真相:晦澀的“非阻塞”NIO里“非阻塞”(NoneBlocking)這個(gè)否定式的新名稱對于大多數(shù)程序員來說的確很難理解,就好像他們很難理解妹子們多變的心情一樣。即便如此,我們還是要硬著頭皮去弄懂它,否則,高薪是很難有的,而沒有高薪,再容易理解的妹子也會(huì)離開。不去想詩與遠(yuǎn)方了,在筆者解釋“非阻塞”這個(gè)概念之前,讓我們先來惡補(bǔ)一下TCP/IP通信的基礎(chǔ)知識(shí)。首先,對于TCP通信來說,每個(gè)TCPSocket在內(nèi)核中都有一個(gè)發(fā)送緩沖區(qū)和一個(gè)接收緩沖區(qū),TCP的全雙工的工作模式及TCP的滑動(dòng)窗口便依賴于這兩個(gè)獨(dú)立的Buffer及此Buffer的填充狀態(tài)。接收緩沖區(qū)把數(shù)據(jù)緩存入內(nèi)核,若應(yīng)用進(jìn)程一直沒有調(diào)用Socket的read方法進(jìn)行讀取的話,則此數(shù)據(jù)會(huì)一直被緩存在接收緩沖區(qū)內(nèi)。不管進(jìn)程是否讀取Socket,對端發(fā)來的數(shù)據(jù)都會(huì)經(jīng)由內(nèi)核接收并且緩存到Socket的內(nèi)核接收緩沖區(qū)中。read所做的工作,就是把內(nèi)核接收緩沖區(qū)中的數(shù)據(jù)復(fù)制到應(yīng)用層用戶的Buffer里面,僅此而已。進(jìn)程調(diào)用Socket的send發(fā)送數(shù)據(jù)的時(shí)候,最簡單的情況(也是一般情況)是將數(shù)據(jù)從應(yīng)用層用戶的Buffer里復(fù)制到Socket的內(nèi)核發(fā)送緩沖區(qū)中,然后send便會(huì)在上層返回。換句話說,send返回時(shí),數(shù)據(jù)不一定會(huì)被發(fā)送到對端(和write寫文件有點(diǎn)類似),send僅僅是把應(yīng)用層Buffer的數(shù)據(jù)復(fù)制到Socket的內(nèi)核發(fā)送Buffer中。而對于UDP通信來說,每個(gè)UDPSocket都有一個(gè)接收緩沖區(qū),而沒有發(fā)送緩沖區(qū),從概念上來說就是只要有數(shù)據(jù)就發(fā),不管對方是否可以正確接收,所以不緩沖,不需要發(fā)送緩沖區(qū)。其次,我們來說說TCP/IP的滑動(dòng)窗口和流量控制機(jī)制,前面我們提到,Socket的接收緩沖區(qū)被TCP和UDP用來緩存網(wǎng)絡(luò)上收到的數(shù)據(jù),一直保存到應(yīng)用進(jìn)程讀走為止。對于TCP來說,如果應(yīng)用進(jìn)程一直沒有讀取,則Buffer滿了之后,發(fā)生的動(dòng)作是:通知對端TCP協(xié)議中的窗口關(guān)閉,保證TCP套接口接收緩沖區(qū)不會(huì)溢出,保證了TCP是可靠傳輸?shù)模@個(gè)便是滑動(dòng)窗口的實(shí)現(xiàn)。因?yàn)閷Ψ讲辉试S發(fā)出超過通告窗口大小的數(shù)據(jù),所以如果對方無視窗口大小而發(fā)出了超過窗口大小的數(shù)據(jù),則接收方TCP將丟棄它,這就是TCP的流量控制原理。而對于UDP來說,當(dāng)接收方的Socket接收緩沖區(qū)滿時(shí),新來的數(shù)據(jù)報(bào)無法進(jìn)入接收緩沖區(qū),此數(shù)據(jù)報(bào)就會(huì)被丟棄,UDP是沒有流量控制的,快的發(fā)送者可以很容易地淹沒慢的接收者,導(dǎo)致接收方的UDP丟棄數(shù)據(jù)報(bào)。明白了Socket讀寫數(shù)據(jù)的底層原理,我們就容易理解傳統(tǒng)的“阻塞模式”了:對于讀取Socket數(shù)據(jù)的過程而言,如果接收緩沖區(qū)為空,則調(diào)用Socket的read方法的線程會(huì)阻塞,直到有數(shù)據(jù)進(jìn)入接收緩沖區(qū)中;而對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60287:2025 SER EN-FR Electric cables - ALL PARTS
- 224套名牌大學(xué)經(jīng)濟(jì)學(xué)初試真題
- 北師大版小學(xué)數(shù)學(xué)一年級下冊(2024)期中綜合素養(yǎng)測評B卷(含答案)
- 2024通信網(wǎng)絡(luò)信息安全防護(hù)項(xiàng)目合同3篇
- 企業(yè)競爭圖譜:2024年磁性元件 頭豹詞條報(bào)告系列
- 2024智能倉庫物流系統(tǒng)設(shè)計(jì)與實(shí)施合同
- 2024餐飲房屋租賃合同范本
- 2024銷售合同軟件
- 2024石材荒料國際貿(mào)易結(jié)算與外匯管理合同3篇
- 福建省南平市建陽水吉中學(xué)2022年高一地理下學(xué)期期末試卷含解析
- 寶寶大便觀察及護(hù)理課件
- 公司月度安全生產(chǎn)綜合檢查表
- 開題報(bào)告會(huì)記錄單
- 對話的力量:焦點(diǎn)解決取向在青少年輔導(dǎo)中的應(yīng)用
- 我的家鄉(xiāng)湖北荊門介紹
- (銀川市直部門之間交流)2022事業(yè)單位工作人員調(diào)動(dòng)表
- 廣州市小學(xué)生學(xué)籍表
- 法律與社會(huì)學(xué)習(xí)通章節(jié)答案期末考試題庫2023年
- 瓷磚采購?fù)稑?biāo)方案
- 大學(xué)生職業(yè)生涯規(guī)劃-自我認(rèn)知-課件
- 化工設(shè)備安裝預(yù)算定額庫
評論
0/150
提交評論