TCP面向字節(jié)流和報(bào)文段的關(guān)系是什么
問題的關(guān)鍵在于TCP是有緩沖區(qū),作為對比,UDP面向報(bào)文段是沒有緩沖區(qū)的。
?TCP發(fā)送報(bào)文時(shí),是將應(yīng)用層數(shù)據(jù)寫入TCP緩沖區(qū)中,然后由TCP協(xié)議來控制發(fā)送這里面的數(shù)據(jù),而發(fā)送的狀態(tài)是按字節(jié)流的方式發(fā)送的,跟應(yīng)用層寫下來的報(bào)文長度沒有任何關(guān)系,所以說是流。
作為對比的UDP,它沒有緩沖區(qū),應(yīng)用層寫的報(bào)文數(shù)據(jù)會直接加包頭交給網(wǎng)絡(luò)層,由網(wǎng)絡(luò)層負(fù)責(zé)分片,所以是面向報(bào)文段的。
而基于TCP Socket編程,比如客戶端使用HTTP請求服務(wù)器的主頁,服務(wù)器生成了自己的主頁,一共300K byte數(shù)據(jù),包括Header + Payload,為了更清晰說明問題,假設(shè)TCP最多一次只能發(fā)送1K byte的數(shù)據(jù),服務(wù)器端程序首先要將300K數(shù)據(jù)按照順序砍成300塊 (Segment),按照從頭到尾編號,1-300,然后調(diào)用send()函數(shù)300次,嚴(yán)格按照時(shí)間順序,第一次調(diào)用發(fā)編號1,第二次調(diào)用發(fā)編號2,…第三百次調(diào)用發(fā)編號300,這個(gè)不復(fù)雜,只要編寫一個(gè)循環(huán)程序(300次)即可,只要每次調(diào)用的返回值都OK,應(yīng)用程序的任務(wù)就算完成了。
并且:
每一層都有pdu如應(yīng)用層報(bào)文、tcp報(bào)文段、ip數(shù)據(jù)報(bào)、以太網(wǎng)幀。
tcp字節(jié)流指在發(fā)送方把從應(yīng)用層發(fā)下來的所有報(bào)文組成一個(gè)字節(jié)流(而非報(bào)文流),根據(jù)擁塞控制和流量控制(由os的協(xié)議棧實(shí)現(xiàn))切割出tcp報(bào)文段下交給網(wǎng)絡(luò)層;接收方把從網(wǎng)絡(luò)層收到的所有tcp報(bào)文段組成一個(gè)字節(jié)流(而非數(shù)據(jù)報(bào)流),切割出報(bào)文上交給應(yīng)用層。
因此會導(dǎo)致發(fā)送方5層交給4層的包和接收方4層交給5層的包的長度不同,即所謂的tcp粘包,接收方的應(yīng)用層必須有能力解決這一信息不對等的問題??偨Y(jié),兩端5層的每個(gè)報(bào)文可能不同,4層的字節(jié)流和3層的ip數(shù)據(jù)報(bào)一定相同。
WRITE-BUG研發(fā)團(tuán)隊(duì)衷心希望【W(wǎng)RITE-BUG數(shù)字空間】可以給每位同學(xué)一個(gè)屬于自己的秘密空間,同時(shí)祝愿大家在“公開圈子”世界里,遇見志同道合的伙伴們,因?yàn)槲覀兣c大家一樣,都曾孤獨(dú)前行著。


