论HTTP请求大小

HTTP分为URI,HEADER,Body三个部分。每个部分都可以包含请求信息,那么每个部分是否都有请求大小限制呢?刚开始以为这个问题很容易找到答案,后来发现这也是个挺复杂的问题。

URI

首先是URI,我们知道,在GET请求中,请求参数是放在URL进行传递的,所以,HTTP GET的请求最关心的一个问题:能有多长?我能放多少参数?URI

从HTTP 1.1协议中开始找:(RFC 2616)

The HTTP protocol does not place any a priori limit on the length of a URI

所以明确一点的是HTTP协议是没有显式限制URI的长度的。理论上来说你在URI中传递多少参数都是可以的。

 

但是现实往往无法永远照进阳光:

1 浏览器限制

所有主流浏览器都会对URI的长度进行限制。如果你在浏览器中输入过长的URI,那么浏览器会自动进行截断。各个浏览器对URI长度的限制各不相同,甚至不同版本也不一样。大约一个概念,2000字符以内的URI都能符合所有主流浏览器的要求。

2 服务端限制

即使客户端同意发送无限长度的URI,但是服务器一方一般都是有长度限制的。一般服务是没有专门针对URI的参数限制的,但是由于URI是会包含在request header中的,所以对header的大小限制是会对URI起作用的,比如nginx的(large_client_header_buffers)这个属性,它默认是4k。

 

题外话

这里的“URI是包含在request header中的” 这句话其实是有问题的。URI在HTTP协议中是叫做request-Line的,如果具体看协议,是会发现request-Line和request-header是两个不一样的,就是说request的请求其实该分为request-line, request-header, request-body三个部分的(具体可以看http://www.ietf.org/rfc/rfc2616.txt 第4和5章)。但是好像使用的时候都默认将header中理解为包含了request-line(比如这篇文章http://trafficserver.apache.org/docs/v2/sdk/HTTPHeaders.html)。这里估计是概念和使用的时候导致问题,不必深究了,所以我们不妨将request-line理解为包含在header中就好。

 

不管如何,综上所述,这里的URI不论是客户端还是服务端,基本是被默认限制住的。

Header

header中存放的信息非常多,比如request-line,cookie,还有各种key-value的特定header字段和值。有点时候,我们也会往header中添加一些自定义的属性。header的长度和URI的情况是一样的。协议中并没有显示限制header的大小。理论上在header中放多少属性都是可以的。

但是实际上:

1 浏览器限制

各个主流浏览器限制几十k~几百M不等的限制。基本上能满足平时的需求了。但是如果这个长度对你业务有很大影响的话,建议还是亲自测试下。

2 服务端限制

比如nginx的large_client_header_buffers就限制了header的长度。你也可以自己设置。

 

可能会影响header的参数还有:

client_header_buffer_size

client_header_timeout

各参数可以参考:http://wiki.nginx.org/HttpCoreModule

Body

body和URI,header非常不一样,不一样的地方原因在于文件上传。HTTP是支持request中带文件的,那么文件的二进制数据不会放在URI或者header里面,它是放在body里面的。那么这个body的大小就一定不能默认限制太小,尤其是客户端。

 

首先理论上,协议是没有对body大小做任何限制的。

其次,浏览器也没有对body做任何大小限制,因为如果浏览器做了大小限制就意味着它直接影响了你的服务功能。

所以对body的限制的任务就放在了服务器上了。这里就我最熟悉的nginx+php-fpm来看下有哪些地方可以对body进行限制:

1 nginx有一些设置会对body大小产生影响

client_max_body_size,这个参数可以限制body的大小,默认是1m

client_body_timeout,当body太大,或者网络太差的时候,这个也有可能会影响请求的成功率的。

2 php.ini也有一些设置会对上传的body数据产生影响

upload_max_filesize,限制最大上传文件大小

post_max_size ,限制post的大小

memory_limit,限制内存使用大小

max_execution_time,这个是php最大执行时间,也有可能影响请求成功率的。

HTTP请求大小有什么影响

首先是安全因素考虑。

试想一下一个网站的服务器是不限制body大小的,那么它就是可以被黑客利用攻击的地方了。黑客利用这一点往HTTP POST的body中传递非常大(比如几M)的请求。那么比如像nginx+php-fpm这样的,就会占用了服务器一个php进程专门处理这个请求,就会导致你对外无法提供其他的服务了,你的服务就瘫痪了,这就是DDOS攻击。

其次是文件上传服务考虑。

文件上传有两种情况:

你可能经常遇到为什么文件上传失败?那么大多是上文说的几个设置没有设置对。

其次,文件上传大小是不是设置越大越好?答案必须是否定的,理由也是安全考虑。满足需求的大小限制就够了。

这里就可以理解为什么大都把文件上传和业务接口分开来提供了吧。如果你的文件上传服务和业务接口是同一个机器的话,那么就说明你的业务接口可以允许的body大小一定是很大的。换句话说,在这种情境下,你的业务中的所有POST请求都是不安全的!!只要进行DDOS攻击,业务就会瘫痪。

时间: 2024-11-19 00:58:15

论HTTP请求大小的相关文章

关于"net::ERR_CONNECTION_ABORTED"和"Firebug 达到了 Post 请求大小限制"的问题

1.其中"net::ERR_CONNECTION_ABORTED"是在Chrome的控制台中打印出来的. 2."Firebug 达到了 Post 请求大小限制" 是 在火狐的Firebug请求消息头中显示出来的. 原因:在做POST提交的时候,提交的内容大小超过2M,导致出现上面的问题.解决办法修改tomcat中的POST请求最大数据量的限制. 修改的文件是:server.xml 修改的内容如下: <Connector port="8888"

你以为的ASP.NET文件上传大小限制是你以为的吗

原文:你以为的ASP.NET文件上传大小限制是你以为的吗 我们以为的文件大小限制 我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRuntime元素中添加maxRequestLength属性设置大小,同时为了支持大文件上传超时可以添加executionTimeout属性设置超时时间.网上有很多这样的例子,但实际情况是否是这样吗? <httpRuntime

操作系统 内存分配 请求帮助

问题描述 操作系统 内存分配 请求帮助 内存管理是所有操作系统必备的功能.为深入研究内存管理功能.实现内存的有效使用,某研究小组计划开发一个实验性内存管理器,实现对内存的分配.释放和整理.对应的接口为 new . delete 和 defrag ,使用语法为: new size :分配 size 字节大小的内存块,返回该内存块的句柄 handle , size 为正整数: new start size :同 new size ,从指定首地址 start 处分配 size 字节大小的内存块: de

my.cnf文件:my.cnf参数配置

PS:本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的站点,主要使用InnoDB存储引擎.其他应用环境请根据实际情况来设置优化. # 以下选项会被MySQL客户端应用读取.# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.# 如果你想你自己的MySQL应用程序获取这些值.# 需要在MySQL客户端库初始化的时候指定这些选项. #[clie

Google网站性能优化工具Page Speed

和Yahoo的YSlow一样,Google的开源网站优化工具Page Speed,是一个基于Firebug的FireFox插件,和YSlow一样,Page Speed可以帮助用户改善网站性能的工具.在运行它之后,可以看到一个帮助你的网站加载速度加快的建议列表,它会根据列表中的每一项检查你的网站并标明是否通过. Page Speed在运行时会分析一些Web服务器配置和服务器上下载下来的代码,还会创建一个结果列表,其中包括如何改进网页的建议.分析基于一个分为五类的最佳实践列表: * 优化缓存--让你

commons-fileupload用户指南(文档翻译)

使用fileupload根据你的应用需求,fileupload可以有许多不同的使用方式.在最简单的情况下,你可以调用一个简单的方法来解析servlet请求,然后在他们提交到你的应用时处理表单列表.在其它规模的终端上,你也可能决定将fileupload进行自定义,以完全控制个别表单项存储的方法.比如,你或许会将内容流化来保存到数据中.在这里.我们将要描述fileupload的基本使用方法,然后解释一些更简单的,以及最常用的使用模式.fileupload的个性化在这里得到了描述.它怎么工作一个文件上

实现ASP.NET程序性能目标的几种方法

asp.net|程序|性能 第一次在这里写BLOG,希望不要被大家取笑!   一. 调整程序代码   1.避免多次读取相同数据   在循环语句中不要包含无端重复执行的代码,如:   while ( dr.read())   {   if(dr.item["lastname"]==Request.params["lastname"])   return true;   else   return false;   }   在上面循环中,对于DataReader返回的每

实现性能目标的几种方法

性能 第一次在这里写BLOG,希望不要被大家取笑!一. 调整程序代码1.避免多次读取相同数据 在循环语句中不要包含无端重复执行的代码,如:while ( dr.read()){ if(dr.item["lastname"]==Request.params["lastname"]) return true; elsereturn false;}在上面循环中,对于DataReader返回的每条记录都要对Request.params["lastname"

浅谈Http协议中的Get和Post

Http HTTP(Hypertext transfer protocol),先说下着几个单词,Hypertext是超文本(除了HTML外,也可以是带有超链接的XML或JSON),protocol是协议,transfer翻译应该是移交(也可以翻译成传输,运输,还有一个更具体的词是transport),最开始学校学习Http的所有市面能见到的书籍都翻译成超文本传输协议,Http设计的本身是为了移交和操作资源,并不是为了传输资源.最开始的的网站都是静态内容类似今天云盘,实现了资源共享,URL(Uni