Python socket模拟HTTP请求
0x00 起
最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数。简单的说,就是重写一下requests中的get、post方法。
今天在写的时候,遇到一枚很奇怪的问题,对同一个URL,POST请求能正常返回信息,而一旦切到GET,socket time out。
伪代码如下:
get_str = 'GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36\r\nAccept: */*\r\n\r\n'
post_str = 'POST %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36\r\n\r\n%s\r\n\r\n' def get(url,port):
sock = socket.connect(url,port)
sock.send(get_str % (url, port)) response = ''
temp = sock.recv(4096)
while temp:
temp = sock.recv(4096)
response += temp return response
0x10 结
心烦意乱的调了很久无果,出去吃了个饭,回来查查资料,从头开始顺了一遍,找到了bug点。原因是HTTP 1.1协议中,默认connection: keep-alive。
Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
而python中的sock.recv如果接收不到数据,会等到TCP连接down掉,才会返回NULL。如果在程序中没有设置超时时间,会等到服务器主动断开连接,一般是30s~60s。
这就是造成socket timeout的原因。在http request里添加connection: close即可解决问题。但是为什么只有get受到影响,post却没有问题呢?
做了个简单的测试:
post 很快就返回了结果:

而get用了很久才返回结果,其中connection为keep-alive:

所以,之前所说的HTTP 1.1协议中,所有的请求都默认为Connection: keep-alive是错误的认识。
只有get请求会默认采取Connection: keep-alive
参考资料:
https://www.byvoid.com/blog/http-keep-alive-header
Python socket模拟HTTP请求的更多相关文章
- Socket模拟HTTP请求
WEB服务器可以可以理解为socket的上层封装,其也是TCP/IP协议,只要知道其IP地址和端口号就可以与他进行通信了 与WEB服务器数据交互,其重点在于请求头,如果请求头不对则不能进行数据传输 简 ...
- socket 模拟 HTTP请求
一.socket介绍 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层.socket则是对TCP/I ...
- PHP+SOCKET 模拟HTTP请求
HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: ...
- python socket 模拟tcp通讯
对于tcp server 端的创建而言, 分为如下步骤: 1,创建socket对象(socket):其中俩个参数分别为 Address Family(如AF_INET为ipv4),AF_I ...
- Java Socket 模拟HTTP请求
public static void main(String[] args) { try { String url = "192.168.1.103"; Socket socket ...
- PHP socket模拟POST请求
<?php if (! function_exists ( 'socket_post' )) { function socket_post($url, $data, $referer = '') ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
- gj10 python socket编程
10.1 HTTP.Socket.TCP这几个概念 五层网络模型 socket 不属于任何协议,是一个API,通过socket 可以和传输层的打交道,然后在之上可以实现自己的功能和协议 10.2 cl ...
- 第五十九节,模拟浏览器请求Python结合html基本格式
模拟浏览器请求Python结合html基本格式 用Python模拟一个客户端,结合打开一个HTML页面 创建客户端 #!/usr/bin/env python # -*- coding:utf8 -* ...
随机推荐
- poj1472[模拟题]
Instant Complexity Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2017 Accepted: 698 ...
- Commons CLI - Usage
Usage Scenarios The following sections describe some example scenarios on how to use CLI in applicat ...
- Xcode Product -> Archive disabled
You've changed your scheme destination to a simulator instead of "iOS Device". That's why ...
- linux中FTP自动备份VPS脚本
服务器多了,网站也越来越多,总觉得不整个备份心里放不下心,并且有好几次rm的操作失误,造成难以挽回的损失.并且大多数的VPS提供商是不提供自动备份功能或者此功能收费价格略高.所以自己还是有必要把这个工 ...
- asp.net输出重写压缩页面文件实例
例子 代码如下 复制代码 using System;using System.Data;using System.Configuration;using System.Web;using Syste ...
- TabbarItem超炫小动画
本文转载自 不灭的小灯灯 的博客 Tabbar点击时候超炫小动画 感谢这位大神的分享! 对UITabBarController上TabBar按钮动画详细介绍-->>保证你有意外收获,如有 ...
- abstract
/// <summary> /// 抽象类不能被直接实例化 /// is a /// </summary> public abstract class BasePhone { ...
- 简单快速的伪Fractional Cascading
Fractional Cascading算法是用于将零散的多个数组(亦可理解成比较高维的空间)中的数据的二分查找速度增加,用的是空间换时间的方法.然而这种方法并不是很好懂,而且中文文献很少.在这里介绍 ...
- 【转】404、500、502等HTTP状态码介绍
基本涵盖了所有问题HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HT ...
- Word中批量替换软回车
在平时工作中,有时候需要拷贝一些截取自网页上的文字,当选中后拷贝到Word中时,有时候在每行的结尾出现如下的符号,,这给后期文字的整理带来了很多不便,在此记录从网上获取的解决方法,以免遗忘和便于查找. ...