网络编程——常用协议解析
**
1、網絡基礎知識
**
1.1> 什么是OSI模型
OSI 模型(Open System Interconnection model)是一個由國際標準化組織?提出的概念模型,試圖?供一個使各種不同的計算機和網絡在世界范圍內實現互聯的標準框架。
它將計算機網絡體系結構劃分為七層,每層都可以提供抽象良好的接口。了解 OSI 模型有助于理解實際上互聯網絡的工業標準——TCP/IP 協議。
1.2> OSI模型介紹
物理層:
物理層負責最后將信息編碼成電流脈沖或其它信號用于網上傳輸;
eg:RJ45等將數據轉化成0和1;
數據鏈路層:
數據鏈路層通過物理網絡鏈路?供數據傳輸。不同的數據鏈路層定義了不同的網絡和協 議特征,其中包括物理編址、網絡拓撲結構、錯誤校驗、數據幀序列以及流控;
可以簡單的理解為:規定了0和1的分包形式,確定了網絡數據包的形式;
網絡層:
網絡層負責在源和終點之間建立連接;
可以理解為,此處需要確定計算機的位置,怎么確定?IPv4,IPv6!
傳輸層
傳輸層向高層?提供可靠的端到端的網絡數據流服務。
可以理解為:每一個應用程序都會在網卡注冊一個端口號,該層就是端口與端口的通信!常用的(TCP/IP)協議;
會話層
會話層建立、管理和終止表示層與實體之間的通信會話;
建立一個連接(自動的手機信息、自動的網絡尋址);
表示層:
表示層提供多種功能用于應用層數據編碼和轉化,以確保以一個系統應用層發送的信息 可以被另一個系統應用層識別;
可以理解為:解決不同系統之間的通信,eg:Linux下的QQ和Windows下的QQ可以通信;
應用層:
OSI 的應用層協議包括文件的傳輸、訪問及管理協議(FTAM) ,以及文件虛擬終端協議(VIP)和公用管理系統信息(CMIP)等;
規定數據的傳輸協議;
常見的應用層協議
互聯網分層結構的好處: 上層的變動完全不影響下層的結構。
1.4> TCP/IP 協議基本概念
OSI 模型所分的七層,在實際應用中,往往有一些層被整合,或者功能分散到其他層去。TCP/IP 沒有照搬 OSI 模型,也沒有 一個公認的 TCP/IP 層級模型,一般劃分為三層到五層模型來描述 TCP/IP 協議。
- 在此描述用一個通用的四層模型來描述,每一層都和 OSI 模型有較強的相關性但是又可能會有交叉
- TCP/IP 的設計,是吸取了分層模型的精華思想——封裝。每層對上一層?供服務的時 候,上一層的數據結構是黑盒,直接作為本層的數據,而不需要關心上一層協議的任何細節
TCP/IP 分層模型的分層以以太網上傳輸 UDP 數據包如圖所示;
1.5> 四層模型介紹
網絡接口層
網絡接口層包括用于協作IP數據在已有網絡介質上傳輸的協議。
它定義像地址解析協議(Address Resolution Protocol,ARP)這樣的協議,?供 TCP/IP 協議的數據結構和實際物理硬件之間的接口。
可以理解為:確定了網絡數據包的形式。
網間層
網間層對應于 OSI 七層參考模型的網絡層,本層包含 IP 協議、RIP 協議(Routing Information Protocol,路由信息協議),負責數據的包裝、尋址和路由。同時還包含網間控制報文協議(Internet Control Message Protocol,ICMP)用來?供網絡診斷信息;
可以理解為:該層時確定計算機的位置。
傳輸層
傳輸層對應于 OSI 七層參考模型的傳輸層,它?供兩種端到端的通信服務。其中 TCP 協議(Transmission Control Protocol)提供可靠的數據流運輸服務,UDP 協議(Use Datagram Protocol)提供不可靠的用戶數據報服務。
TCP:三次握手、四次揮手;UDP:只發不管別人收不收得到–任性哈
應用層
應用層對應于 OSI 七層參考模型的應用層和表達層;
不明白的再看看7層參考模型的描述。
1.6> 數據包
寬泛意義的數據包:每一個數據包都包含"標頭"和"數據"兩個部分."標頭"包含本數據包的一些說明."數據"則是本數據包的內容.
細分數據包:
應用程序數據包: 標頭部分規定應用程序的數據格式.數據部分傳輸具體的數據內容. ——對應下圖中的數據!
TCP/UDP數據包:標頭部分包含雙方的發出端口和接收端口. UDP數據包:'標頭’長度:8個字節,"數據包"總長度最大為65535字節,正好放進一個IP數據包. TCP數據包:理論上沒有長度限制,但是,為了保證網絡傳輸效率,通常不會超過IP數據長度,確保單個包不會被分割. ——對應下圖中的UDP數據!
IP數據包: 標頭部分包含通信雙方的IP地址,協議版本,長度等信息. '標頭’長度:20~60字節,"數據包"總長度最大為65535字節. ——對應下圖中的IP數據
以太網數據包: 最基礎的數據包.標頭部分包含了通信雙方的MAC地址,數據類型等. '標頭’長度:18字節,'數據’部分長度:46~1500字節. ——對應下圖中的以太網數據
UDP(User Datagram protocol)用戶數據報協議,它只提供應用進程尋址和簡單的差錯檢測,并不提供其他功能。
TCP(Transmission Control Protocol,傳輸控制協議)是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常復雜,只簡單的描述下這三次對話的簡單過程:主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;主機B向主機A發送同意連接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)的數據包:“可以,你什么時候發?”,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之后,主機A才向主機B正式發送數據。
**
2、TCP/IP 協議族
**
2.1> TCP/IP 協議族常用協議
應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
傳輸層:TCP,UDP
網絡層:IP,ICMP,OSPF,EIGRP,IGMP
數據鏈路層:SLIP,CSLIP,PPP,MTU
- 重要的 TCP/IP 協議族協議進行簡單介紹:
IP(Internet Protocol,網際協議)是網間層的主要協議,任務是在源地址和和目的地址之間傳輸數據。IP 協議只是盡最大努力來傳輸數據包,并不保證所有的包都可以傳輸 到目的地,也不保證數據包的順序和唯一。
IP 定義了 TCP/IP 的地址,尋址方法,以及路由規則。現在廣泛使用的 IP 協議有 IPv4 和 IPv6 兩種:IPv4 使用 32 位二進制整數做地址,一般使用點分十進制方式表示,比如 192.168.0.1。
IP 地址由兩部分組成,即網絡號和主機號。故一個完整的 IPv4 地址往往表示 為 192.168.0.1/24 或192.168.0.1/255.255.255.0 這種形式。
IPv6 是為了解決 IPv4 地址耗盡和其它一些問題而研發的最新版本的 IP。使用 128 位 整數表示地址,通常使用冒號分隔的十六進制來表示,并且可以省略其中一串連續的 0,如:fe80::200:1ff:fe00:1。
ICMP(Internet Control Message Protocol,網絡控制消息協議)是 TCP/IP 的 核心協議之一,用于在 IP 網絡中發送控制消息,?供通信過程中的各種問題反饋。 ICMP 直接使用 IP 數據包傳輸,但 ICMP 并不被視為 IP 協議的子協議。常見的聯網狀態診斷工具比如依賴于 ICMP 協議;
TCP(TransmissionControlProtocol,傳輸控制協議)是一種面向連接的,可靠的, 基于字節流傳輸的通信協議。TCP 具有端口號的概念,用來標識同一個地址上的不 同應用。?述 TCP 的標準文檔是 RFC793。
UDP(UserDatagramProtocol,用戶數據報協議)是一個面向數據報的傳輸層協 議。UDP 的傳輸是不可靠的,簡單的說就是發了不管,發送者不會知道目標地址 的數據通路是否發生擁塞,也不知道數據是否到達,是否完整以及是否還是原來的 次序。它同 TCP 一樣有用來標識本地應用的端口號。所以應用 UDP 的應用,都能 夠容忍一定數量的錯誤和丟包,但是對傳輸性能敏感的,比如流媒體、DNS 等。
ECHO(EchoProtocol,回聲協議)是一個簡單的調試和檢測工具。服務器器會 原樣回發它收到的任何數據,既可以使用 TCP 傳輸,也可以使用 UDP 傳輸。使用 端口號 7 。
DHCP(DynamicHostConfigrationProtocol,動態主機配置協議)是用于局域 網自動分配 IP 地址和主機配置的協議。可以使局域網的部署更加簡單。
DNS(DomainNameSystem,域名系統)是互聯網的一項服務,可以簡單的將用“.” 分隔的一般會有意義的域名轉換成不易記憶的 IP 地址。一般使用 UDP 協議傳輸, 也可以使用 TCP,默認服務端口號 53。?
FTP(FileTransferProtocol,文件傳輸協議)是用來進行文件傳輸的標準協議。 FTP 基于 TCP 使用端口號 20 來傳輸數據,21 來傳輸控制信息。
TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)是一個簡化的文 件傳輸協議,其設計非常簡單,通過少量存儲器就能輕松實現,所以一般被用來通 過網絡引導計算機過程中傳輸引導文件等小文件;
SSH(SecureShell,安全Shell),因為傳統的網絡服務程序比如TELNET本質上都極不安全,明文傳說數據和用戶信息包括密碼,SSH 被開發出來避免這些問題, 它其實是一個協議框架,有大量的擴展冗余能力,并且?供了加密壓縮的通道可以 為其他協議使用。
POP(PostOfficeProtocol,郵局協議)是支持通過客戶端訪問電子郵件的服務, 現在版本是 POP3,也有加密的版本 POP3S。協議使用 TCP,端口 110。
SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)是現在在互聯網 上發送電子郵件的事實標準。使用 TCP 協議傳輸,端口號 25。
HTTP(HyperTextTransferProtocol,超文本傳輸協議)是現在廣為流行的WEB 網絡的基礎,HTTPS 是 HTTP 的加密安全版本。協議通過 TCP 傳輸,HTTP 默認 使用端口 80,HTTPS 使用 443。
2.2> TCP &UDP
TCP提供一對一的、面向連接的可靠通信服務。TCP建立連接,對發送的數據包進行排序和確認,并恢復在傳輸過程中丟失的數據包。與TCP不同,UDP提供一對一或一對多的、無連接的不可靠通信服務。
不論是TCP/IP還是在OSI參考模型中,任意相鄰兩層的下層為服務提供者,上層為服務調用者。下層為上層提供的服務可分為兩類:面向連接服務和無連接服務。
面向連接的網絡服務(TCP)
面向連接的網絡服務又稱為虛電路(Virtual
Circuit)服務,它具有網絡連接建立、數據傳輸和網絡連接釋放三個階段。是按順序傳輸可靠的報文分組方式,適用于指定對象、長報文、會話型傳輸要求。
&
面向連接服務以電話系統為模式。要和某個人通話,首先拿起電話,撥號碼,通話,然后掛斷。同樣在使用面向連接的服務時,用戶首先要建立連接,使用連接,然后釋放連接。連接本質上像個管道:發送者在管道的一端放入物體,接收者在另一端按同樣的次序取出物體;其特點是收發的數據不僅順序一致,而且內容也相同。–類似打電話
無連接的網絡服務
無連接網絡服務的兩實體之間的通信不需要事先建立好一個連接。無連接網絡服務有3種類型:數據報(Datagram)、確認交付(Confirmed
Delivery)與請求回答(Request reply)。
無連接服務以郵政系統為模式。每個報文(信件)帶有完整的目的地址,并且每一個報文都獨立于其他報文,由系統選定的路線傳遞。在正常情況下,當兩個報文發往同一目的地時,先發的先到。但是,也有可能先發的報文在途中延誤了,后發的報文反而先收到;而這種情況在面向連接的服務中是絕對不可能發生的。–類似發短信
TCP的優缺點
從原理上,TCP的優勢有:
- 簡單直接的長連接;
- 可靠的信息傳輸;
- 數據包的大小沒有限制;
TCP最糟糕的特性是它對阻塞的控制。
一般來說,TCP假定丟包是由于網絡帶寬不夠造成的,所以發生這種情況的時候,TCP就會減少發包速度。
在3G或WiFi下,一個數據包丟失了,你希望的是立馬重發這個數據包,然而TCP的阻塞機制卻完全是采用相反的方式來處理!
而且沒有任何辦法能夠繞過這個機制,因為這是TCP協議構建的基礎。這就是為什么在3G或者WiFi環境下,ping值能夠上升到1000多毫秒的原因。
一個采用TCP的游戲必須能夠處理好突發的延遲問題(紙牌客戶端就很典型,對突發性的一秒的延遲,玩家也不會產生什么抱怨)或者是擁有緩解延遲問題的好方法。
魔獸世界中是有多重連接的, 應該是UDP和TCP共用的, UDP用于不要求數據可靠的數據, TCP用于傳輸有可靠性要求的數據.
例如周圍人物的動向,NPC移動,技能動畫指令等則可以使用UDP,這個UDP并不保證可靠,但丟包影響不大。對于技能,
金錢,經驗等重要的人物數據, 必須通過TCP保證.
UDP的優缺點
UDP (User Datagram Protocol,用戶數據報協議),是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,
UDP是基于數據包構建,這意味著在某些方面需要你完全顛覆在TCP下的觀念。UDP只使用一個socket進行通信,不像TCP需要為每一個客戶端建立一個socket連接。
在選擇使用協議的時候,選擇UDP必須要謹慎。
在網絡質量令人十分不滿意的環境下,UDP協議數據包丟失會比較嚴重。
但是由于UDP的特性:它不屬于連接型協議,因而具有資源消耗小,處理速度快的優點,
所以通常音頻、視頻和普通數據在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。
那么到底是用UDP還是TCP呢?
- 如果是由客戶端間歇性的發起無狀態的查詢,并且偶爾發生延遲是可以容忍,那么使用HTTP/HTTPS吧。
- 如果客戶端和服務器都可以獨立發包,但是偶爾發生延遲可以容忍(比如:在線的紙牌游戲,許多MMO類的游戲),那么使用TCP長連接吧。
- 如果客戶端和服務器都可以獨立發包,而且無法忍受延遲(比如:大多數的多人動作類游戲,一些MMO類游戲),那么使用UDP吧。
這些也應該考慮在內:你的MMO客戶端也許首先使用HTTP去獲取上一次的更新內容,然后使用UDP跟游戲服務器進行連接。
2.3> TCP 工作原理
TCP–傳輸控制協議
TCP全稱是Transmission Control Protocol,中文名為傳輸控制協議,它可以提供可靠的、面向連接的網絡數據傳遞服務。
- 傳輸控制協議主要包含下列任務和功能:
確保IP數據報的成功傳遞。
對程序發送的大塊數據進行分段和重組。
確保正確排序及按順序傳遞分段的數據。
通過計算校驗和,進行傳輸數據的完整性檢查。
根據數據是否接收成功發送肯定消息。通過使用選擇性確認,也對沒有收到的數據發送否定確認。
為必須使用可靠的、基于會話的數據傳輸程序,如客戶端/服務器數據庫和電子郵件程序,提供首選傳輸方法。
TCP工作原理
TCP的連接建立過程又稱為TCP三次握手;
首先發送方主機向接收方主機發起一個建立連接的同步(SYN)請求;
接收方主機在收到這個請求后向發送方主機回復一個同步/確認(SYN/ACK)應答;
發送方主機收到此包后再向接收方主機發送一個確認(ACK),此時TCP連接成功建立.
一旦初始的三次握手完成,在發送和接收主機之間將按順序發送和確認段。關閉連接之前,TCP使用類似的握手過程驗證兩個主機是否都完成發送和接收全部數據。
完成三次握手,客戶端與服務器開始傳送數據。
HTTP(Hypertext Transfer Protocol)超文本傳輸協議(80)
1).請求報文:請求行 - 通用信息頭 - 請求頭 - 實體頭 - 報文主體
2).應答報文:狀態行 - 通用信息頭 - 響應頭 - 實體頭- 報文主體
3).訪問過程如下
HTTP+TCP網絡傳輸示意圖:
TCP協議的三次握手與四次關閉詳解,傳送門
IP數據包和TCP/UDP的數據包
2.4> HTTP協議常用狀態碼
4).狀態碼A).1xx:指示信息--表示請求已接收,繼續處理100——客戶必須繼續發出請求101——客戶要求服務器根據請求轉換HTTP協議版本B).2xx:成功--表示請求已被成功接收、理解、接受200——請求成功201——提示知道新文件的URL202——接受和處理、但處理未完成203——返回信息不確定或不完整204——請求收到,但返回信息為空205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件206——服務器已經完成了部分用戶的GET請求C).3xx:重定向--要完成請求必須進行更進一步的操作300——請求的資源可在多處得到301——刪除請求數據302——在其他地址發現了請求數據303——建議客戶訪問其他URL或訪問方式304——客戶端已經執行了GET,但文件未變化305——請求的資源必須從服務器指定的地址得到306——前一版本HTTP中使用的代碼,現行版本中不再使用307——申明請求的資源臨時性刪除D).4xx:客戶端錯誤--請求有語法錯誤或請求無法實現400——錯誤請求,如語法錯誤401——請求授權失敗402——保留有效ChargeTo頭響應403——請求不允許404——沒有發現文件、查詢或URl405——用戶在Request-Line字段定義的方法不允許406——根據用戶發送的Accept拖,請求資源不可訪問407——類似401,用戶必須首先在代理服務器上得到授權408——客戶端沒有在用戶指定的餓時間內完成請求409——對當前資源狀態,請求不能完成410——服務器上不再有此資源且無進一步的參考地址411——服務器拒絕用戶定義的Content-Length屬性請求412——一個或多個請求頭字段在當前請求中錯誤413——請求的資源大于服務器允許的大小414——請求的資源URL長于服務器允許的長度415——請求資源不支持請求項目格式416——請求中包含Range請求頭字段,在當前請求資源范圍內沒有range指示值,請求也不包含If-Range請求頭字段417——服務器不滿足請求Expect頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求E).5xx:服務器端錯誤--服務器未能實現合法的請求500——服務器產生內部錯誤501——服務器不支持請求的函數502——服務器暫時不可用,有時是為了防止發生系統過載503——服務器過載或暫停維修504——關口過載,服務器使用另一個關口或服務來響應用戶,等待時間設定值較長505——服務器不支持或拒絕支請求頭中指定的HTTP版本HTTPS(Hypertext Transfer Protocol Secure)超文本傳輸安全協議(443)
1).HTTP+SSL(Netscape的安全套接層)
a).SSL((Secure Sockets Layer) 安全套接層(40-128)
b).TLS(Transport Layer Security) 傳輸層安全 2).數據加密(SSL);身份認證(CA證書)
TCP(Transmission Control Protocol)傳輸控制協議
1).面向連接
2).可靠傳輸的情況, 應用于文件傳輸, 重要狀態更新等場景
3).傳輸大量數據
4).傳輸慢
UDP(User Data Protocol)用戶數據協議
1).面向非連接
2).高速傳輸和實時性要求較高的通信領域(可靠性需要應用層控制)
3).傳輸少量數據
4).傳輸快
**
三、Socket
**
3.1> Socket 簡介
Socket起源于 20 世 紀 80 年代早期,最早由 4.1c BSD UNIX 引入,所以也稱之為“BSD Socket 或者 Berkeley Socket”。BSD Socket 是事實上的網絡應用編程接口標準,其它編程語言往往也是用與這套(用C寫成的編程接口)類似接口。
用 Socket 能夠實現網絡上的不同主機之間或同一主機的不同對象之間的數據通信。所以,現在 Socket 已經是一類通用通信接口的集合。
大的類型可以分為網絡 Socket 和本地 Socket 兩種。
本地上的兩個進程如何通信?
- 內存共享(munmap());
- 消息和隊列
- 管道(匿名管道pipe()和命名管道mkfifo());
- 信號量(P V操作);
- RPC remote protocol control
- 本地Socket;
網路上的兩個進程如何通信?
本地進程間通信(IPC)通過PID(在終端中輸入ps-ef可查看PID)可以唯一確定彼此,然后通過共享內存,消息隊列來通;
網絡上的兩個進程確定彼此需要IP與端口號,通過傳輸層(TCP/UDP)協議進行通信;
這就是網絡 Socket 。 socket可以理解為:在TCP/UDP 加一個端口綁定。
網絡socket和 本地 Socket對比
在同一個設備上,兩個進程如果需要進行通訊最基本的一個前提能能夠唯一的標示一個進程,在本地進程通訊中可以使用PID來唯一標示一個進程;
PID只在本地唯一,網絡中的兩個進程PID沖突幾率很大,此時顯然不行了,怎么辦?
IP層的ip地址可以唯一標示主機,而TCP層協議和端口號可以唯一標示主機的一個進程,所以可以利用ip地址+協議+端口號唯一標示網絡中的一個進程。
Socket通信就是一種確定了端口號的TCP/IP通信,或者說Socket通信與IP通信差別就是端口確定,協議確定。
用一張圖表達一下:
端口的打開是雙方的,在C/S(Client&&Server)結構的TCP連接中不僅僅要注意到S的端口(監聽的),實際上C也開了一個端口,而C端的端口是動態端口,TCP連接建立的時候,C端的端口會在三次握手結束后確定,動態打開一個,這個端口不受用戶/程序員的控制。
Socket 代碼編寫步驟
創建客戶端Socket
創建服務器Socket
連接到服務器(Socket編程)
發送數據給服務器
接收服務器返回的數據
關閉Socket : close(socketNumber)
一張經典的Socket C/S的步驟圖。
3.2> Socket編程優劣勢
1).socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口
2).連接過程:服務器監聽,客戶端請求,連接確認
3).優勢與劣勢
A).優勢:
B).劣勢:
a).需對傳輸的數據進行解析,轉化成應用級的數據 b).相對于HTTP協議傳輸,增加了開發量 c).對開發人員的開發水平要求高4).基于Socket傳輸的特點其適用于對傳輸速度,安全性,實時交互,費用等要求高的應用中,如網絡游戲,手機應用,銀行內部交互等
**
四、拓展:
**
http://geosmart.github.io/2017/09/17/Web開發常用協議/
https://www.cnblogs.com/fzz9/p/8964513.htm
Socket
https://blog.csdn.net/alpha_love/article/details/62043077
總結
以上是生活随笔為你收集整理的网络编程——常用协议解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减肥期间突然体重增加怎么回事
- 下一篇: TCP协议——三次握手与四次关闭