繁体   English   中英

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

[英]Why is there TCP RST packet after sending a string and closing a socket

我尝试使用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捕获: 在此输入图像描述 如何发送字符串然后输入? 使用多个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有红线: 在此输入图像描述

这里发生了什么事?

有序的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才会关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM