如何理解協議棧?

協議棧簡單的說就是對業務資料進行層層封包和層層解包的過程。傳送資料的處理過程就像資料流入一個管道進行層層封包過濾,收資料的過程就像資料經過另一個管道進行層層解包過濾,管道中有一層層的過濾器,像堆疊起來的棧~

如何設計協議棧?

其實很簡單,單獨拿出協議棧中的一層過濾器,只需要考慮以下幾點就可以。

傳送:

1 考慮本層應該按何種方式接受上層的資料?上層應該傳給流包,還是大小可知的包給本層,如果是大小可知的包,包最大應該為多少等,換句話說 本層應該規定本層的資料包的最小分割單位,上層傳遞本層資料的時候應該按我的要求來分割資料包,即提供給上層何種介面的問題。

2 考慮本層的資料封包格式。即本層應該如何加工資料包,應該新增何種協議頭或者協議尾,即本層資料處理的問題。

3 考慮如何將本層的資料包按下一層的格式進行拆分或者合併然後交付給下層,即和下層介面對接的問題。

接收:

1 考慮下層傳遞給本層的包如何按自己的資料封包格式進行組包

2 考慮如何剝去本層的封包頭尾然後傳遞給上層

協議棧的其他層,也按這種思路設計即可(其實就是遞迴、遞迴邊界的思想)

協議棧舉例

TCP層對上層提供流式包介面,不規定最大的包大小,即提供給上層的API的訊息接受引數可以設計為一個快取區物件。

TCP層對本層資料的處理是新增埠、序號等封包格式。

TCP層的下層是IP層,IP的設計要求是固定的最大65k的封包,所以TCP層應該能夠把本層的資料按照最大65k的包長度進行分割和組合,然後呼叫IP層介面。

IP層從上層接受最大65K的資料包。

IP層對資料包新增源和目的IP等封包格式。

IP層的下層是鏈路層,假設MTU最大為1500位元組,IP層按1500位元組分割本層的資料,然後呼叫鏈路層傳送出去。

接收端IP層收到資料後,把1500位元組的包組包成最大65k的包

IP層講組合的包去掉本層封包頭尾後交付給上層

最根本原則:如何傳送如何還原~如何拆包如何組

補充:

所謂拆包是指:對訊息體進行分割,對分割後的資料體新增訊息頭尾巴後組成完整的新訊息

所謂組包是指:對完整的訊息中提取資料體,多個數據體合併後再新增訊息頭尾組成完整的新訊息

(完)