網絡編程(更新中)
軟件開發架構
C/S架構
主從式架構 (英語:Client–server model) 也稱客戶端-服務器(Client/Server)架構、C/S架構,是一種網絡架構,它把客戶端 (Client) (通常是一個采用圖形用戶界面的程序)與服務器 (Server) 區分開來。每一個客戶端軟件的實例都可以向一個服務器或應用程序服務器發出請求。
B/S架構
瀏覽器-服務器(Browser/Server)結構,簡稱B/S結構,與C/S結構不同,其客戶端不需要安裝專門的軟件,只需要瀏覽器即可,瀏覽器通過Web服務器與數據庫進行交互,可以方便的在不同平臺下工作;服務器端可采用高性能計算機,並安裝Oracle、Sybase、Informix等大型數據庫。B/S結構簡化了客戶端的工作,它是隨著Internet技術興起而產生的,對C/S技術的改進,但該結構下服務器端的工作較重,對服務器的性能要求更高。
網絡基礎
IP地址
互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議地址),縮寫為IP地址(英語:IP Address),是分配給網絡上使用網際協議(英語:Internet Protocol, IP)的設備的數字標簽。常見的IP地址分為IPv4與IPv6兩大類。
IPV4地址
IP地址由32位二進制數組成,為便於使用,常以XXX.XXX.XXX.XXX形式表現,每組XXX代表小於或等於255的10進制數。地址可分為A、B、C、D、E五大類,其中E類屬於特殊保留地址。
IP地址是唯一的。目前IP技術可能使用的IP地址最多可有4,294,967,296個(即232
隨著互聯網的快速成長,IPv4的42億個地址的分配最終於2011年2月3日用盡[1][2]。相應的科研組織已研究出128位的IPv6,其IP地址數量最高可達3.402823669 × 1038個,屆時每個人家居中的每件電器,每件對象,甚至地球上每一粒沙子都可以擁有自己的IP地址。
在A類、B類、C類IP地址中,如果主機號是全1,那麽這個地址為直接廣播地址,它是用來使路由器將一個分組以廣播形式發送給特定網絡上的所有主機。32位全為1的IP地址
IPV6地址
從IPv4到IPv6最顯著的變化就是網絡地址的長度。RFC 2373和RFC 2374定義的IPv6地址,就像下面章節所描述的,有128位長;IPv6地址的表達形式,一般采用32個十六進制數。
IPv6中可能的地址有2128≈3.4×1038個,具體數量為340,282,366,920,938,463,463,374,607,431,768,211,456個。也可以想象為1632個,因為32位地址每位可以取16個不同的值(參考組合數學)。
在很多場合,IPv6地址由兩個邏輯部分組成:一個64位的網絡前綴和一個64位的主機地址,主機地址通常根據物理地址自動生成,叫做EUI-64(或者64-位擴展唯一標識)
IPV6地址表示:
IPv6地址為128位長但通常寫作8組每組四個十六進制數的形式。例如:
- 2001:0db8:85a3:08d3:1319:8a2e:0370:7344
是一個合法的IPv6地址。
如果四個數字都是0,可以被省略。例如:
- 2001:0db8:85a3:0000:1319:8a2e:0370:7344
等價於
- 2001:0db8:85a3::1319:8a2e:0370:7344
遵從這些規則,如果因為省略而出現了兩個以上的冒號的話,可以壓縮為一個,但這種零壓縮在地址中只能出現一次。因此:
- 2001:0DB8:0000:0000:0000:0000:1428:57ab
- 2001:0DB8:0000:0000:0000::1428:57ab
- 2001:0DB8:0:0:0:1428:57ab
- 2001:0DB8:0::0:1428:57ab
- 2001:0DB8::1428:57ab
都是合法的地址,並且他們是等價的。但
- 2001::25de::cade
是非法的。(因為這樣會使得搞不清楚每個壓縮中有幾個全零的分組)
同時前導的零可以省略,因此:
- 2001:0DB8:02de::0e13
等價於
- 2001:DB8:2de::e13
如果這個地址實際上是IPv4的地址,後32位可以用10進制數表示;因此:
- ffff:192.168.89.9等價於::ffff:c0a8:5909,但不等價於::192.168.89.9和::c0a8:5909。
- ffff:1.2.3.4格式叫做IPv4映射地址,是不建議使用的。而::1.2.3.4格式叫做IPv4一致地址。
IPv4地址可以很容易的轉化為IPv6格式。舉例來說,如果IPv4的一個地址為135.75.43.52(十六進制為0x874B2B34),它可以被轉化為0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34。同時,還可以使用混合符號(IPv4-compatible address),則地址可以為::135.75.43.523。
端口
在電腦網絡中,通信端口(英語:port),又稱為連接端口、接口、端口、協議端口(protocol port),是一種經由軟件創建的服務,在一個電腦操作系統中扮演通信的端點(endpoint)。每個通信端口都會與主機的IP地址及通信協議關聯。通信端口以16比特數字來表示,這被稱為通信端口編號(port number)。
位於傳輸層的通信協議通常需要指定端口號,例如在TCP/IP協議族之下的TCP與UDP協議。在應用層中,使用主從式架構的通信協議,在每個通信端口上提供多路復用服務(multiplexing service)。經由公認連接端口號(well-known port numbers),通常可以辨認出這個連接使用的通信協議,其中具代表性的是最基礎的1024個公認連接端口號(well-known port numbers),例如telnet協議默認使用23端口來連接,HTTP連接默認使用80端口。
傳輸層協議,如傳輸控制協議(TCP)與用戶數據報文協議(UDP),在數據包表頭中,定義了來源端口號與目的端口號。一個通信端口號使用16位無符號整數(unsigned integer)來表示,其範圍介於0與65535之間。在TCP協議中,端口號0是被保留的,不可使用。在UDP協議中,來源端口號是可以選擇要不要填上,如果設為0,則代表沒有來源端口號。
在操作系統中,一個進程,可以通過internet socket,將它的輸入與輸出,與一個特定的傳輸協議,一個通信端口,與IP地址,關系起來。這個關系動作,稱為綁定(binding),在這之後,就可以通過網絡提交與接收數據。
在操作系統上運行的網絡軟件,可以通過操作系統,利用各個不同的通信端口,將數據發送到網絡上;操作系統也可以根據數據包的IP地址以及端口號,將這些數據包轉送到匹配的進程去。
雖然使用同樣傳輸協議,但是特定的IP地址以及通信端口的組合,只會被綁定到單一的特定進程上。當使用同樣協議的多個程序,嘗試著綁定在同一個IP地址下的相同通信端口,就會產生一個常見的應用程序錯誤,這個錯誤有時候被稱為通信端口沖突(port conflicts)。
端口號有兩種用途:
- 標識服務器上提供特定網絡服務的進程。客戶機可以按照服務器IP與端口號與相應的服務器進程創建網絡連接,獲得相應的網絡服務。例如,通常使用80端口號提供http服務,使用23端口號telnet服務。服務器的這種功能叫做listening。客戶機通常使用動態指定的端口號與服務器創建連接。
- 由本機地址、本機端口號、目標機地址、目標機端口號、通信協議組成的五元組,用於唯一確定正在使用的網絡連結。因此,對於不同的協議、不同的目標機地址,本機的不同地址(如果本機使用多個網卡)等多種情形,同一個端口號可以復用。因此對於1對1通信,且本機與目標機之間只能創建一個通信連接,則不需要使用端口號。
網絡防火墻或者網關還可提供端口轉發(port forwarding),即NAT。
OSI七層模型
開放式系統互聯通信參考模型(英語:Open System Interconnection Reference Model,縮寫為 OSI),簡稱為OSI模型(OSI model),一種概念模型,由國際標準化組織(ISO)提出,一個試圖使各種計算機在世界範圍內互連為網絡的標準框架。定義於ISO/IEC 7498-1。
層次劃分:
根據建議X.200,OSI將計算機網絡體系結構劃分為以下七層,標有1~7,第1層在底部。 現“OSI/RM”是英文“Open Systems Interconnection Reference Model”的縮寫。
第七層 應用層
應用層(Application Layer)提供為應用軟件而設的界面,以設置與另一應用軟件之間的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。
第六層 表示層
表示層(Presentation Layer)把數據轉換為能與接收者的系統格式兼容並適合傳輸的格式。
該層被棄用。應用層的HTTP、FTP、Telnet等協議有類似的功能。傳輸層的TLS/SSL也有類似功能。
第五層 會話層
會話層(Session Layer)負責在數據傳輸中設置和維護電腦網絡中兩臺電腦之間的通信連接。
該層被棄用。應用層的HTTP、RPC、SDP、RTCP等協議有類似的功能。
第四層 傳輸層
傳輸層(Transport Layer)把傳輸表頭(TH)加至數據以形成數據包。傳輸表頭包含了所使用的協議等發送信息。例如:傳輸控制協議(TCP)等。
第三層 網絡層
網絡層(Network Layer)決定數據的路徑選擇和轉寄,將網絡表頭(NH)加至數據包,以形成分組。網絡表頭包含了網絡數據。例如:互聯網協議(IP)等。
第二層 數據鏈路層
數據鏈路層(Data Link Layer)負責網絡尋址、錯誤偵測和改錯。當表頭和表尾被加至數據包時,會形成幀。數據鏈表頭(DLH)是包含了物理地址和錯誤偵測及改錯的方法。數據鏈表尾(DLT)是一串指示數據包末端的字符串。例如以太網、無線局域網(Wi-Fi)和通用分組無線服務(GPRS)等。
分為兩個子層:邏輯鏈路控制(logic link control,LLC)子層和介質訪問控制(media access control,MAC)子層。
第一層 物理層
物理層(Physical Layer)在局部局域網上傳送幀,它負責管理電腦通信設備和網絡媒體之間的互通。包括了針腳、電壓、線纜規範、集線器、中繼器、網卡、主機適配器等
TCP協議
傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能,用戶數據包協議(UDP)是同一層內另一個重要的傳輸協議。
TCP協議的運行可劃分為三個階段:連接創建(connection establishment)、數據傳送(data transfer)和連接終止(connection termination)。
TCP用三路握手(或稱三次握手,three-way handshake)過程創建一個連接。在連接創建過程中,很多參數要被初始化,例如序號被初始化以保證按序傳輸和連接的強壯性。
TCP連接的正常創建
一對終端同時初始化一個它們之間的連接是可能的。但通常是由一端打開一個套接字(socket)然後監聽來自另一方的連接,這就是通常所指的被動打開(passive open)。服務器端被被動打開以後,用戶端就能開始創建主動打開(active open)。
- 客戶端通過向服務器端發送一個SYN來創建一個主動打開,作為三路握手的一部分。客戶端把這段連接的序號設定為隨機數A。
- 服務器端應當為一個合法的SYN回送一個SYN/ACK。ACK的確認碼應為A+1,SYN/ACK包本身又有一個隨機產生的序號B。
- 最後,客戶端再發送一個ACK。當服務端收到這個ACK的時候,就完成了三路握手,並進入了連接創建狀態。此時包的序號被設定為收到的確認號A+1,而響應號則為B+1。
連接終止使用了四路握手過程(或稱四次握手,four-way handshake),在這個過程中連接的每一側都獨立地被終止。當一個端點要停止它這一側的連接,就向對側發送FIN,對側回復ACK表示確認。因此,拆掉一側的連接過程需要一對FIN和ACK,分別由兩側端點發出。
UDP協議
用戶數據包協議(英語:User Datagram Protocol,縮寫為UDP),又稱用戶數據報文協議,是一個簡單的面向數據報的傳輸層協議,正式規範為RFC 768。
在TCP/IP模型中,UDP為網絡層以上和應用層以下提供了一個簡單的接口。UDP只提供數據的不可靠傳遞,它一旦把應用程序發給網絡層的數據發送出去,就不保留數據備份(所以UDP有時候也被認為是不可靠的數據報協議)。UDP在IP數據報的頭部僅僅加入了復用和數據校驗(字段)。
UDP首部字段由4個部分組成,其中兩個是可選的。各16bit的來源端口和目的端口用來標記發送和接受的應用進程。因為UDP不需要應答,所以來源端口是可選的,如果來源端口不用,那麽置為零。在目的端口後面是長度固定的以字節為單位的長度域,用來指定UDP數據報包括數據部分的長度,長度最小值為8byte。首部剩下地16bit是用來對首部和數據部分一起做校驗和(Checksum)的,這部分是可選的,但在實際應用中一般都使用這一功能。
由於缺乏可靠性且屬於非連接導向協議,UDP應用一般必須允許一定量的丟包、出錯和復制粘貼。但有些應用,比如TFTP,如果需要則必須在應用層增加根本的可靠機制。但是絕大多數UDP應用都不需要可靠機制,甚至可能因為引入可靠機制而降低性能。流媒體(流技術)、即時多媒體遊戲和IP電話(VoIP)一定就是典型的UDP應用。如果某個應用需要很高的可靠性,那麽可以用傳輸控制協議(TCP協議)來代替UDP。
由於缺乏擁塞控制(congestion control),需要基於網絡的機制來減少因失控和高速UDP流量負荷而導致的擁塞崩潰效應。換句話說,因為UDP發送者不能夠檢測擁塞,所以像使用包隊列和丟棄技術的路由器這樣的網絡基本設備往往就成為降低UDP過大通信量的有效工具。數據報擁塞控制協議(DCCP)設計成通過在諸如流媒體類型的高速率UDP流中,增加主機擁塞控制,來減小這個潛在的問題。
socket套接字
socket概念
黏包
網絡編程(更新中)