HTTP数据包详解

  • A+
所属分类:安全闲碎

HTTP数据包详解


HTTP数据包详解

1. HTTP报文格式

    HTTP由请求和响应两部分组成,所以对应的也有两种报文格式。下面分别介绍HTTP请求报文格式和HTTP响应报文格式。

      HTTP请求报文格式

HTTP数据包详解

    以上表格中,第1行为“请求行”,第2、3、4行为“请求头部”,第5行为空行,第6行为“请求正文”。分别介绍这4部分:
      1.请求行:由3部分组成,分别为:请求方法、URL(见备注1)以及协议版本,之间由空格分隔,请求方法包括GET、POST等。协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1。
      2.请求头部包含很多客户端环境以及请求正文的有用信息。请求头部由“关键字:值”对组成,每行一堆,关键字和值之间使用英文“:”分隔。
      3.空行,这一行非常重要,必不可少。表示请求头部结束,下面就是请求正文。
      4.请求正文:可选部分,比如GET请求就没有请求正文;POST比如以提交表单数据方式为请求正文。

    HTTP响应报文格式:

HTTP数据包详解

     以上表格中,第1行为“状态行”,第2、3、4行为“响应头部”,第5行为空行,第6行为“响应正文”。下面分别介绍这4部分:

      (1)状态行由由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔。状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)。这里列举几个常见的:

HTTP数据包详解

      (2)响应头部与请求头部类似,也包含了很多有用的信息。

      (3)空行,这一行非常重要,必不可少。表示响应头部结束

      (4)响应正文,服务器返回的文档,最常见的为HTML网页。


2. HTTP的头域
      在HTTP的请求消息和应答消息中,都包含头域。头域分为4种,其中请求头域和应答头域分别只在请求消息和应答消息中出现,通用头域和实体头域在两种消息中都可以出现,但实体头域只有当消息中包含了实体数据时才会出现。下面分别介绍这4种头域中的域名城和功能

      HTTP请求头域

HTTP数据包详解

HTTP数据包详解

应答头域只在应答消息中出现,是Web服务器向浏览器提供的一些状态和要求。如下


HTTP 应答头域

HTTP数据包详解

HTTP数据包详解

通用头域既可以用在请求消息中,也可以用在应答消息。


HTTP通用头域

HTTP数据包详解

     只有在请求和应答消息中包含实体数据时,才需要实体头域。请求消息中的实体数据是一些由浏览器向web服务器提交的数据,如在浏览器中采用POST方式提交表单时,浏览器就要把表单中的数据封装在请求消息的实体数据部分。应答消息中的实体数据是web服务器发给浏览器的媒体数据,如网页,图片和文档等。实体头域说明了实体数据的一些属性。如下表


 HTTP实体头域

HTTP数据包详解


3.Http请求数据包 

1)请求行

     包含三个内容 method + request-URI + http-version。

   method 包含有 post , get, head,delete, put, connect, options, patch, propfind,propatch, mkcol, copy, move, lock, unlock, trace, head。

HTTP数据包详解

主要介绍get方法和post方法

       get方法:

是在url中说明情请求的资源,

比如https://www.baidu.com/con?from=self?_t=1466609839126其中?后的数据就是请求的数据,并且连接用&get方法也可以提交表单数据,但是提交的数据在url中,其他人可以通过查看历史记录中的url来获取你提交的数据,这样很不安全。

      post方法:

传输数据不在url,而在数据段中出现,并且请求头多了Content-TypeContent-Length,post提交表单数据的时候比get方法更安全。

 

post方法提交表单和get方法提交表单相比较:

       get明文传输,信息附加在url上面,get明文传输,post更加安全

       get传输有大小限制,应该是3kpost需要制定传输类型

       get多用于获取数据,根据get变量的不同调用不同的数据,post多用于提交数据,提交用户输入的数据

get方法和post方法的区别:

    1>Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。

     2>Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改。

    3>Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。

     4>Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。

     5>GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。在服务器端,用Request.QueryString来获取Get方式提交来的数据。

    6>Post请求则作为http消息的实际内容发送给web服务器,数据放置在请求体中,Post没有限制提交的数据。PostGet安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post

   7>POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取。

2)请求头

Accept:指浏览器或其他客户可以接爱的MIME文件格式。Servlet可以根据它判断并返回适当的文件格式。

User-Agent:是客户浏览器名称。

Host:对应网址URL中的Web名称和端口号。

Accept-Langeuage:指出浏览器可以接受的语言种类,如enen-us,指英语。

connection:用来告诉服务器是否可以维持固定的HTTP连接。http是无连接的,HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接

Cookie:浏览器用这个属性向服务器发送CookieCookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。

Referer:表明产生请求的网页URL。如比从网页/icconcept/index.jsp中点击一个链接到网页/icwork/search,在向服务器发送的GET/icwork/search中的请求中,Refererhttp://hostname:8080/icconcept/index.jsp。这个属性可以用来跟踪Web请求是从什么网站来的。

User-Agent:是客户浏览器名称。

Content-Type:用来表名request的内容类型。可以用HttpServletRequestgetContentType()方法取得。

Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.

Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。

 

get方法请求头例如:

    Accept:image/webp,image/*,*/*;q=0.8

    Accept-Encoding:gzip,deflate, sdch, br

   Accept-Language:en-US,en;q=0.8

    Connection:keep-alive

    Cookie:PSTM=1466499789;BAIDUID=D3A617EE01FFA9DB9B7E3E5F0D3A01EE:FG=1;BIDUPSID=4AA34EC11075CB66B8BC9792DD422B6F;BDUSS=VCc1M0cVQtYnFGfmxTUW5kVTUydnBZUmhiWFRXbnRlMnpIdWV2ODVxNHZ1WkZYQVFBQUFBJCQAAAAAAAAAAAEAAADkEA1ZtPO3rMfRt6zH0cfRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8salcvLGpXdz;BD_HOME=1; BD_UPN=123353; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1;H_PS_PSSID=19292_18286_1458_20318_18241_20369_17942_20388_19690_20417_18560_17001_15560_12277_20253;BDSVRTM=0

    Host:www.baidu.com

   Referer:https://www.baidu.com/s?wd=http%20%E8%AF%B7%E6%B1%82%E6%95%B0%E6%8D%AE%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%E6%A0%BC%E5%BC%8F&rsv_spt=1&rsv_iqid=0x9b746a8000022af9&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&oq=http%20%E8%AF%B7%E6%B1%82%E6%96%B9%E5%BC%8Fpost%20url%E6%A0%BC%E5%BC%8F&rsv_t=59fb7cEn5xgK8JFpqQ7F7coy6k6dn5sGpEMj1cDM4oMoy0TGArJ2l3fxOqy6F9lXoqoi&inputT=7936&rsv_pq=ca5859d100027005&rsv_sug3=73&rsv_sug1=12&rsv_sug7=100&rsv_sug2=0&rsv_sug4=32020

    User-Agent:Mozilla/5.0 (X11;Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79Safari/537.36

 

post方法的请求头

    Accept:*/*

    Accept-Encoding:gzip,deflate, br

   Accept-Language:en-US,en;q=0.8

    Authorization:BasicWkEtMTE0MjcyNjAyMDY=

    Connection:keep-alive

    Content-Length:666

    Content-Type:application/json

   Host:zhihu-web-analytics.zhihu.com

    Origin:http://www.zhihu.com

   Referer:http://www.zhihu.com/question/41690822

    User-Agent:Mozilla/5.0 (X11;Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79Safari/537.36

    Request Payload

    view source

相比之下多了content-Type 和 Content-Length

1. Content-Type:表示的是请求报文体的 MIME 类型 ,注:GET的请求消息体是空的 所以不需要指定消息体的MIME类型

2. Content-Length:表示的是 post的数据的长度 

例如请求数据:

    GET/sample.jspHTTP/1.1

   Accept:image/gif.image/jpeg,*/*

    Accept-Language:zh-cn

    Connection:Keep-Alive

    Host:localhost

    User-Agent:Mozila/4.0(compatible;MSIE5.01;WindowNT5.0)

    Accept-Encoding:gzip,deflate

  

第一行为http请求行,包含方法,URI http版本

1-7为请求头,包含浏览器,主机,接受的编码方式和压缩方式;第8行表示一个空行表示请求头结束 这个空行是必须的;


数据体

9行是数据体,比如是需要查询的信息。

 

4.http响应数据包 

状态行 + 响应头 + 响应正文

1)状态行是由:HTTP-Version+Status-Code+Reason-Phrase

比如:HTTP/1.1 200 ok

分别表示http版本 + 状态码 + 状态代码的文本描述

状态码:

HTTP数据包详解

2)响应头:包含服务器类型,日期,长度,内容类型等

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:13:33 GMT

Content-Type:text/html

Last-Moified:Mon,6 Oct 2003 13:23:42 GMT

Content-Length:112


3)响应正文响应正文就是服务器返回的HTML页面


本文始发于微信公众号(LemonSec):HTTP数据包详解

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: