http请求详解

2019/03/15 08:22
阅读数 33

什么是HTTP

1、概述

HTTP全称是HyperText  Transfer  Protocal,即超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,HTTP是应用层协议,当你上网浏览网页的时候,浏览器和web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。HTTP是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response。

2、特点

支持客户端/服务器模式

简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记

无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省时间

无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就比较快

3、http请求报文由3部分组成:请求行、请求头、请求体;

4、请求行包括:请求方法、url、协议版本

其中请求方法:get,post,head,put,delete,options,trace,connect.

5、请求头包括:user-Agent:产生请求的浏览器类型

Accept:客户端可识别的内容类型列表

Host:主机地址

6、请求数据:post方法中,会把数据以key value形式发送请求

7、空行:发送回车符和换行符,通知服务器以下不再有请求头。

http请求和响应报文

在HTTP连接中报文分为请求(request)和响应(response)两种。每种报文在HTTP首部都有不同的字段来标识不同的用途。

1. 请求报文:HTTP协议使用TCP协议进行传输,在应用层协议发起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客户端会向服务器发出一个请求报文。请求报文的格式如下图抓包所示:

前三行为请求行,其余部分称为request-header。请求行中的method表示这次请求使用的是get方法。请求方法的种类比较多,如option,get,post,head,put,delete,trace等,常用的主要是get,pos。Get表示请求页面信息,返回页面实体;post是请求服务器将指定文档作为请求的url中的从属实体,简单说,我们常用的在网页中填写表单然后申请等动作就是使用了post方法,填写用户名密码登录站点就使用了post方法,如下图:

方法之后是URI,表示请求的页面地址,图中的“/”表示服务器的根目录。之后是表示http的版本。

请求行之后是请求首部。首部常见的部分有如下几个:

l Accept:请求的对象类型。如果是“/”表示任意类型,如果是指定的类型,则会变成“type/”。

l Accept-Language:使用的语言种类。

l Accept-Encording:页面编码种类。

l Accept-Charset:页面字符集。说到这里,需要解释以下字符集和编码的区别。字符集通常对应着一种语言,将语言中的所有字符集合起来就可以视为一种字符集,这样我们可以看出,中文并非是一种字符集,因为中文无法使用一些字符来进行表示;而编码则是将字符转换为计算机所能识别的2进制数的一种方式,例如常说的unicode,UTF-8,ANSI等等,我们在访问一些国外网站会出现乱码的原因就是因为我们浏览器所使用的编码与页面所使用的编码不能互相识别。我们常说的BIG5和GB2312都是编码。

l User-Agent:提供了客户端浏览器的类型和版本。

l Host:连接的目标主机,如果连接的服务器是非标准端口,在这里会出现使用的非标准端口。

l Connection:对于HTTP连接的处理,keep-alive表示保持连接,如果是在响应报文中发送页面完毕就会关闭连接,状态变为close。

2. 响应报文:当收到get或post等方法发来的请求后,服务器就要对报文进行响应。同样,响应报文也分为两部分。

前两行称为状态行,状态行给出了服务器的http版本,以及一个响应代码。响应代码是服务器根据请求进行查找后得到的结果的一种反馈,共有5大类。分别以1、2、3、4、5开头。1**表示接收到请求,继续进程,在发送post后可以收到该应答。

 

2**表示请求的操作成功,在发送get后返回。

3**表示重发,为了完成操作必须进一步动作。

4**表示客户端出现错误。

5**表示服务器出现错误。

其余部分称为应答实体。

 

其中的server表示服务器软件版本,date标注了当前服务器的时间,connection标明连接关闭,抓包可以发现在响应返回后服务器向客户端发出fin包单向关闭了连接。Expires表示在某个时间以前可以不用重新缓存该页面,而cache-control表示对页面是否进行缓存。Pragma的参数no-cache表示对页面不进行缓存。而content-type表示了应答请求后返回的内容类型。Content还有内容长度和内容语言以及内容编码三个项,其中内容长度只有在请求报文中的connection值为keep-alive时才会用到。

3. Cookie:cookie是一种类似缓存的机制,它保存在一个本地的文本文件中,其主要作用是在发送请求时将cookie放在请求首部中发送给服务器,服务器收到cookie后查找自己已有的cookie信息,确定客户端的身份,然后返回相应的页面,cookie的方便之处在于可以保持一种已登录的状态,例如:我们注册一个论坛,每次访问都需要进行填写用户名和密码然后登录。而使用了cookie后,如果cookie没有到达过期时间,那么我们只需在第一次登录时填写信息然后登录,以后的访问就可以省略这一步骤。

在HTTP协议中,cookie的交互过程是这样的:首先是三次握手建立TCP连接,然后客户端发出一个http request,这个request中不包含任何cookie信息。

 

当服务器收到这个报文后,针对request method作出响应动作,在响应报文的实体部分,加入了set-cookie段,set-cookie段中给出了cookie的id,过期时间以及参数path,path是表示在哪个虚拟目录路径下的页面可以读取使用该cookie,将这些信息发回给客户端后,客户端在以后的http request中就会将自己的cookie段用这些信息填充。

 

如果用户在连接中通过了服务器相应的认证程序,服务器会添加一个cdb_auth到set-cookie中,这个段表示了客户端的认证信息,而客户端以后在访问过程中也会将cdb_auth信息写入自己的cookie字段。服务器每次收到http request后读取cookie,然后根据cookie的信息返回不同的页面。例如,没有通过认证的客户端在request中不会有cdb_auth,因此服务器读取cookie后,不会将通过认证的客户端的页面返回给该客户端。

 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部