1、最大半连接数

什么是最大半连接数

半连接:在进行TCP协议通信时,客户端与服务器端进行三次握手建立连接,但是有时客户端与服务器端进行了连接申请,服务器端也同意了申请(既已经完成三次握手的两次),此时只需要客户端再次进行确认即可建立连接,但是此时客户端未进行确认,就会进入半连接状态

最大半连接数:三次握手没有完全执行完毕的连接的最大数量

为什么需要最大半连接数?

在根据TCP协议进行网络通讯时,会进行三次握手建连接,四次挥手断连接,但是有时当连接服务端的客户端较多时,会大量占用服务器端的资源,容易导致服务端奔溃,此时需要对连接的数量进行限制,只有在规定的数量之内才能与服务端进三次握手建连接,超过数量连接的申请会直接被驳回,不能建立连接。

如何使用最大半连接数?

当我们创建了socket对象后,使用`socket.listen()方法时可以设置最大半连接数的数值

2、粘包问题

什么是粘包问题?

当我们使用TCP流式协议进行socket对象的创建时,由于操作系统的优化机制,会将时间 间隔较短且数据量较小的数据合并成一次发送,而由于流式协议的特点,在发送数据时是没有数据的边界的,这时如果发送时时间间隔较短且数据量较小时,两次数据就会粘包,或者是在取值时,没有完全取出发送的数据,那么剩余的数据就会在第二次取值时被取出,影响数据的完整性,这种不能将两次数据进行分开的问题就是粘包问题

为什么会有粘包问题?

因为在流式协议中,数据之间是没有边界的,如果将两个数据放到一起,那么这两个数据就不能分开谁是谁,这种不能将数据分开的问题叫做粘包问题

只有流式协议才有粘包问题,既只有TCP协议有粘包问题,UDP是没有粘包问题的,因为UDP是数据报协议,在使用UDP发送信息时,会自动加上报头及报尾,这样数据之间就有了边界,每次取值就可以将每次的值完全取出,不存在粘包问题

如何处理粘包问题?

要解决粘包问题的方案有两种:

1、扩大两次发送时间,这种方法可以解决两次发送时间太短导致的粘包问题,但是,对于不能一次取出全部数据的问题,这种方法就不能解决

2、对数据进行分组,为数据添加报头,每次只去一次发送的值,这样就可以从根本上解决存在的粘包问题

那么如何对数据添加报头呢

我们可以这样操作,在发送数据之前,先将数据的长度进行发送,然后在进行数据的发送,但是数据的长度也可能不是固定长度的,这样还是不能解决问题,有没有一种方法,可以将数值类型的数据转换成固定长度的数据呢?

通过struct模块可以将数值类型的数据装换成固定长度的二进制字符串

使用方法为:

impotr struct
struct.pack("类型",要转换的数值)

使用上述方法可以将数值转换成固定长度的二进制字符串

同样在接收方可以使用

import struct
struct.unpack("类型",要转换的二进制字符串)

这样通过将数据的长度进行转换,转换成固定长度的字符串,这样首先发送这个字符串,再将实际的数据发送,在接收方首先通过接受固定长度的字符串,从中将信息的长度转换出来,这样在下次接收时就可以将整个数据接收出来,如果数据的长度过长,这样就可以使用while循环进行循环接收,判断已接收数据与总数据长度,进而将整个数据接收

我们这样解决了粘包问题,但是如果我们想获得数据的格式,文件名等消息时应该怎么办呢?

这样可以首先将需要首先发送过去的数据进行组合,组合成一个字典类型,在转换成json字符串,得到这个json字符串的长度,在将这个长度转换成固定长度的struct类型,在进行发送时,首先将固定长度的字符串首先发送,再根据得到的数字接收报头,在将报头转换成字典类型,在从中取出需要的值(如文件名、文件的大小,文件的类型等)再根据得到的文件大小循环接收发送方发送的数据,直至数据完全取出。

day32 网络编程之粘包问题的更多相关文章

  1. Python之路 - 网络编程之粘包

    Python之路 - 网络编程之粘包 粘包

  2. UNIX网络编程——Socket粘包问题

    一.两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进行一次报文收发交易 ...

  3. 8-2udp和tcp网络编程以及粘包和解决粘包的方法

    一  tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...

  4. python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...

  5. Learning-Python【29】:网络编程之粘包

    粘包问题 上一篇博客遗留了一个问题,在接收的最大字节数设置为 1024 时,当接收的结果大于1024,再执行下一条命令时还是会返回上一条命令未执行完成的结果.这就是粘包问题. 因为TCP协议又叫流式协 ...

  6. Python网络编程,粘包、分包问题的解决

    tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...

  7. Python全栈-网络编程-TCP粘包

    一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...

  8. python网络编程-socket“粘包”(小数据发送问题)

    一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...

  9. 网络编程ssh,粘包

    1.什么是socket? TCP,可靠地,面向连接协议,有阻塞rect udp,不可靠的,无线连接的服务 这里因为不需要阻塞,所以速度会很快,但安全性不高 2.关于客户端退出而服务器未退出的解决办法 ...

随机推荐

  1. ACM-ICPC 2018 南京赛区网络预赛Sum,线性筛处理积性函数

    SUM 题意:f(n)是n可以拆成多少组n=a*b,a和b都是不包含平方因子的方案数目,对于a!=b,n=a*b和n=b*a算两种方案,求∑i=1nf(i) 首先我们可以知道,n=1时f(1)=1, ...

  2. 洛谷P4698 [CEOI2011]Hotel [贪心,二分,并查集]

    题目传送门 Hotel 题目描述 你经营着一家旅馆,这家旅馆有 n 个房间,每个房间有维护费用和容量.其中第 i 个房间的维护费用为 ci​,容量为 pi​ 人. 现在有 m 个订单,每个订单有两个参 ...

  3. FatMouse's Speed

    J - FatMouse's Speed DP的题写得多了慢慢也有了思路,虽然也还只是很简单的DP. 因为需要输出所有选择的老鼠,所以刚开始的时候想利用状态压缩来储存所选择的老鼠,后面才发现n太大1& ...

  4. ACM之路(18)—— 矩阵

    矩阵是干什么的呢?一句话来说就是,知道相邻两个函数的递推关系和第一个数,让你递推到第n个数.显然,如果n很大,那么一个一个递推过去是会超时的.所以矩阵就是用来解决这种快速递推的问题的. 比方说斐波那契 ...

  5. ARTS打卡计划第十一周

    Algorithms: https://leetcode-cn.com/problems/linked-list-cycle/ 链表环. Review: “What I learned from do ...

  6. js base64编码,C#解码

    JS: this.Base64 = function (str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, fu ...

  7. tensorflow训练中出现nan

    问题暂记: 之后看 https://blog.csdn.net/qq_23142123/article/details/80526931 https://www.zhihu.com/question/ ...

  8. vscode 记住git用户密码

    一.选中文件-->首选项-->设置,搜索git,在setting.json中添加 "git.path":"/bin/git.exe" 二.git b ...

  9. 在Ubuntu 16.04 LTS下编译安装OpenCV 4.1.1

    目录 一 安装前的准备 二 编译并安装OpenCV 4.1.1 注:原创不易,转载请务必注明原作者和出处,感谢支持! OpenCV目前(2019-8-1)的最新版本为4.1.1.本文将介绍如何在Ubu ...

  10. CentOS 7 最小化安装后的注意事项

    http://blog.csdn.net/f_srion/article/details/54910943 在VM虚拟机中安装CentOS 7 时 有时候顾虑到电脑硬件性能,我们需要最小化安装,而最小 ...