複習:
tcp 四層模型:
應用層:telnet ftp email
運輸層:tcp udp
網路層:ip icmp igmp
鏈路層:裝置驅動程式以及介面
osi七層
應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層
1、聯絡
為什麼要在 ip 之上?
ip中包含的資訊有:源ip目的ip 然而乙個網路中的程序的自由度是5:
源ip目的 ip 源埠目的埠協議,也就是說通過ip可以確定到計算機,
但是沒有辦法將訊息傳送給具體的程序,而這個工作是交給tcp、udp
來完成的。也就是說,tcp、udp都對ip來的資料進行的分發,交給
上層應用。但是在這個過程中,tcp做的工作要比udp多很多。
2、區別
tcp基於連線、udp無連線。
這就決定了tcp是p2p的,而udp是支援一對一,一對多,多對一,多對多的:因
為它根本就沒有連線(但是還是可以繫結埠),所以乙個udp套接字可以給其他
任意套接字發東西。(這裡有乙個問題叫做 確認udp套接字。多個套接字繫結乙個
埠的時候,程式設計師希望負載均衡,但實際上是達不到的,因為每次都只會命中一
個套接字。解決方案是開啟***選項)
這裡可以展開說連線與可靠是個什麼意思:我的理解是,tcp通過一系列機制(確認號,重傳等),儘管底層是不可靠的,但是不可靠發生的時候,tcp總可以糾正錯誤,保證使用者不需要操心資料的到來是亂序的,或者資料丟失了,使用者通過tcp建立連線之後,就可以放心的認為資料是對著的。 而tcp實現資料的可靠傳輸,是通過事先(三次握手)雙發約定好的一些資料(序列號,確認號,視窗大小)來完成的,這個東西就叫做連線,所以必然是點對點的,不可能對多,也不可能中通換物件。
但是udp就不管這麼多,udp完成的是最初的任務:原本的任務就是要解決ip無法將資料遞交給使用者期望的程序的問題的。所以udp的結構相對簡單,占用的資源少,通過ip+埠號,將資料發過去就好了,也不管資料丟失沒有,接收方也不管資料有沒有到達,有沒有重複。所有這也工作都要交給上層應用完成,也就是所謂的 網路中的某個問題,在各層都可以解決,如果底層不解決就讓上層解決。 既然udp如此不方便,為什麼還要用udp?尤其是我們熟悉的dns似乎就是用udp實現的?a:udp開銷小,負載消耗小,在一些對精度要求不大,但是對速度要求大的場合,用udp是合理的,即使一次失敗,重試的損失也不大。就拿dns來說,它的任務就是通過**找到ip然後返回,一次不行就再來一次,開銷很小,但是要盡量快,要降低伺服器負載。 但是dns伺服器之間進行同步的時候用的就是tcp,這種場合要保證資料的正確。
最後總結一下:tcp是有連線的可靠的傳輸。
udp是無連線的不可靠的傳輸。
我們來看看tcp比udp多做了哪些事情:
1)首先,在傳送資料的時候:
tcp在傳送大塊資料的時候,會對資料進行分段,每個分段可以攜帶的資料為1個
mss(mss是tcp雙發協定好的報文長度,這個長度既要盡量多的傳送使用者資料,
又要避免ip分片,所以定乙個合理的mss是一件困難的事情),然後tcp將決定一
次傳送多少段資料過去(這個時候就要考慮對方能處理多少資料——滑動視窗、以及
網路的情況允許傳送多少資料——擁塞控制,這兩點其實就是tcp的流量控制與擁
塞控制) tcp在傳送大量小的資料的時候,為了充分利用頻寬,會啟動nagle演算法
(可以配置是否啟動),對較小的資料進行合併。(但是這樣就又會造成粘包問
題,處理方法有短連線,應用層分包 等。。。)
udp傳送的時候無論大小,該發就發(所以沒有粘包問題,你看多好。。。)然
而,如果udp發的資料太多了,就會在底層發生分片。來算一算udp發多少資料是
合適的:
乙太網資料幀的長度必須在[46-1500]位元組之間,1500叫做mtu,最大傳輸單
元,是有乙太網的物理特性決定的。然後,1500不包括鏈路層的首尾(18字
節),多以1500實際上是ip資料報的長度限制,ip首部20位元組,留給udp或者
tcp的有1480位元組,然後udp自己的首部用掉8位元組,所以乙個udp中的資料應、該不超過1472位元組。
又因為英特網上執行的mtu標準是576位元組,同理,udp的資料長度要限制在548位元組(576-20-8);
乙太網協議頭,
ip頭,
tcp頭,
udp頭
如果udp資料超過長度會怎麼樣?a: 首先會造成ip分片,接收方就要重組,
使得效率變低,更加容易出現錯誤,如果資料錯誤或者丟失了,那麼udp整個數
據報就要丟掉。
那麼可不可以稍微長一點?
從ip包的總長度來看,ip包最大長度65536,減去頭(去掉頭就可以吃了),再減一
個udp頭,就有65507個。
所以,不要超過1472(建議548),超過了就不要超65507.
2)然後,接收資料的時候:tcp會檢驗自己的ack與對面發來的seq,確認收到的資料是想要的資料(這裡邊有
重複,丟失,亂序等)。如果不是想要的資料 比如我收到了1 2 3,接下來想要4,
但是對面給我傳了5,那我只好再給對面傳乙個(seq = x,ack=3)的報文,告訴對
方,我這裡只確認到3,那對方就再給我傳乙個4過來(具體實現沒有這麼簡單,上
述的實際是一種丟包問題,具體可能要重出3次同樣的ack才會觸發重傳,或者超時
重傳,或者用sack機制重傳。。。)
然後,亂序的包,tcp重新整理好了順序。
最後,tcp會告訴傳送方自己收到了哪些資料。
3)另外,在1中提到過,tcp實現了流量控制,網路擁塞控制。流量控制還好理解,雙方時刻關注對方的吞吐能力就可以了。網路的情況是難以預
期的,難以觀測的,只能間接的了解網路的情況,tcp是如何做到擁塞控制的,還
有tcp為何要控制擁塞,這是tcp應該完成的任務嗎?
tcp正是通過一些量,間接的觀測出網路的狀況,來實現擁塞控制的。至於要不
要控制?答案是要,因為tcp的出現會(重傳等)造成網路的擁塞,那麼tcp必須
要負責。試想:如果某一時刻網路出現擁堵,tcp不管不顧,只認為自己的資料沒
有送達,不斷地重傳,只會造成網路更加擁堵,惡性迴圈。
tcp通過:慢啟動 擁塞避免 擁塞發生時的策略 快速恢復 這一系列策略,決定
當前可以傳送的 段的數量,控制擁塞。
ps:有人說ping是基於udp的,對嗎?
不對。儘管ping的特點和udp很像:傳送的資料少,要求速度等…但是ping是基於原始套接字,使用icmp協議完成的。和資料報套接字,流式套接字完全沒有關係,甚至從層次上看,icmp是ip的子協議,ping的實現在網路層,tcp/udp在運輸層,所以上述說法顯然是錯誤的。
TCP與UDP的區別
面向連線的tcp 面向連線 就是在正式通訊前必須要與對方建立起連線。比如你給別人打 必須等線路接通了 對方拿起話筒才能相互通話。tcp協議能為應用程式提供可靠的通訊連線,使一台計算機發出的位元組流無差錯地發往網路上的其他計算機,對可靠性要求高的資料通訊系統往往使用tcp協議傳輸資料。面向非連線的ud...
tcp 與udp 的區別
tcp提供面向連線 可靠的位元組流服務。udp提供面向資料報的傳輸層協議。1.tcp 提供客戶與伺服器之間的連線。tcp客戶與某個伺服器建立乙個連線,再跨跨該連線與伺服器交換資料,最後終止連線。2.tcp提供可靠性。當tcp向對端傳送資料時,要求對端返回乙個確認。如果沒收到確認,tcp就自動重傳資料...
TCP與UDP的區別
tcp transmission control protocol,傳輸控制協議 是基於連線的協議,也就是說,在正式收發資料前,必須和對方建立可靠的連線。乙個tcp連線必須要經過三次 對話 才能建立起來,其中的過程非常複雜,我們這裡只做簡單 形象的介紹,你只要做到能夠理解這個過程即可。我們來看看這三...