Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

有没有选项可以避免粘包发生,比如每次调用send #83

Open
qht1003077897 opened this issue Jan 18, 2021 · 7 comments
Open

Comments

@qht1003077897
Copy link

qht1003077897 commented Jan 18, 2021

我们现在碰到一个问题,给100个设备同时发送数据,在接收端会看到粘包的情况

@qht1003077897
Copy link
Author

image

@IronsDu
Copy link
Owner

IronsDu commented Jan 18, 2021

我们现在碰到一个问题,给100个设备同时发送数据,在接收端会看到粘包的情况

  1. 没太明白你说的这个场景,可以再详细说说:譬如谁给谁发,谁在接受谁。
  2. 粘包是不可避免的,TCP是面向流的,接收端必须按照协议去parse(剥离)消息。

@qht1003077897
Copy link
Author

我这边维护了100个客户端,每5s同时分别给100个服务端发送心跳数据,长度是24,用wireshark抓包看到客户端有时候发出了48长度的数据

@IronsDu
Copy link
Owner

IronsDu commented Jan 18, 2021

我这边维护了100个客户端,每5s同时分别给100个服务端发送心跳数据,长度是24,用wireshark抓包看到客户端有时候发出了48长度的数据

嗯,这极有可能是内核把我们两次send的数据合并到一个TCP报文段里了。

@IronsDu
Copy link
Owner

IronsDu commented Jan 18, 2021

你需要自己能从48字节的数据里区分出这是两个独立的业务消息。

@qht1003077897
Copy link
Author

我这边维护了100个客户端,每5s同时分别给100个服务端发送心跳数据,长度是24,用wireshark抓包看到客户端有时候发出了48长度的数据

嗯,这极有可能是内核把我们两次send的数据合并到一个TCP报文段里了。

但是我们两次发送数据的时间间隔是5s钟,且设置了nodelay,还是粘到一起了
我会每隔5s用100个客户端给100个服务器发心跳数据,客户端和服务端是1对1

@IronsDu
Copy link
Owner

IronsDu commented Jan 19, 2021

我这边维护了100个客户端,每5s同时分别给100个服务端发送心跳数据,长度是24,用wireshark抓包看到客户端有时候发出了48长度的数据

嗯,这极有可能是内核把我们两次send的数据合并到一个TCP报文段里了。

但是我们两次发送数据的时间间隔是5s钟,且设置了nodelay,还是粘到一起了
我会每隔5s用100个客户端给100个服务器发心跳数据,客户端和服务端是1对1

这个确实不好说。nodelay应该说只是一种建议。但它并不能保证一定分开为两个独立的TCP报文。
我们不要去依赖它和做任何假设。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants