[quote=引用 6 楼 screen12 的回复:] [quote=引用 5 楼 wangningyu 的回复:] [quote=引用 4 楼 screen12 的回复:] [quote=引用 3 楼 shenyi0106 的回复:] 具体的拆包和组包都是协议栈帮你完成的,对你的应用层是透明的,你应用程序感觉不到这其中的变化。 这里需要解释的唯一一点是: 1. 如果你一次发送64K的包; 2. 假设数据包的路径都是在以太网内传输; 3. 再假设以太网的MTU是1024(原本是1500,为了方便计算,假设是1024); 那么协议栈会帮你把64K的数据分成64个1K的数据包然后发送到网络上;接收端接收时,会等待着64个1K的数据包都收到了,才向你的应用层返回数据。这里再次假设接收了63个丢了1个,那么对于协议栈而言,就意味着这64K的数据都必须要丢掉(已经收到的63K也必须丢掉),这就造成了极大的浪费。 所以,如你业务逻辑可以接受小包传输的话,最好还是在应用层拆包发送,这样即使最后一个1K丢了,那前面的63K你是已经收到了,重发最后一个1K就可以了,或者可以忍受丢掉这1K所带来的损失。效率上有大的提高
[quote=引用 5 楼 wangningyu 的回复:] [quote=引用 4 楼 screen12 的回复:] [quote=引用 3 楼 shenyi0106 的回复:] 具体的拆包和组包都是协议栈帮你完成的,对你的应用层是透明的,你应用程序感觉不到这其中的变化。 这里需要解释的唯一一点是: 1. 如果你一次发送64K的包; 2. 假设数据包的路径都是在以太网内传输; 3. 再假设以太网的MTU是1024(原本是1500,为了方便计算,假设是1024); 那么协议栈会帮你把64K的数据分成64个1K的数据包然后发送到网络上;接收端接收时,会等待着64个1K的数据包都收到了,才向你的应用层返回数据。这里再次假设接收了63个丢了1个,那么对于协议栈而言,就意味着这64K的数据都必须要丢掉(已经收到的63K也必须丢掉),这就造成了极大的浪费。 所以,如你业务逻辑可以接受小包传输的话,最好还是在应用层拆包发送,这样即使最后一个1K丢了,那前面的63K你是已经收到了,重发最后一个1K就可以了,或者可以忍受丢掉这1K所带来的损失。效率上有大的提高
如果接收端提供足够大的缓冲区,要么都收到,要么什么也收不到~
具体的拆包和组包都是协议栈帮你完成的,对你的应用层是透明的,你应用程序感觉不到这其中的变化。 这里需要解释的唯一一点是: 1. 如果你一次发送64K的包; 2. 假设数据包的路径都是在以太网内传输; 3. 再假设以太网的MTU是1024(原本是1500,为了方便计算,假设是1024); 那么协议栈会帮你把64K的数据分成64个1K的数据包然后发送到网络上;接收端接收时,会等待着64个1K的数据包都收到了,才向你的应用层返回数据。这里再次假设接收了63个丢了1个,那么对于协议栈而言,就意味着这64K的数据都必须要丢掉(已经收到的63K也必须丢掉),这就造成了极大的浪费。 所以,如你业务逻辑可以接受小包传输的话,最好还是在应用层拆包发送,这样即使最后一个1K丢了,那前面的63K你是已经收到了,重发最后一个1K就可以了,或者可以忍受丢掉这1K所带来的损失。效率上有大的提高
[quote=引用 4 楼 screen12 的回复:] [quote=引用 3 楼 shenyi0106 的回复:] 具体的拆包和组包都是协议栈帮你完成的,对你的应用层是透明的,你应用程序感觉不到这其中的变化。 这里需要解释的唯一一点是: 1. 如果你一次发送64K的包; 2. 假设数据包的路径都是在以太网内传输; 3. 再假设以太网的MTU是1024(原本是1500,为了方便计算,假设是1024); 那么协议栈会帮你把64K的数据分成64个1K的数据包然后发送到网络上;接收端接收时,会等待着64个1K的数据包都收到了,才向你的应用层返回数据。这里再次假设接收了63个丢了1个,那么对于协议栈而言,就意味着这64K的数据都必须要丢掉(已经收到的63K也必须丢掉),这就造成了极大的浪费。 所以,如你业务逻辑可以接受小包传输的话,最好还是在应用层拆包发送,这样即使最后一个1K丢了,那前面的63K你是已经收到了,重发最后一个1K就可以了,或者可以忍受丢掉这1K所带来的损失。效率上有大的提高
[quote=引用 3 楼 shenyi0106 的回复:] 具体的拆包和组包都是协议栈帮你完成的,对你的应用层是透明的,你应用程序感觉不到这其中的变化。 这里需要解释的唯一一点是: 1. 如果你一次发送64K的包; 2. 假设数据包的路径都是在以太网内传输; 3. 再假设以太网的MTU是1024(原本是1500,为了方便计算,假设是1024); 那么协议栈会帮你把64K的数据分成64个1K的数据包然后发送到网络上;接收端接收时,会等待着64个1K的数据包都收到了,才向你的应用层返回数据。这里再次假设接收了63个丢了1个,那么对于协议栈而言,就意味着这64K的数据都必须要丢掉(已经收到的63K也必须丢掉),这就造成了极大的浪费。 所以,如你业务逻辑可以接受小包传输的话,最好还是在应用层拆包发送,这样即使最后一个1K丢了,那前面的63K你是已经收到了,重发最后一个1K就可以了,或者可以忍受丢掉这1K所带来的损失。效率上有大的提高
18,356
社区成员
64,214
社区内容
加载中
试试用AI创作助手写篇文章吧