如题,在做一些 TCP 的小实验,但是本地环境网络太快了,很难模拟封包丢失之类的情况,所以来 v2 问一下老哥。
我的问题是,
一、
假如一个客户端连接到了服务端,中间经过三次握手之后开始正式传递内容。假设客户端想要发送一个长度为 40K 的图片,调用 socket.sendall(picture)这种感觉的命令,由于较长被拆成 10 个封包发送。在发送完毕后恰好客户端电脑断电,且恰好 10 个封包中第五个丢失了,那么理论上服务端的应用层是否只能读出来前四个封包?
二、
如果第一问成立,将上述问题改为,10 次 send 的过程,并非由系统内核拆分,而是由应用层主动拆分,调用十次 socket.send 命令发送,最终表现出来的行为是否一致?
三、
假设我有一个应用场景,需要在两个进程之间建立 RPC 连接,基于 TCP 层设计,那么出于效率考量,最好复用同一个 TCP 连接,即不同反复重复握手、分手的过程。每次 A 端生成若干请求封包,发送至 B 端,这些都发生在同一个连接内部,比如发送两次请求,是否意味着如果第一个请求挂了,第二个请求永远收不到。还是连接内部也有区分,比如按一次 send 区分,前一个 sendall 的排序不影响新的 sendall 的排序?
如果同一连接内部按 sendall 划分排序的话,保证两次请求之间的隔离性似乎只能靠重新建立一次 TCP 连接来实现了?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.