分析&回答
拆包和粘包是在socket編程中經(jīng)常出現(xiàn)的情況,
- 在socket通訊過(guò)程中,如果通訊的一端一次性連續(xù)發(fā)送多條數(shù)據(jù)包,tcp協(xié)議會(huì)將多個(gè)數(shù)據(jù)包打包成一個(gè)tcp報(bào)文發(fā)送出去,這就是所謂的粘包。
- 如果通訊的一端發(fā)送的數(shù)據(jù)包超過(guò)一次tcp報(bào)文所能傳輸?shù)淖畲笾禃r(shí),就會(huì)將一個(gè)數(shù)據(jù)包拆成多個(gè)最大tcp長(zhǎng)度的tcp報(bào)文分開(kāi)傳輸,這就叫做拆包。
MTU
泛指通訊協(xié)議中的最大傳輸單元。一般用來(lái)說(shuō)明TCP/IP四層協(xié)議中數(shù)據(jù)鏈路層的最大傳輸單元,不同類型的網(wǎng)絡(luò)MTU也會(huì)不同,我們普遍使用的以太網(wǎng)的MTU是1500,即最大只能傳輸1500字節(jié)的數(shù)據(jù)幀。可以通過(guò)ifconfig命令查看電腦各個(gè)網(wǎng)卡的MTU。
MSS
指TCP建立連接后雙方約定的可傳輸?shù)淖畲骉CP報(bào)文長(zhǎng)度,是TCP用來(lái)限制應(yīng)用層可發(fā)送的最大字節(jié)數(shù)。如果底層的MTU是1500byte,則 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte。
TCP粘包/拆包發(fā)生的原因
問(wèn)題產(chǎn)生的原因有三個(gè),分別如下。
- 應(yīng)用程序write寫入的字節(jié)大小大于套接口發(fā)送緩沖區(qū)大小;
- 進(jìn)行MSS大小的TCP分段;
- 以太網(wǎng)幀的payload大于MTU進(jìn)行IP分片。
粘包問(wèn)題的解決策略
由于底層的TCP無(wú)法理解上層的業(yè)務(wù)數(shù)據(jù),所以在底層是無(wú)法保證數(shù)據(jù)包不被拆分和重組的,這個(gè)問(wèn)題只能通過(guò)上層的應(yīng)用協(xié)議棧設(shè)計(jì)來(lái)解決,根據(jù)業(yè)界的主流協(xié)議的解決方案,可以歸納如下。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-699209.html
- 消息定長(zhǎng),例如每個(gè)報(bào)文的大小為固定長(zhǎng)度200字節(jié),如果不夠,空位補(bǔ)空格;
- 在包尾增加回車換行符進(jìn)行分割,例如FTP協(xié)議;
- 將消息分為消息頭和消息體,消息頭中包含表示消息總長(zhǎng)度(或者消息體長(zhǎng)度)的字段,通常設(shè)計(jì)思路為消息頭的第一個(gè)字段使用int32來(lái)表示消息的總長(zhǎng)度;
- 更復(fù)雜的應(yīng)用層協(xié)議。
喵嗚面試助手:一站式解決面試問(wèn)題,你可以搜索微信小程序 [喵嗚面試助手]?或關(guān)注 [喵嗚刷題] -> 面試助手?免費(fèi)刷題。如有好的面試知識(shí)或技巧期待您的共享!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-699209.html
到了這里,關(guān)于說(shuō)說(shuō) TCP的粘包、拆包的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!