加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TCP接收端接收不到已发送数据包的情况小结

(2011-08-27 20:23:32)
标签:

tcp

丢包

it

分类: 通信

当前碰到了运行在Windows的界面接收不到Linux服务器方发出的TCP报文的情况,为了解决这个问题做了下列几项实验:

1.       C编写了一个简单的Windows发包程序,以不同的速率向界面发送报文

发送报文数量

发送延迟(ms)

接收报文数量

200

0

40,25,47

5

195,194

50

200

2000

0

1018,653,523

5

1991,1992,1989

50

2000

 

根据实验结果,最初认为是界面未收到这些数据包,但是意识到TCP协议是可靠协议,它通过重传机制保证数据包成功到达接收方。同时由于TCP是基于流机制的,不区分应用层的报文边界,因此会出现所谓的“粘包”现象。这个结论通过在客户端抓包后得以证实,即几个服务器端应用层的数据包信息合在了一个数据包中传递给了客户端。即便我在服务器端将socketFILE关联,并调用了该FILEfflush操作,看来fflush并不能保证将应用层的报文以单个的数据包发送出去,它只是保证将当前套接字缓冲区的数据发出去,而当应用层往缓冲区写入的速率太快时,很可能几个数据报文就合成一个发送出去了。

因此,为了解决可能出现的粘包问题,接收方的应用层必须要做拆包的工作。

 

2.       将刚才所编写的发包程序稍作改动之后放在Linux上,发送延迟调到一个比较大的值500ms

此时接收方的情况是:如果发送方发送10个数据包,那么接收方只能接收到9个,而抓包的时候发现客户端是能够接收到第十个数据包的。

 

3.       同样是上面的场景,但是将发送时延调小

此时接收方的情况是,抓包时并不能抓到所发送的全部数据,并且有粘包的现象,但是所有接收到的数据都会到达应用层。

 

解决以上两个问题的方法是,在服务器端关闭套接字之前加入了一点延迟。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有