0%

计算机网络(3)——HTTP

一. HTTP简介

今天看了一些http协议的一些相关的概念,准备在博客中记录一下。
HTTP是客户端和服务端用于通信的协议,可以用来传输文本、图片、文件。他是基于TCP连接,所以说HTTP协议是一个可靠的协议,当HTTP客户端发起一个与服务端的TCP连接,一旦连接建立起来,该浏览器和服务器进程就可以通过套接字接口访问TCP。

二. HTTP特性

1. HTTP的无状态

HTTP是一种无状态的协议,我们如何去理解无状态协议呢。当浏览器向服务端连续发送相同的请求时,服务器不会因为两次请求的相同而返回不同的响应,而是从新去发送请求的对象,就像服务器完全忘记之前做过的事情一样,换一句话说就是每一次请求都是完全独立的。因为HTTP服务器不会保存关于客户的任何相关信息,所以说HTTP是一个无状态的。

那如果我们需要使用HTTP协议去维持一个有状态的场景应该怎么办呢。比如说我们登陆网站,我们会对服务端发送一个登陆请求,登陆上以后我们想浏览网站,就会对服务端发送其他请求,我们想要服务端记住我们已经登陆的状态,这种情况下我们应该如何去处理问题呢?为了帮助HTTP变得有状态,我们通常使用Session和Cookie,我这里先卖一个关子,后面为大家详细介绍。

2. HTTP的长连接和短连接

HTTP的短连接就是,当客户端向服务端每发送一次请求是就要建立一次TCP连接然后传输数据然后立刻关闭连接,这样当客户端向服务端请求的web页面含有多个对象时如图片、视频等,每多一个对象,客户端就需要重新和服务端建立一次连接,这样无疑会增加网页加载的时间。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

我们都说HTTP长连接和短连接本质上是TCP的长连接和短连接,应为HTTP是应用层上的协议,它的底层是基于TCP,应为TCP协议支持长连接,能够保持TCP在请求结束后不立刻关闭,所以说HTTP支持长连接,如果TCP协议在请求结束后立刻关闭,我们说这样的HTTP是短连接的。

当我们请求的一个网页含有大量的图片、CSS、JS等静态资源,长连接能够帮助我们只建立一个TCP通道就可以完成全部的请求,这就省下了大量的资源消耗。

三. HTTP格式

应为HTTP不仅用于发送请求服务端,还用于响应客户端。所以HTTP包含了请求报文格式和响应报文格式。

1. 请求报文格式

upload successful
请求报文包括,请求行、请求头部、请求体。
请求行

  • 请求方法:有GET、POST、PUT、DELET。GET请求参数可以放在URL后面,而POST请求的数据参数只能放在请求数据里面,和GET请求相比POST请求更安全一些,并且应为POST请求的参数是放在请求数据内,POST可以传输的数据也更多一些。PUT和DELET使用的更少一些,以我的使用经验来说,这些往往适合REST风格配合使用。

  • URL:是指请求的资源

  • 协议版本:指HTTP协议的版本,如HTTP/1.1

请求头部
请求头部由头部字段名:值的格式构成,看起来像JSON格式,我介绍一些比较常用的。

  • user-agent: 这的是用户使用浏览器版本。例如:user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36。这个是chrome的引擎。

  • Cookie:用于在客户端存储少量的信息,通常用于实现session功能。

  • Host:请求的资源在哪个主机的端口上。

请求数据
请求数据又叫请求体,使用是用于传输html表单中的信息。通常来说使用POST方法会将参数放到请求体中,而使用GET方法一般不会放在请求体中。

2. 响应报文格式

upload successful
响应报文协议是当服务端进行处理返回给客户端的信息,这里面同样包含了3个部分,响应行、响应头、响应正文。
响应行
由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔。

状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)

这里举出一些常见的:
upload successful

响应头
与请求头部类似,为响应报文添加了一些附加信息
upload successful

我们前面提到了http是无状态的。这简化了服务器的设计,并且可以允许程序员去开发可以同时处理数以千计的TCP连接的高新能Web服务器。然而一个Web站点经常希望能够识别用户。为此,HTTP使用了cookie。cookie在HTTP应用中有四个部分:

    1. http请求头部包含了cookie字段
    1. http响应报文包含了Set-Cookie字段
    1. 服务端数据库会保存cookie的相关信息。
    1. 客户端会保存cookie信息的文件。

我们举一个例子,假设张三晚上想上淘宝,当他第一次上淘宝时,我们假定他以前访问过淘宝,当请求报文到达淘宝的时候,淘宝的服务器会生成一个唯一的识别码,并以此作为索引在他的后端数据库产生一个表项,接下来淘宝的服务器会用一个包含了set-cookie首部的http响应报文对于张三的浏览器进行响应,其中set-cookie就含有该识别码。可能是

  • Set-cookie:1678
    当张三的浏览器收到了该HTTP响应报文时,他会看到set-cookie:首部。该浏览器在他管理的cookie文件中会添加一行,该行包含服务器的主机名和在set-cookie:首部的识别码。当张三继续浏览淘宝时,其浏览器就会查询该cookie文件并抽取他对这个网站的识别码,并放到http请求报的识别码的cookie首部行中。之后每一次发往淘宝的cookie的请求报文中就包含了一下首部行:
  • cookie:1678
    在这样的方式下,淘宝就可以跟踪张三的浏览记录,并为张三提供购物车服务,即淘宝可以维护张三希望购买的物品列表,这样张三在结束回话时可以一起为他们支付。

如果张三再次访问该网站的时候,比如说是一个星期以后,她的浏览器会在其请求报文中继续放入首部行cookie:1678.淘宝将根据张三过去访问过的页面向她推荐产品,如果张三在淘宝网注册过,可以将邮件地址、银行卡相关联,这就可以解释淘宝等购物网站的点击购物功能,即在点击购买的时候不需要重新提供信用卡和姓名。

web缓存

Web缓存器也叫做代理服务器,它能够代表初始的服务器来满足http请求的网络实体,并在存储空见保存最近请求过的对象的副本。
举一个例子,如果有一个浏览器想访问淘宝。

    1. 浏览器首先会向web缓存器发送http请求。
    1. 缓存服务器会查询存储空间中是否含有请求对象的副本,如果含有的话,立刻返回副本数据。
    1. 如果web缓存器中没有该对象,他就打开一个与该对象的初始服务器的TCP连接,web缓存器则向淘宝网发送http请求,在收到请求后,淘宝的服务器会返回一个响应报文。
    1. 当web缓存起接收到该对象是,他在本地存储空间会存储一份副本,并向客户端浏览器发送该副本。

这样以后在去访问该对象时,就可以快速返回。但是这会有一个问题,如果代理服务器备份的副本时间过长,对象已经被修改了,这样web缓存器返回回来的对象就是错误的。
我们使用条件GET可以解决这个问题,条件GET是指在请求报文中,我们使用GET方法,并且在请求头中包含了“If-Modified-Since”字段,这是由web缓存起发送的,缓存器在备份副本的时候会记录修改的时间,当浏览器再次请求相同的对象时,web缓存器会先向服务端发送一个包含If-Modified-Since的GET请求,如果没有被修改则返回一个304响应报文。这样虽然会影响一些效率,但是增加了安全性和可靠性。

参考文献

HTTP请求、响应报文格式
浅谈HTTP中GET、POST用法以及它们的区别
计算机网络 自顶向下方法