Tcp是個“流協議”,所謂流,就是沒有界限的一連串數據,沒有界限。TCP底層不了解業務數據的含義,它會根據TCP緩沖區的實際情況進行包的劃分,所以業務上認為,一個完整的包可能被TCP拆分為多個包進行發送,也可能把多個小包封裝成一個大的數據包進行發送,這就是所謂的TCP粘包和拆包問題。
TCP 粘包 / 拆包
TCP以流方式傳輸,是沒有界限的一串數據,并沒有消息邊界。
TCP傳輸數據時,會根據底層的TCP緩存區實際情況進行數據包劃分:
1.業務上定義的完整數據(比方說一個完整的json串),可能會被TCP拆分成多個數據包進行發送(拆包)。
2.業務上特殊含義的獨立數據,也有可能因為大小或者緩沖區原因,被TCP封裝成一個大數據包發送(粘包)。
為什么會發生TCP粘包、拆包?
發生TCP粘包、拆包主要是由于下面一些原因:
2.應用程序寫入數據小于套接字緩沖區大小,網卡將應用多次寫入的數據發送到網絡上,這將會發生粘包。
3.進行MSS(最大報文長度)大小的TCP分段,當TCP報文長度-TCP頭部長度>MSS的時候將發生拆包。
4.接收方法不及時讀取套接字緩沖區數據,這將發生粘包。
粘包、拆包解決辦法
TCP本身是面向流的,作為網絡服務器,如何從這源源不斷涌來的數據流中拆分出或者合并出有意義的信息呢?通常會有以下一些常用的方法:
1、發送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據后,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了。
2、發送端將每個數據包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩沖區中讀取固定長度的數據就自然而然的把每個數據包拆分開來。
3、可以在數據包之間設置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數據包拆分開。
回答所涉及的環境:聯想天逸510S、Windows 10。
Tcp是個“流協議”,所謂流,就是沒有界限的一連串數據,沒有界限。TCP底層不了解業務數據的含義,它會根據TCP緩沖區的實際情況進行包的劃分,所以業務上認為,一個完整的包可能被TCP拆分為多個包進行發送,也可能把多個小包封裝成一個大的數據包進行發送,這就是所謂的TCP粘包和拆包問題。
TCP 粘包 / 拆包
TCP以流方式傳輸,是沒有界限的一串數據,并沒有消息邊界。
TCP傳輸數據時,會根據底層的TCP緩存區實際情況進行數據包劃分:
1.業務上定義的完整數據(比方說一個完整的json串),可能會被TCP拆分成多個數據包進行發送(拆包)。
2.業務上特殊含義的獨立數據,也有可能因為大小或者緩沖區原因,被TCP封裝成一個大數據包發送(粘包)。
為什么會發生TCP粘包、拆包?
發生TCP粘包、拆包主要是由于下面一些原因:
2.應用程序寫入數據小于套接字緩沖區大小,網卡將應用多次寫入的數據發送到網絡上,這將會發生粘包。
3.進行MSS(最大報文長度)大小的TCP分段,當TCP報文長度-TCP頭部長度>MSS的時候將發生拆包。
4.接收方法不及時讀取套接字緩沖區數據,這將發生粘包。
粘包、拆包解決辦法
TCP本身是面向流的,作為網絡服務器,如何從這源源不斷涌來的數據流中拆分出或者合并出有意義的信息呢?通常會有以下一些常用的方法:
1、發送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據后,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了。
2、發送端將每個數據包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩沖區中讀取固定長度的數據就自然而然的把每個數據包拆分開來。
3、可以在數據包之間設置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數據包拆分開。
回答所涉及的環境:聯想天逸510S、Windows 10。