本文参考于CSDN博客wxy941011 1.疑问 我们使用第四个博客中的项目. 修改客户端为:连接成功后循环向服务器发送从1-100的数字.看看服务器会不会正常的接收100次数据. 可是我们发现服务器只接收了两次数据,为什么和期望的不一样呢,这就触发了粘包问题. 2.什么是粘包和拆包 当客户端不断向服务器发送数据包时,服务器就可能出现两个数据包粘在一起的情况. 而和Tcp同为传输层的Udp则不会发生粘包和拆包问题.因为Udp是基于报文发送的,从Udp帧结构可以看出,Udp首部采用了16bit来…
8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. 即面向流的通信是无消息保护边界的. 2.接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包) 粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的. 8.41 strac…
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2) :  65535 :数据包长度.0:分隔符偏移值.2:分隔符长度.0:数据包偏移值.2:数据包长度. Class : Server package lime.pri.limeNio.netty.netty04; import j…
为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”.“快速恢复(Fast Recovery)”算法,再后来在TCP NewReno中又对“快速恢复”算法进行了改进,近些年又出现了选择性应答( selective acknowledge…
1.TCP连接状态 LISTEN:Server端打开一个socket进行监听,状态置为LISTEN SYN_SENT:Client端发送SYN请求给Server端,状态由CLOSED变为SYN_SENT SYN_RECV:Server端接收Client端发送的SYN请求,并回应ACK给Client端,同时发送SYN请求给Client端,状态由LISTEN变为SYN_RECV ESTABLISHED:Client端(接收Server端的ACK,状态由SYN_SENT变为ESTABLISHED)和S…
目录 模拟ssh远程执行命令 服务端 客户端 粘包问题 什么是粘包 TCP发送数据的四种情况 粘包的两种情况 解决粘包问题 struct模块 解决粘包问题 服务端 客户端 模拟ssh远程执行命令 服务端 import socket import subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('127.0.0.1', 8000)) server.listen(5) print('…
TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 .SQ_SNDBUF套接字本身有缓冲区(发送缓冲区,接收缓冲区) .tcp传送的网络数据最大值MSS大小限制 .链路层也有MTU(最大传输单元)大小限制,如果数据包大于>MTU要在IP层进行分片,导致消息分割.(可以简单的认为MTU是MSS加包头数据) .tcp的流量控制和拥塞控制,也可能导致粘包 .…
本节内容 概述 linux下运行效果 sleep解决粘包 服务端插入交互解决粘包问题 一.概述 刚刚我们在window的操作系统上,很完美的解决了,大数据量的数据传输出现的问题,但是在Linux环境下执行会出现什么状况呢?接下来我们拭目以待. 客户端和服务端的代码还是在 day8-接收大数据  中的代码 二.linux下运行效果 2.1.客户端的效果图 我擦咧,出错了,我们来看看出得什么错误?我们先看看服务端的代码: 终于明白了,原来是服务端两次发送给客户端的数据粘在一起了,为什么会造成粘包呐?…
一.服务端 1.创建套接字: int socket(int domain, int type, int protocol); domain:指定协议族,通常选用AF_INET. type:指定socket类型,TCP通信下使用SOCK_STREAM. protocol:指定协议,通常为0. 返回值:成功则返回新socket的文件描述符,失败返回-1. 头文件:sys/socket.h     sys/types.h 2.绑定套接字 int bind(int sockfd, struct sock…
本节内容 1.概述 2.代码实现 一.概述 上一篇博客讲到的用MD5来校验还是用的之前解决粘包的方法,就是客户端发送一个请求,等待服务端的确认的这样的一个笨方法.下面我们用另外一种方法:就是客户端已经知道可接收多少数据了,既然客户端已经知道接收多少数据了,那么客户端在接收数据的时候,正好接收已经知道的数据,不就ok了吗?就是说我循环了正好是收到已经知道的那些数据.比如:我要发5M的数据,我正好收到5M的数据,然后就不往下再收了,因为它有可能跟MD5值黏在一块了,本来说是发5M文件,结果你发了5.…