一、TCP/IP五層協議
? ->? ?應用層 : 傳輸的數據在應用程序中如何使用
? ?->? ?傳輸層 : 關注的是通信的起點終點
? ?->? ?網絡層 : 關注的是通信中的路線規劃
? ?->? ?數據鏈路層 : 關注的是相鄰節點之間的通信細節
? ?->? ?物理層 : 網絡通信的基礎設施
說是五層,實際上下面這四層都是在 操作系統內核,硬件,驅動程序中已經實現好了,(計算機內置了)
我們程序員在網絡編程過程中能影響到的也就只有應用層了.
對于一臺主機,他的操作系統內核實現了從傳輸層到物理層的內容,也即是TCP/IP五層模型的下四層;
對于一臺路由器,他實現了從網絡層到物理層,也即是TCP/IP五層模型的下三層;? ->? 路由器工作在網絡層
對于一臺交換機,他實現了從數據鏈路層到物理層,也即是TCP/IP五層模型的下兩層;? ?->? 交換機工作在數據鏈路層
對于集線器,他只實現了物理層;
二、封裝和分用
封裝和分用,是網絡傳輸數據過程中,最核心的流程.
例:
比如說,A通過QQ給B發送了一個hello? ?->? ?會經歷以下流程
2.1 分裝
2.1.1 應用層(應用程序)
QQ從消息輸入框獲取到用戶輸入的hello
就要把這個字符串構造成一個應用層的數據包
QQ這樣的程序就內置了一個應用層協議,應用層數據包就是按照這個應用層協議約定的格式來構造.
約定格式如下:
接下來,應用程序就會調用操作系統提供的api,把這個數據包交給傳輸層.
2.1.2?傳輸層
傳輸層就會把上述數據作為一個整體,再構造成一個傳輸層的數據包.
傳輸層涉及到的協議就是TCP和UDP
此處假定是使用UDP來進行通信.就會構造成一個UDP數據包.
這個數據包,由應用層傳輸過來的內容看作一個整體,叫做載荷,添加一個UDP報頭,叫做報頭.
這個整體就是我們的UDP數據包.
形容這樣的添加報頭的過程就叫做 " 封裝 ",其實就是,字符串拼接.
只不過拼接的報頭,具有一定的結構.
UDP報頭,雖然不能保護數據,但是可以起到 " 貼標簽 " 類似效果.
就能承載一些關鍵的用來轉發數據的信息.
對于UDP報頭來說,承載的最重要的信息就是 源端口 和 目的端口.
拼好傳輸層數據包后,就要把這個數據包進一步的交給下層,網絡層繼續進行了封裝.
(交給下層,指的是,下層協議提供一組api(函數),上層調用這個api,并且把剛才構造好的數據通過參數傳過去,下層協議就可以來處理這個數據了)
2.1.3 網絡層?
網絡層,這里涉及到了最核心的協議? ?->? ?IP協議
網絡層 IP協議,把剛才的傳輸層的UDP數據包作為一個整體,再拼上IP協議的報頭.
構造成一個IP數據包.
構造完成完整的IP數據包之后,IP協議繼續調用數據鏈路層的api,把數據再交給數據鏈路層這里的協議進行處理.
2.1.4 數據鏈路層
數據鏈路層這里涉及到的核心協議? ?->? ?以太網? ?->? ?此處 " 以太 " 用來表示網絡數據傳輸的介質.
以太網就是我們日常最常見到的有線網絡.
我們日常用到的網線,也叫做 " 以太網線 ",日常用到的網口也叫做 " 以太網口 ".
用到的交換機,也叫做 " 以太交換機 '.
以太數據幀.也是以IP數據包作為一個整體,在這個基礎上添加幀頭和幀尾.
接下來,再把這個數據交給物理層.
2.1.5 物理層
物理層? ?->? ?硬件設備
把上述這樣的以太網數據幀,二進制結構( 一串0 1 0 1 這樣的數據),轉換成 光信號/電信號/電磁波,然后進行發送.
經過上述一些列的操作,數據就從電腦上發送出去了.
2.2 分用
暫時不考慮中間過程,假定數據包已經到達B網卡了,B如何處理,B的處理過程就稱為 " 分用 ".
2.2.1 物理層
B的物理層收到了光信號/電磁波/電信號,就會把這些物理信號轉換成 數字信號(二進制的0 1 0 1 ),得到一個以太網數據幀,進一步的把這個數據幀交給數據鏈路層處理.
2.2.2 數據鏈路層? ?以太網
按照以太網數據幀的格式,來解析,取出其中的載荷,再交給上層協議.
2.2.3 網絡層 IP協議
按照IP協議的格式進行解析,去除其中的載荷,再交給上層協議.
2.2.4 傳輸層 UDP協議
按照UDP協議格式來解析,取出其中的載荷,再交給上層協議.
2.2.5 應用層
按照應用程序的內部應用層協議來解析數據
例:
QQ在拿到信息后,就會在窗口中顯示,讓你看到信息(聊天消息).
分用的過程,就是封裝的逆向過程.
真實情況下,兩個主機不太會是通過網線直連的,通過一系列的交換機和路由器來進行數據轉發的.
但是實際上,即使是經過交換機或者路由器,上述的分裝分用過程,也是同樣適用的.
只不過,封裝分用的程度不一定是到應用層.
經典交換機來說,就只需要封裝分用到數據鏈路層即可.
經典的路由器來說,就只需要封裝分用到網絡層即可.
交換機會把光電信號轉換成以太網數據幀二級制數據,交給數據鏈路.
交換機的數據鏈路層就會對上述數據進行解析.
這個解析過程,一方面要取出載荷部分,另一方面,就要解析到幀頭中的關鍵信息.
根據幀頭中的關鍵信息,決定下一步把數據往哪里進行發送,根據這個情況再進一步的構造出新的以太網數據幀.
把這個新的數據通過物理層發送出去.
如果是路由器,情況稍微復雜一點點,就是封裝分用到網絡層.
先是物理層拿到光電信號,轉成二進制數據交給數據鏈路層
IP協議對進行解析,取出載荷,再重新封裝
繼續交給數據鏈路層,繼續加上幀頭幀尾
這個數據再交給物理層,轉成光電信號,繼續傳輸.
三、幾個術語
描述一個網絡上傳輸的數據,單位"可能會用到這幾個術語:
包? ?->? ?packet
段? ?->? ?segment
報? ?->? ?datagram
幀? ?->? ?frame
如 : IP數據包 / IP數據報
網絡編程,本質上就是學習 傳輸層 給 應用層 提供的 API,就可以寫入代碼,把數據交給傳輸層,進一步通過層層封裝,就可以把數據通過網卡發送出去了.
四、網絡編程中一些重要的概念
4.1 客戶端VS服務器
? ? ? ? 再網絡中,主動發起通信的這一方,稱為 " 客戶端 ",被動接受的這一方,稱為 " 服務器 ".
同一個程序再不同的場景中,可能是客戶端,也可能是服務器.
客戶端給服務器發送的數據,稱為 " 請求 " (request)
服務器給客戶端返回的數據,稱為 " 響應 " (response)
客戶端和服務器之間的交互,也是有很多種模式的.
1? ?->? ?一問一答
一個請求對應一個響應,一對一? ? ? ? 常見于網頁開發(web開發)
2? ?->? ?一問多答
一個請求對應多個響應? ? ? ? ? ? ? ? 常見于 "下載"
3? ?->? ?多問一答
多個請求對應一個響應? ? ? ? 常見于 "上傳"
4? ?->? ?多問多答
一個請求可能對應多個響應
一個響應也可能對應多個請求? ? ? ? ? ? ? ? 常見于 "遠程控制/遠程桌面"
五、TCP和UDP特點上的差別
要想進行網絡編程,需要使用系統的API,本質上是傳輸層提供的.
傳輸層涉及到的協議主要是兩個,TCP,UDP
由于這兩個協議,之間差異很大,他們的api差距也很大.
TCP和UDP特點上的差別:
????????TCP? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?UDP
? ? ?有連接? ? ? ? ? ? ? ? ? ?????????? ? ? ?無連接
? ? ?可靠傳輸? ? ? ? ? ? ? ? ? ? ? ? ????不可靠傳輸
? ? ?面向字節流? ? ? ? ? ? ? ? ? ? ? ? ?面向數據報
? ? ? 全雙工? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?全雙工
有鏈接/無連接? ?->? ?指的是抽象的,本質上就是是否有記錄對方的信息
可靠傳輸/不可靠傳輸? ?->? ?盡可能的完成數據傳輸,雖然無法確保數據到達對方,至少可以知道,當前這個數據對方是不是收到了.
ps : 網絡上存在的 "異常情況" 是很多的,無論什么手段都無法保證這個數據100%能從A到達B
此處的可靠傳輸,主要是指發的數據到沒到,發送方能知道.
面向字節流? ?->? ?此處談到的字節流與文件中的字節流完全一致.? ? ? ? TCP
網絡中傳輸數據的基本單位是字節.
面向數據包? ?->? ?每次傳輸的基本單位是一個 "數據報" 特定的結構? ?UDP
全雙工? ?->? ?一個信道,可以雙向通信
半雙工? ?->? ?一個信道,只能單向通信