TCP/UDP的小事情
UDP:
沒有復雜的控制機制,面向無連接的通信服務。
常用于:
包總量少的通信
音視頻傳輸(即時通信)
TCP:
對傳輸、發送、通信、進行控制的協議。面向有連接的協議,只有在確認通信對端存在時才會發送數據,UDP是對端不存在也會發送。
通過檢驗和、序列號、確認應答、重發控制、連接管理以及窗口控制等機制實現可靠的傳輸。
①?通過序列號和確認應答提高TCP的可靠性
- 確認應答(ACK):當發送端數據達到接收主機時,接受主機會返回一個已收到消息的通知,這就是ACK。如果發送端沒有收到確認應答,就會進行重發。
- 序列號:按順序給發送數據標上號碼的編號,接收端查詢接收數據TCP首部中的序列號和數據長度,將自己下一步應該接受的序號作為確認應答返送回去。
- 接收端會根據序列號的判斷需要接受數據。
- 通過序列號可以避免接受端收到數據,確認應答沒有返給發送端,導致發送端一直重發數據的情況。
②? 重發超時如何確定
- 重發超時是指在重發數據之前,等待確認應答到來的那個特定的時間間隔。如果超過這個時間還沒有收到確認應答,發送端就會進行重新發送數據。
- 那么這個時間如何確定呢?根據不同網絡波段擁堵情況不一樣,需要計算每次發包的往返時間及其偏差。
③??連接管理
- 使用TCP的首部字段進行管理TCP連接,一次連接與斷開至少需要七次來回發包。
④?TCP以段來發送數據
- 在建立TCP的連接時,也可以確定發送數據包的單位,我們稱其為最大消息長度MSS。最理想的情況是MSS正好是IP中不會被分片處理的最大數據。
- MSS是在三次握手時計算出來的,兩端的主機發送連接請求時,會在TCP首部中寫入MSS,告訴對方自己適應的尺寸,然后選擇一個較小的值投入使用。
⑤?利用窗口控制提高速度
- TCP以1個段為單位,每發一個段進行一次應答處理,這樣處理有一個缺點,那就是包的往返時間越長通信性能就越低。為了解決這個問題,TCP就引入了窗口的概念。
- 窗口的大小是指無需確認應答而可以繼續發送數據的最大值,如圖,窗口大小為4個段。
?
⑥?窗口控制與重發控制
- 連續三次收到同一個應答,會對其重發,高速重發精致。
⑦?流控制
- 這種機制可以讓發送端根據接受端的實際接受能力控制發送的數量。
- TCP首部中,專門有一個字段用來通知窗口大小。
- 接收端向發送端主機通知自己可以接受數據的大小,于是發送端會發送不超過這個限度的數據。
⑧?擁塞控制
- 在通信一開始的時候,會有一個慢啟動的算法的出的值,對發送數據量進行控制。避免通信開始時連續發包導致的網絡擁堵。
?
?
?
?TCP結構
?
TCP中沒有表示包長度和數據長度的字段,可由IP層獲知TCP的包長,有TCP的包長可獲知數據的長度。
?
源端口號:
表示發送端端口號,字段長16位。
目標端口號:
表示接收端端口號,字段長16位。
序列號:
字段長32位,序列號是指發送數據所在的位置。每發送一次數據,就累加一次該數據的字節數的大小。
序列號不會從0或者1 開始,而是建立連接時由計算機產生的隨機數作為初始值,通過SYN包傳給接收端主機,然后再由每轉發過去的字節數累加到初始值上表示數據的位置。此外,在建立連接和斷開連接時發送的SYN包和FIN包雖然本身不攜帶數據,但是也會作為一個字節增加對應的序列號。
確認應答號:
確認應答號字段長度為32位,是指下一次應該收到的數據的序列號。實際上,它是指已收到的確認應答減一為值得數據。發送端在收到這個確認應答以后可以認為在這個序號之前的數據都已經被正常接收到了。
數據偏移:
該字段表示TCP所傳輸的數據部分應該從TCP包的哪個位開始計算,當然也可以把它看做是TCP首部的長度。該字段長4位,單位字節4字節即32位。如果該字段的值為5,那說明從TCP包的最一開始到20字節位置都是TCP首部,余下部分是TCP數據。
保留
該字段主要是為了以后擴展使用,一般設置為0,但即使收到的包中該字段不為0,也不會丟棄。
控制位
每一位從左至右分別為CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。
- CWR:CWR標志與后面的ECE標志,都用于IP首部的ECN字段,ECE的標志位1時,則通知對方已將阻塞窗口縮小。
- ECE:ECE標志,置為1時會通知對方,從對方到這邊的網絡有阻塞。在收到數據包IP首部中ECN為1時將TCP首部中ECE設置為1,
- URG:該位為1時,表示包中有需要緊急處理的數據。對于需要緊急處理的數據,會在后面的緊急指針中在進行解釋。
- ACK:該位為1時,確認應答有效,TCP規定除了最初建立連接時的SYN包之外該位必須設置為1。
- PSH:該位為1時,表示需要將受到的數據立刻傳給上層應用協議,為0時,則不需要穿而是先進行緩存。
- RST:該位為1時,表示TCP連接中出現異常必須強制斷開連接。
- SYN:用于建立連接。SYN為1時表示希望建立連接,并在其序列號的字段進行序列號初始值的設定。
- FIN:該位為1時,表示今后不會再有數據發送,希望斷開連接,當通信結束希望斷開連接時,通信雙方的主機之間就可以相互交換FIN位置為1的TCP段,每個主機又對對方的FIN包進行確認應答以后就可以斷開連接。不過,主機收到FIN設置為1 時的TCP段,以后不必馬上回復一個FIN包,而是等到緩沖區中所有的數據都因成功發送而被自動刪除后在發送確認應答。
窗口大小
該字段長為16,用于通知從相同TCP首部的確認應答號所指位置開始能夠接受數據大小,TCP不允許發送超過此處所示大小的數據。如果窗口大小為0,表示窗口探測,以了解最新的窗口大小。
校驗和
同UDP
緊急指針
本報文中的緊急數據的指針。
選項
提高TCP的性能。
?
UDP結構
?
?
除去數據部分正是UDP的首部,UDP首部由源端口號、目標端口號、包長、校驗和組成。
包長度
該字段保存了UDP首部的長度跟數據的長度之和。
校驗和
校驗和是為了提供可靠的UDP首部和數據而設計。
?
轉載于:https://www.cnblogs.com/ZeGod/p/10241260.html
總結
以上是生活随笔為你收集整理的TCP/UDP的小事情的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring boot的第一个demo
- 下一篇: WMI入门(三):我需要的类在哪里?