1.HTTP协议简介
1.HTTP协议介绍
1.HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
2.HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
2.HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
4.HTTP默认的端口号为80,HTTPS的端口号为443。
HTTP协议工作流程
一次HTTP操作称为一个事务,其工作过程大概如下:
1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;
2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;
eg:
a.浏览器请求这个页面:
b.在这一步,需要域名系统DNS解析域名hackr.ip,得主机的IP地址 20X.189.105.112。
c.然后将上面结合本机自己的信息,封装成一个http请求数据包
3.在HTTP开始工作前,客户端首先会通过TCP/IP协议来和服务端建立链接(TCP三次握手)
4.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和内容。
5.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
6.一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然而如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
2.1 短连接
短连接的操作步骤是:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。
2.2 长链接
示意:长链接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
长链接操作步骤:建立连接——数据传输...(保持连接)...数据传输——关闭连接
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间
长链接分为 without pipelining 和 with pipelining,下图中是without
pipelining,客户端只在收到前一个请求的响应后,才发出新的请求
2.3 管线化
下图是with pipelining,每次建立链接后无需等待请求回来就可以发送下一个请求
3. Http请求报文
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、请求体组成,下图给出了请求报文的一般格式。
请求行:
方法: GET 获取资源 POST 向服务器端发送数据,传输实体主体 PUT 传输文件 HEAD 获取报文首部 DELETE 删除文件 OPTIONS 询问支持的方法 TRACE 追踪路径协议/版本号URL复制代码
请求头:
通用首部(General Header)请求首部(Request Header)响应首部(Response Header)实体首部(Entity Header Fields)复制代码
请求体
请求报文拆解:
3.1 get请求
3.2 post请求
4. Http响应报文
HTTP响应组成:响应行、响应头、响应体。
响应行
(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)复制代码
响应头
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1复制代码
响应体
响应报文拆解:
5. Http状态码
类别 原因
1XX Informational(信息性状态码)
2XX Success(成功状态码)
3XX Redirection(重定向)
4XX Client Error(客户端错误状态码)
5XX Server Error(服务器错误状态吗)
5.1 2XX 成功
200(OK 客户端发过来的数据被正常处理
204(Not Content 正常响应,没有实体
206(Partial Content 范围请求,返回部分数据,响应报文中由Content-Range指定实体内容
5.2 3XX 重定向
301(Moved Permanently) 永久重定向
302(Found) 临时重定向,规范要求,方法名不变,但是都会改变
303(See Other) 和302类似,但必须用GET方法
304(Not Modified) 状态未改变,
配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307(Temporary Redirect) 临时重定向,不该改变请求方法
5.3 4XX 客户端错误
-
400(Bad Request) 请求报文语法错误
-
401 (unauthorized) 需要认证
-
403(Forbidden) 服务器拒绝访问对应的资源
-
404(Not Found) 服务器上无法找到资源
5.4 5XX 服务器端错误
-
500(Internal Server Error)服务器故障
-
503(Service Unavailable) 服务器处于超负载或正在停机维护
6. 首部
6.1 通用首部字段
首部字段名 说明
-
Cache-Control 控制缓存行为
-
Connection 链接的管理
-
Date 报文日期
-
Pragma 报文指令
-
Trailer 报文尾部的首部
-
Trasfer-Encoding 指定报文主体的传输编码方式
-
Upgrade 升级为其他协议
-
Via 代理服务器信息
-
Warning 错误通知
6.2 请求首部字段
首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的编码
Accept-Langulage 优先的语言
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在的服务器
If-Match 比较实体标记
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(和If-Modified-Since相反)
Max-Forwards 最大传输跳数
Proxy-Authorization 代理服务器需要客户端认证
Range 实体字节范围请求
Referer 请求中的URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息
6.3 响应首部字段
首部字段名 说明
Accept-Ranges 是否接受字节范围
Age 资源的创建时间
ETag 资源的匹配信息
Location 客户端重定向至指定的URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 再次发送请求的时机
Server 服务器的信息
Vary 代理服务器缓存的管理信息
www-Authenticate 服务器对客户端的认证
6.4 实体首部字段
首部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体的编码方式
Content-Language 实体的自然语言
Content-Length 实体的内容大小(字节为单位)
Content-Location 替代对应资源的URI
Content-MD5 实体的报文摘要
Content-Range 实体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体过期时间
Last-Modified 资源的最后修改时间
7、HTTP中的重定向和请求转发的区别
解释一 一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次request, 第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
请求转发是服务器内部把对一个request/response的处理权,移交给另外一个 对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。
解释三 假设你去办理某个执照,
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。