一、粘包分析
作者本人在写一个FTP项目时,在文件的上传下载模块遇到了粘包问题。在网上找了一些解决办法,感觉对我情况都不好用,因此自己想了个比较好的解决办法,提供参考
1.1 粘包现象
在客户端与服务器使用tcp通讯中,不同于http短连接,长链接在发送接收数据包过程中,多个数据包沾粘在一起,导致数据混乱的情况。
1.2 原因分析
发送方: TC
转载
2024-01-03 15:57:08
63阅读
一:黏包tcp协议在发送数据时,会出现黏包现象. (1)数据粘包是因为在客户端/服务器端都会有一个数据缓冲区, 缓冲区用来临时保存数据,为了保证能够完整的接收到数据,因此缓冲区都会设置的比较大。 (2)在收发数据频繁时,由于tcp传输消息的无边界,不清楚应该截取
转载
2024-01-28 19:11:21
61阅读
一、丢包这个丢包不是网卡级别的丢包,在每个网卡中也会显示丢失的包的数据。这个一般是由于网卡在中断处理中需要通过skbuff来存储新来的包。此时是直接通过内存管理接口申请结构,此时这个地方并没有办法做限制,因为此时的中断处理程序并不理解上层的协议,更不用说进程或者是socket这些逻辑概念。所以当网卡收到数据之后就分配一个包结构,此时分配失败就认为是丢掉一个包,计入网卡的报文统计中。TCP和UDP是
转载
2023-09-10 16:43:13
264阅读
TCP的黏包问题主要分为以下三种情况: 第一种情况:如上图中的第一根bar所示,服务端一共读到两个数据包,每个数据包都是完成的,并没有发生粘包的问题,这种情况比较好处理,服务器只需要简单的从网络缓冲区去读就好了,每次服务端读取到的消息都是完成的,并不会出现数据不正确的情况。第二种情况:服务端仅收到一个数据包,这个数据包包含客户端发出的两条消息的完整信息,这个时候基于第一种情况的逻辑实现的服务端就蒙
转载
2023-11-25 12:58:47
48阅读
TCP粘包TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据
的头紧接着前一包数据的尾。1.出现原因这里提一下保护消息边界和流,保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。 而面向流则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在
转载
2024-01-29 07:13:09
0阅读
黏包现象 在使用TCP协议进行数据传输的时候,会有以下问题出现。 client: import socket sk = socket.socket() sk.connect(("127.0.0.1", 8101)) # 连续发送数据 s = "我爱你" sk.send(s.encode("utf-8 ...
转载
2021-04-24 22:25:00
416阅读
2评论
TCP粘包
原创
2019-12-18 23:25:00
238阅读
# 实现 Java TCP 包教程
## 1. 简介
在开始教学之前,我们首先了解一下什么是 TCP。TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。Java 提供了一套 TCP 相关的类库,方便我们进行网络编程。
本教程将指导你如何使用 Java 实现一个简单的 TCP 通信过程。
## 2. 教学步骤
原创
2023-08-07 03:00:39
61阅读
粘包问题分析与对策TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。什么时候需要考虑粘包问题?如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题(因为只有一种包结构,类似于http协议)。关闭连接主要是要双方
转载
2024-01-01 16:47:57
93阅读
目录一:解决方案一(1):原因分析 (2):代码实现二:解决方案改进(1):struct模块(2):使用struct解决黏包 (3):自定义报头预备知识:TCP协议的黏包现象
一:解决方案一(1):原因分析问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循
转载
2023-10-27 12:58:35
90阅读
# 教你实现 Python TCP 包
TCP(传输控制协议)是互联网通信的核心协议之一,它保证数据包的顺序和完整性。在这篇文章中,我将教你如何使用 Python 实现一个简单的 TCP 服务器和客户端,让你充分了解整个过程。
## 流程概述
在开始编写代码之前,我们先了解一下实现 TCP 的基本流程。可以通过以下表格总结步骤:
| 步骤 | 描述
原创
2024-08-21 08:49:07
20阅读
粘包 tcp粘包其实就是服务器端接收数据分界线不明确导致的, tcp数据传输是以流的方式传输的,在接收端有一个缓冲区,所有的信息都存储在这个缓冲区中, 在程序中接收数据是要有一个明确的接收长度的,客户端发送过来的数据长度不明确,服务器端用一个固定长度的数据进行接收导致数据接收分界线不明确从而导致粘包 ...
转载
2021-07-12 13:27:00
313阅读
2评论
最近发现自己对于TCP通讯中的黏包问题还有疑问,查阅资料做下总结。 一、TCP黏包问题 TCP黏包问题是因为发送方把若干数据发送,接收方收到数据时候黏在一包,从接受缓冲区来看,后一包的数据黏在前一包的尾部。 二、黏包出现的原因 TCP黏包问题主要出现在两个方面 (1)发送方问题 首先TCP会默认使用Nagle算法,Nagle算法主要做两件事。 第一:上一包分组得到确认,才会发送下一分组。
转载
2023-11-24 19:03:02
48阅读
使用tcp协议在任何时候都不会丢包,因为: tcp/ip模型中,ip层负责发送包但不保证正确接收,而tcp层在ip层上,保证每个包正确接收。 在应用程序中,如果用socket的send发送一段数据,只要函数返回ok,对方肯定正确接收
转载
2024-02-20 22:25:00
53阅读
保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。假设A发给B的数据流由一个500 000字节的文件组成,MSS为1000字节。数据流的首字节ID为0,那么TCP会将这个文件分为500个报文段,每一个报文段的首部序号字段中分别为0、1000、2000... 如果第二个报文段先于第一个到B,也就是包的顺序出错。TCP RFC中并没
转载
2024-01-04 06:02:45
94阅读
粘包只可能出现在流传输中UDP是不会出现粘包,因为他是基于报文的,也就是说UDP发送端调用几次write,接收端必须调用相同次数的read读完,他每次最多只能读取一个报文,报文与报文是不会合并的,如果缓冲区小于报文长度,则多出来的部分会被丢掉。TCP不同了,TCP是基于流传输的,他会合并消息,并且以不确定方式合并,这样就需要我们去粘包处理了。TCP造成粘包主要原因: 1、
转载
2023-07-15 13:22:43
188阅读
网络编程网络协议如同人与人之间相互交流是需要遵循一定的规则(如语言)一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议。OSI参考模型和TCP/IP模型在不同的层次中有许多不同的网络协议,如图所示:网络协议之间的关系图如下: IP协议(Internet protocol)IP协议的作用在于把各种数据包准备无误的传递给对方,其中两个重要的条件是IP地址和MAC地址。由于I
https://blog.csdn.net/xufengyongyou/article/details/45305947 void SockBox::AddBox(const char *data, const size_t size){ if (dat...
转载
2020-04-06 12:42:00
192阅读
2评论
TCP的重传TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢?所以 TCP 针对数据包丢失的情况,会用重传机制解决。接下来说说常见的重传机制:超时重传快速重传SACKD-SACK超时重传在发送数据时,设定一
转载
2024-02-15 17:54:23
75阅读
void SockBox::AddBox(const char* data, const size_t size){if (data){m_data.SetDataSize(m_sizeBuf + size);memcpy(m_data.GetData() + m_sizeBuf, data, size);m_sizeBuf += size;}if (m_sizeBuf ...
原创
2021-09-28 15:11:20
395阅读