Socket通訊TCP/UDP粘包,多包和斷包、少包問題解讀

前言

  這段時間一直做公司與設備通訊這一塊的內容,主要採用了以UDP爲主TCP爲輔進行數據傳輸,在過程中幾次遇到數據斷包接受不到的問題,下面對於這些問題進行解讀,作爲筆記。

TCP(transport control protocol,傳輸控制協議)

TCP是面向連接的,面向流的,提供高可靠性服務。收發兩端(客戶端和服務器端)都要有一一成對的socket,因此,發送端爲了將多個發往接收端的包,更有效的發到對方,使用了優化方法(Nagle算法),將多次間隔較小且數據量小的數據,合併成一個大的數據塊,然後進行封包。這樣,接收端,就難於分辨出來了,必須提供科學的拆包機制。即面向流的通信是無消息保護邊界的。

UDP(user datagram protocol,用戶數據報協議)

UDP是無連接的,面向消息的,提供高效率服務。不會使用塊的合併優化算法,, 由於UDP支持的是一對多的模式,所以接收端的skbuff(套接字緩衝區)採用了鏈式結構來記錄每一個到達的UDP包,在每個UDP包中就有了消息頭(消息來源地址,端口等信息),這樣,對於接收端來說,就容易進行區分處理了。 即面向消息的通信是有消息保護邊界的。

由於TCP無消息保護邊界, 需要在消息接收端處理消息邊界問題。也就是爲什麼我們以前使用UDP沒有此問題。反而使用TCP後,出現少包的現象。

粘包的分析

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章