<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
黏包:指資料與資料之間沒有明確的分界線,導致不能正確的讀取資料。
應用資料想要傳送資料就必須將資料交給作業系統,而作業系統需要同時為所有的應用程式提供資料傳輸服務,就意味著不可能馬上將應用資料傳送,就需要為程式提供一個緩衝區,用於臨時存放資料。
當傳送資料很快,有兩條資料都在緩衝區時,作業系統可能將兩個資料發給接收方,資料之間沒有分界線,接收方會誤認為是一條資料。
UDP在收發資料時是基於封包的,即一個包一個包的傳送,包與包之間有明確的分界,到達對方緩衝區後也是獨立封包。這種方式存在的問題:
①傳送資料的長度每個作業系統會有不同的限制,資料超過限制則無法傳送;
②接收方接收資料時,如果應用程式提供的快取容量小於封包的長度,則會造成資料的丟失,而緩衝區大小不可能無限大。
這意味著UDP不會出現黏包問題,但會丟失資料,不可靠。
TCP增加了一套校驗規則來保證資料的完整性,會將超過TCP包最大長度的資料拆分為多個TCP包,並在傳輸資料時為每一個TCP封包指定一個順序號,接收方在收到TCP封包後按照順序將封包進行重組,重組後的資料全都是二進位制資料,且每次收到的二進位制資料之間沒有明顯的分界。基於這種工作機制,TCP在三種情況下發生黏包問題:
①當單個封包較小時,接收方可能一次性讀取了多個包的資料;
②當整體資料較大時,接收方可能一次性僅讀取了一個包的一部分內容;
③另外TCP協定為提高效率,增加了一種優化機制,會將資料小且傳送間隔短的資料合併行送,該機制也會導致傳送方將兩個封包粘在一起傳送。
也就是說,TCP傳輸資料是可靠的,但是會黏包。
伺服器端:
from socket import * server_socket = socket(AF_INET,SOCK_STREAM) server_socket.bind(('',8080)) server_socket.listen(5) new_socket,client_addr = server_socket.accept() data1 = new_socket.recv(1024) data2 = new_socket.recv(1024) print("收到的第一條資料:",data1) print("收到的第二條資料:",data2) new_socket.close() server_socket.close()
使用者端:
from socket import * client_socket = socket(AF_INET,SOCK_STREAM) client_socket.connect(('10.175.193.126',8080)) client_socket.send('hello'.encode('utf-8')) client_socket.send('word'.encode('utf-8')) client_socket.close()
伺服器端接收到的資料:
由於使用者端兩條資料傳送間隔太短且封包太小,被伺服器端誤認為是一條資料。
伺服器端:
from socket import * import time server_socket = socket(AF_INET,SOCK_STREAM) server_socket.bind(('',8080)) server_socket.listen(5) new_socket,client_addr = server_socket.accept() print("連線成功!",client_addr) data1 = new_socket.recv(3) #每次只接收三個位元組,接收不完整 time.sleep(6) print("收到的第一條資料:",data1) data2 = new_socket.recv(10) #接收第一次未接收的資料,若有空間,會繼續接收新資料 print("收到的第二條資料:",data2) new_socket.close() server_socket.close()
使用者端:
from socket import * #通過time模組使使用者端傳送多個封包時,時間間隔變長 import time client_socket = socket(AF_INET,SOCK_STREAM) client_socket.connect(('10.175.193.126',8080)) client_socket.send('hello'.encode('utf-8')) time.sleep(5) #讓當前執行緒休眠5秒 client_socket.send('word'.encode('utf-8')) client_socket.close()
伺服器端接收到的資料:
①伺服器端出現黏包:接收方不知道訊息之間的界限,不知道一個訊息要提取多少位元組的資料造成的;
②使用者端出現黏包:TCP在傳送資料少且間隔時間短的封包時,會將幾條合併一起傳送。
到此這篇關於Python資料傳輸黏包問題的文章就介紹到這了,更多相關Python資料傳輸黏包內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45