HTTP协议学习一:什么是HTTP协议

HTTP协议学习笔记。参考《图解HTTP协议》

什么是HTTP协议

Web使用一种名为HTTP(HyperText Transfer Protocol)超文本传输协议作为规范,完成从客户端到服务器端等一系列运作流程。

他的网络基础是TCP/IP协议。通常使用的网络是在TCP/IP协议族的基础上运作的。而HTTP属于他内部的一个协议。与HTTP关系密切的协议:IP、TCP和DNS。

IP和TCP协议详情请参见 TCP/IP计算机网络总结

DNS服务:
DNS服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。计算机既可以被赋予IP地址,也可以被赋予主机名和域名。用户通常使用主机名或域名来访问对方的计算机,而不是直接通过IP地址访问。DNS协议通过提供域名查找IP地址服务。

URI与URL:
URI统一资源标识符。URI就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型名称。采用HTTP协议时,协议方案就是http。除此之外还有ftp,telnet,file等其他URI标准协议。

URL表示资源的地点(互联网上所处的位置)。可见URL是URI的一个子集。

URI格式:表示指定的URI,要使用涵盖全部必要信息的绝对URI,绝对URL以及相对URL。相对URL是指从浏览器中基本URI初指定的URL。

URI_format

  • 登录信息(认证),指定用户名和密码作为从服务器端获取资源时必要的登录信息。(可选项)
  • 服务器地址,使用绝对URI必须指定待访问的服务器地址。
  • 服务器端口号,指定服务器连接的网络端口号。(也是可选项,若用户省略则自动使用默认端口号)
  • 带层次的文件路径,指定服务器上的文件路径来定位特指的资源。
  • 查询字符串,针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数(可选项)
  • 片段标识符,使用片段标识符通常可标记处已获取资源中的子资源。

HTTP协议

HTTP协议用于客户端和服务器之间的通信。请求访问资源的一端成为客户端,而提供资源响应的一段成为服务器端。

客户端发送请求报文

请求报文示例

1
2
GET /index.htm HTTP/1.1  #GET表示请求访问服务器的类型,成为方法;/index.htm指明请求访问的资源对象,也叫做请求URI。最后是HTTP版本号
Host: hakr.jp

请求报文是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成。

1
2
3
4
5
6
7
8
#请求首部字段
POST /form/entry HTTP/1.1
Host: hackr.jp
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
#内容实体字段
name=ueno&age=37

服务器返回处理结果

1
2
3
4
5
6
7
8
9
#返回处理结果首部
HTTP/1.1 200 OK #200OK表示请求的处理结果状态码(status code)和原因短语(reason-phrase)
Date: Tue, 10 Jul 2012 06:50:15 GMT #显示创建相应的日期时间
Content-Length: 362
Content-Type: text/html

#处理结果内容实体
<html>
...

响应报文由协议版本、状态码、原因短语、可选的响应首部字段以及实体主体构成。

HTTP是不保存状态的协议

  • HTTP协议自身不对请求和相应之间的通信状态进行保存。在HTTP这个级别,协议对发送过的请求或响应都不做持久化处理。这是为了快速处理大量事务。
  • Cookie技术。无状态协议经常使业务处理变得困难,比如用户登录购物网站,在页面跳转之间需要保证登录状态。这种情况下,网站为了掌握是谁送出的请求,需要保存用户的状态。

请求URI定位资源

HTTP协议使用URI定位互联网上的资源。当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。

可以使用完整URI也可以使用在Host中写明网络域名和IP地址的方法指定URI。

告知服务器意图的HTTP方法

  • GET 获取资源。用来请求访问已被URI识别的资源。
  • POST 传输实体主题。
  • PUT 传输文件。像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
  • HEAD 获取报文首部。与GET一样,但不返回报文主题部分。用于确认URI的有效性以及资源更新的日期时间等。
  • DELETE 删除文件。与PUT相反
  • OPTIONS 询问支持的方法。用来查询针对请求URI指定的资源支持的方法
  • TRACE 让Web服务器端将之前的请求通信环回给客户端的方法。客户端通过TRACE方法可以查询发送出去的请求时怎样被加工修改、篡改的。这是因为,请求想要连接的源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。
  • CONNECT 要求用隧道协议连接代理。主要使用SSL和TSL协议把通信内容加密后经网络隧道传输。

持久连接

  • 单次HTTP连接请求。

HTTP_response

出现问题,当资源中含有大量图片,这种每次请求都要建立TCP连接的方式就非常冗余。

  • 持久连接。只要任意一段没有明确提出断开连接,则保持TCP连接状态。这也就是TCP断开问什么是四次挥手
    持久连接的好处在于减少了TCP重复连接和断开造成的额外开销,减轻了服务器端的负载。

  • 管线化。持久连接使得多数请求以pipelining方式发送成为可能。从前发送请求后需要等待并收到响应才能发送一个请求。管线化技术可以不用等待响应也可发送下一个请求。

当请求一个包含10张图片的HTML页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化可以比持久连接更快。

使用Cookie的状态管理

HTTP是无状态协议,它不对之前发生过的请求和相应状态进行管理。也就是无法根据之前的状态进行本次的请求处理。

要求登录认证的Web页面本身无法进行状态的管理,那么每次跳转新页面就需要 再次登录 或者 在每次请求报文中附加参数来管理登录状态

Cookie是用过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送的Cookie后,会去检查是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。