《世界是數字的》是世界頂尖計算機科學家Brian W.Kernighan寫的1本計算機科普類讀物,簡明扼要但又深入全面地解釋了計算機和通訊系統背后的秘密,合適計算機初學者和非計算機專業的人讀。這真的是1本好書,借Google常務董事長的話:
對計算機、互聯網及其背后的奧秘充滿好奇的人們,這絕對是1本不容錯過的好書。
對1個計算機已學了N年的專業人士來講,這本書或許簡單了點,不過我還是認真過了1遍,發現也有1定的收貨,由于1個人很難掌握本領域里的所有知識,或多或少會有1些欠缺,總會有1些你之前不知道的,或1直沒理解清楚的但又很有必要知曉的知識,我在瀏覽此書進程中就有這類感覺,常常會有1種恍然大悟的感覺,比如理解了互聯網上1些不為人知的跟蹤原理(具體可以看我下面總結的第12點“Cookie如何暴露你在互聯網上的行跡”)。我是個喜歡記筆記和做總結的人,瀏覽完1本書,我常常會找個閑暇的時間總結下,主要是根據自己已有的知識儲備體系總結1些對我有幫助的或有必要知道的知識點。
下面就簡單總結下自己的所獲和所感。
注意:下面的知識都是科普知識,合適非計算機專業、計算機初學者及和像我1樣計算機1開始就沒學好的人看,那些牛B的大牛就不用來浪費時間來讀你們已稱之為“常識”的知識啦。
現在的程序員都很怕遇到NP問題,不但算法復雜而且還保證不了每次都能找到解。那到底甚么是P問題和NP問題呢?作為1個程序員,你如果回答說“P問題就是容易的問題,NP問題就是復雜的難以解決的問題”那就太失敗了。P即“Polynomial”(多項式),P問題是指具有“多項式”級復雜性的問題。換句話說,解決這些問題的時間可以用N^2這樣的多項式來表示,其中指數可以大于2,但都是可能在多項式時間內被解決的,這些問題相對照較簡單。
但是,現實中大量的問題或說很多實際的問題仿佛都需要指數級算法來解決,即我們還不知道對這類問題有無多項式算法。這類問題被稱為“NP(nondeterministic polynomial,非肯定性多項式)”問題。NP 問題的特點是,它可以快速驗證某個解決方案是不是正確,但要想迅速找到1個解方案卻很難。可以這么認為,這些問題可以用1個算法在多項式時間內靠猜想來解決,而且該算法必須每次都能猜中。在現實生活中,沒有甚么能榮幸到始終都做出正確的選擇,所以這只是理論上的1種假想而已。
可以舉個簡單的例子來講明NP問題,那就是著名的“旅行推銷員問題”(Traveling Salesman Problem)。1個推銷員必須從他居住的城市動身,到其他幾個城市去推銷,然后再回家。目標是每一個城市只到1次(不能重復),而且走過的總距離最短。這個問題實際利用價值很大,其原理常常被利用于設計電路板上孔洞的位置,或部署船只到墨西哥灣的特定地點收集水樣。旅行推銷員問題已被仔細斟酌了50 多年,但還是解決不了NP難問題。
現在業界內也常常討論1個問題:P 是不是等于NP?即這些困難到底跟那些簡單的問題是否是1類?
雖然很多人都相信未來的某1天可以到達P=NP,但我還是希望這1天不要太早到來,由于現在1些重要的利用,如加密軟件,都是完全建立在某個特定的問題確切極難解決的基礎之上的。假想1下,如果某天這些難問題都被攻破了,那我們的各個賬號密碼、網銀豈不是要……固然,如果真有那末1天,也表明計算機領域又有了1個重大的突破,這是值得可賀的。
我們知道,磁盤沒有真實的刪除,我們所謂的“delete”操作只是把文件占用的塊回寫到空閑塊列表。但是,這些文件的內容并沒有被刪除。換句話說,原始文件占用的每一個塊中的所有字節都會原封不動地呆在原地。除非相應的塊從空閑塊列表中被“除名”并奉送給某個利用程序,否則這些字節不會被新內容覆蓋。這意味著甚么呢?意味著你認為已刪除的信息實際上還保存在硬盤上。如果有人知道怎樣讀取它們,依然可以把它們讀出來。任何可以不通過文件系統而能夠逐塊讀取硬盤的程序,都可以看到那些被“刪除”的內容。
那末如何真實的完全刪除呢?Mac中的“安全擦除”選項在釋放磁盤塊之前,會先用隨機生成的比特重寫其中的內容。但是即便用新信息重寫了原有內容,1名訓練有素的敵人仍舊可以憑仗他掌握的大量資源發現蛛絲馬跡。軍事級的文件擦除會用隨機的1 和0 對要釋放的塊進行多遍重寫。更加保險的做法是把整塊硬盤放到強磁場里進行消磁。而最保險的做法則是物理上燒毀硬盤,這也是保證其中內容完全銷聲 匿跡的唯1可靠方法。
也有1些完全刪除文件的軟件,比如我用過的BCWipe(是看韓國黑客犯法片“幽靈”時知道的,劇里常常用這個軟件刪除機密文件),它提供 Delete with wiping、Wipe free disk space 兩種方式來清除你的磁盤文件,還有其它選項,不過這款軟件是收費軟件,我只試用過1段時間,我本人沒啥見不得人的文件,也不需要此類軟件,只是當時看完電視好奇試玩了1把。
從技術角度講,無線網絡利用電磁波傳送信號。電磁波是特定頻率的電波,其振動頻率以Hz 來衡量(讀者可能更熟習廣播電臺經常使用的MHz 或GHz,比如北京交通廣播電臺的頻率是103.9 MHz)。在發送信號之前,首先要通過調制把數據信號附加到載波上。比如,調幅(AM)就是通過改變載波的振幅或強度來轉達信息,而調頻(FM)的原理則是圍繞1個中心值來改變載波的頻率。接收器接收到信號的強度與發射器的功率成正比,與到發射器距離的平方成反比。由于存在這類2次方遞減的關系,距離發射器的距離增加1倍,接收器接收到的信號強度就只有原來的4分之1。無線電波穿越各種物資時強度都會衰減,物資不同衰減程度也不同,比如說金屬就會屏蔽任何電波(突然想起《超驗駭客》電影里卡斯特家花園里建的用來屏蔽信號的金屬網)。高頻比低頻更容易被吸收,2者在其他方面都1樣。
無線聯網對可使用的頻率范圍―頻段,和使用多大的功率發送電波都有嚴格規定。頻段分配始終都是1個有爭議的話題,由于各種需求總會產生沖突。
無線以太網裝備發射的電波頻率為2.4~2.5 GHz,某些802.11 裝備的頻率會到達5 GHz。所有沒有線裝備的頻率都局限于這1較窄的范圍內,沖突的可能性大大增加。更糟的是,有些無線電話、醫療裝備,乃至微波爐也隨著湊熱烈,一樣使用這1頻段。有1次作者在使用廚房里那臺舊筆記本時無線連接突然斷了,后來才發現是用微波爐加熱咖啡的原因。30 秒鐘的加熱就足以讓筆記本斷開無線連接。
下面介紹3種使用最廣泛的無線聯網技術。
(1)首先就是藍牙,藍牙技術是為近距離臨時性連接而發明的,使用與802.11 相同的2.4 GHz 頻段。藍牙連接的距離是1 到100 米,具體取決于功率大小,數據傳輸速度為1~3 Mbit/s。使用藍牙技術的裝備主要包括無線麥克風、耳機、鍵盤、鼠標、游戲手柄,功率相對較低。
(2)第2種技術是RFID(radio-frequency identification),即無線射頻辨認,主要用于電子門禁、各種商品的電子標簽、自動收費系統、寵物植入芯片,和護照等身份證明。 RFID 標簽其實就是1個小型無線信號收發裝置,對外廣播身份信息。被動式標簽不帶電源,通過天線接收到的RFID 讀取器廣播的信號來驅動。RFID 系統使用多種不同的頻率,比較常見的是13.56 MHz。RFID 芯片讓秘密監視物體和人的行跡成為可能。 植入寵物體內的芯片就是1種常見的利用,已有人建議也給人植入這類芯片了。至于動機嘛,就不好說了。
(3)最后1種是GPS(Global Positioning System,全球定位系統),它是1種重要的單向無線系統,常見于汽車和手機導航系統中。GPS衛星會廣播精確的時間信息,而GPS接收器會根據它從34顆衛星接收到信號的時間來計算自己在地面的位置。但是,GPS只接收信號不發送信號。之前曾有1個關于GPS 的誤解,認為它能悄悄地跟蹤用戶。給大家摘錄1段《紐約時報》幾年前鬧的1個笑話吧:“有些(手機)依托全球定位系統,也就是GPS,通過向衛星發送信號來精確地定位用戶。”這完全是誤解。要 想利用GPS跟蹤用戶,必須得有地面系統(比如手機)轉發位置信息。手機與基站之間保持密切通訊,因此可以(而且確切會)不斷地報告你的位置。只不過有了GPS 接收器以后,它所報告的信息可以更加精確。
何謂“蜂窩”?由于頻段和無線電的覆蓋范圍都是有限的,因此就要把全部地區劃分為蜂窩狀的許多小區。可以將每一個這樣的小區想象為6邊形,然后中央有1個基站,相鄰的小區之間通過基站相連。打電話的時候,手機會與最近的基站通訊。當用戶移動到另外一個小區時,進行中的通話就由原來的小區移交給新小區,但這個切換用戶1般覺察不到。
由于接收功率會隨著距離的2次方衰減,所以位于既定頻段中的頻帶在不相鄰的小區內可以重用,而不會相互干擾。這就是可以高效利用有限頻段的秘密所在。
大家看下面這幅示意圖:
1 號小區中的基站與2 到7 號小區中的基站不會使用相同的頻率,但可以跟8到19號小區中的基站使用相同的頻率,由于與它們之間的距離足以免干擾了。“蜂窩”中小區的實際形狀要取決很多因素,比如天線的輻射圖形。這張圖只是1種理想化的結果。
蜂窩手機是常規的電話網絡的1部份,只不過連接這個網絡不是靠電話線,而是靠基站發射無線電波。
手機使用的頻段很窄,傳輸信息的能力有限。由于要使用電池,所以打電話時發射的都是低功率無線電波。而且根據法律規定,為了不與其他無線裝備產生干擾,它們的傳輸功率也遭到限制。
手機在世界的不同地區會使用不同的頻帶,但1般都在900 MHz 左右。每一個頻帶被分成多個信道,每次通話時,收發信號各占用1個信道。發送呼喚信號的信道由小區中所有手機同享,在某些系統中這個信道也能夠同時用于發送短信和數據。
撥打電話的原理:每一個手機都有唯1的辨認碼(可不是說手機號啊),相當于以太網的地址。啟動手機后,它就會廣播自己的辨認碼。距離最近的基站接收得手機信號后,會通過后臺系統驗證該辨認碼。隨著手機移動,基站實時更新其位置信息,其實不斷向后臺系統報告。如果有人呼喚該手機,后臺系統就可以通過1直與它保持聯系的基站找到它。
手機與基站通訊時的信號強度很高。但手機會動態調劑功率,在距離基站較近時下降功率。這樣不但可以省電,也能夠減少干擾。待機時的耗電量遠遠比不上1次通話,而這也是為何待機時間以天為單位,而通話時間以小時為單位的緣由。如果手機所在小區信號較弱或根本沒有信號,那末它就會由于拼命查找基站而大量耗電。
美國使用了兩種完全不同的手機通訊技術:
(1)AT&T和T-Mobile使用GSM(Global System for Mobile Communications,全球移動通訊系統),這是1種在歐洲使用非常普遍的系統,它把頻帶分成很窄的信道,在每一個信道內順次附加多路通話。GSM 是世界上利用范圍最廣的系統。
(2)Verizon 和Sprint 使用CDMA (Code Division Multiple Access,碼分多址),這是1種“擴大頻段”技術,它把信號擴大到頻帶以外,但對不同的通話采取不同的編碼模式進行調制。這就意味著,雖然所有手機都使用相同的頻帶,但大多數情況下通話之間不會產生干擾。
GSM 和CDMA 都會利用數據緊縮來盡量減少封裝信號的比特量。對通過喧鬧的無線電信道發送數據時沒法避免的毛病,再添加毛病校驗來解決問題。
手機帶來了1系列難解的非技術問題:
(1)頻段的分配。在美國,政府限 制每一個頻帶最多只能有兩家公司使用指定頻率。因此頻段是非常稀缺的資源,也是無線聯網系統的關鍵資源。
(2)手機信號發射塔的位置。信號發射塔作為戶外建筑算不上漂亮,很多地區為 此謝絕在自己的地界上搭設這類東西。
互聯網有很多協議,其中最基礎的有兩個,1是互聯網協議(Internet Procotol,IP),定義了單個包的格式和傳輸方式,2是傳輸控制協議(Transmission Control Protocol,TCP),定義了IP包如何組合成數據流和如何連接到服務。二者合起來起就叫TCP/IP。固然TCP/IP協議族不只是包括這兩個協議,還包括其它許多的協議。
數據緊縮技術分為無損緊縮和有損緊縮。
所有緊縮算法的思路都是減少或去掉那些不能物盡其用的位串,采取的主要方法包括把出現頻率較高的元素編碼成短位串、構造頻率字典、用數字代替重復內容等。無損緊縮能夠完善重現原始數據,有損緊縮通過拋棄接收者不需要的信息,來達成數據質量和緊縮率的折衷。
在“毛病檢測和校訂”小節看到了1個成心思的算法,是IBM公司的彼得?盧恩(Peter Luhn)于1954年設計的1個校驗和(checksum)算法,來檢測在實際操作中最多見的兩種毛病:單個數字毛病、由于兩個數字寫錯位置而引發的大多數換位毛病。后來這個算法有了很多利用場景,比如可以檢測16位長的信譽卡和儲蓄卡的卡號是不是是有效的卡號(這是美國的情況,中國的儲蓄卡1般是19位,不過算法一樣適用);10 位或13 位的ISBN 書號也采取了類似算法的校驗和,用來對付同類毛病。
這個算法很簡單:從最右1位數開始向左,把每一個數字交替乘1或2,如果結果大于 9就減9。如果把各位數的計算結果加起來,最后得到的總和能被10 整除,那這個卡號就是有效卡號。
你可以用這個方法測試1下信譽卡,以“4417 1234 5678 9112”為例(此卡號取自某銀行廣告),這個卡號計算的結果是69,所以不是真卡號;如果把它的最后1個數字換成3,那就是有效卡號了。我用該算法測試了自己的銀行卡和信譽卡,的確可以用來檢測卡的真偽,這也算是個小知識吧。
通用網關接口(Common Gateway Interface,CGI),是HTTP 協議里1個從客戶端(你的閱讀器)向服務器傳遞信息的機制,它能用來傳遞用戶名和密碼、查詢條件、單選按鈕和下拉菜單選項。
CGI機制在HTML里用<form> ... </form>標簽來控制。你可以在<form>標簽里放入文本輸入區、按鈕等常見界面元素。如果再加上1個“提交”按鈕,按下去就會把表單里的數據發送到服務器,服務器用這些數據作為輸入,來運行指定的程序。
Cookie技術和Javascript腳本語言都是Netscape公司發明的,網景公司對互聯網的貢獻真是太大了(還記得網景閱讀器嗎?),不能不佩服。
病毒和蠕蟲在技術上有個細微差別是:病毒的傳播需要人工參與,也就是只有你的操作才能催生它的傳播;而蠕蟲的傳播卻不需要你的援手,完全自發進行。
搜索引擎的核心競爭力在于怎樣才能迅速從抓取的頁面中挑選出匹配度最高的URL,比如最為匹配的10個頁面。誰能把最好匹配結果排在前頭,誰的響應速度快,誰就可以贏得用戶。
第1批搜索引擎只會顯示1組包括搜索關鍵詞的頁面,而隨著網頁數量激增,搜索結果中就會混入大量無關頁面。谷歌的PageRank算法會給每一個頁面賦予1個權重,權重大小取決因而否有其他頁面援用該頁面,和援用該頁面的其他頁面本身的權重。從理論上講,權重越大的頁面與查詢的相干度就越高。正如布林和佩奇所說:“憑直覺,那些常常被其他網頁提及和援用的頁面的價值1定更高1些。”固然,要產生高質量的搜索結果絕對不會只靠這1點。搜索引擎公司會不斷采取措施來改進自己的結果質量,以期超出對手。
搜索引擎的收入通常來自廣告。簡單來講,搜索引擎的廣告模式有兩種:
(1)廣告客戶付錢在網頁上顯示廣告,價格由多少人看過和甚么樣的人看到該網頁來決定。這類定價模式叫按頁面閱讀量收費,即按“展現”, 也就是按廣告在頁面上被展現的次數收費。
(2)另外一種模式是按點擊收費,即按閱讀者點擊 廣告的次數收費。因此搜索引擎的廣告模式。
說到底就是拍賣搜索關鍵詞,且搜索引擎公司都有完備的手段避免虛假點擊。
只要上網,我們的信息就會被搜集,而如果沒有我們留下的蛛絲馬跡,幾近甚么事兒也干不了。使用其他系統時的情況也1樣,特別是使用手機的時候,手機網絡隨時都知道我們在哪里。如果是在戶外,支持GPS的手機(現在的智能手機幾近都支持)定位用戶的誤差不超過10米,而且隨時都會報告你的位置。有些數碼相機也帶GPS,可以在照片中編入地理位置信息,這類做法被稱為打地理標簽。
把多個來源的跟蹤信息匯總起來,就能夠繪制1幅關于個人的活動、喜好、財務狀態,和其他很多方面的信息圖。這些信息最最少可以讓廣告客戶更精準地定位我們,讓我們看到樂意點擊的廣告。不過,跟蹤數據的利用可遠不止于此。這些數據還可能被用在很多我們意想不到的地方。比如根據收入把人分成369等,在貸款時區分對待,或更糟地,被人冒名頂替,被政府監控,被人圖財,乃至害命。
怎樣搜集我們的閱讀信息呢?有些信息會隨著閱讀器的每次要求發送,包括你的IP地址、正在閱讀的頁面、閱讀器的類型和版本、操作系統,還有語言偏好。
另外,如果服務器的域中有cookie,那末這些“小甜餅”也會隨閱讀器要求1塊發送。根據cookie的規范,只能把這些保存用戶信息的小文件發給最初生成它們的域。那還怎樣利用cookie跟蹤我對其他網站的訪問呢?
要知道答案,就得明白鏈接的工作原理:
每一個網頁都包括指向其他頁面的鏈接(這正是“超鏈接”的本義)。我們都知道鏈接必須由我們主動點擊,然后閱讀器才會打開或轉向新頁面。但圖片不需要任何人點擊,它會隨著頁面加載而自動下載。網頁中援用的圖片可以來自任何域。因而,在閱讀器獲得圖片時,提供該圖片的域就知道我訪問過哪一個頁面了。而且這個域也能夠在我的計算機上寄存cookie,并且收到之前訪問過的域所產生的cookie。
以上就是實現跟蹤的秘密所在,下面我們再通過例子來解釋1下。假定我想買1輛新車,因此訪問了toyota.com。我的閱讀器因此會下載60 KB的HTML文件,還有1些JavaScript,和40張圖片。其中1張圖片的源代碼以下:
<img src="http://ad.doubleclick.net/ad/
N2724.deduped_spotlight/B1009212;
sz=1x1;tag=total_traffic;ord=1?"
width=1 height=1 border=0>
這個<img>
標簽會讓閱讀器從ad.doubleclick.net下載1張圖片。這張圖片只有1像素寬、1像素高,沒有邊框,而且極可能是透明的,總之頁面上看不見它(稱之為網頁信標)。固然,這張圖片根本就沒想讓人看到。當我的閱讀器要求它時,DoubleClick會知道我正在閱讀豐田汽車公司網站的某個頁面,而且(如果我允許)還會在我的計算機中保存1個cookie文件。要是我隨后又訪問了1個內置DoubleClick圖片的網站,DoubleClick就能夠繪制1張我的“足跡圖”。如果我的“足跡”大都留在汽車網站上,DoubleClick會把這個信息流露給自己的廣告客戶。因而乎,我就可以看到汽車經銷商、購車貸款、修車服務、汽車配件等等各種廣告。如果我的“足跡”更多與交通事故或止疼有關,那末就會看到律師和醫生投放的廣告。
DoubleClick(現為谷歌所有)在拿到用戶訪問過的站點信息后,會根據這些信息向豐田等廣告客戶推銷廣告位。豐田公司繼而利用這些信息定向投放廣告,而且(可能)會參考包括我的IP地址在內的其他信息。(DoubleClick不會把這些信息賣給任何人。)隨著我訪問的頁面愈來愈多,DoubleClick就能夠繪制1幅關于我的更詳細的圖畫,借以推斷我的個性、愛好,乃至知道我已60多歲了,是個男的,收入中上,住在新澤西中部,在普林斯頓大學上班。知道我的信息越多,DoubleClick的廣告客戶投放的廣告就越精準。到了某個時刻,DoubleClick乃至可以肯定那個人就是我,雖然大多數公司都宣稱不會針對具體的某個人。可是假設我的確在某些網頁中填過自己的名字和電子郵件地址,那誰也不敢保證這些信息不會被傳播。
這套互聯網廣告系統設計得極為精密。打開1個網頁,這個網頁的發布者會立即通知雅虎的Right Media或谷歌的Ad Exchange,說這個網頁上有1個空地兒正虛位以待,可以顯示廣告。同時發過去的還有閱讀者的信息(例如,25到40歲之間、單身、住在舊金山,是個技術宅,喜歡泡館子)。因而,廣告客戶會為這個廣告位而競價,勝出者的廣告將被插入到這個網頁中。全部進程不過零點幾秒而已。
只要上網,防范基本上是不可能的,不過可以選擇性的關閉1些cookie跟蹤。比如作者使用過Firefox 的1個擴大TACO(Target Advertising Cookie Opt-out,定向廣告Cookie 自愿躲避),這個擴大保護著1個cookie 跟蹤站點的列表(目前有大約150個名字),在閱讀器中保存著它們的自愿躲避cookie。而我呢,同時對大多數網站都選擇關閉cookie。
許多網站都含有多家公司的跟蹤程序。給大家推薦1個閱讀器擴大Ghostery,通過它可以禁用JavaScript 跟蹤代碼,還能查看被禁止的跟蹤器。裝上它,你會驚訝于互聯網上潛伏著多少“特務”。僅適用于Firefox的Noscript插件也有類似的功能。
1個像素大的圖片或叫網頁信標(web beacon,1個很小而且通常是看不到的圖片,用于記錄某個網頁是不是已被下載過了。)都可以用來跟蹤你。 用于獲得像素圖片的URL 可以包括1個標識碼,表示你正在閱讀甚么網頁,還可以包括1個標識符,表示特定的用戶。這兩個標志就足以跟蹤你的閱讀活動了。
隨著社交網站的流行,為了文娛和與其他人聯系,我們自愿放棄了很多個人隱私。社交網站存在隱私問題是毫無疑義的,由于它們會搜集注冊用戶的大量信息,而且是通過把這些信息賣給廣告客戶來賺錢。
作為最大也最成功的社交網站,Facebook 的問題也最明顯。Facebook 給第3方提供了 API,以方便編寫Facebook 用戶可使用的利用。但這些API 有時候會背背公司隱私政策流露1些隱私信息。固然,并不是只有Facebook 1家如此。做地理定位服務的Foursquare 會在手機上顯示用戶的位置,能夠為找朋友和基于位置的游戲提供方便。在知道潛伏用戶位置的情況下,定向廣告的效果特別好。如果你走到1家餐館的門口,而手機上恰好是關于這家餐館的報導,那你極可能就會推門進去體驗1下。雖然讓朋 友知道你在哪兒沒甚么問題,但把自己的位置昭告天下則非明智之舉。比如,有人做了1個示范性的網站叫“來搶劫我吧”(Please Rob Me),該網站根據Foursquare 用戶在Twitter 上發表的微博可以推斷出他們甚么時候不在家,這就為入室行竊提供了機會。
社交網站很容易根據自己的用戶構建1個交往群體的“社交圖譜”,其中包括被這些用戶牽連進來但并未同意乃至絕不知情的人。