TCP FIN 字节值?

QnA*_*QnA 2 c networking network-programming tcp network-protocols

我的问题实际上分为两部分:

从发送者的角度来看,

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

从接收者的角度来看,

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

Ste*_*ich 5

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

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

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