-
为什么会出现黏包现象: 首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据丢失,因此,在连续发送小数据的时候,以及接收大小不符的时候容易出现黏包现象。本质还是因为我们在接收数据的时候不知道发送的数据的长短。解决黏包问题 在传输大量数据之前首先告诉接收端要发送的数据大小,如果想更漂亮的解决问题,可以通过struct模块来定制协议。struct模块: 功能:可以把一个类型,如数字,转成固定长度的bytes。1234567import struct ret = struct.pack('i',456872783) #'i'代表int,就是即将要把一共数字转换成固定长度(4个字节)的bystes类型print(ret) num = struct.unpack('i',ret) #转换回来,返回一个元组print(num[0]) #提前元组中的值得到4096解决黏包问题: 服务端:123456789101112131415161718import structimport socketsk = socket.socket()sk.bind(('127.0.0.1',8080))sk.listen()conn,addr = sk.accept()while True: cmd = input('>>>') if cmd == 'q': #当输入‘q'时,结束,并向客户端发送一个'q'。 conn.send(b'q') break conn.send(cmd.encode('gbk')) #将输入的cmd命令发送给客户端 num = conn.recv(4) #接收字节信息(返回的消息长度信息)。 num = struct.unpack('i',num)[0] #将接收的字节码转化为原来的类型并放在一个元组里面,后面加[0]是提前出元组中的值。 res = conn.recv(int(num)).decode('gbk') #接收长度为num 的消息。 print(res) #打印conn.close()sk.close() 客户端:123456789101112131415161718192021import structimport socketimport subprocess sk = socket.socket()sk.connect(('127.0.0.1',8080))while True: cmd = sk.recv(1024).decode('gbk') #接收服务端发送来的cmd命令 if cmd == 'q': #当接收到‘q'时,结束。 break # 在客户端执行接收到的cmd命令。并将正确的消息和错误的消息分别放入stdout和stderr管道。 res = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) std_out = res.stdout.read() #读取管道内正确的消息 std_err = res.stderr.read() #读取管道内错误的消息 len_num = len(std_out)+len(std_err) #计算正确和错误消息的总长度 num_by = struct.pack('i',len_num) #将消息总长度转换成长度为4的字节码 sk.send(num_by) #发送消息长度信息 sk.send(std_out) #发送正确消息 sk.send(std_err) #发送错误消息 sk.close()
-
[中国,广州,2020年11月4日] 11月2日,华南理工大学与华为在华工五山校区签订战略合作框架协议。华南理工大学与华为共同签署战略合作协议华南理工大学党委书记章熙春,华南理工大学副校长李正、李卫青,华为公司董事长梁华,华为中国区副总裁周建军和华为中国区政企业务副总裁杨萍等出席签约仪式,并为华工与华为“创新人才中心”揭牌。华南理工大学与华为共同为创新人才中心揭牌根据协议,华南理工大学与华为将围绕创新驱动发展战略,推进双方深层次合作,在联合科研创新、人才培养与交流、智慧校园建设等方面展开战略合作。章熙春介绍了华南理工大学的发展历程,以及在科研投入、人才培养等方面取得的进展。他表示:“华为与华工同处**前沿,都拥有强大的创新基因和深厚的地缘优势。一直以来,学校与华为建立了良好的合作关系。此次双方签署战略合作协议是贯彻落实党的十九届五中全会精神一项重要举措,也是学校深化办学综合改革,加速推进“双一流”建设和广州国际校区建设的生动实践。希望双方以此次签约为契机,继续深化合作,积极整合双方的人才、学科、科技等高端创新资源,进一步促进人才链、创新链、产业链、资金链有机衔接,共同推进人工智能、大数据等新一代信息技术与教育的深度融合,助力校企共赢发展。”梁华介绍了华为公司近期的发展情况,并对多年来双方的良好合作表示肯定。他认为,在智能时代,计算是AI的基础,而半导体产业是基础中的基础。只有在半导体、电子信息技术新材料等基础学科上取得突破,才能为全面智能化时代的到来打下坚实基础。此次战略合作协议签署,是华南理工大学与华为公司深度合作的新起点,共同探索面向未来的前沿科学和应用技术。华南理工大学信息网络工程研究中心、党委办公室(学校办公室)等相关部门负责人,华为松山湖研究所技术合作部部长陈冯奇、华为广东政企教育医疗行业总经理娄蔓睿等参加本次签约。
-
2020-11-05:谈一下TCP的拥塞控制。#福大大#
-
1. 问题描述 版本:GaussDB 6.5.1.9 客户跑批业务时,CN所在服务器经常出现TCP端口使用阈值告警,总共配置端口数量为32000+,会使用26000+,占比82%。2. 数据收集:查看系统随机端口资源:cat /proc/sys/net/ipv4/ip_local_port_range,操作系统默认在(32768, 61000);查询集群规模,统计集群共有多少台服务器,每台服务器部署多少主DN:cm_ctl query -Cv;统计Gauss进程信息:ps ux | grep gauss在任意一台TCP端口使用率过高的机器上连接CN进入数据库,查询并发数量:select count(*) from pg_stat_activity;查询当前CN与所有节点的连接数:select count(*) from pg_pooler_status;统计正常连接状态下的端口使用数量:netstat -npt | grep gauss | awk '{print $4}' | sort -n | uniq -c | wc -l;收集所有Gauss进程的TCP连接信息:netstat -anopt | grep gauss > result.log3. 问题分析 :根据集群规模以及并发数初步计算CN与DN之间的连接数量:436 * 270 = 117720;由于每一并发不一定需要与所有DN相连,实际CN、DN连接数量通过pg_pooler_status视图查询:62388;打开收集的Gauss进程的TCP连接信息,可根据对应的进程号,统计实际各个节点总的连接数量,例如:CN进程号为76649,搜索进程号,可看到实际有66371条连接;同理,DN与DN之间也存在着连接,数量为:4 * DN数量,也可根据DN进程统计连接数量;可以看出,Gauss连接数量远远大于可用端口数量,由于端口存在复用,实际使用数量为2.6中收集的:27922;4. 规避措施 :GaussDB所有进程均支持端口复用,端口使用率高也不会出现问题,但是如果在同台服务器上有第三方进程不支持端口复用时,随机端口耗尽后可能会出现报错。可根据情况评估后,选择是否屏蔽此项告警;降低并发数量,减少连接;5. 几个减少连接数量的方法(修改前要评估) :开启CN多流,GUC参数为comm_cn_dn_logic_conn;清理空闲连接,clean connection to all; 以上两种方法详见产品文档;
-
给大家报告一下近日两大“智慧园区”产业战略合作协议在深圳华为坂田基地签订(以下排名不分先后,按时间顺序)一华建集团 X 华为签订产业战略合作协议华东建筑集团股份有限公司与华为签订产业战略合作协议在华为公司战略部总裁张文林和华建集团党委书记、董事长顾伟华的见证下智慧园区业务部总裁苏宝华和华建集团副总裁龙革签订产业战略合作协议▼根据合作协议,双方将在智慧园区/智慧建筑的信息基础设施标准化建设、规范建设与应用、产业洞察与思想力构建等领域深入合作,全面推动产业发展、共迎产业机遇。张文林指出:“ 智慧园区是实现华为公司万物互联愿景的落脚点和助力客户数字化转型的践行者。华为将自己的园区作为试验田,自己的降落伞自己先跳。在打造出自己满意的智慧园区后,联合生态伙伴,对准客户战略,解决客户问题,为客户创造价值,进而成就客户。”顾伟华表示:“ 建筑由智能向智慧进化,有巨大的发展空间。华建集团懂建筑,而华为的ICT技术是创新园区和建筑物群体验的技术动力。华建集团将与华为携手,围绕建筑和园区的智慧化,共同构筑产业影响力、加深加强产业合作,推动智慧园区/智慧建筑的产业繁荣。”二深总院 X 华为签订产业战略合作协议深圳市建筑设计研究总院有限公司与华为签署产业战略合作协议签约在中国工程院孟建民院士、华为公司战略部总裁张文林见证下深总院董事长廖凯和华为智慧园区业务部总裁苏宝华现场签约▼根据协议,双方将在智慧园区、智慧建筑、智慧医院、智慧校园等领域开展深入合作,加快通信与信息技术在建筑领域的应用研究和探索,促进智慧园区和智慧建筑产业的标准化建设和健康发展。孟院士指出:“ 华为和深总院在智慧园区、全光网络等领域已形成了广泛而深入的合作,双方将协同互补,在未来一体化建设服务和生态产业园区建设方面,全面提升合作深度。人和建筑将融为一体,变成有机的生命体,这是可期的未来。”张文林表示:“ 在智慧园区产业与生态中,设计院是我们最重要的伙伴之一。后续双方将在智慧园区、智慧建筑的信息基础设施标准化建设、标准与规范、产业影响力构建等领域,充分发挥各自优势,进一步深化合作。
-
UDP和TCP都是传输层的协议,用来建立可靠的通信传输链接的。UDP仅提供了最基本的数据传输功能,至于传输时连接的建立和断开、传输可靠性的保证这些UDP统统不关心,而是把这些问题抛给了UDP上层的应用层程序去处理,自己仅提供传输层协议的最基本功能。TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,会在传输开始前建立连接,传输结束后断开连接,此外,TCP还采取了多种措施保障传输的可靠性。TCP和UDP的区别如下:TCP是面向有连接型,UDP是面向无连接型;TCP是一对一传输,UDP支持一对一、一对多、多对一和多对多的交互通信;TCP是面向字节流的,即把应用层传来的报文看成字节流,将字节流拆分成大小不等的数据块,并添加TCP首部;UDP是面向报文的,对应用层传下来的报文不拆分也不合并,仅添加UDP首部;TCP支持传输可靠性的多种措施,包括保证包的传输顺序、重发机制、流量控制和拥塞控制;UDP仅提供最基本的数据传输能力。
-
(1)发送方产生粘包采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据。但当发送的数据包过于的小时,那么 TCP 协议默认的会启用 Nagle 算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。一句话:要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。(2)接收方产生粘包接收方采用 TCP 协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的 TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C 语言用 recv、read 等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)。
-
如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况。1. TCP 是基于字节流的,虽然应用层和 TCP 传输层之间的数据交互是大小不等的数据块,但是 TCP 把这些数据块仅仅看成一连串无结构的字节流,没有边界;2. 从 TCP 的帧结构也可以看出,在 TCP 的首部没有表示数据长度的字段。基于上面两点,在使用 TCP 传输数据时,才有粘包或者拆包现象发生的可能。一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。
-
如果TCP建连接时SYN超时,server端接到了client发的SYN后回了SYN ACK后client失去连接了,server没有收到client返回的ACK。那这个连接处于一个临时状态,server会等待一定时间后重发SYN ACK。(服务器认为是自己发的包丢掉了,多么好的服务器!)linux下,默认重试次数为5次,重试的间隔时间从1s开始每次翻倍,5次的重试时间间隔分别是1s, 2s, 4s, 8s, 16s,32s。累计到一起是63s,TCP才会把连接断开。SYN Flood攻击就是利用了这一点:给服务器发了一个SYN后,就下线了。于是服务器需要默认等63s才会断开连接。发送多个SYN后,攻击者就可以把服务器的SYN队列耗尽,让正常的连接请求不能被应答。linux里面tcp_syncookies的参数来应对SYN攻击。当SYN队列满了后,TCP会通过源地址端口、目标地址端口和时间戳构成一个特别的Sequence Number发回去,攻击者不会响应,如果是正常连接,则会把这个Sequence Number发回来,然后服务器可以通过其建连接。可以调整的三个TCP参数:tcp_synack_retries 重试次数;tcp_max_syn_backlog 最大SYN连接数;tcp_abort_on_overflow 检查到 backlog 队列已满时,直接发 RST 包给客户端终止此连接。
-
问题描述:现场业务有如下报错,只要全表扫描必定出现time out之类的问题图中error日志上方,都可以看到节点的报错,有connection refused,可以猜测是有通信问题问题分析:借助speed_test工具,进行网络排查1.source 环境变量2.cd $GPHOME3.find -name speed_test*4.cd 到对应speed_test工具路径下5.测试tcp连接:./speed_test connect可以看到连接超时,tcp建连最多重试七次,报错超时会需要两分钟。和日志报错是一样的,符合。四、此类问题基本就可以考虑防火墙配置导致不通,因此开始检查现场防火墙问题通过firewall-cmd --list-all,可以看到防火墙这块配置没打开解决方案:修改防火墙配置,放开相应的端口
-
一、什么是死锁官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。二、为什么会形成死锁看到这里,也许你会有这样的疑问,事务和谈判不一样,为什么事务不能使用完锁之后立马释放呢?居然还要操作完了之后一直持有锁?这就涉及到 MySQL 的并发控制了。MySQL的并发控制有两种方式,一个是 MVCC,一个是两阶段锁协议。那么为什么要并发控制呢?是因为多个用户同时操作 MySQL 的时候,为了提高并发性能并且要求如同多个用户的请求过来之后如同串行执行的一样(可串行化调度)。具体的并发控制这里不再展开。咱们继续深入讨论两阶段锁协议。两阶段锁协议(2PL)官方定义:两阶段锁协议是指所有事务必须分两个阶段对数据加锁和解锁,在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;在释放一个封锁之后,事务不再申请和获得任何其他封锁。对应到 MySQL 上分为两个阶段:扩展阶段(事务开始后,commit 之前):获取锁收缩阶段(commit 之后):释放锁就是说呢,只有遵循两段锁协议,才能实现 可串行化调度。但是两阶段锁协议不要求事务必须一次将所有需要使用的数据加锁,并且在加锁阶段没有顺序要求,所以这种并发控制方式会形成死锁。三、MySQL 如何处理死锁?MySQL有两种死锁处理方式:等待,直到超时(innodb_lock_wait_timeout=50s)。发起死锁检测,主动回滚一条事务,让其他事务继续执行(innodb_deadlock_detect=on)。由于性能原因,一般都是使用死锁检测来进行处理死锁。死锁检测死锁检测的原理是构建一个以事务为顶点、锁为边的有向图,判断有向图是否存在环,存在即有死锁。回滚检测到死锁之后,选择插入更新或者删除的行数最少的事务回滚,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段来判断。四、如何避免发生死锁收集死锁信息:利用命令 SHOW ENGINE INNODB STATUS查看死锁原因。调试阶段开启 innodb_print_all_deadlocks,收集所有死锁日志。减少死锁:使用事务,不使用 lock tables 。保证没有长事务。操作完之后立即提交事务,特别是在交互式命令行中。如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),尝试降低隔离级别。修改多个表或者多个行的时候,将修改的顺序保持一致。创建索引,可以使创建的锁更少。最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。如果上述都无法解决问题,那么尝试使用 lock tables t1, t2, t3 锁多张表
-
TCP传输的关键是得有socket(套接字),所以代码里面要用到socket的模块实现原理所需要的环境,一台windows电脑,一个linux虚拟机,linux虚拟机下写好相关python代码,windows下安装网络调试助手此时选自己的windows电脑为服务端,linux虚拟机为客户端py代码如下:import socketif __name__ == '__main__': # 首先创建好客户端的套接字socket,这个是socket模块下的一个类,其中第一个参数是ipv4协议的意思,第二个参数是选择了TCP协议 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 此段代码代表这个客户端与服务端进行连接,其中8080是服务端开启的端口(我所用的服务端为windows电脑) tcp_client_socket.connect(("192.168.99.1", 8080)) # 下面写好准备发送的数据,因为TCP协议是以字节流的形式发送,所以要用encode方法去编译代码 send_data = "hello python".encode("utf-8") # 发送数据 tcp_client_socket.send(send_data) # 养成良好习惯,发完数据后关闭套接字 tcp_client_socket.close()1234567891011121314运行完代码后,我们可以在windows电脑下的网络调试助手下看见:说明我们发送成功,服务端已经收到了客户端发来的请求
-
2020-09-23:TCP头部信息有哪些?#福大大架构师每日一题#
-
2020-09-19:TCP状态有哪些?#福大大架构师每日一题#
-
2020-09-17:arp协议缓存过程是怎样的?#福大大架构师每日一题#
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签