回覆列表
-
1 # 喲喲吼說科技
-
2 # 愛答問題的小星星
本人在目前從事嵌入式開發,主要是通訊類產品,平常開發工作中經常跟各種通訊協議打交道,我來回答一下這個問題
背景知識介紹定義:TCP(Transmission Control Protocol )傳輸控制協議,是一種面向連線的,可靠的,基於位元組流的資料傳輸協議,其位於OSI模型中的傳輸層,其上面是應用層,下面是資料鏈路層。傳輸層的作用:傳輸層提供端到端的通訊,端到端的通訊怎麼理解,就是,一臺電腦上有很多應用程式,像QQ,淘寶,當一個淘寶資料流到達主機後怎麼區分QQ和淘寶這兩個程序,就是傳輸層透過目的埠號進行識別的;與網路層的區別:網路層是提供主機到主機的服務,也就是透過我們常見的IP地址將資料包從一個主機發送到主機,但是他不能區分統一主機的不同程序。為什麼TCP可以提供可靠地資料傳輸業務首先明確什麼是可靠的資料傳輸業務,所謂可靠就是將請求資料準確無誤地交付給服務端和客戶端,可千萬別小看聽起來這麼簡單的事情,TCP是要做大量工作的。UDP和TCP都是處於傳輸層的控制協議,UDP是一種非面向連線的傳控制協議,主主要用於影片等對資料可靠性不太高的場景,可見面向連線是提供可靠傳輸資料傳輸的保證,那究竟什麼是面向連線:其實就是TCP建立連線的三次握手,四次分手來建立可靠的資料通訊鏈路;就跟你和他人打電話時,先撥號建立連線,然後給對方傳送你想說的話,對方聽不懂還可以叫你重新說一遍,直到明白為止,當你和對方說再見時就表明本次通訊準確無誤地完成了。下圖是TCP建立可靠資料傳輸的握手示意圖:TCP使用那些技術實現資料可靠傳輸業務為什麼UDP不能實現可靠資料傳輸協議?是因為UDP沒有解決,是因為UDP沒有實現資料確認,定時重傳,資料校驗,合理劃分資料大小等功能,相反TCP能提供可靠的傳輸是因為實現了這些功能:
分塊也叫分段傳送,TCP會根據一系列演算法將網路層資料劃分為大小合適的資料塊,然後加上自己的頭部資訊封裝成資料包。定時確認重傳:當TCP傳送一個數據包後,就會啟動一個定時器,在該定時時間內如果沒有收到接收方的反饋資訊,將重新發送該資料包。資料校驗:TCP頭部欄位有一個稱為校驗和,用來檢查資料包在傳輸的過程中是否發上篡改和變化,一旦資料發生變化,接受端就拋棄該資料包希望傳送端重傳該資料包。正確排序:我們知道來自網路層的資料被TCP層分割成一包一包的,每一包都有一個序列號,因為TCP資料傳送並不是按順序傳送,而是在一個大小合適的視窗內很多包一起傳送,如果不能正確排序,接受端收到資料組裝完成的資訊已經不再是傳送端傳送的。重複丟棄:因視窗大小不合適或接受端未及時傳送接受確認,導致傳送端重複傳送相同的資料包,但是TCP能透過序號將重複的資料包丟棄擁塞控制:TCP能透過調整視窗和流量控制來防止流量過大造成擁堵進而造成資料包丟失。TCP為實現可靠資料傳輸業務的相關技術很複雜,限於篇幅不在展開講述,如有興趣可以私信留言與我交流。
TCP(Transmission Control Protocol,傳輸控制協議)是一個面向連線的、可靠的傳輸層協議。
如題,為什麼要由TCP協議負責資料傳輸的可靠性?
喲喲認為歸結一句話就是:網路層沒有辦法負責資料傳輸的可靠性。
在通訊網路裡,有些資料存在一些丟包是可以接收的,不會影響使用。而有些資料是不能有任何資料的丟失的。誰都想資料可以快速而安全的傳送至目的端,但資料傳輸的可靠性跟實時性在一定程度上是一對矛盾體。
在傳輸層,常用的協議就是TCP和UDP:
1、UDP協議是面向無連線的,不可靠的協議,可以保證傳輸的速率,但無法保證傳輸的安全性;
2、TCP協議是面向連線的,可靠的協議,可以保證的資料傳輸的安全性,但在速率上相對較慢。
下面喲喲簡單說明一下為什麼要由TCP協議負責資料傳輸的可靠性:
網路層無法去應對資料傳輸單元的重複缺失和亂序問題。大家都清楚,網路層傳輸的物件是分組,但一個應用層的資料可能會被分成多個分組來進行傳輸,假設網路層可以保證每個分組資料的可靠性,但是無法保證多個數據包正確組合的可靠性。若分組出現亂序或者丟包現象,那麼網路層就無法保證整個資料的完整性了。若非要將保證資料傳輸可靠性的重擔交給網路層,那麼就會增加傳輸時延,更加不利於快速尋找目標主機即轉發。