HTTP协议其实就是这么简单

一、HTTP简介

1.http协议介绍

  1. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
  2. HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
  3. HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图HTTP协议其实就是这么简单_第1张图片
  4. HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
  5. HTTP默认的端口号为80,HTTPS的端口号为443。

2.http协议工作流程

一次HTTP操作称为一个事务,其工作过程大概如下:

  1. 用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;
  2. 浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;
浏览器请求这个页面:http://hackr.ip/index.html
在这一步,需要域名系统DNS解析域名hackr.ip,得主机的IP地址 20X.189.105.112。
然后将上面结合本机自己的信息,封装成一个http请求数据包
  1. 在HTTP开始工作前,客户端首先会通过TCP/IP协议来和服务端建立链接(TCP三次握手)
  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
  3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
  4. 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP协议其实就是这么简单_第2张图片

2.1 短连接

短连接的操作步骤是:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。

HTTP协议其实就是这么简单_第3张图片

2.2 长链接

长链接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。

长链接操作步骤:建立连接——数据传输...(保持连接)...数据传输——关闭连接

长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间

长链接分为 without pipelining 和 with pipelining,下图中是without pipelining,客户端只在收到前一个请求的响应后,才发出新的请求。

HTTP协议其实就是这么简单_第4张图片

2.3 管线化

下图是with pipelining,每次建立链接后无需等待请求回来就可以发送下一个请求

HTTP协议其实就是这么简单_第5张图片

3. Http请求报文

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

请求行(request line)、请求头部(header)、请求体组成,下图给出了请求报文的一般格式。

HTTP协议其实就是这么简单_第6张图片

请求行:
    方法:
        GET 获取资源
        POST 向服务器端发送数据,传输实体主体
        PUT 传输文件
        HEAD 获取报文首部
        DELETE 删除文件
        OPTIONS 询问支持的方法
        TRACE 追踪路径
    协议/版本号
    URL
    
请求头:
    通用首部(General Header)
    请求首部(Request Header)
    响应首部(Response Header)
    实体首部(Entity Header Fields)
    
请求体

请求报文拆解:

HTTP协议其实就是这么简单_第7张图片

3.1 get请求

HTTP协议其实就是这么简单_第8张图片

3.2 post请求

HTTP协议其实就是这么简单_第9张图片

4. Http响应报文

HTTP响应组成:响应行、响应头、响应体。

HTTP协议其实就是这么简单_第10张图片

响应行
    (HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
响应头
    Date:生成响应的日期和时间;
    Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1
响应体

响应报文拆解:

HTTP协议其实就是这么简单_第11张图片

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的人,让他们办好后,送了过来。


参考:

  1. HTTP简介
  2. HTTP协议详解
  3. HTTP
  4. HTTP工作过程

你可能感兴趣的:(http)