大家好呀
我是浪前
今天講解的是網絡篇的第三章:網絡編程概念和TCP&UDP的區別
網絡編程概念+TCP和UDP的區別
- 跨主機通信:
- 網絡編程
- 插座:
- 網絡編程的本質:
- 網絡編程的重要概念:
- 客戶端和服務器:
- 客戶端和服務器的交互模式
- TCP 和UDP的區別
大家好呀,我們今天繼續來學習網絡篇
網絡篇的前兩篇博客主要是進行了網絡初識,主要介紹了網絡的基本概念和背景流程
接下來的章節會重點介紹網絡編程:
也就是去實際地編寫代碼,通過代碼來完成基于網絡的跨主機通信
跨主機通信:
實現跨主機通信有很多的方式,如下所示:
- TCP/IP網絡
- 藍牙通信
- 近場通信(NFC)
- 毫米波通信
- 等等
而TCP/IP網絡是我們日常編程中最容易涉及到的最通用的跨主機通信的方式
藍牙通信的方式特點:功耗低,待機時間長,效率也低
近場通信(NFC): 需要在現實中貼的很近才可以
毫米波通信: 功率較高,帶寬也高,抗干擾能力差
所以我們下面就直接來學習TCP/IP的跨主機通信方式吧~
網絡編程
網絡編程的定義就是:通過網絡,讓兩個主機之間能夠進行通信,基于這樣的通信來完成一定的功能
插座:
注意:需要一組插座才可以完成網絡編程:
插座的定義:
進行網絡編程的時候,需要操作系統提供一組API,通過這些API才能完成網絡編程
API就是應用層和傳輸層之間交互的路徑
這一組API就稱作“Socket API”,也就是叫做插座。
通過這一套Socket API 就可以解決不同主機之間,不同系統之間的網絡通信了
在傳輸層這一層里面提供的網絡協議,主要是TCP和UDP協議,
而TCP和UDP這兩個協議的工作原理和特性差別很大,導致使用了這兩個協議進行的網絡編程也存在一定的差別,所以系統就提供了兩套Socket API
TCP有一套Socket API ,UDP也有一套Socket API
網絡編程的本質:
網絡編程的本質就是學習傳輸層給應用層提供的API就可以寫網絡編程的代碼,通過代碼把數據交給傳輸層,進一步通過層層封裝,就可以把數據通過網卡發送出去了
我們要學習的不僅僅是API,也要學習網絡程序的基本工作流程
后端開發:就是服務器上的程序開發
而服務器就會涉及到大量的網絡通信
雖然實際開發中使用的是一些框架,比如Spring
不會直接用到系統原生的API,但是框架的背后,也是封裝了系統API來實現網絡通信的
只要我們掌握了這些基礎API,就可以更好地理解框架的工作流程,也可以擁有自己去實現框架/魔改框架的能力,然后搭配上數據結構和算法能力才是未來的核心競爭力,而不是學會了什么特別高大上的流行框架:
如下圖所示,一圖勝千言~
![[表情包.gif]]
網絡編程的重要概念:
客戶端和服務器:
客戶端 vs 服務器
客戶端的定義:
客戶端就是在網絡中,主動發起通信的一方,就是客戶端
服務器的定義:
服務器就是被動接受的一方
客戶端和服務器的角色不是固定不變的~
同一個程序在不同的場景中,可能是客戶端,也可能是服務器
舉一個大家都喜歡聽的例子:
在少男少女談戀愛的過程中:一般是男生追求女生,
但是如果一直是男生單方面努力,全靠男生主動,這個戀愛大概率不可能談成,男生要么追不上,要么即使最后費盡千辛萬苦才談上,但是這個感情也難以長久
那么戀愛的正確打開方式是什么呢?
正常情況一般是男生主動了一段時間之后,女生也能夠主動,也就是女生也有積極的回應男生的追求,這樣后面感情才會長長久久
給大家支一個小妙招~
當你的女朋友給你發消息,說肚子疼,最近不舒服的時候,你千萬不要回復“多喝熱水/巖漿”這樣的廢話,記住這句話
Talk is cheaper, show me the action
你先不要急著回復消息,如果你們是同校,那么你立即去買好熱好紅糖水和布洛芬,然后走到她的宿舍樓下,叫她下來拿…
如果你們是異地,你可以立馬在美團買藥的購物車里面加滿布洛芬+紅糖水的商品,然后配送到她的地點,到了之后直接call她電話,告訴她去拿藥…
切實的行動勝過千言萬語~
好啦,今天的戀愛小課堂就結束啦,我們拉回正題
所以程序在網絡中的角色是可以發生改變的,主動的時候就是客戶端,被動的時候就是服務器
請求(request):
請求的定義:客戶端給服務器發送的數據稱為 “請求”
響應(response):
響應的定義:服務器給客戶端返回的數據稱為“響應”
客戶端和服務器的交互模式
客戶端和服務器一共有四種交互模式:
- 一問一答
- 一問多答
- 多問一答
- 多問多答
我們分別來介紹:
1: 一問一答:
一個請求對應一個響應,一對一
在后續的網站開發(web開發)中都是這種一問一答的交互形式
如下圖所示;
2: 一問多答:
客戶端的一個請求對應了服務器的多個響應
使用場景: 適用于下載的場景,當你要下載一個大的文件時,此時客戶端發送這個下載任務請求的時候,服務器就分成了多個響應
3: 多問一答:
客戶端的多個請求只對應了一個服務器的響應
使用場景:上傳
4: 多問多答:
一個請求可能對應多個響應
一個響應也可能對應多個請求
這個場景主要涉及到“遠程控制/遠程桌面”
我們進行的鼠標鍵盤操作,都會作為一個個請求發送出去
我們看到的一個個畫面都對應了一個個響應
想要進行網絡編程,需要使用系統的API,這個API本質上是傳輸層提供的
傳輸層涉及到的協議主要有兩種: 一個是TCP 一個是UDP
由于這兩個協議之間的差異還是很大的,所以TCP和UDP的API各不相同
TCP 和UDP的區別
TCP和UDP這兩種協議的特性(工作原理) 差異很大,導致使用這兩種協議進行網絡編程,也存在一定的差別,系統就分別提供了兩套API
TCP和UDP的區別:
- TCP是有連接的,UDP是無連接的
- TCP是可靠傳輸的,UDP是不可靠傳輸的
- TCP是面向字節流的,UDP是面向數據報的
- TCP和UDP都是全雙工的
TCP是有連接的,UDP是無連接的
這里的連接是抽象的概念:不是物理上的連接,而是彼此保留了對方的關鍵信息
計算機中這種抽象的連接是很常見的
此處的連接本質上就是建立連接的雙方,各自保存對方的信息,連接的特點是雙方都認同
只要通信的雙方都記錄了對方的關鍵信息,此時連接就建立好了
TCP要想通信必須先建立連接,即要先保留對方的關鍵信息,連接建立好了之后,才能進行后續的通信
但是:如果A想和B建立連接,但是B不愿意,那么連接就會失敗
連接的本質就是各自保存對方的相關信息
舉一個例子~
小坤同學給小紀同學打電話,小紀同學接通了,這個連接才成功,如果小紀同學沒有接,那么連接失敗
這個連接是如何實現的?
在客戶端中,有一些數據結構記錄了誰是小坤同學的服務器
在服務器中,有一些數據結構記錄了誰是小坤同學的客戶端
在這個數據結構中,可以保存很多的信息,所以一個客戶端可以保存很多的服務器,一個服務器也可以保存很多的客戶端
TCP是有連接的,UDP是無連接的
UDP不需要進行連接,UDP想要進行通信,就直接發送數據即可,不需要征得對方的同意,UDP自身也不會保存對方的信息
雖然UDP不知道對方的信息,但是寫程序的人得知道,UDP自己不會保存,但是程序員調用UDP的socket api的時候要把對方的位置作為參數給傳過去
TCP會先去保存對方的關鍵信息,然后再進行連接
UDP是不會去保存對方的信息,直接進行的通信
TCP是可靠傳輸,UDP是不可靠傳輸
在網絡上存在的“異常情況“非常多,無論使用什么樣的軟硬件技術手段,都沒有辦法100%保證網絡數據能夠從A一定傳輸到B
網絡上進行通信,A -> B 發送一個消息,這個消息也不可能做到百分之百送達的
再牛逼的技術也比不過挖掘機的一鏟子
無線通信技術的手段,當然很厲害,但是傳輸的效率也比不過有線的
無線受到環境干擾的因素更加多了
TCP的可靠傳輸是退而求其次,可靠傳輸不是100%送達,
而是如果A給B發送消息,消息是否會真的送達到B ,
A是知道的,即A會知道消息是發送失敗還是發送成功,
如果發送失敗,那么A就可以在發送失敗的時候采取一定的措施(嘗試重傳之類的)
所以可靠傳輸指的是: A在發送消息之后,A能夠知道是發送成功還是發送失敗
在TCP中就內置了可靠傳輸機制
在UDP中就沒有內置可靠傳輸機制
為什么UDP不內置這個可靠傳輸機制呢?
因為這個可靠傳輸雖然很好,但是也還是要付出代價的
可靠傳輸是要去付出代價來交換的
做任何事情都是要付出代價的
如果內置了可靠傳輸機制,那么會導致:
- 機制更加復雜
- 傳輸效率會降低
TCP內置了可靠傳輸機制之后,在發送數據之后可以知道是否發送成功
UDP沒有內置可靠傳輸機制,在發送數據之后不知道是否發送成功
TCP是面向字節流的,UDP是面向數據報的
此處的字節流和文件操作中的字節流是一個意思
TCP也是文件操作一樣,以字節為單位來進行傳輸的
UDP則是按照數據報為單位來進行傳輸的,每次傳輸的基本單位是一個數據報
這個數據報是由一系列的字節構成的特定的結構
UDP數據報是有一個嚴格的格式的,一次只能傳輸一個完整的數據報,不可以只傳輸半個數據報
網絡通信數據的基本單位,涉及到多種說法:
- 數據報(Datagram)
- 數據包(Packet)
- 數據幀(Frame)
- 數據段(Segment)
TCP和UDP都是全雙工的
什么是全雙工?
一個信道,允許雙向通信,就是全雙工
一個信道,只能單向通信,就是半雙工
代碼中使用一個Socket對象,就可以發送數據也能夠接收數據,這個就是全雙工
操作系統提供的網絡編程的API 叫做“socket api”,意為插頭,插座
相當于代碼中使用一個Socket對象,就可以發送數據也能夠接受數據:
一個網線里面是有8根線,這個8根線分為兩組,4個一組,每一組都可以完成一個完成的通信過程)
分為兩組就是為了防止萬一其中的一根線壞了,那么另一組也可以正常地工作
這個一組中的4根線,有的負責上傳,有的負責下載,這里的全雙工就是靠著多根線來完成的