看回顧一下OSI 7層協議網絡模型
程序員
再回顧一下OSI每一層的做用
服務器
一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接
二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
三、tcp經過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還能夠對次序亂掉的分包進行順序控制(TCP粘包處理)。
三、UDP具備較好的實時性,工做效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊。
四、TCP對系統資源要求較多,UDP對系統資源要求較少。網絡
- TCP 是流式協議沒有消息邊界,客戶端向服務器端發送一次數據,可能會被服務器端分紅屢次收到。客戶端向服務器端發送多少數據。服務器端可能一次所有收到。
2.保證傳輸的可靠性,順序。
3.TCP有擁塞控制,因此數據包可能會延後發送。
1什麼是 TCP 粘包?socket
TCP 粘包是指發送方發送的若干包數據 到 接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾。(多條信息可能會合成一條消息)tcp
2 TCP 出現粘包的緣由?ide
發送方:發送方須要等緩衝區滿才發送出去,形成粘包
接收方:接收方不及時接收緩衝區的包,形成多個包接收函數
3.TCP粘包的處理線程
方式一:手動解決粘包,客戶端發送明文消息,在消息結尾加上特定的EOF標記。服務端接收到消息後,經過特定EOF將數據報分割多條,每條便是原始消息。
方式二:客戶端按照約定的封包類型對消息進行封包pack操做,服務端開啓消息的包格式校驗,符合條件後對消息進行解包操做。3d
2.緩衝區擁堵或溢出code
每一個 socket 被建立後,都會分配兩個緩衝區,輸入緩衝區和輸出緩衝區。write()/send() 並不當即向網絡中傳輸數據,而是先將數據寫入緩衝區中,再由TCP協議將數據從緩衝區發送到目標機器。
一旦將數據寫入到緩衝區,函數就能夠成功返回,無論它們有沒有到達目標機器,也無論它們什麼時候被髮送到網絡,這些都是TCP協議負責的事情。TCP協議獨立於 write()/send() 函數,數據有可能剛被寫入緩衝區就發送到網絡,也可能在緩衝區中不斷積壓,屢次寫入的數據被一次性發送到網絡,這取決於當時的網絡狀況、當前線程是否空閒等諸多因素,不禁程序員控制。