首页 > 解决方案 > TCP FIN 字节值?

问题描述

我的问题实际上是两个部分:

从发件人的角度来看,

  1. 除了 TCP 标头 FIN 标志之外,TCP 层是否真的在流中注入(或者更像是附加,因为它应该在流的末尾)一个人造字节,这意味着这个字节是 TCP 有效负载的一部分?
  2. 如果是这样,这个字节的值是多少?

从接收者的角度来看,

  1. TCP 层和应用程序都需要知道这个 FIN 标志/字节。那么TCP层真的只看FIN标志,没有对流中的字节进行特殊处理吗?
  2. 申请如何通知?通过 FIN 标志,或者,通过流中的这个特殊字节?
  3. 什么时候通知申请?就在 TCP 层接收带有 FIN 标志的段时,或者,当该段最终冒泡接收器的 TCP 缓冲区时?
  4. 如果应用程序在具有 FIN 标志的段最终冒泡 TCP 缓冲区之前没有收到特殊通知,这意味着 TCP 层必须以某种方式标记缓冲区,因为 TCP 标头应该已经被剥离。那么它是如何标记FIN的呢?

标签: cnetworkingtcpnetwork-programmingnetwork-protocols

解决方案


除了 TCP 标头 FIN 标志之外,TCP 层是否真的在流中注入(或者更像是附加,因为它应该在流的末尾)一个人造字节,这意味着这个字节是 TCP 有效负载的一部分?

不。没有实际的字节注入,只是增加了 TCP 序列号,因此很明显 ACK 是针对 FIN 而不是一些先前的数据。

这也意味着如果接收到 FIN,则不会将特殊字节放入套接字缓冲区并传递给应用程序,而是将套接字缓冲区标记为完成。应用程序对空且“完成”的套接字缓冲区的读取将返回缓冲区中没有更多数据并且永远不会,因此应用程序知道对等方已停止发送(即套接字关闭以写入或套接字关闭) .


推荐阅读