TCP无保护消息边界

 我们都知道,TCP协议是面向流的。面向流是指无保护消息边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中会接收两个或者更多的数据包。

      那什么是保护消息边界呢?就是指传输协议把数据当做一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。

     举个例子来说,连续发送三个数据包,大小分别是1k,2k,4k,这三个数据包都已经到达了接收端的缓冲区中,如果使用UDP协议,不管我们使用多大的接收缓冲区去接收数据,则必须有三次接收动作,才能把所有数据包接受完。而使用TCP协议,只要把接收数据的缓冲区大小设置在7kb以上,就能够一次把所有的数据包接收下来,即只需要有一次接收动作。

     这样问题就来了,由于TCP协议是流传输的,它把数据当作一串数据流,所以他不知道消息的边界,即独立的消息之间是如何被分隔开的。这便会造成消息的混淆,也就是说不能够保证一个Send方法发出的数据被一个Recive方法读取。在讲解缓冲区的时候,我们已经讲过Recive方法是从系统缓冲区上读取数据的,所以只要数据缓冲区的容量足够大,该方法不单单接收第一个包的数据,可能是所有的数据。

      例如,有两台网络上的计算机,客户机发送的消息是:第一次发送abcde,第二次发送12345,服务器方接收到的可能是abcde12345,即一次性收完;也可能是第一次接收到abc,第二次接收到de123,第三次接收到45.

      针对这个问题,一般有3种解决方案:发送和接收定长的消息,把消息的尺寸与消息一块发送,使用特殊标记来区分消息间隔。

 

发送固定长度的消息

 

 这种方法的好处是他非常容易,而且只要指定好消息的长度,没有遗漏未未发的数据,我们重写了一个SendMessage方法。代码如下:

  private static int SendMessage(Socket s, byte[] msg)

        {

            int offset = 0;

            int size = msg.Length;

            int dataleft = size;

            while (dataleft > 0)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值