首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我没有得到HTTP答案与sr函数。只是个ACK

我没有得到HTTP答案与sr函数。只是个ACK
EN

Stack Overflow用户
提问于 2016-07-23 23:31:41
回答 1查看 190关注 0票数 0

我试图向google.com发送HTTP请求,但我得到的答案是ACK,而不是HTML。以下是代码:

代码语言:javascript
复制
def Make_Get():
        synR = IP(dst = 'www.google.com', ttl = 64)/TCP(dport = 80,sport = randint(1024,65535), flags = 'S')
        synAckAN = sr1(synR)
        req = (IP(dst='www.google.com') / TCP(dport=80, sport=synAckAN[TCP].dport, seq=synAckAN[TCP].ack, ack=synAckAN[TCP].seq + 1, flags='A')/"GET / HTTP/1.0 \n\n")

        ans, a = sr(req)
        return ans

这是我得到的两个包作为这个函数的回报:

### IP ### version =4 ihl = None tos = 0x0 len = None id =1标志= frag =0 ttl = 64 proto = TCP chksum =id src = 192.168.233.128 dst = 216.58.214.100 \ ### tcp ###体育= 35534 dport= http =1ack= 1964930533 dataofs =无保留=0标志=a window = 8192 chksum =n urgptr =0选项= {} ###原始### load = 'GET / HTTP/1.0 \n‘无### IP ###版本= 4L ihl =5Ltos= 0x0len = 40 id = 32226标志= frag =0Lttl=128个proto = TCP chksum = 0x6425 src =216.58.214.100dst= 192.168.233.128 \ ### tcp ###体育= http dport = 35534 seq = 1964930533 ack = 18 dataofs = 5L保留= 0L标志=窗口= 64240 chksum = 0xe5e6 urgptr =0选项= {} ###填充### load =‘\x00\x00’无

当我在发送这个包裹的时候嗅到了流量,我得到了这个:

代码语言:javascript
复制
###[ Ethernet ]###
  dst= 00:0c:29:bb:8e:79
  src= 00:50:56:e9:b8:b1
  type= 0x800
###[ IP ]###
     version= 4L
     ihl= 5L
     tos= 0x0
     len= 517
     id= 32136
     flags= 
     frag= 0L
     ttl= 128
     proto= tcp
     chksum= 0x5004
     src= 172.217.20.100
     dst= 192.168.233.128
     \options\
###[ TCP ]###
        sport= http
        dport= 1928
        seq= 1828330545
        ack= 18
        dataofs= 5L
        reserved= 0L
        flags= FPA
        window= 64240
        chksum= 0x8b5f
        urgptr= 0
        options= []
###[ HTTP ]###
###[ HTTP Response ]###
              Status-Line= u'HTTP/1.0 302 Found'
              Accept-Ranges= None
              Age= None
              E-Tag= None
              Location= u'http://www.google.co.il/?gfe_rd=cr&ei=9fiTV6P6FuWg8weei7rQDA'
              Proxy-Authenticate= None
              Retry-After= None
              Server= None
              Vary= None
              WWW-Authenticate= None
              Cache-Control= u'private'
              Connection= None
              Date= u'Sat, 23 Jul 2016 23:08:37 GMT'
              Pragma= None
              Trailer= None
              Transfer-Encoding= None
              Upgrade= None
              Via= None
              Warning= None
              Keep-Alive= None
              Allow= None
              Content-Encoding= None
              Content-Language= None
              Content-Length= u'261'
              Content-Location= None
              Content-MD5= None
              Content-Range= None
              Content-Type= u'text/html; charset=UTF-8'
              Expires= None
              Last-Modified= None
              Headers= u'Date: Sat, 23 Jul 2016 23:08:37 GMT\r\nContent-Length: 261\r\nContent-Type: text/html; charset=UTF-8\r\nLocation: http://www.google.co.il/?gfe_rd=cr&ei=9fiTV6P6FuWg8weei7rQDA\r\nCache-Control: private'
              Additional-Headers= None
###[ Raw ]###
                 load= '<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">\n<TITLE>302 Moved</TITLE></HEAD><BODY>\n<H1>302 Moved</H1>\nThe document has moved\n<A HREF="http://www.google.co.il/?gfe_rd=cr&amp;ei=9fiTV6P6FuWg8weei7rQDA">here</A>.\r\n</BODY></HTML>\r\n'

如您所见,这一层的最后一层包含了我需要的代码。

我的问题是:

为什么我不使用sr()获取包,以及如何获得它来收集HTML代码?

编辑:

对函数的调用:

代码语言:javascript
复制
print Make_Get('www.google.com')[0][Raw]

职能:

代码语言:javascript
复制
def Make_Get(ipp):
        ip = DNS_Req(ipp)
        synR = IP(dst = ip)/TCP(dport = 80,sport = randint(1024,65535), flags = 'S')
        syn_ack = sr1(synR)
        getStr = "GET / HTTP/1.1\r\nHost: {}\r\n\r\n".format(ip)
        request = (IP(dst= ip) / TCP(dport=80, sport=syn_ack[TCP].dport, seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A')/getStr)
        an = sr(request)
        return an

其结果是:

Begin emission: .Finished to send 1 packets. \* Received 2 packets, got 1 answers, remaining 0 packets Begin emission: \*Finished to send 1 packets. Received 1 packets, got 1 answers, remaining 0 packets []

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-29 07:31:00

首先,在HTTP中,正确的换行符是"\r\n",而不是"\n“。

第二,您是否有理由使用HTTP/1.0而不是HTTP/1.1?如果没有,则应将请求更改为:

代码语言:javascript
复制
GET / HTTP/1.1\r\n
Host: www.google.com\r\n
\r\n

第三,您得到的ACK通常在发送实际HTTP响应之前由服务器发送,以更快地确认您的请求。然后,使用HTTP响应发送第二个段。您在第一个show()示例中遗漏了这个示例。

看看here

要捕获此段,可以使用sr()函数及其参数timeoutmulti

代码语言:javascript
复制
ans, unans = sr(request, timeout=2, multi=True)

for c, s in ans:
    if s.haslayer(Raw):
        print b[Raw]
    print("-----------") # just a delimiter

timeout用于确保sr()将停止(值2是任意的)。multi的意思是“接受相同刺激的多个答案”,除非它存在,否则sr()将停止在发送请求的一个应答后进行嗅探。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38547323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档