文章目錄
- 一、面向字節流
- 二、粘包問題
- 應用層如何解決粘包問題?
一、面向字節流
使用 TCP socket 進行網絡編程,Linux 內核會給每個 socket 都分配一個發送緩沖區和一個接收緩沖區
由于緩沖區的存在, TCP 讀寫不需要一一匹配,例如:
- 寫 100 字節數據時,可以調用一次 write 寫 100 字節,也可以調用 100 次 write,每次寫一字節,…
- 讀100 字節數據時,完全不需要考慮寫的時候是怎么寫的,可以調用一次 read 讀 100 字節,也可以調用 100 次 read,每次讀一字節,…
二、粘包問題
- 首先要明確,粘包問題中的 “包” 指的是應用層的數據包
- 站在應用層的角度看,接收緩存區只是一串連續的字節數據,一旦包與包的邊界不明確,應用進程就不知道一個完整的數據包是從哪開始讀,讀多少結束
應用層如何解決粘包問題?
- 通信雙方固定包大小
- 特殊字符作為邊界
- 自定義結構
struct
{uint32_t dlen;...
} data_header;