http报文解析

http报文解析

Posted by WangZiTao on Wednesday, September 18, 2019

General

Request URL:请求的URL地址
Request Method: 请求方法,get/post/put/……
Status Code:状态码,200 为请求成功
Remote Address:路由地址

注: x-forwarded-for

针对这个,去了解了下,总结下其他人的经验: 当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP, X-Forwarded-For 是一个扩展头。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239 (Forwarded HTTP Extension)标准之中。

X-Forwarded-For 请求头格式非常简单,就这样:X-Forwarded-For: client, proxy1, proxy2 可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2 总结是:在使用nginx等反向代理服务器的时候,是必须使用X-Forward-For来获取用户IP地址的(此时Remote Address是nginx的地址),因为此时X-Forward-For中的地址是由nginx写入的,而nginx是可信任的。不过此时要注意,要禁止web对外提供服务。

Remote Address

Remote Address代表的是当前HTTP请求的远程地址,即HTTP请求的源地址。HTTP协议在三次握手时使用的就是这个Remote Address地址,在发送响应报文时也是使用这个Remote Address地址。因此,如果请求者伪造Remote Address地址,他将无法收到HTTP的响应报文, 此时伪造没有任何意义。这也就使得Remote Address默认具有防篡改的功能。如果Http请求经过代理服务器转发,则这种情况,用户的真实ip会丢失,所以才有了 “X-Forwarded-For”的方式。

Response Headers

1Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
2Accept-RangesWEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。
3 Cache-Control:服务器应遵循的缓存机制。
        public(可以用 Cached 内容回应任何用户)
        private(只能用缓存内容回应先前请求该内容的那个用户)
        no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端) 
        max-age:(本响应包含的对象的过期时间)  
        ALL:  no-store(不允许缓存)  
4 Connection 是否需要持久连接
        close(连接已经关闭)。
        keepalive(连接保持着,在等待本次连接的后续请求)。
        Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive300
5Content-EncodingWEB服务器表明自己使用了什么压缩方法(gzipdeflate)压缩响应中的对象。 例如:Content-Encodinggzip 
6Content-LanguageWEB 服务器告诉浏览器自己响应的对象的语言。
7Content-LengthWEB 服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012
8Content-RangeWEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022
9Content-TypeWEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Typeapplication/xml
10ExpiredWEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。
11Last-ModifiedWEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
12LocationWEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。
13Proxy-Authenticate 代理服务器响应浏览器,要求其提供代理身份验证信息。
14Server: WEB 服务器表明自己是什么软件及版本等信息。
15Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。

Request Headers

1Accept  告诉WEB服务器自己接受什么介质类型,'*/*' 表示任何类型,type '/*' 表示该类型下的所有子类型;
2Accept-Charset  浏览器申明自己接收的字符集
3Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法  gzipdeflate
4Accept-Language  浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5gb2312gbk等等。
5Authorization 包含了客户端提供给服务器,以便对其自身进行认证的数据。
6Connection:表示是否需要持久连接。close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,
不要等待本次连接的后续请求了)。keep-alive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
7Content-Length:请求的内容长度。
8Connection-Type 表示具体请求中的媒体类型信息。
9Referer:发送请求页面URL。浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL
10User-Agent: 浏览器表明自己的身份(是哪种浏览器)。
11Host:指定请求的服务器的域名和端口号。
12Origin:存在于请求中,用于指明当前请求来自于哪个站点。
13Cache-Control:浏览器应遵循的缓存机制。
        no-cache(不要缓存的实体,要求现在从WEB服务器去取)
        max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象) 
        max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值)  
        min-fresh:(接受其新鲜生命期大于其当前 Age  min-fresh 值之和的缓存对象)
14Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control no-cache
15Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。
16Form:一种请求头标,给定控制用户代理的人工用户的电子邮件地址。
17Cookie:这是最重要的请求头信息之一。
18Sec-Fetch-Mode:代表請求的模式。主要有 corsnavigatenested-navigateno-cors 等等。
        來判断这个请求是什么,类似 fetch 当中 mode
        像是 Set-Fetch-User 我们也可以知道使用者是否是投过操作(例如点击、键盘等等)來发出請求的
19Sec-Fetch-Site:代表请求的来源是同源还是跨域。

Content-Type 常见的媒体格式类型如下:

text/html  HTML格式
text/plain :纯文本格式     
text/xml   XML格式
image/gif gif图片格式   
image/jpeg jpg图片格式
image/pngpng图片格式

以application开头的媒体格式类型:

application/xhtml+xml XHTML格式
application/xml      XML数据格式
application/atom+xml  Atom XML聚合格式   
application/json     JSON数据格式
application/pdf       pdf格式 
application/msword   Word文档格式
application/octet-stream  二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded  <form encType=””>中默认的encTypeform表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

multipart/form-data  需要在表单中进行文件上传时,就需要使用该格式

以上就是我们在日常的开发中,经常会用到的若干content-type的内容格式。

参考

HTTP首部Connection实践 Http请求中Content-Type讲解以及在Spring MVC中的应用 更安全的請求標頭 - Fetch Metadata Request Headers HTTP请求中的referrer和Referrer-Policy 彻底搞清referrer和origin Origin字段 HTTP Referer 教程


comments powered by Disqus