当前位置:  技术问答>linux和unix

关于TCP收发包问题

    来源: 互联网  发布时间:2017-05-28

    本文导语:  各位大虾,我有一个很急的问题请教 问题描述: 先建立tcp连接,客户端循环调用send函数发送数据包,就假设循环两次吧。 服务端调用read一直读客户端发来的数据,结果问题来了,接收到的数据有点问题。 通过tcpdu...

各位大虾,我有一个很急的问题请教

问题描述:
先建立tcp连接,客户端循环调用send函数发送数据包,就假设循环两次吧。
服务端调用read一直读客户端发来的数据,结果问题来了,接收到的数据有点问题。
通过tcpdump工具抓包分析,发现有时tcp会将两次send的数据一次打包发过去,而有时则是正常一次一次打包发送,后来我想,是不是发送数据太快,于是在每次send后让其睡眠1秒,通过这种方式,发送数据正常了。

问:
tcp会整合调用多次send的数据一次发送 是否属于tcp正常行为?还是我写的程序有问题?
在线等 谢谢!

|
tcp是流,只保证顺序到达,但如何打包到达不保证。
例如:发送端三次分别发送123 456 789
接收端可能会任何组合接收,但接收的顺序一定是123456789,可能是1到9次不等。

|
这不是典型的基于TCP自定义协议的解析么,必须要考虑的问题:
1、会话管理
2、粘包处理
3、协议解析

每一个链接包装成一个会话,每个会话关联一个数据缓冲,存放接收到的数据,解码器读取缓冲中的数据,将满足自定义协议包长度的bytes读取出来,抛给解析器处理,最后是业务逻辑解析。

简单说,添加一个接收缓冲,就能解决粘包问题。

|
做过tcp传输的,没有不知道这个粘包问题的。

最常见的解决办法是把消息包处理成如下格式:

消息类型+消息头部+消息体长度。其中消息类型和消息头部固定字节数。

这样可以适应任何长度的数据包传输。

发送和接收端需要根据这样的格式进行解码

|
包头+长度+内容, 
包头的目的就是为了在接收端缓存里面作为切割两个数据包的分界线。比如你随便来个"ABC", 包头定义的越长,切割的错误率越低(主要是内容中也包含和包头同样的字符), 但是信道占用越大.

    
 
 

您可能感兴趣的文章:

  • 请问:嵌入式系统中TCP/IP如何支持邮件收发
  • 100分求《嵌入式系统Web服务器—TCP/IP Lean》或《TCP/IP Lean Web Servers for Embedded Systems 》 iis7站长之家
  • TCP_NODDELAY的问题
  • 控制在网络上传输TCP数据包的大小的问题
  • udp服务器和TCP服务器的问题
  • TCP状态问题
  • TCP通信select 非常奇怪的问题
  • TCP connect 相关问题
  • 发送大量tcp包,丢包问题
  • linux 下 tcp接收窗口大小问题
  • 跟相同IP,端口不同的TCP服务端连接问题
  • 询问一个TCPDUMP语法问题 在抓TCP包时不能指定IP吗?
  • TCP套接字抓包的问题
  • TCP与UDP通信问题!
  • C++ socket 变成遇到无法解决的tcp 分片问题
  • 关于tcp协议的问题
  • ubuntu下tcp程序问题
  • 请教: tcp传输同步问题
  • 网络编程TCP header问题。
  • 关于TCP效率问题
  • 问一个TCP连接终接的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net接口socketoptions的类成员方法: tcp_nodelay定义及介绍
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • Linux内核中影响tcp三次握手的一些协议配置
  • 100分求《嵌入式系统Web服务器—TCP/IP Lean》或《TCP/IP Lean Web Servers for Embedded Systems 》
  • TCP协议报头字段详解及报头图
  • tcp和udp套接字有何不同?在什么情况下用tcp什么情况下用udp????
  • 对TCP协议状态及状态转换理解
  • tcp_prequeue_process怎么调用了tcp_v4_do_rcv的??求解??在tcp_recvmsg调用的
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 请问怎么知道每个TCP连接所属哪个进程??还有怎么样断开系统中任意一个TCP连接?
  • TCP协议三次握手过程详解
  • 高分求救:SOL_SOCKET,SO_RCVTIMO,SO_SNDTIMEO,IPPOTO_TCP,TCP_NODELAY这些是在哪个头文件定义的呢?
  • TCP/IP协议族介绍及TCP/IP协议族中各协议对应的RFC编号
  • 请问RST在什么情况下发送?? 使用TCP socket编程的话是否会引起这种TCP包的发送?
  • netfilter里如何获得TCP包的数据?
  • linux内核tcp重组的函数?
  • 转发 TCP/IP 连接 prtunnel
  • tcp的分节表示什么?
  • 如何在Linux系统上运行T/TCP程序
  • SCO Openserver 5 TCP/IP
  • 关于tcp/ip详解卷2中的代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3