博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTTP协议
阅读量:4183 次
发布时间:2019-05-26

本文共 3746 字,大约阅读时间需要 12 分钟。

HTTP简介

HTTP(Hyper Text Transfer Protocol)是应用层上的协议,我们称之为超文本传输协议,是用于从Web服务器传输超文本到本地浏览器的传送协议。 HTTP是基于TCP/IP协议来传输数据。(HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。) 浏览器作为客户端向web服务器通过url发送请求,web接收请求后处理向客户端发送响应信息。

HTTP所在位置

这里写图片描述

HTTP主要特点

1.支持B/S模式、C/S模式

2.简单快速:基于请求和响应,请求只用发送请求方法和路径
3.灵活:可以传输任意类型数据对象
4.无连接:无连接是说应用层是无连接的,下层使用TCP仍然是面向连接的,无连接的含义是指限制每一次建立连接只处理一次请求,服务器处理完客户请求,收到客户应答就断开连接。
5.无状态:HTTP是无状态协议。无状态是指协议对于事物处理没有记忆能力,这次请求与上次请求时无关系的。缺少状态意味着如果后续处理需要之前的信息,需要重传,这会导致每次连接传送数据量增大。另一方面,在服务器不需要先前信息时,应答就较快。

HTTP之URL

这里写图片描述

HTTP使用统一的资源标识符URI来传输数据和建立连接,URL是一种特殊的URI,包含了用于查找某个资源足够的信息,称之为统一资源定位符。是互联网上用于标识某一资源的地址。

HTTP方法

根据HTTP标准,HTTP可以使用多种方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET     请求指定的页面信息,并返回实体主体。HEAD    类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头POST    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。        数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。PUT     从客户端向服务器传送的数据取代指定的文档的内容。DELETE  请求服务器删除指定的页面。CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。OPTIONS 允许客户端查看服务器的性能。TRACE   回显服务器收到的请求,主要用于测试或诊断。

HTTP请求和响应格式

客户端发送一个HTTP请求的请求消息包括:

请求行+请求报头(header)+空行+请求正文(Body)
一般情况下,服务器接收并处理客户端发来的请求之后,会返回一个响应消息,其包括:
响应行+响应报头(header)+空行+响应正文(Body)
这里写图片描述
说明:
header:是请求的属性,是以冒号分隔的键值对形式,每组键值对之间用\n分隔,header遇到空行结束

body:空行后面都是body,body允许空字符串,如果body存在,则在header中会有一个Content-Length标识body长度,如果服务器返回了⼀个html⻚⾯, 那么html⻚⾯内容就是在body中

常见header:

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

HTTP状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

常用状态码:

200 OK                        //客户端请求成功302 Redirect                  //重定向400 Bad Request               //客户端请求有语法错误,不能被服务器所理解401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden                 //服务器收到请求,但是拒绝提供服务404 Not Found                 //请求资源不存在,eg:输入了错误的URL500 Internal Server Error     //服务器发生不可预期的错误503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

HTTP工作流程

一个HTTP操作叫做一个事务

1)客户端与服务器建立连接。一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口建立一个TCP套接字连接。
2)建立连接之后,客户端向服务器发送请求报文,请求方式的格式为:请求方法| 统一资源标识符(URL) |协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号 |一个成功或错误的代码 |后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

长连接与短连接

长连接:

建立连接——数据传输。。。(保持连接)。。。数据传输——关闭连接
短连接:
建立连接——数据传输——关闭连接。。。建立连接——数据传输。。。

在HTTP1.1版本加入了长连接,接下来我们来说一说。

HTTP长连接和短连接实质上是TCP的长连接和短连接。

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。简单的说,你打开的服务器上的网页之间是没有任何的联系的。

长连接:HTTP/1.1开始使用长连接,用来保持连接的特性。使用长连接的HTTP协议,会在响应头加入一行代码:Connection:keep-Alive,在使用长连接的情况下,当网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端去再次进行访问,这个时候再次去访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它会有一个保持时间,可以在不同的服务器软件上去设定这个时间。实现长连接需要客户端和服务器都来支持长连接。

短连接:HTTP/1.0默认使用短连接,浏览器和服务器每次进行一次HTTP操作,就建立一次连接,任务结束以后中断连接。当客户端浏览器去访问资源的时候,这个时候就需要建立一次HTTP会话。

HTTP的长连接和短连接是对应TCP的长连接和短连接

TCP的短连接,client/server之间传递一次读写操作,然后由client断开连接,特点是管理起来比较简单,存在的链接都是有用的连接(主要此时的连接都会进行数据传输),不需要额外的控制手段。

TCP的长连接,C/S进行一次读写操作以后不进行关闭连接,后续读写操作还回去使用这个连接。

此时使用的是TCP的保活功能,保活功能主要是为服务器应用提供的,服务器应用希望知道客户主机是否崩溃。

长短连接优缺点

长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,适用长连接。长连接需要进行TCP的保活探测,还有就是它只是探测TCP的存活,如果遇到恶意的链接,保活功能就不应该使用。

在长连接下,client不会主动去关闭连接,这样随着客户端连接越来越多,server就会出现问题,太多连接要去分配数据结构来操作。
这个时候就需要采取一些措施,例如关闭一部分长时间没有使用的连接,防止出现服务器崩溃,如果条件允许,就可以限制客户端的最大长连接数目,防止一台客户端机器去占有太多对服务器产生损害。

短连接的管理就是存在的连接都是有用的连接,不需要额外的控制手段。唯一的缺陷就是如果有频繁的请求,这个时候将会在TCP的建立和关闭上浪费时间和带宽。

长连接的应用:数据库的连接使用长连接,因为数据库是经常要进行写入写出的操作的。

短连接的应用:WEB网站的HTTP服务一般来说都会使用短连接,长连接会耗费一定的资源,造成高并发的问题。

你可能感兴趣的文章
《Android系统学习》第二章:如何制作OTA U盘升级包
查看>>
《Android系统学习》第五章:编译Android的JDK环境
查看>>
《C++特性》之引用类型
查看>>
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>
《Android系统学习》第十一章:Android应用程序Activity组件分析
查看>>
Android4.2 Input子系统
查看>>
《C++面向对象》结构体继承
查看>>
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
查看>>
指向指针的指针
查看>>
《tiny6410裸机程序》第三章:基础汇编test1
查看>>
《tiny6410裸机程序》第四章:汇编与C混合编程
查看>>
《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
查看>>
《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
查看>>
《tiny6410裸机程序》第七章:S3C6410外部中断简介
查看>>
《tiny6410裸机程序》第八章:S3C6410外部中断控制寄存器
查看>>
《tiny6410裸机程序》第八章:S3C6410总中断控制寄存器
查看>>
《tiny6410裸机程序》第九章:tiny6410按键控制蜂鸣器程序
查看>>
有关free()函数的一个问题
查看>>