RFC的这一部分是关于将责任转移到操作系统或过程的下一阶段。从根本上讲,它与层的分离有关。
TCP的确认不能保证已将数据传递给最终用户,而只能保证接收方的TCP承担了责任。
我一直这样想:
- 操作系统可能在发送ACK和到达客户端进程的数据之间崩溃(此处的“客户端”是指操作系统的客户端,而不是“网络客户端”)
- 客户端进程可能是错误的或崩溃的,或者比预期的慢得多,无法处理其传入的数据,或者实际上仅在非显而易见的情况下才读取它
- 如果客户端正在将数据向前发送,也许是发送到磁盘文件,则该文件可能尚未被写入或刷新
- 如果客户端正在通过TCP继续发送数据,则远端TCP可能尚未发送数据,未收到ACK,或者远端进程已成功使用了数据
只是说这是第3层确认(“我听到了您的字节”),而不是更高层的确认。考虑例如TCP ACK,250 OK
下一跳邮件网关接受消息之后的SMTP ,消息接收消息(例如,按照RFC 3798),消息打开的跟踪像素,来自PA的感谢信之间的区别,并回答“是的,我会做。”
另一个具体示例是打印机:
- 在知道数据的末尾之前,它必须提早确认数据(可能是Postscript文件,其开头的库大于TCP传输窗口)
- 它可能包含状态查询(“您有纸吗?”,显然可以执行该查询)
- 它可能包含打印命令(“请打印此命令”,如果缺纸,则可能会失败)
我建议如果用户正在查看和发送ACK,但仍然遇到连接问题,那么拥塞,操作系统或应用程序问题的发生率要比与网络完全相关的问题高出几个数量级。
为了诊断,我建议寻找重传,而不是专门的ACK。