为什么在发送字符串并关闭套接字后会出现TCP RST数据包

时间:2017-03-05 17:07:32

标签: python sockets

我尝试使用python套接字发送char Y并在输入之后但是当我捕获wireshark时我发现它错误。为什么? python中的代码:

import socket
import re

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (('pwnable.kr', 9009))
sock.connect((server_address))
b=sock.recv(2048)    # I must use 2 sock.recv then recv full text 
print b
b=sock.recv(2048)
print b
b=re.findall("Y/N",b)
print b
#sock.recv(1024)
if b[0]=="Y/N":
    print "OK"
    sock.send(("Y"+"\r\n").encode())
    b=sock.recv(1024)

Wireshark捕获: enter image description here 如何发送字符串然后输入? 使用多个sock.recv会影响任何事情吗?

UPDATE1: 我想打印最后一个b,它应该是

Enter 1 to Begin the Greatest Game Ever Played.
Enter 2 to See a Complete Listing of Rules.
Enter 3 to Exit Game. (Not Recommended)
Choice: 

但我收到空列表。 我的代码:

import socket
import re

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
server_address = (('pwnable.kr', 9009))  
sock.connect((server_address))
b=sock.recv(2048)
print b
b=sock.recv(2048)
print b
b=re.findall("Y/N",b)
print b
#sock.recv(1024)
if b[0]=="Y/N":
    print "OK"
    sock.send(("Y"+"\r\n").encode())
    b=sock.recv(1024)
    print b
sock.close()    

在wireshark有红线: enter image description here

1 个答案:

答案 0 :(得分:2)

这里发生了什么?

有序TCP关闭如下所示:

  • 此方发送FIN表示“我没有其他内容可以发送”。
  • 另一方回复ACK意思是“好的,得到了​​所有数据”。从这一点开始,从另一侧的套接字读取将返回空(意味着“文件结束”)。
  • 另一方决定它没有更多要说的,发送FIN意思是“我没有更多要发送”。
  • 此方发送ACK表示“确定,获取所有数据”。
  • 现在双方都可以关闭文件描述符。

但是socket.close没有按顺序关闭。它发送FIN,等待ACK,然后关闭描述符。从这一点来看,任何到此端口的TCP数据包都会产生RST响应,意味着“没有这样的连接”。

红线只是TCP RST数据包的标记。

如何避免RST数据包?

假设远程端在recv返回空(0字节可用)后最终关闭连接,则可以通过执行以下操作来避免RST:

sock.shutdown(socket.SHUT_WR)
buf = sock.recv(1)
if not buf:
  # Remote side sent FIN.
  sock.close()
# else: more data to handle, should recv again, until it returns empty

这样,你的一方将处理对方想要发送的所有内容,并且只有在另一方说FIN时才会关闭。

相关问题