TCP接收端接收不到已发送数据包的情况小结
(2011-08-27 20:23:32)
标签:
tcp丢包it |
分类: 通信 |
当前碰到了运行在Windows上的界面接收不到Linux服务器方发出的TCP报文的情况,为了解决这个问题做了下列几项实验:
1.
|
发送报文数量 |
发送延迟(ms) |
接收报文数量 |
|
200 |
0 |
40,25,47 |
|
5 |
195,194 |
|
|
50 |
200 |
|
|
2000 |
0 |
1018,653,523 |
|
5 |
1991,1992,1989 |
|
|
50 |
2000 |
根据实验结果,最初认为是界面未收到这些数据包,但是意识到TCP协议是可靠协议,它通过重传机制保证数据包成功到达接收方。同时由于TCP是基于流机制的,不区分应用层的报文边界,因此会出现所谓的“粘包”现象。这个结论通过在客户端抓包后得以证实,即几个服务器端应用层的数据包信息合在了一个数据包中传递给了客户端。即便我在服务器端将socket与FILE关联,并调用了该FILE的fflush操作,看来fflush并不能保证将应用层的报文以单个的数据包发送出去,它只是保证将当前套接字缓冲区的数据发出去,而当应用层往缓冲区写入的速率太快时,很可能几个数据报文就合成一个发送出去了。
因此,为了解决可能出现的粘包问题,接收方的应用层必须要做拆包的工作。
2.
此时接收方的情况是:如果发送方发送10个数据包,那么接收方只能接收到9个,而抓包的时候发现客户端是能够接收到第十个数据包的。
3.
此时接收方的情况是,抓包时并不能抓到所发送的全部数据,并且有粘包的现象,但是所有接收到的数据都会到达应用层。
解决以上两个问题的方法是,在服务器端关闭套接字之前加入了一点延迟。

加载中…