學習筆記(11):Python網絡編程并發編程-粘包底層原理分析

立即學習:https://edu.csdn.net/course/play/24458/296241?utm_source=blogtoedu

?1.send和recv底層分析

?

?

1)不管是recv還是send都不是直接接收對方數據或者發送給對方數據,而是對自己的操作系統內存進行操作;

?

2)客戶端與服務端并不是一個send對于一個recv;

?

3)send過程分析(此處以客戶端向服務端發送數據為例):

?

???? #1.客戶端將數據發送給自己的操作系統,即將數據給操作系統內存,這樣就算是結束了send這個命令,而至于怎么將數據發送給服務端由客戶端的操作系統決定;

?

???? #2.send需要經歷的階段:產生數據——將數據copy給客戶端自己的操作系統內存

?

4)recv過程分析(以服務端接收客戶端數據為例)

?

??? #1.服務端首先是等待客戶端的數據,然后接收數據即可

?

??? #2.recv經歷的階段:wait data(耗時較長)——copy data(首先是客戶端的操作系統內存的數據通過網關發送給服務端的操作系統內存,然后再由服務端的程序從自身的操作系統內存中copy data,再進行執行,這就完成recv的過程)

?

2.粘包產生的原因:由TCP協議中的優化算法nagle算法決定的。TCP協議存在的問題,在UDP協議中不會出現這種問題

?

1)產生粘包的條件:數據小且兩次或多次發送數據的間隔小的情況下會產生粘包現象,所以使用TCP協議不是一定會發生粘包,只有滿足條件才會

?

2)在TCP協議中,send是一條一條消息地發送數據,而recv卻可以一次性接收多條消息發送的數據,即接收到的數據是一個整體,因為在時間間隔較短的時間內發送的小數據會在客戶端的操作系統內存中會被合并成一個數據包,再發送給服務端的操作系統內存,因此無法判斷出哪些數據是哪條消息的,TCP時面向流的

?

?

?

?3)TCP是面向流的,為了減少IO傳輸

的次數進而增加傳輸數據的效率,采用了nagle算法,將間隔時間短的小數據合并成一個大的數據塊進行接收處理,然后將處理后的大的數據塊返回給客戶端,而客戶端無法識別出哪些數據是哪條信息的,故產生了粘包!

?

?

4)在客戶端粘包的情況,在客戶端時間間隔短的情況下發送兩次數據,導致客戶端發送的數據產生粘包現象

#客戶端產生粘包的情況'''
客戶端
'''
import socket 
phone = socket.socket((socket.AF_INET,socket.SOCK_STREAM))
phone.connect(('127.0.0.1',8080))
phone.send('hello')
phone.send('world')'''
服務端
'''
import socket
phone = socket.socket((socket.AF_INET,socket.SOCK_STREAM))
phone.bind(('127.0.0.1',8080))
conn,client  = phone.accept()res1 = conn.recv(1024)
#b'helloworld'
print('第一次接收的數據:',res1)res2 = phone.recv(1024)
#b''
print('第二次接收的數據:',res2)#客戶端不存在粘包的現象,只需要在客戶端的兩次send之間加入一個time.sleep(2)即可,即破壞粘包產生的條件之一:間隔時間短的情況下發送多次數據

?

4)服務端產生粘包現象

#客戶端
......
phone.send('hello'.encode('utf-8'))
time.sleep(5)
phone.send('world'.encode('utf-8'))
......#服務端
......
res1 = conn.recv(1)
#b'h'
print('第一次接收的數據',res1)
time.sleep(6)#服務器端比客戶端多睡一秒鐘,因此上一次的發送的未接收的數據‘ello’會和這次發送的world在服務器端的操作系統內存中合并在一起
res2 = conn.recv(1024)
#b'elloworld'
print('第二次接收的數據:',res2)

注:上述只是便于理解才用time.sleep()來解決粘包,實際上是非常不支持這樣來解決粘包問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257088.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

切面編程(4)

這篇介紹的是最為常見的切面編程首先介紹的是通過注解Aspect來配置AOP類Component Aspect public class Acsep {//定義切入點Pointcut("execution(* com.test.*.*(..))")//切面公式public void aspect(){ }//執行方法之前Before("aspect()")public void be…

c++存儲類型

1、c中的存儲類型一般有靜態存儲、棧、和自動類型三種,一般默認值是為自動類型auto

多線程編程 (1) -NSThread

多線程編程 (1) -NSThread 每個iOS應用程序都有個專門用來更新顯示UI界面、處理用戶觸摸事件的主線程,因此不能將其他太耗時的操作放在主線程中執行,不然會造成主線程堵塞(出現卡機現象),帶來極壞的用戶體驗。一般的解決方案就是將那些耗時的…

交叉工具鏈的搭建方法(測試成功)

之前安裝了一個rehat6的linux系統,把交叉編譯搭建給忽視了,結果在編譯uboot的時候出現問題,顯示找不到arm-linux-gcc。于是自己來搭建交 叉編譯環境。出現好多錯。先是解壓時沒在后邊加 -C/,后是直接自己創建了個目錄&#xff0c…

VMware內存回收與分配機質

VMware內存回收與分配機質 整理了下學習過的東西,為了防止以后忘記。^_^VMware內存回收按照內存回收先后順充,依次為:1.TPS 透明頁共享2.Ballooning 氣球回收3.Compressiong 內存壓縮4.Swapping 內存交換網上對這個的解釋也挺多&#xff…

學習筆記(12):Python網絡編程并發編程-解決粘包問題-簡單版本

立即學習:https://edu.csdn.net/course/play/24458/296243?utm_sourceblogtoedu 粘包現象的解決:簡單版 1.思路: 在服務器端計算出執行命令后結果的字節長度,然后再將字節數長度send即通知給客戶端,客戶端根據這個字節數的長度一…

關于for循環中的變量int i 如果跳出了這個for循環后,i的值是繼續保留還是被釋放掉了

#include<iostream> using namespace std;int main() {char a[10]; //定義一個一維數組用來存放字符串int i,j; //定義變量cout<<"請輸入字符&#xff1a;“;for(i0;i<10;i) //接收用戶的輸入{ ci…

keil優化等級設置

優化級別說明&#xff08;僅供參考&#xff09;&#xff1a;則其中的 Code Optimization 欄就是用來設置C51的優化級別。共有9個優化級別&#xff08;書上這么寫的&#xff09;&#xff0c;高優化級別中包含了前面所有的優化級別。現將各個級別說明如下&#xff1a;0級優化&…

SVN命令使用詳解

1、檢出svn co http://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名 --password 密碼svn co svn://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名 --password 密碼svn checkout http://路徑(目錄或文件的全路徑) [本地目錄全路徑]…

服務器排障 之 nginx 499 錯誤的解決

問題描述&#xff1a; Nginx 服務器大量499報錯 220.181.165.136 - - [18/May/2015:10:31:02 0800] "POST /v1/jobsHTTP/1.1" 499 0 "" "bdHttpRequest/1.0.0"115.239.212.7 - - [18/May/2015:10:31:03 0800] "GET /v1/job/643309e3-dc73-4…

二叉查找樹的先序遍歷,中序遍歷,后序遍歷

1、有一個二叉查找樹&#xff0c;存儲者字符A,B,C,D,E,F,G,H,下面哪個結果是后序樹遍歷結果 A. ADBCEGFH B. BCAGEHFD C. BCAEFDHG D. BDACEFHG 我的結題思路是將每個答案按照后序的遍歷方法把二叉樹存儲數據的結構還原&#xff0c;看是否滿足二叉樹的性質。 二叉樹的性…

學習筆記(13):Python網絡編程并發編程-解決粘包問題-終極版本

立即學習:https://edu.csdn.net/course/play/24458/296244?utm_sourceblogtoedu 粘包現象解決&#xff08;終極版&#xff09; 1.簡單版的問題所在 1&#xff09;報頭信息不一定只是包含著命令執行結果的字節數長度&#xff0c;在文件傳輸的時候也可能包含文件名等&#xff0c…

C#多態

C#多態 多態性&#xff08;C# 編程指南&#xff09;轉自MSDN通過繼承&#xff0c;一個類可以用作多種類型&#xff1a;可以用作它自己的類型、任何基類型&#xff0c;或者在實現接口時用作任何接口類型。這稱為多態性。C# 中的每種類型都是多態的。類型可用作它們自己的類型或用…

Ubuntu 14.04.02 安裝openvswitch-2.3.1

Open vSwitch安裝 安裝好操作系統 # lsb_release -a LSB Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch:core-4.1-amd64:core-4.1-noarch:security…

struts-上傳

一、創建項目項目名稱&#xff1a;demoupload二、添加jar包commons-fileupload-1.2.2.jarcommons-io-2.0.1.jarcommons-lang3-3.1.jarfreemarker-2.3.19.jarjavassist-3.11.0.GA.jarognl-3.0.5.jarstruts2-core-2.3.4.1.jarxwork-core-2.3.4.1.jar三、在web.xml文件中配置過濾器…

將數組作為參數,調用該函數時候給的是數組地址還是整個數組

1、在實際的應用中&#xff0c;數組經常作為函數參數&#xff0c;將數組中的數據傳遞到另外一個函數中&#xff0c;一般來說&#xff0c;傳遞可以采用兩種方法&#xff1a; 1>、數組元素作為函數的實參時&#xff0c;用法跟普通變量作參數相同&#xff0c;將數組元素的值傳遞…

C#項目中常用到的設計模式

C#項目中常用到的設計模式 1. 引言 一個項目的通常都是從Demo開始&#xff0c;不斷為項目添加新的功能以及重構&#xff0c;也許剛開始的時候代碼顯得非常凌亂&#xff0c;毫無設計可言。但是隨著項目的迭代&#xff0c;往往需要將很多相同功能的代碼抽取出來&#xff0c;這也是…

學習筆記(14):Python網絡編程并發編程-文件傳輸功能實現

立即學習:https://edu.csdn.net/course/play/24458/296245?utm_sourceblogtoedu 1.課程目的&#xff1a; 實現客戶端輸入下載文件的命令&#xff0c;然后將命令發送給服務端&#xff0c;服務端再執行下載文件的命令&#xff0c;最后將執行下載文件命令后的結果返回給客戶端&a…

NFS精簡版配置方法

此實驗的前提是防火墻需關閉。 1.關閉iptables /etc/init.d/iptables stop /etc/init.d/iptables status 2.關閉selinux setenforce 0 getenforce Permissive ---出現這個單詞即代表selinux臨時關閉&#xff0c;如需永久關閉則需修改/etc/sysconfig/selinux配置文件 …

Serializable接口中serialVersionUID字段的作用

序列化運行時使用一個稱為 serialVersionUID 的版本號與每個可序列化類相關聯&#xff0c;該序列號在反序列化過程中用于驗證序列化對象的發送者和接收者是否為該對象加載了與序列化兼容的類。 如果接收者加載的該對象的類的 serialVersionUID 與對應的發送者的類的版本號不同&…