TCP粘包、拆包的场景与处理

TCP粘包、拆包的场景

场景1:应用程序写入的数据大于套接字缓冲区大小将会发生拆包。

场景2:应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上将会发生粘包。

场景3:TCP设置了最大报文段长度(MSS),当TCP报文长度 - TCP头部长度 > 最大报文段长度的时候将会发生拆包。

场景4:接收方法不及时读取套接字缓冲区数据将会发生粘包。

TCP粘包、拆包的处理

方案1:发送端在每个包结尾处添加特殊字符,接收方根据此特殊字符接收相应的包数据。

方案2:发送端给每个数据包添加包首部,首部中包含数据内容的长度,接收端在接收到数据后,通过读取包首部的长度字段,再获取数据内容。

方案3:发送端在包首部与包内容之间添加特殊字符,接收方先解析包头,获取包内容大小并接收包内容。

/// 缓冲区有数据
- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;

/// 读到相应长度的数据
- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;

/// 读到相应的data边界
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;

应用-方案1:通过readDataToData获取数据包

应用-方案2:通过readDataToLength获取包首部,再通过readDataToLength获取包内容。

应用-方案3:通过readDataToData获取包首部,再通过readDataToLength获取包内容。

---------------------------------------------------------------------------------------------------------

SocketClient:demo-简单模拟client与sever的TCP通讯,实现长短链接、数据的传输

猜你喜欢

转载自blog.csdn.net/z119901214/article/details/118418255