HTTP协议简介

应用层

基础概念
应用层就是在应用程序之间进行数据交换,我们平时写的一个个应用程序解决一个个实际问题,满足日常需求的网络程序,都是在应用层。

应用层常见协议

  1. HTTP协议——超文本传输协议
  2. FTP协议——文件传输协议
  3. SMTP协议——简单邮件传输协议
  4. DNS协议——域名解析协议

应用层有好多协议,都是由我们程序员自己处理的,在这些协议中,我们最常用的就是HTTP协议,那么接下来就让我们一起来看看,HTTP协议到底是怎么样的。

HTTP协议

HTTP协议简介

HTTP(Hyper Text Transfer Protocol —— 超文本传输协议),它是用于从万维网到本地浏览器之间的文件传输协议,HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

在这里插入图片描述
HTTP工作流程

一次HTTP通信机制,客户端与服务端应该包括包括以下几个步骤

  1. 建立TCP连接
    在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;

  2. 客户端向服务端发送请求
    建立了TCP连接,客户端就会向服务器发送请求命令;

  3. 客户端发送请求头信息
    客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送。

  4. 服务端应答
    客户端向服务器发出请求后,服务器会客户端返回响应;

  5. 服务端响应头信息
    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档。

  6. 服务端向客户端发送数据
    服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;

  7. 服务端关闭TCP连接
    一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP之URL

其实URL其实并没有那么神秘,它其实就是我们俗称的网址,学名叫做统一资源定位符,又叫URL(Uniform Resource Locator),是专为标识Internet网上资源位置而设置的一种编址方式,我们平时所说的网页地址指的即是URL。统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。下面让我们来具体的了解一下url到底是如何构成的。

基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如"协议://授权/路径?查询"。
完整的、带有授权部分的普通URL语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

例如:
在这里插入图片描述

HTTP请求

一个HTTP请求包含三部分,首行、头部、正文。

  1. 首行: [方法] + [url] + [版本]
  2. Header: 请求的属性, 冒号分割的键值对,每组属性之间使用\n分隔;遇到空行表示Header部分结束
  3. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度.

在这里插入图片描述
举个例子如下:
在这里插入图片描述
HTTP响应

一个HTTP响应也包含三部分,首行、头部、正文。

  1. 首行: [版本号] + [状态码] + [状态码解释]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  3. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中.

举个例子如下:

在这里插入图片描述

HTTP常见头部

  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

HTTP请求方法

  • GET:GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

  • HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。

  • PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲,
    PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。举个例子:如一个用于提交博文的URL,/addBlog。如果用PUT,则提交的URL会是像这样的”/addBlog/abc123”,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。目前大部分博客都是这样的。显然,PUT和POST用途是不一样的。具体用哪个还取决于当前的业务场景。

  • DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源。

  • POST:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个完成。

  • OPTIONS:这个方法很有趣,但极少使用。它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET,POST”。

HTTP状态码
在这里插入图片描述
最常见的状态码, 比如 :

  • 200(OK)请求成功。一般用于GET与POST请求

  • 404(Not Found)服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面

  • 403(Forbidden)服务器理解请求客户端的请求,但是拒绝执行此请求

  • 301(Moved Permanently) 永久性定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。

  • 302(Found, 重定向) 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。和301相似,但302表示的资源不是永久移动,只是临时性的。换句话说,已移动的资源对应的URI将来还有可能发生变化,比如,用户把uri保存为书签,但不会像301状态码出现时那样更新书签,而是仍旧保留返回302状态码的页面对应的uri

  • 500(Internal Server Error)服务器内部错误,无法完成请求

  • 502(Bad Gateway) 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值