邢臺企業(yè)做網(wǎng)站費用哪里可以建網(wǎng)站
個人主頁:Lei寶啊?
愿所有美好如期而遇
協(xié)議
簡單來說,就是通信雙方約定好的結構化的數(shù)據(jù)。
序列化與反序列化
我們通過一個問題引入這個概念,假如我們要實現(xiàn)一個網(wǎng)絡版的計算器,那么現(xiàn)在有兩種方案,第一種,客戶端發(fā)送一種類似于“1+1”這樣的字符串,服務端接收到后進行拆解,然后計算。第二種,雙方約定好一種結構體,按照某種規(guī)則轉換成字符串發(fā)送給對方,然后對方再按照這種規(guī)則拆解成結構體,這個過程就叫做序列化與反序列化。
無論我們采用方案一, 還是方案二, 還是其他的方案, 只要保證, 一端發(fā)送時構造的數(shù)據(jù),
在另一端能夠正確的進行解析, 就是 ok 的. 這種約定, 就是 應用層協(xié)議。
理解Tcp為什么支持全雙工
什么是全雙工?簡單來說,就是同時收發(fā)消息,而消息之間不會互相受到干擾。
具體來講,全雙工(Full Duplex)是一種通信方式,它允許數(shù)據(jù)在通信鏈路的兩個方向上同時傳輸,即通信的雙方可以同時發(fā)送和接收數(shù)據(jù)。
因為OS系統(tǒng)內部,Tcp為每一個連接的客戶端維護了兩個緩沖區(qū),一個是發(fā)送緩沖區(qū),一個是接收緩沖區(qū),這樣,就可以同時發(fā)送和接收信息而不互相干擾,read,write等系統(tǒng)調用在Tcp這里,也就支持了一個socketfd既可以讀,也可以寫。
Tcp粘包問題
TCP粘包是指發(fā)送方發(fā)送的若干包數(shù)據(jù)到接收方接收時粘成一包,從接收緩沖區(qū)看,后一包數(shù)據(jù)的頭緊接著前一包數(shù)據(jù)的尾。這種現(xiàn)象既可能由發(fā)送方造成,也可能由接收方造成。
由于Tcp是基于字節(jié)流的協(xié)議,發(fā)送緩沖區(qū)內的數(shù)據(jù)什么時候發(fā),發(fā)多少,出錯了怎么辦,完全由Tcp協(xié)議自己決定,所以就會導致出現(xiàn)報文發(fā)送不完整或者接收方不能讀取完整報文的情況,那么接受方如果不對這種報文進行正確處理,就會導致粘包現(xiàn)象。
我們解決粘包問題的方案是,循環(huán)讀入數(shù)據(jù)判斷報文是否完整,如果完整則處理,并將緩沖區(qū)中的這段報文刪除,判斷處理下一個。
關于具體實現(xiàn)方案,我們后面的文章中,會給出具體實現(xiàn)。