详解HTTP协议

时间:2024-03-29 08:37:40

当我们在浏览器中输入URL(统一资源定位符),浏览器会给我们呈现出想要访问的页面。在这背后工作的协议就是HTTP。

URL(Uniform Resource Locator)是使用Web浏览器等访问Web页面时需要输入的网页地址。

详解HTTP协议

我们日常生活中经常会使用到一些搜索引擎,如百度,必应等。如果在搜索框中输入/?:这样的字符,已经被url当做特殊意义理解了。因此这些字符在url中是不能随意出现的,那么,我们就需要对这些特殊字符进行转译。

转译规则如下:将需要转码的字符转为16进制,然后从右到左取4位,每2位做一位,前面加%,编码成%XY格式。

详解HTTP协议

如上图,C++被转译为C%2B%2B,这种转码方式被称为urlencode,解码过程被称为urldecode。URL中,后面的每一个传入的参数用&符号分割开。

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

协议:指的是通信双方事先约定好的事情。如:通信格式,通信所采用的编码,语言等。

与HTTP协议密不可分的还有TCP/IP协议族中的各种协议,以及DNS服务在使用HTTP协议中也发挥了很重要的作用。

HTTP下层所采用的协议是TCP,HTTP本身是一种无状态协议。

DNS是进行域名解析服务的,我们输入浏览器中的域名通常是使人比较容易记忆的,但是对计算机难以理解,故想要与目标主机通信需要得到目标主机的IP地址,而DNS服务就是来完成域名转化为IP这样的工作的。DNS下层采用的协议是UDP协议。

HTTP和DNS都属于应用层协议。

在应用层下的还有传输层,网络层,数据链路层,和物理层。

这些层次划分在之前也有一张结构图分享出来~

为什么要分这么多层次呢?一个整体不能解决网络传输的问题吗?

答案是:可以,一个整体当然可以解决,但是在实现难度上可能会成倍增加。比如在某个设计上存在缺陷,那么进行改动就需要把整个部分全部换掉。而分层之后,只需要把变动的层更换掉即可。

我们先来从宏观上描述一下访问一个网页的步骤,然后再从细节上理解HTTP在其中发挥的作用。

  1. 我们在浏览器(客户端)输入一个URL(网址),比如百度,然后浏览器会自动向DNS服务器发出请求,请求内容描述的意思是,请告诉我百度的IP地址吧!然后DNS就会想我们的浏览器发出响应,响应内容就是百度的IP地址。
  2. 然后我们的浏览器就可以拿到百度的IP地址,然后HTTP协议在此就会行使他的职责:生成针对目标Web服务器(这里是百度)的HTTP请求报文。
  3. HTTP协议调用TCP协议,TCP通过自身协议特性,将HTTP协议请求报文按序号分成多个报文段,把每个报文段可靠地传给对方。
  4. TCP协议调用IP协议,IP协议搜索对方(百度)地址,一边中转,一边传送。
  5. 百度的服务器收到了我们浏览器发来的请求报文,在TCP层按序号以原来的顺序重组请求报文。
  6. 百度HTTP协议对请求的内容进行处理,我们发过去的是网址,那么百度服务器给出的响应就是百度的首页。
  7. 我们的浏览器得到百度的响应,然后解析出其中的html等标记语言的文本,翻译出界面,这样就得到了一个首页。

至此,我们已经了解了请求一个网页的大致过程,那么在上面所描述的HTTP请求报文,究竟是什么呢?有什么样的格式要求呢?

为了看到实际效果,我们用telnet远程登录到百度的服务器,然后书写一个简单的请求报文,看看得到的响应报文是什么样子的。

详解HTTP协议

在图中我们可以看到,请求报文由三个字段构成,GET,/,HTTP/1.1这三个部分。

其中GET表示请求访问服务器的类型,称为方法。随后的/填写的内容应该是URI,用来指明请求访问的资源对象。最后的HTTP1.1是HTTP的版本号,用来提示客户端所使用的HTTP协议功能,常见的还有HTTP1.0。

所以可以得到,请求报文中至少包含请求方法、请求URI、协议版本这三项内容。事实上还有可选的请求首部字段和内容实体构成。

而从百度服务器返回的内容中,响应报文也是由三个字段构成,HTTP1.1,200,OK这三个部分。

其中HTTP1.1表示服务器对应的HTTP版本,200表示请求处理结果的状态码,OK表示原因短语。

图示如下:

详解HTTP协议

请求报文和响应报文的首部和实体之间都是用一个空行来分隔的。空行之前称为首部,解析协议实体内容的时候需要去掉首部。

HTTP的字段分四种类型,通用首部字段,请求首部字段,响应首部字段,实体首部字段。

详解HTTP协议

通过这四种类型的字段,HTTP协议可以控制传输的状态,请求的服务,是否代理缓存,长连接还是短连接等等一系列内容。

对比响应字段等内容,可以看到上面百度发给我们的字段中,实体长度为14615字节,链接类型为长连接,发送的日期时间等等。

长连接是指一次TCP连接,多次发送内容,短连接是只发送一次,建立一次连接。早期的HTTP是不支持长连接的。

还有一点就是HTTP本身是无状态协议,但是因为电商以及各种业务需求,需要保存之前的状态,所以引入了Cookie技术用来进行状态管理。

当然无状态本身也有自己的好处,那就是开销小。