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必须指定待访问的服务器地址。
- 服务器端口号,指定服务器连接的网络端口号。(也是可选项,若用户省略则自动使用默认端口号)
- 带层次的文件路径,指定服务器上的文件路径来定位特指的资源。
- 查询字符串,针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数(可选项)
- 片段标识符,使用片段标识符通常可标记处已获取资源中的子资源。
HTTP协议
HTTP协议用于客户端和服务器之间的通信。请求访问资源的一端成为客户端,而提供资源响应的一段成为服务器端。
客户端发送请求报文
请求报文示例
1 | GET /index.htm HTTP/1.1 #GET表示请求访问服务器的类型,成为方法;/index.htm指明请求访问的资源对象,也叫做请求URI。最后是HTTP版本号 |
请求报文是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成。
1 | #请求首部字段 |
服务器返回处理结果
1 | #返回处理结果首部 |
响应报文由协议版本、状态码、原因短语、可选的响应首部字段以及实体主体构成。
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连接请求。
出现问题,当资源中含有大量图片,这种每次请求都要建立TCP连接的方式就非常冗余。
持久连接。只要任意一段没有明确提出断开连接,则保持TCP连接状态。这也就是TCP断开问什么是四次挥手
持久连接的好处在于减少了TCP重复连接和断开造成的额外开销,减轻了服务器端的负载。管线化。持久连接使得多数请求以pipelining方式发送成为可能。从前发送请求后需要等待并收到响应才能发送一个请求。管线化技术可以不用等待响应也可发送下一个请求。
当请求一个包含10张图片的HTML页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化可以比持久连接更快。
使用Cookie的状态管理
HTTP是无状态协议,它不对之前发生过的请求和相应状态进行管理。也就是无法根据之前的状态进行本次的请求处理。
要求登录认证的Web页面本身无法进行状态的管理,那么每次跳转新页面就需要 再次登录 或者 在每次请求报文中附加参数来管理登录状态 。
Cookie是用过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送的Cookie后,会去检查是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。