計算機是如何通過010101來呈現這個浩瀚的網路世界的?

可否從01開始推算到常用軟體


首先理解位元組byte和位bit的概念

bit是計算機描述數據的最小單位,1個bit即是一個0或1

1個byte由8個bit構成,1個bit可以表達0或1兩種數據,那麼1個byte就可以表示2^8=256種數據。即是說1個byte可以用於表達0~255的數字。

那麼,如何用byte來表示文字呢?

最基礎的機制是ASCII編碼。ASCII編碼用00~7F(也就是0~127)表示128種常用字元,包括英文字母、阿拉伯數字、半形標點等。也就是說,採用ASCII編碼,可以用1個byte表示1個字元。

例如小寫字母f,用十六進位的ASCII編碼表示是66,用bit來表示就是01100110

如果要用0和1表示"Hello!"的話,就是:

01001000 - H

01100101 - e

01101100 - l

01101100 - l

01101111 - o

00100001 - !

不過,我們現實中接觸的字元遠不止128種,各種語言的文字、各種類型的符號加起來數以萬計,僅適用ASCII編碼來表示字元是遠遠不夠的。於是就誕生了Unicode編碼(萬國碼)。

Unicode規定用2個byte來表示一個字元,這就把可以體現的字元數擴充到了65536種,後來發現65536也不夠用,於是乾脆又加入了1個byte用於標識「層數」,變成用3個byte表示一個字元。目前Unicode中一共規定了17層,可表達17*65536=1114112種字元(目前只用到了其中6層)

但Unicode強制使用3個byte表示一個字元,造成了不小的資源浪費(最常用的數字英文和符號實際上用1個byte就足夠了,往前面填一堆0確實浪費)。好在之後又誕生了UTF編碼,UTF可以以變長的方式來表示Unicode字元,以應用最廣的UTF-8為例,可以用1個byte表示ASCII範圍內的字元,用2個byte表示希臘文、希伯來文、阿拉伯文等西語系文字,用3個byte表示常見漢字、日文、韓文等一大堆文字和數學符號、製表符等等等等,用4個byte表示位於0層之外其他16層的Unicode字元。

有點扯遠了

總之,世上所有的文字和符號都可以以UTF-8編碼來通過至多32個0或1來表示。

那麼,我們從0和1的角度來看看,當用戶從瀏覽器中輸入url訪問一個網頁時發生了什麼:

首先瀏覽器要將用戶的訪問行為解析成一個HTTP請求,例如訪問http://www.demo.com/hello.htm:

GET /hello.htm HTTP/1.1
Host: www.demo.com

這是一個最最基礎的GET請求報文,實際情況中一個請求包含的信息要比這個多得多,例如瀏覽器希望接收的響應文檔類型、希望接收的語言類型、用戶的瀏覽器和操作系統版本等等等等,但無論這個請求報文有多麼複雜,最終都是以字元的形式體現,也就是說是以一長串0和1來體現的。

接下來瀏覽器需要與遠端簡歷TCP連接,這一過程經歷了DNS解析、三次握手等環節,為了控制篇幅就不細說了,總之都是0和1可以搞定的。連接建立後,將這串用於表達GET請求的bit串通過TCP連接發送過去,服務端接收到之後通過執行一系列的機器指令來生成響應報文,如何用01來表示機器指令可以參考Nebula.Trek的回答,總之響應報文可能是這個樣子的:

HTTP/1.1 200 OK
Date: Fri, 21 Oct 2016 03:42:54 GMT
Content-Type: text/html; charset=utf-8

Hello!

瀏覽器解析這一串0和1,就能把一個只包含"Hello!"文字的網頁展現在用戶面前。

但網頁上不可能只有文字,圖片怎麼辦?圖片也是可以用0和1來表示的,以最容易理解的點陣圖(bitmap)格式為例來說明:

一張200*200,32位色彩的圖片,實際上就是由40000個不同顏色的像素點構成的。點陣圖格式用32個0和1來描述1個像素點的顏色,再乘以40000份(當然還有一些bit位用於描述這張圖片的寬和高),對這張圖片的描述便就完成了。

(當然實際上沒有網站會用bmp格式來展示圖片,點陣圖格式結構簡單便於理解,但所佔用的空間實在是太大了)

至於音視頻,我對這方面不太了解,沒辦法以形象的語言來描述如何用01來描述一段音視頻,不過相信並不難想像。


用一組01來代表不同的指令,基本指令主要是對內存的操作,內存操作結合輸入輸出指令(通過輸入輸出)指導計算機實現某些功能(例如輸出一個字元在顯示器上)。

簡單的指令編寫成複雜的指令,用彙編語言簡化指令,然後用c語言簡化彙編,然後c語言或者更高級被更高級的語言調用。

核心的理解就是:人為的把某些指令規定為0101:

例如,可以:

  • 指令部分的示例
    1. 0000 代表 載入(LOAD)
    2. 0001 代表 存儲(STORE)

...

  • 寄存器部分的示例
    1. 0000 代表寄存器 A
    2. 0001 代表寄存器 B

...

  • 內存部分的示例
    1. 000000000000 代表地址為 0 的內存
    2. 000000000001 代表地址為 1 的內存
    3. 000000010000 代表地址為 16 的內存
    4. 100000000000 代表地址為 2^11 的內存
  • 集成示例
    1. 0000,0000,000000010000 代表 LOAD A, 16


題主的問題看一本書就夠了:計算機組成:結構化方法 (豆瓣)

謝邀。


謝邀,簡單來說,計算機其實一點都不聰明,他只認識兩個數0和1,即電信號斷和通。他的每一個動作都是一條由01組合成的具有唯一性的命令。你存進硬碟的文件,也只能拆分成01的,才能被計算機讀取。不過計算機動作很迅速,每秒可以處理上億條命令,所以隨著計算性能提升,我們看到的虛擬世界才越來越豐富多彩。


《編碼

---- 隱匿在計算機軟硬體背後的語言》

作者: Charles Petzold


話說這不是我小時候超級好奇的問題嗎。。。題主去看點書就懂了


把所有可以輸入的 輸出的 計算的東西 使用01經過七八次編碼(舉個例子:豆子和豆腐乳差別巨大)就可以了。有興趣的話可以自學一下計算機系統結構。


01就是二進位數,一位二進位可以表達出T/F的信息,兩位二進位除了可以表達T/F的信息,還可以表達0-3的數據,二進位位數越多,可以表達的信息就越多,在計算機的世界裡,可以是內存地址、IP地址、數值型數據、字元型數據等等,這些01經過編碼又可以表達出語音信息、圖像信息等等。凡是現實世界裡存在的物質,以及人類的思想意識等等都可以描述為信息,都可以用足夠的01在計算機的世界裡來表達(顯示、處理、存儲……)和傳輸。而我們直接或間接所使用的各種計算機軟體其實就幫助我們完成這幾件事情:1.信息輸入,也就是將前面描述的各種信息轉換成計算機世界的通用語言(01)的表達形式。2.對數據進行存儲、運算處理和傳輸。3.信息輸出,讓你期望的人得到你想讓他得到的信息,這就是輸出,比如在各種顯示器上列印出來供他閱讀。完成這些事情的物理介質就是CPU,內存,硬碟,顯示器,路由器,調製解調設備等等。補充一句,數字通信技術所要解決的根本問題就是發送-傳輸-接收這些01信息的過程中的諸多問題。


想想什麼是函數,複合函數……


想想01可以無窮大,自然界也無窮大,那麼OK


推薦閱讀:

win7旗艦版忘記開機密碼怎麼辦?
電腦右下角出現了「Windows 7 內部版本 7600 此 Windows 副本不是正版」是什麼意思?怎麼解決?
參加過信息學競賽是怎樣一種體驗?
win8不安裝360之類的如何管理開機啟動項?
29日後,大規模推送win10升級是否會導致大量PC出現兼容性以及其它問題?

TAG:軟體 | 編程 | 計算機 | 代碼 | 計算機網路 |