一区二区三区中文国产亚洲_另类视频区第一页_日韩精品免费视频_女人免费视频_国产综合精品久久亚洲

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > python socket網(wǎng)絡(luò)編程之粘包問題詳解

python socket網(wǎng)絡(luò)編程之粘包問題詳解

來源:千鋒教育
發(fā)布人:xqq
時間: 2023-11-07 23:28:00 1699370880

粘包問題詳情

1、只有TCP有粘包現(xiàn)象,UDP永遠(yuǎn)不會粘包

你的程序?qū)嶋H上無權(quán)直接操作網(wǎng)卡的,你操作網(wǎng)卡都是通過操作系統(tǒng)給用戶程序暴露出來的接口,那每次你的程序要給遠(yuǎn)程發(fā)數(shù)據(jù)時,其實是先把數(shù)據(jù)從用戶態(tài)copy到內(nèi)核態(tài),這樣的操作是耗資源和時間的,頻繁的在內(nèi)核態(tài)和用戶態(tài)之前交換數(shù)據(jù)勢必會導(dǎo)致發(fā)送效率降低,因此socket為提高傳輸效率,發(fā)送方往往要收集到足夠多的數(shù)據(jù)后才發(fā)送一次數(shù)據(jù)給對方。若連續(xù)幾次需要send的數(shù)據(jù)都很少,通常TCPsocket會根據(jù)優(yōu)化算法把這些數(shù)據(jù)合成一個TCP段后一次發(fā)送出去,這樣接收方就收到了粘包數(shù)據(jù)。

2、首先需要掌握一個socket收發(fā)消息的原理

發(fā)送端可以是1k,1k的發(fā)送數(shù)據(jù)而接受端的應(yīng)用程序可以2k,2k的提取數(shù)據(jù),當(dāng)然也有可能

是3k或者多k提取數(shù)據(jù),也就是說,應(yīng)用程序是不可見的,因此TCP協(xié)議是面來那個流的協(xié)議,

這也是容易出現(xiàn)粘包的原因而UDP是面向無連接的協(xié)議,每個UDP段都是一條消息,應(yīng)用程序必

須以消息為單位提取數(shù)據(jù),不能一次提取任一字節(jié)的數(shù)據(jù),這一點和TCP是很同的。怎樣定義

消息呢?認(rèn)為對方一次性write/send的數(shù)據(jù)為一個消息,需要命的是當(dāng)對方send一條信息的

時候,無論鼎城怎么樣分段分片,TCP協(xié)議層會把構(gòu)成整條消息的數(shù)據(jù)段排序完成后才呈現(xiàn)在內(nèi)核緩沖區(qū)。

例如基于TCP的套接字客戶端往服務(wù)器端上傳文件,發(fā)送時文件內(nèi)容是按照一段一段的字節(jié)流發(fā)送的,

在接收方看來更笨不知道文件的字節(jié)流從何初開始,在何處結(jié)束。

3、粘包的原因

3-1直接原因

所謂粘包問題主要還是因為接收方不知道消息之間的界限,不知道一次性提取多少字節(jié)的數(shù)據(jù)所造成的

3-2根本原因

發(fā)送方引起的粘包是由TCP協(xié)議本身造成的,TCP為提高傳輸效率,發(fā)送方往往要收集到足夠多的數(shù)據(jù)后才發(fā)送一個TCP段。若連續(xù)幾次需要send的數(shù)據(jù)都很少,通常TCP會根據(jù)優(yōu)化算法把這些數(shù)據(jù)合成一個TCP段后一次發(fā)送出去,這樣接收方就收到了粘包數(shù)據(jù)。

3-3總結(jié)

TCP(transportcontrolprotocol,傳輸控制協(xié)議)是面向連接的,面向流的,提供高可靠性服務(wù)。收發(fā)兩端(客戶端和服務(wù)器端)都要有一一成對的socket,因此,發(fā)送端為了將多個發(fā)往接收端的包,更有效的發(fā)到對方,使用了優(yōu)化方法(Nagle算法),將多次間隔較小且數(shù)據(jù)量小的數(shù)據(jù),合并成一個大的數(shù)據(jù)塊,然后進行封包。這樣,接收端,就難于分辨出來了,必須提供科學(xué)的拆包機制。即面向流的通信是無消息保護邊界的。

UDP(userdatagramprotocol,用戶數(shù)據(jù)報協(xié)議)是無連接的,面向消息的,提供高效率服務(wù)。不會使用塊的合并優(yōu)化算法,,由于UDP支持的是一對多的模式,所以接收端的skbuff(套接字緩沖區(qū))采用了鏈?zhǔn)浇Y(jié)構(gòu)來記錄每一個到達的UDP包,在每個UDP包中就有了消息頭(消息來源地址,端口等信息),這樣,對于接收端來說,就容易進行區(qū)分處理了。即面向消息的通信是有消息保護邊界的。

tcp是基于數(shù)據(jù)流的,于是收發(fā)的消息不能為空,這就需要在客戶端和服務(wù)端都添加空消息的處理機制,防止程序卡住,而udp是基于數(shù)據(jù)報的,即便是你輸入的是空內(nèi)容(直接回車),那也不是空消息,udp協(xié)議會幫你封裝上消息頭,實驗略

udp的recvfrom是阻塞的,一個recvfrom(x)必須對唯一一個sendinto(y),收完了x個字節(jié)的數(shù)據(jù)就算完成,若是y>x數(shù)據(jù)就丟失,這意味著udp根本不會粘包,但是會丟數(shù)據(jù),不可靠

tcp的協(xié)議數(shù)據(jù)不會丟,沒有收完包,下次接收,會繼續(xù)上次繼續(xù)接收,己端總是在收到ack時才會清除緩沖區(qū)內(nèi)容。數(shù)據(jù)是可靠的,但是會粘包。

以上內(nèi)容為大家介紹了pythonsocket網(wǎng)絡(luò)編程之粘包問題詳解,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機構(gòu):千鋒教育。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT