问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

HTTP分为URI,HEADER,Body三个部分

发布网友 发布时间:2022-10-12 11:29

我来回答

1个回答

热心网友 时间:2023-11-12 19:48

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/HttpCoreMole
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攻击,业务就会瘫痪。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
土狗一般多大开始懂人性 如何训练 小土狗怎么训练才听话 新手训狗的好方法 跑跑卡丁车故事模式哪一关还海盗船长(人物)奖励的,骨灰玩家说下._百 ... 跑跑卡丁车手游被遗忘的炮塔的宝藏在哪_跑跑卡丁车手游被遗忘的炮塔的... 跑跑卡丁车手游在被遗忘的炮塔附近搜寻宝藏怎么做?遗忘炮塔宝藏攻略... 跑跑卡丁车手游被遗忘炮塔宝藏在哪 炮塔附近搜寻宝箱位置详解-新手攻略... 跑跑卡丁车被遗忘的炮塔附近宝藏在哪里_跑跑卡丁车被遗忘的炮塔附近宝藏... 跑跑卡丁车手游在遗忘的炮塔附近搜寻宝藏在哪 遗忘炮塔宝藏位置详解 迅捷路由器使用问题 ...MATLAB7.0的,程序总是在打开后一会,就自动关闭了。希望能帮忙哦,感... HTTP请求行、请求头、请求体详解 电脑突然关机,鼠标灯一闪一闪的 南宁的滴滴可以在县份接单吗? 菲斯曼a1he和a1je区别 股票真的有买涨和跌的吗?和现买现卖吗,又有人介绍现贷黄金可以买涨或跌真的有吗?可信吗?各位帮我解释 朋友圈优美文案 电脑阴阳屏怎么修复 梦见烹饪菜肴有什么征兆 女生主动找男生尬聊 长安锐程CC的备用钥匙可以放车里吗 长安锐程cc2022钥匙孔在哪里 猪皮怎么做 做猪皮的方法 关于打篮球,你认为我哥哥那种做法最脑残? 哥哥在操场上打篮球有语病吗? 爱打篮球的哥哥作文 爪爪充电怎么破解 右键选项太多了怎么整理 央行正式公布,“数字人民币”将出现,“扫一扫”将成为过去? 手机可以验钞票吗? 个人商标转让要多长时间? 苹果4s有软件更新,总是震动,怎么样关闭震动 苹果4s开机时的震动怎么关闭 刚出现的问题,iphone4s连接电源时会振动一下,怎么关掉 苹果4s晚上不想被打扰怎么把手机调成震动 苹果4s按键音怎么取消我什么办法都用了,还是不行 如何关闭帕提派对的震动 起点的点击是怎么算的啊,这不科学 苹果浏览器不能跳转文件下载 双十一买的笔记本电脑,边缘老是漏电,是不是可以退货? 我前几天在苏宁买了台苹果电脑,现在电脑的电源坏了,还在七天之类,请问能不能退货? 我3月12号买的电脑现在无法上网,而且漏电十分严重,不知道能不能退货 我买了一台苹果电脑5天,想要退货,可以吗 vivoz3i怎么把歌下到mp3里? iphone4s语音备忘录录音时扬声器声音变成了听筒声咋回事 怎么样用照片展示出我们的家庭低碳生活呢? 产品电视广告文案 连PPT都照搬!小米新产品文案“碰瓷”苹果,致敬行业龙头标杆? 苹果7wifi损坏如何开机 绿书签手抄报一等奖图片 绿书签是什么意思? 绿书签护苗行动手抄报内容