目錄
一、UDP協議
1.UDP特點
1.無連接:知道對方的IP地址和端口號就直接進行傳輸,不需要建立連接
2.不可靠:沒有確認應答機制、超時重傳;如果因爲網絡故障導致該段無法發送到對方,UDP協議也不會告訴應用層(不會返回錯誤信息)
3.面向數據報(每一個報文就是一個獨立的個體)應用層交給UDP多長報文,UDP就發多少,不會拆分,也不會合並
- 比如 用UDP傳輸50個字節的數據
- 發送:它就調用一次sendto,發50個字節,因爲UDP沒有真正的發送緩衝區,所以調用sendto會直接交給內核,再由內核交給網絡層協議進行後面的傳輸
- 接收:接收端也調用一次recvfrom,接收50個字節,而不是循環調用5次,每次接收10個字節
- UDP具有接收緩衝區,但接收緩衝區不能保證收到的UDP報的順序跟發送的UDP報的順序一致,如果緩衝區滿了,再到達的UDP數據就會被丟棄。
2.協議格式
- 16位UDP長度:表示整個數據報的最大長度
- 數據報(報頭+數據(有效載荷))
- 如果我們傳輸的數據超過16*4k=64k,就需要在應用層手動的分包,多次發送,並在接收端手動拼裝
二、TCP協議
1.TCP的特點
有連接、可靠傳輸、面向字節流(想收多少就收多少)
PS:UDP中,定長將報頭和有效載荷分離;TCP中,4位首部長度將報頭和有效載荷分離
2.協議格式
源/目的端口號:表示數據從哪個進程到哪個進程
6個標誌位:(通過標誌位確認是否建立連接)
URG 確認緊急指針是否有效
SYN 請求建立連接(發送)
ACK 確認號是否有效(回覆)
RST 重新建立連接(重建)
FIN 通知對方,本端要關閉了(結束連接)
PSH 提示接收端立刻從TCP緩衝區中把數據拿走
3.TCP保證可靠性
校驗和
接收端校驗不通過,認爲數據有問題,這裏的校驗和包括TCP首部和TCP數據部分
32位序號/32位確認序號
保證數據按序到達,能確認哪些報文被接收(去重)
確認應答
發送者發的每個字節的數據都有編號,也就是序列號,接收者接收後會回覆(ACK裏帶有確認序列號)告訴發送者,我已經收到了哪些數據,下一次從哪裏開始發
超時重傳
如果主機A給主機B發數據,在一定時間內,A沒有收到B的應答,A就會重新發送
發送失敗的原因可能是:
1.網絡擁塞
2.主機B收到消息,在回覆的路上,ACK丟失等原因
- 超過一定的時間:一般以n*500ms爲一個單位ps累計一定次數,TCP認爲網絡或者對端主機出現異常,就強制關閉連接了
- 如果是情況2,B收到數據,但在回覆的路上將ACK丟失了,當A再重傳時,B會收到重複的數據(因爲TCP報頭中有序列號,B能確認哪些是重複的),就把重複的數據丟棄了
連接管理
正常情況下,TCP要經過三次握手建立連接,四次揮手斷開連接
流量控制
根據接收端的處理能力,來決定發送端的發送速度
因爲接收端處理數據的速度有限,如果發送端發的太快,導致接收緩衝區滿了,繼續發送就會導致丟包,則會引起丟包重傳等一系列連鎖反應
擁塞控制
- 開始發送數據時,我們並不知道網絡狀態,網絡上有很多計算機,可能當前網絡狀態就比較擁堵,如果最開始就發送大量數據,就可能引起網絡擁堵等連鎖反應
TCP可以通過慢啓動,先發少量數據探路,等摸清當前的網絡狀態,再按最大速度傳輸數據
滑動窗口=擁塞窗口>接收窗口?接收窗口:擁塞窗口
4.提高性能
滑動窗口
引入原因:一發一收(確認應答)的方式性能太低
-
一次發多條數據(也就是將多個段的等待時間重疊在一起)就能大大提高性能
-
窗口大小指無需等待確認應答而可以繼續發送數據的最大值(上圖窗口大小爲4,是4個段,4000個字節)
-
收到一個確認應答後,滑動窗口向後移,繼續發送第五個,依次類推
-
操作系統內核維護這個滑動窗口,開闢發送緩衝區來記錄還沒有應答的數據,只有確認過應答的數據,才能從緩衝區刪掉
-
窗口越大,網絡的吞吐率越高
-
丟包的兩種情況:
1.數據包到達,部分ACK丟失,可以通過後面的ACK確認(捎帶應答)
2.數據包直接丟失,收到三次同樣的確認應答時進行重傳(少於三次就是超時重傳了,這也叫快速重傳) PS 收到的是四次ACK,第一個是正常的,後面三個是冗餘的
捎帶應答、 快速重傳
三、TCP的粘包問題
這裏的"包",是指應用層的數據包,UDP不存在粘包問題,它面向數據報,每一個報文就是一個獨立的個體,是一個個把數據交付給應用層,有很明確的數據邊界,應用層使用UDP時,要麼收完整的報文,要麼不收
- 雖然傳輸層看到TCP是一個個報文過來的,並按序排好放在緩衝區中,但應用層看到的只是一串連續的字節數據,所以應用程序看到是一個完整的應用層數據包,不知道從從哪開始到哪結束
解決:
- 對於定長的包,定長讀取
- 對於變長的包,可以在包頭位置約定一個包總長度或者在包和包之間使用明確的分隔符
四、TCP異常情況
進程終止、機器重啓:釋放文件描述符,仍然可發FIN,和正常關閉一樣
機器斷電、斷網:接收端有寫入操作時發現連接不在了,會進行reset操作。TCP內有保活定時器,即使沒寫入操作,也定期詢問對方在不在,不在就釋放連接。(應用層的某些協議也有檢測機制,egHTTP長連接中,也會定期檢測對方的狀態)