socket recv 的问题
举例说,如果是接收2M大小的内容的话,可能接收不完整。比如说就接收了1.5M,之后需要再调用recv接收余下的内容。那么接收2k大小的数据,会不会也出现接收不完整的情况呢...
举例说,如果是接收2M大小的内容的话,可能接收不完整。比如说就接收了1.5M,之后需要再调用recv接收余下的内容。那么接收2k大小的数据,会不会也出现接收不完整的情况呢,比如说只接收1.5k
就来说udp,传输数据量小比如说2k也会出现传输不完整吗 展开
就来说udp,传输数据量小比如说2k也会出现传输不完整吗 展开
展开全部
TCP本身提供超时和重传机制,无论多少,要么全部传输到,要么全部都接受不到,不会出现不完整现象。
UDP不太相同。
具体原因:
网络承载的一次传输能力有限,一般为1500个字节,除去IP头部,TCP头或者UDP头部,以太网头,一次传输的数据就以自己使用来说最好不要超过1400个字节。(具有分片能力IP和TCP)
现在拿你的情况来说,比如是2M,如果TCP传输的话,TCP首先会对2M数据分割,使他们成为1500字节/个的包,然后传输到对方机器,对方的TCP会从新组装所有到达的包,然后返回给应用程序。如果中途丢了任何一个包,TCP会负责重传这个包,如果确实无法传到,那么TCP就无法重组完整的数据给应用进程,TCP做法就是不会把任何数据给应用进程,所以TCP就是要么全部到达,要么全部放弃。
UDP不太相同,UDP不支持分片,如果用它传输2M数据,一般的情况是直接报错。当然也有可能的情况是IP层会将UDP的包分片,但IP不保证数据的可靠性,也就是到达对方机器后,很有可能IP层在重组数据(IP分的片,会在IP层重组)失败,一旦无法从组,IP就不会把失败的数据上传给UDP。传输失败。
从这样看来似乎是不会出现不完整的现象,但UDP本身也是为了达到传输目的而存在的,使用UDP的老道的人员都会注意,不会让UDP承载的数据量超过MTU,一般最好别超过1400,因此他们一般做法对于2M数据,自己首先就开始分片,然后再将分好的数据片交由UDP传输,然后再接受方,自己的应用程序重组。所以不完整的现象是自己分的UDP片被丢。
TCP分片和IP分片看上去有点重复,不过实际不是这样,这个就不扯远了。
UDP不太相同。
具体原因:
网络承载的一次传输能力有限,一般为1500个字节,除去IP头部,TCP头或者UDP头部,以太网头,一次传输的数据就以自己使用来说最好不要超过1400个字节。(具有分片能力IP和TCP)
现在拿你的情况来说,比如是2M,如果TCP传输的话,TCP首先会对2M数据分割,使他们成为1500字节/个的包,然后传输到对方机器,对方的TCP会从新组装所有到达的包,然后返回给应用程序。如果中途丢了任何一个包,TCP会负责重传这个包,如果确实无法传到,那么TCP就无法重组完整的数据给应用进程,TCP做法就是不会把任何数据给应用进程,所以TCP就是要么全部到达,要么全部放弃。
UDP不太相同,UDP不支持分片,如果用它传输2M数据,一般的情况是直接报错。当然也有可能的情况是IP层会将UDP的包分片,但IP不保证数据的可靠性,也就是到达对方机器后,很有可能IP层在重组数据(IP分的片,会在IP层重组)失败,一旦无法从组,IP就不会把失败的数据上传给UDP。传输失败。
从这样看来似乎是不会出现不完整的现象,但UDP本身也是为了达到传输目的而存在的,使用UDP的老道的人员都会注意,不会让UDP承载的数据量超过MTU,一般最好别超过1400,因此他们一般做法对于2M数据,自己首先就开始分片,然后再将分好的数据片交由UDP传输,然后再接受方,自己的应用程序重组。所以不完整的现象是自己分的UDP片被丢。
TCP分片和IP分片看上去有点重复,不过实际不是这样,这个就不扯远了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询