tcp的close与shutdown的区别引发的血案

之前写的一个程序需要与flash进行通信,根据flash关于policy-request-file的描述,服务器端甚至不需要读到<policy-file-request>这个请求,只需要返回一个crossdomain的协议,然后再把连接关闭。于是我的程序也这么写了,但是flash端就是说读不到数据,连接被拒绝。查了半天问题,抓包对比之后,发现

client->三次握手->server

cleint-><policy-file-request>->server

server->crossdomain->client

server->reset->client

根据reset的描述,这个时候client的所有资源被释放,因此也可能没有crossdomain的数据了。与之前一个可以运行的抓包对比发现差异发生在了server->crossdomain->client之后

client->fin->server

server->fin_ack->client

也就说是client主动关闭的连接,于是我也写成等待client主动关闭连接,果然Ok了,可是问题虽然解决了,但是原因还是没搞清楚。

后来在2w同学的帮助下,发现tcp协议有一段这样的描述:

Consider two peers, A and B, communicating via TCP. If B closes a socket and there is any data in B’s receive
queue, B sends a TCP RST to A instead of following the standard TCP closing protocol, resulting in an error return
value from recv( ).

而shutdown是没有问题,所以最终代码改成了在写完crossdomain之后,显式shutdown。至此真相大白了,看来一些tcp连接底层的东西还是得了解一下,否则一些边界问题还真不知道怎么查原因。

你可能感兴趣的:(shutdown)