網(wǎng)絡(luò)編程概念介紹
1. 前言
我們知道計算機(jī)網(wǎng)絡(luò)就是將各種設(shè)備通過有線或無線連接在一起,這些設(shè)備有終端設(shè)備,比如 PC、手機(jī)、打印機(jī)等;還有各種網(wǎng)絡(luò)核心設(shè)備,比如路由器、交換機(jī)、網(wǎng)關(guān)等。通常把網(wǎng)絡(luò)設(shè)備叫做節(jié)點,這些節(jié)點都工作在計算機(jī)網(wǎng)絡(luò)的 TCP/IP 參考模型之上。
鏈路層實現(xiàn)節(jié)點之間的數(shù)據(jù)轉(zhuǎn)發(fā)。比如以太網(wǎng)協(xié)議,包含獨立的以太網(wǎng)幀頭,幀頭中包含了源 MAC 地址、目標(biāo) MAC 地址,通過 MAC 地址實現(xiàn)節(jié)點之間的數(shù)據(jù)幀轉(zhuǎn)發(fā)。
網(wǎng)絡(luò)層也叫 Internet 協(xié)議層,主要職責(zé)就是提供端到端的網(wǎng)絡(luò)傳輸,比如主機(jī)到主機(jī)的通信。網(wǎng)絡(luò)層最重要的一個設(shè)備就是路由器,路由器的主要職責(zé)是提供路由選擇和轉(zhuǎn)發(fā),將分組從源主機(jī)轉(zhuǎn)發(fā)到目的主機(jī)。每臺主機(jī)和路由器的每個端口都配有 IP 地址,路由器是通過 IP 地址實現(xiàn)分組轉(zhuǎn)發(fā)的。分組在路由器之間的轉(zhuǎn)發(fā)是一個逐跳轉(zhuǎn)發(fā)的過程。網(wǎng)絡(luò)層不保證分組傳輸?shù)目煽啃浴?/p>
傳輸層包含兩個非常重要的協(xié)議:TCP 和 UDP。TCP 是可靠傳輸協(xié)議,面向連接的,可以保證數(shù)據(jù)段(Segment)順序。UDP 是不可靠傳輸協(xié)議,無連接的,不保證數(shù)據(jù)報(Datagram)的順序。一臺主機(jī)可以同時運行多個 TCP 或 UDP 應(yīng)用程序,不同應(yīng)用程序之間是通過端口號(Port)來識別。
2. IP 地址
IP 地址有 IPv4 和 IPv6 兩個版本。IPv4 地址長度是 32 bit,4 個字節(jié),每個字節(jié)是獨立取值,通常用點分十進(jìn)制的形式表示。例如,192.168.0.100。IPv4 地址范圍是 0.0.0.0 ~ 255.255.255.255,最多包含 4294967296(2^32) 個 IP 地址。而 IPv6 的地址格式是八元組形式,比如 2001:0DB8::1428:57ab。
本節(jié)只討論 IPv4 地址。IPv4 地址通常劃分成網(wǎng)絡(luò) ID和主機(jī) ID兩部分。比如:
IP 地址分類劃分如下:
分類 | 起始地址 | 結(jié)束地址 |
---|---|---|
A | 0.0.0.0 | 127.255.255.255 |
B | 128.0.0.0 | 191.255.255.255 |
C | 192.0.0.0 | 223.225.255.255 |
D | 224.0.0.0 | 239.255.255.255 |
IP 地址分類劃分缺乏靈活性,對于 A 類地址來說,網(wǎng)絡(luò) ID 只有 2^7 = 128 個,但是主機(jī) ID 多達(dá) 2^24 = 16777216 個,主機(jī) ID 浪費很大。對于 C 類地址來說,網(wǎng)絡(luò) ID 可以有 2^21 = 2097152 個,但是主機(jī) ID 只有 2^8 = 256 個,對于有些組織來說主機(jī) ID 不夠劃分。于是 1993 年出現(xiàn)了 CIDR(Classless Inter-Domain Routing)的編址策略,叫做無類別域間路路由選擇。
CIDR 編址是一種 IP 地址的壓縮表示方式,將 IP 地址分為網(wǎng)絡(luò)前綴和主機(jī)標(biāo)識兩部分,形如 A.B.C.D/L 的表示方式,L 是一個小于 32 的十進(jìn)制數(shù)字,代表網(wǎng)絡(luò)前綴占用 L 個比特,主機(jī)標(biāo)識占用 32 - L 個比特。比如,200.101.80.0/20 表示網(wǎng)絡(luò)前綴占用 20 個比特,主機(jī)標(biāo)識占用 12 個比特。
在 CIDR 編址方式下,如何通過 IP 地址快速確定網(wǎng)絡(luò) ID 呢?是通過子網(wǎng)掩碼來確定的。對于形如 A.B.C.D/L 的子網(wǎng),子網(wǎng)掩碼是由 L 個 bit 1 和 32 - L 個 bit 0 組成的二進(jìn)制數(shù)。只要把 A.B.C.D 和子網(wǎng)掩碼做一個按位與(&)運算,就可以得到網(wǎng)絡(luò) ID??梢哉f,形如 A.B.C.D/L 的表示,可以唯一確定一個網(wǎng)絡(luò) ID,我們通常把 A.B.C.D/L 表示叫做網(wǎng)段。你可以說 A.B.C.D/L 表示了一個網(wǎng)段,網(wǎng)段就是形如 A.B.C.D/L 的表示形式。
比如,200.101.80.0/20 網(wǎng)段的子網(wǎng)掩碼的二進(jìn)制形式是 11111111 11111111 11110000 00000000,十進(jìn)制形式是 255.255.240.0。將 200.101.80.0 和 255.255.240.0 做按位與(&)運算,得到的網(wǎng)絡(luò) ID 是 200.101.80.0。
那么 IP 地址 200.101.96.1 是 200.101.80.0/20 網(wǎng)段的 IP 嗎?我們只需要把 200.101.96.1 和 255.255.240.0 做一個按位與(&)運算,查看結(jié)果是否等于 200.101.80.0 即可。
采用 CIDR 編碼方式優(yōu)勢如下:
- 簡單靈活
- 有效利用 IP 地址空間
- 減小路由表規(guī)模。
比如 200.101.80.0/20 網(wǎng)段中的 IP 地址 200.101.80.100,如果按照分類,屬于 C 類地址,網(wǎng)絡(luò) ID 占用 24 個 bit,主機(jī) ID 占用 8 個 bit;如果采用 CIDR 方式,網(wǎng)絡(luò) ID 占用 20 個 bit,主機(jī) ID 占用 12 個 bit。對于主機(jī)較多的網(wǎng)絡(luò),極大地提高了 IP 地址的利用率。
3. 端口號
端口號是用 16 bit 無符號整數(shù)表示的,取值范圍是 0~65535,總共可以分配 65536 個端口號。端口號屬于稀缺資源,是由 Internet Assigned Numbers Authority (IANA)統(tǒng)一管理和分配的。端口號當(dāng)前分配狀況:
- 0 ~ 1023
此區(qū)間內(nèi)的端口號叫做知名端口號,已經(jīng)被系統(tǒng)或者是一些知名的服務(wù)所占用,比如:
端口號 | 用途 |
---|---|
20 , 21 | 用于 FTP 協(xié)議 |
23 | 用于 telnet 協(xié)議 |
80 | 用于著名的 HTTP 服務(wù) |
443 | 用于 HTTPS 服務(wù) |
- 1023 ~ 65535
此區(qū)間端口號也有很多被知名的應(yīng)用占有,比如:
端口號 | 用途 |
---|---|
1433 | 用于 SQL Server 服務(wù)等等 |
1935 | 用于 RTMP 服務(wù) |
3306 | 用于 MySQL 服務(wù) |
8080 | 作為 HTTP 服務(wù)的另外一個端口號 |
4. 域名及域名解析
不管是 IPv4 地址,還是 IPv6 地址,都是用一串?dāng)?shù)字表示的。計算機(jī)喜歡處理數(shù)字化的 IP 地址,而我們?nèi)祟惒⒉幌矚g數(shù)字,因為數(shù)字不直觀、不便于記憶、不利于使用。試想一下,如果讓你去記憶各大網(wǎng)站的 IP 地址,我相信你能記住的 IP 地址不會超過 10 個。
那么該如何化解這個尷尬呢?科學(xué)家們又發(fā)明了一套字符型的地址方案,即用主機(jī)名(Host Name)來唯一標(biāo)識一臺主機(jī),主機(jī)名是用我們?nèi)祟愖约旱恼Z言來命名,當(dāng)然目前主要是英語了。這里需要強(qiáng)調(diào)的是 Host Name 也可以唯一標(biāo)識一臺主機(jī),是另外一套地址方案。只不過 Host Name 是方便人類使用的,而計算機(jī)還是用 IP 地址。
在互聯(lián)網(wǎng)中,有不計其數(shù)的主機(jī),要保證這些主機(jī)的唯一性,必須用一套統(tǒng)一的 Host Name 編碼方案。目前應(yīng)用最廣泛的就是域名系統(tǒng)(DNS,Domain Name System),DNS 是一套分布式系統(tǒng),DNS 所包含的兩項最主要的工作就是:域名分配和域名解析。域名分配就是為互聯(lián)網(wǎng)中的主機(jī)分配一個唯一的域名,域名解析就是將域名轉(zhuǎn)換為IP 地址的過程。
域名是一顆樹形結(jié)構(gòu),包含了許多層級:
- 根級域,是指一個無名的樹根。
- 頂級域,頂級域分為 generic TLDs(gTLDs),country-code TLDs(ccTLDs)、internationalized country-code TLDs(IDN,ccTLDs)、infrastructure TLD。我們在圖中列舉的 net、edu、org、gov、com 是指 gTLDs,即通用頂級域。比如 .com。
- 二級域,是指頂級域的下一級。比如 .imooc。
- 子域,是指二級域以下的所有層級。其實也可以叫做三級域、四級域等。比如 www。
比如,拿 idcbgp.cn 來說,.com 是頂級域;.imooc 是二級域;www 是子域。
域名是由美國非營利性機(jī)構(gòu)維護(hù)的,它管理著全世界的域名系統(tǒng)。比如,所有的頂級域(TLD)都是由 ICANN 來規(guī)定。
域名解析是通過本地域名解析服務(wù) Resolver 或者遠(yuǎn)程域名解析服務(wù)器獲取 IP 地址的過程。
5. 小結(jié)
IP 地址可以唯一標(biāo)識一臺主機(jī),Port 可以唯一標(biāo)識某臺主機(jī)上的某個應(yīng)用程序。IP 和 Port 的組合經(jīng)常叫做 Endpoint,可以唯一標(biāo)識互聯(lián)網(wǎng)中的一個應(yīng)用程序。在網(wǎng)絡(luò)編程過程中是離不開 IP 和 Port 的,所以掌握 IP 地址的劃分,以及端口號的基本知識是非常有必要的。
在互聯(lián)網(wǎng)中,域名可以唯一標(biāo)識一臺主機(jī),理解域名分配、域名解析過程,對解決一些復(fù)雜網(wǎng)絡(luò)問題有很大的幫助。