您的位置:首页 > 理论基础 > 计算机网络

【Http】HTTP报文结构及请求数据大小

2015-09-10 16:35 344 查看
在项目中遇到了【Nginx】错误 413 Request Entity Too Large 的解决方法该问题,于是引出了本文讨论的问题。

HTTP报文结构如下:

HTTP报文结构包含请求行、请求头、请求体三部分。一次请求示例如下图:



一、请求行【request-line】

POST 请求方法

/sso/login 请求URL,及URI

HTTP/1.1 HTTP协议及版本

HTTP协议没有限制请求行的长度。但是出于各种原因的考虑,各家的浏览器、服务器端都做了不同程度的限制。

1、浏览器限制

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

2、服务端限制

一般服务是没有专门针对URI的参数限制的,但是由于URI是会包含在请求头中的,所以对请求头大小的限制是会影响URI的。

3、关于请求行的疑惑

HTTP协议分为request-line、request-header、request-body三个部分的。在查看各浏览器、服务器配置的时候往往将request-line、request-header归为一类了,request-line的数据大小受request-header的影响,比如nginx的large_client_header_buffers属性。

二、请求头【request-header】

请求头部存放了客户端请求的信息,包含User-Agent、Accept、Host等。请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。协议中也没有显示限制请求头的大小。但是出于各种原因的考虑,各家的浏览器、服务器端都做了不同程度的限制。

1、浏览器限制

各主流浏览器都限制请求头的大小,但值得大小不尽相同。

2、服务端限制

出于安全考虑,我们必须在服务器端对请求头大小进行限制,由于存放的信息比较简单,因此建议值不应超过100K。

三、请求体【request-body】

HTTP协议没有限制请求体的长度。HTTP是支持文件传输的,文件的二进制数据不是放在请求行或者请求头里面,它是放在请求体里面的。

1、浏览器限制

如果浏览器对请求体大小做限制,可能会影响文件的传输,因此浏览器本身没有对请求体做大小限制。

2、服务端限制

出于安全考虑,我们必须在服务器端对请求体大小进行限制,请求体长度的最大值的设置有多方面的因素,需要根据业务情况反复调优决定。考虑以下几方面因素:

1、根据请求报文的大小,预估实际请求体的最大值;

2、限制上传文件的大小,文件上传服务与业务操作服务分离;

3、设置合理的超时时间,避免由于请求体太大导致线程被长时间占用;

4、请求体设置不能太大,防止轻易被DDOS攻击;

参考资料

论HTTP请求大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: