我尝试在遗留系统和Linux系统之间实现通信,但我经常遇到以下情况之一:
(遗留系统是服务器,Linux是客户端)
Function recv(2) returns 0 (the peer has performed an orderly shutdown.)
> SYN
< SYN, ACK
> ACK
< PSH, ACK (the data)
> FIN, ACK
< ACK
> RST
< FIN, ACK
> RST
> RST
Function connect(2) returns -1 (error)
> SYN
< RST, ACK
当服务器发送数据时,客户端应该回复数据,但我得到了一个&#34; FIN,ACK&#34; 为什么会这样?我该怎么解释这个?我在这个级别上并不熟悉TCP
答案 0 :(得分:1)
当服务器发送数据时,客户端应该回复数据,但我得到一个“FIN,ACK”为什么会这样?我该怎么解释这个?
一旦服务器发送了数据(第4行),客户端就会关闭套接字或提前终止,操作系统关闭其套接字并发送FIN
(第5行)。服务器使用FIN
回复ACK
,但客户端已不再存在,其操作系统以RST
响应。 (我希望客户端操作系统在臭名昭着的TIME-WAIT
状态期间默默地忽略并丢弃任何到达关闭连接的TCP段,但由于某种原因这不会发生。)
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination:
某些主机TCP堆栈可能会实现半双工关闭序列,如Linux或HP-UX。如果这样的主机主动关闭连接但仍未读取堆栈已从链路接收的所有传入数据,则该主机发送RST而不是FIN(RFC 1122中的第4.2.2.13节)。这允许TCP应用程序确保远程应用程序已经读取了前者发送的所有数据 - 当它主动关闭连接时,从远程端等待FIN。但是,远程TCP堆栈无法区分连接中止RST和此数据丢失RST。两者都会导致远程堆栈丢弃它收到的所有数据,但是应用程序仍然没有读取
答案 1 :(得分:0)
FIN,PSH,ACK - &gt;一笔交易完成 第二个请求接收但发送[RST] seq = 140 win = 0 len = 0