c - TCP FIN 字节值?
问题描述
我的问题实际上是两个部分:
从发件人的角度来看,
- 除了 TCP 标头 FIN 标志之外,TCP 层是否真的在流中注入(或者更像是附加,因为它应该在流的末尾)一个人造字节,这意味着这个字节是 TCP 有效负载的一部分?
- 如果是这样,这个字节的值是多少?
从接收者的角度来看,
- TCP 层和应用程序都需要知道这个 FIN 标志/字节。那么TCP层真的只看FIN标志,没有对流中的字节进行特殊处理吗?
- 申请如何通知?通过 FIN 标志,或者,通过流中的这个特殊字节?
- 什么时候通知申请?就在 TCP 层接收带有 FIN 标志的段时,或者,当该段最终冒泡接收器的 TCP 缓冲区时?
- 如果应用程序在具有 FIN 标志的段最终冒泡 TCP 缓冲区之前没有收到特殊通知,这意味着 TCP 层必须以某种方式标记缓冲区,因为 TCP 标头应该已经被剥离。那么它是如何标记FIN的呢?
解决方案
除了 TCP 标头 FIN 标志之外,TCP 层是否真的在流中注入(或者更像是附加,因为它应该在流的末尾)一个人造字节,这意味着这个字节是 TCP 有效负载的一部分?
不。没有实际的字节注入,只是增加了 TCP 序列号,因此很明显 ACK 是针对 FIN 而不是一些先前的数据。
这也意味着如果接收到 FIN,则不会将特殊字节放入套接字缓冲区并传递给应用程序,而是将套接字缓冲区标记为完成。应用程序对空且“完成”的套接字缓冲区的读取将返回缓冲区中没有更多数据并且永远不会,因此应用程序知道对等方已停止发送(即套接字关闭以写入或套接字关闭) .
推荐阅读
- xamarin.forms - 使用 Xamarin.Forms 在画布视图中显示图像
- angular - 如何有条件地禁用客户端
- .htaccess - 如何将 301 非 www 重定向到 www nginx
- sql - 如果 A 不是 B 则数据合并
- aspnetboilerplate - 如何防止更新 LockoutEndDateUtc
- linux - 如何使用 mplayer 查看原始 yuv 文件?
- python - 如何从多项式拟合中排除值?
- jquery - 在 jquery 中创建一个随机边框
- postgresql - PostgreSQL 删除表无效参数
- r - 如何在执行 R 脚本时分配特定核心