說說TCP和UDP的區別?
TCP使用無邊界的字節流傳輸,可能發生拆包和粘包,接收方并不知道數據邊界;UDP采用數據報傳輸,數據報之間相互獨立,有邊界。
應用場景方面,TCP適合對數據的可靠性要求高于速率要求的場景,比如郵件傳輸,文件傳輸,網頁瀏覽。UDP適合對速率要求高、可以容忍一定數據丟失的場景,比如即時聊天、在線視頻、語音電話。
你會如何設計QQ中的網絡協議?
首先是登陸功能,由于需要準確性和數據加密,所以采用TCP + SSL/TSL協議來進行登陸。
登陸之后的即時聊天/語音視頻通話功能,由于實時性要求高,所以采用UDP協議。
如何保證消息的不丟失?
對于TCP協議來說,如果發生消息丟失,則會嘗試進行重傳(RTO超時重傳/快速重傳)
對于UDP協議,可以通過應用層的重傳機制來保證消息不丟失。當接收方的應用層收到消息后,發送一個確認信息給發送方,如果發送方沒有收到確認信息,則重傳。同時,每個消息都有一個序列號,接收方通過序列號來判斷消息是否丟失,如果發現序列號不連續,就要求發送方重新發送,這樣還可以避免消息重復。
消息持久化也很重要,可以將消息保存在服務器或者本地數據庫中,即時網絡斷連,也能從數據庫中恢復消息。
為什么QQ采用UDP協議?
- QQ并不是全部采用UDP協議,比如文件傳送采用的是TCP保證可靠性。
- 使用UDP傳輸信息的好處是延遲較低,對于數據丟失的處理比較簡單。TCP是一個全雙工的協議,需要建立連接,網絡開銷較大。
- 如果使用QQ語音或者視頻通話,UDP的優勢更能顯現,首先延遲較小,其次是偶爾的丟包不需要重傳,因為用戶可以接受偶爾的卡頓和畫面模糊,但是如果頻繁出現幾秒前的畫面和聲音,幾乎是不可接受的。
- QQ的服務器設計容量是海量級的,一臺服務器要容納幾十萬的并發連接,因此服務器只有采用UDP與客戶端通信才能保證如此大規模的服務,服務器壓力小。
UDP協議為什么不可靠?
- 不保證消息交付:無確認、無重傳、無超時
- 不保證交付順序:無序號、不重排、無隊首阻塞(TCP需要等待丟失的數據重傳才能把數據交付到應用層)
- 不跟蹤連接狀態
- 不進行擁塞控制
DNS為什么要用UDP?
DNS既使用TCP又使用UDP。
使用TCP的情況是區域傳送,也就是DNS服務器之間同步域名解析數據時。因為數據同步所要傳輸的數量大于普通的請求和響應,而TCP能夠傳輸更大的報文長度,而且為了保證數據的正確性,所以使用TCP。
客戶端向DNS服務器請求域名解析的時候使用UDP,服務器返回的內容不會超過UDP的最大允許長度,并且不需要建立連接,大大提升的響應速度,但這要求客戶端自己有超時處理/請求重傳/重試機制來保證響應數據的可靠性。