HTTP协议详解
HTTP协议简介
超⽂本传输协议(英⽂:HyperText Transfer Protocol,缩写:HTTP)是⼀种⽤于分布式、协作式和超媒体信息系统的应⽤层协议。HTTP是万维⽹的数据通信的基础。HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核⼦研究组织(CERN)所发起。HTTP的标准制定由万维⽹协会(World Wide Web Consortium,W3C)和互联⽹⼯程任务组(Internet Engineering Task Force,IETF)进⾏协调,最终发布了⼀系列的RFC,其中最著名的是1999年6⽉公布的 RFC 2616,定义了HTTP协议中现今⼴泛使⽤的⼀个版本——HTTP 1.1。2014年12⽉,互联⽹⼯程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)⼯作⼩组将HTTP/2标准提议递交⾄IESG进⾏讨论,于2015年2⽉17⽇被批准。 HTTP/2标准于2015年5⽉以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。
HTTP协议概述
HTTP是⼀个客户端终端(⽤户)和服务器端(⽹站)请求和应答的标准(TCP)。通过使⽤⽹页浏览器、⽹络爬⾍或者其它的⼯具,客户端发起⼀个HTTP请求到服务器上指定端⼝(默认端⼝为80)。我们称这个客户端为⽤户代理程序(user agent)。应答的服务器上存储着⼀些资源,⽐如HTML⽂件和图像。我们称这个应答服务器为源服务器(origin server)。在⽤户代理和源服务器中间可能存在多个“中
间层”,⽐如代理服务器、⽹关或者隧道(tunnel)。
尽管TCP/IP协议是互联⽹上最流⾏的应⽤,HTTP协议中,并没有规定必须使⽤它或它⽀持的层。事实上,HTTP可以在任何互联⽹协议上,或其他⽹络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使⽤。因此也就是其在TCP/IP协议族使⽤TCP作为其传输层。
通常,由HTTP客户端发起⼀个请求,创建⼀个到服务器指定端⼝(默认是80端⼝)的TCP连接。HTTP服务器则在那个端⼝监听客户端的请求。⼀旦收到请求,服务器会向客户端返回⼀个状态,⽐如"HTTP/1.1 200 OK",以及返回的内容,如请求的⽂件、错误消息、或者其它信息。
HTTP⼯作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页⾯,以及服务器如何把Web页⾯传送给客户端。HTTP协议采⽤了请求/响应模型。客户端向服务器发送⼀个请求报⽂,请求报⽂包含请求的⽅法、URL、协议版本、请求头部和请求数据。服务器以⼀个状态⾏作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
1. 客户端连接到Web服务器
⼀个HTTP客户端,通常是浏览器,与Web服务器的HTTP端⼝(默认为80)建⽴⼀个TCP套接字连接。例如,www.baidu。
2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送⼀个⽂本的请求报⽂,⼀个请求报⽂由请求⾏、请求头部、空⾏和请求数据4部分组成。
3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。⼀个响应由状态⾏、响应头部、空⾏和响应数据4部分组成。
4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持⼀段时间,在该时间内可以继续接收请求;
5. 客户端浏览器解析HTML内容
客户端浏览器⾸先解析状态⾏,查看表明请求是否成功的状态代码。然后解析每⼀个响应头,响应头告知以下为若⼲字节的HTML⽂档和⽂档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进⾏格式化,并在浏览器窗⼝中显⽰。
例如:在浏览器地址栏键⼊URL,按下回车之后会经历以下流程:
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
解析出 IP 地址后,根据该 IP 地址和默认端⼝ 80,和服务器建⽴TCP连接;
浏览器发出读取⽂件(URL 中域名后⾯部分对应的⽂件)的HTTP 请求,该请求报⽂作为 TCP 三次握⼿的第三个报⽂的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的 html ⽂本发送给浏览器;
释放 TCP连接;
浏览器将该 html ⽂本并显⽰内容; 
http协议是基于TCP/IP协议之上的应⽤层协议。
基于请求-响应的模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建⽴通信的,服务器端在没有接收到请求之前不会发送响应
⽆状态保存
HTTP是⼀种不保存状态,即⽆状态(stateless)协议。HTTP协议⾃⾝不对请求和响应之间的通信状态进⾏保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
使⽤HTTP协议,每当有新的请求发送时,就会有对应的新响应产⽣。协议本⾝并不保留之前⼀切的请求或响应报⽂的信息。这是为了更快地处理⼤量事务,确保协议的可伸缩性,⽽特意把HTTP协议设计成如此简单的。可是,随着Web的不断发展,因⽆状态⽽导致业务处理变得棘⼿的情况增多了。⽐如,⽤户登录到⼀家购物⽹站,即使他跳转到该站的其他页⾯后,也需要能继续保持登录状态。针对这个实例,⽹站为了能够掌握是谁送出的请求,需要保存⽤户的状态。HTTP/1.1虽然是⽆状态协议,但为了实现期望的保持状态功能, 于是引⼊了Cookie技术。有了Cookie再⽤HTTP协议通信,就可以管理状态了。有关Cookie的详细内容稍后讲解。
⽆连接
⽆连接的含义是限制每次连接只处理⼀个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采⽤这种⽅式可以节省传输时间,并且可以提⾼并发性能,不能和每个⽤户建⽴长久的连接,请求⼀次相应⼀次,服务端和客户端就中断了。但是⽆连接有两种⽅式,早期的http协议是⼀个请求⼀个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,⽽是等⼏秒钟,这
⼏秒钟是等什么呢,等着⽤户有后续的操作,如果⽤户在这⼏秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这⼏秒钟⽤户没有发送新的请求,那么就会断开连接,这样可以提⾼效率,减少短时间内建⽴连接的次数,因为建⽴连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,⾃⼰⽹站根据⾃⼰⽹站⽤户的⾏为来分析统计出⼀个最优的等待时间。
HTTP请求⽅法
HTTP/1.1协议中共定义了⼋种⽅法(也叫“动作”)来以不同⽅式操作指定的资源:
GET:向指定的资源发出“显⽰”请求。使⽤GET⽅法应该只⽤在读取数据,⽽不应当被⽤于产⽣“副作⽤”的操作中,例如在Web Application中。其中⼀个原因是GET可能会被⽹络蜘蛛等随意访问。
HEAD:与GET⽅法⼀样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本⽂部分。它的好处在于,使⽤这个⽅法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
POST:向指定资源提交数据,请求服务器进⾏处理(例如提交表单或者上传⽂件)。数据被包含在请求本⽂中。这个请求可能会创建新的资源或修改现有资源,或⼆者皆有。
PUT:向指定资源位置上传其最新内容。url编码和utf8区别
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要⽤于测试或诊断。
OPTIONS:这个⽅法可使服务器传回该资源所⽀持的所有HTTP请求⽅法。⽤'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道⽅式的代理服务器。通常⽤于SSL加密服务器的链接(经由⾮加密的HTTP代理服务器)。
注意事项:
⽅法名称是区分⼤⼩写的。当某个请求所针对的资源不⽀持对应的请求⽅法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不⽀持对应的请求⽅法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器⾄少应该实现GET和HEAD⽅法,其他⽅法都是可选的。当然,所有的⽅法⽀持的实现都应当匹配下述的⽅法各⾃的语义定义。此外,除了上述⽅法,特定的HTTP服务器还能够扩展⾃定义的⽅法。例如PATCH(由 RFC 5789 指定的⽅法)⽤于将局部修改应⽤到资源。
GET提交的数据会放在URL之后,也就是请求⾏⾥⾯,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456.(请求头⾥⾯那个content-type做的这种参数形式,后⾯讲) POST⽅法是把提交的数据放在HTTP包的请求体中.
GET提交的数据⼤⼩有限制(因为浏览器对URL的长度有限制),⽽POST⽅法提交的数据没有限制.
GET与POST请求在服务端获取请求数据⽅式不同,就是我们⾃⼰在服务端取请求数据的时候的⽅式不同了,这句废话昂。
HTTP状态码
所有HTTP响应的第⼀⾏都是状态⾏,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。状态代码的第⼀个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这⼀请求
4xx请求错误——请求含有词法错误或者⽆法被执⾏
5xx服务器错误——服务器在处理某个正确请求时发⽣错误
虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发者仍然能够⾃⾏决定采⽤何种短语,⽤以显⽰本地化的状态描述或者⾃定义信息。
URL
超⽂本传输协议(HTTP)的统⼀资源定位符将从因特⽹获取信息的五个基本元素包括在⼀个简单的地址中:
传送协议。
层级URL标记符号(为[//],固定不变)
访问资源需要的凭证信息(可省略)
服务器。(通常为域名,有时为IP地址)
端⼝号。(以数字⽅式表⽰,若为HTTP的默认值“:80”可省略)
路径。(以“/”字符区别路径中的每⼀个⽬录名称)
查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
⽚段。以“#”字符为起点
以www.luffycity:80/news/index.html?id=250&page=1 为例, 其中:
http,是协议;
www.luffycity,是服务器;
80,是服务器上的默认⽹络端⼝号,默认不显⽰;
/news/index.html,是路径(URI:直接定位到对应的资源);
id=250&page=1,是查询。
⼤多数⽹页浏览器不要求⽤户输⼊⽹页中“”的部分,因为绝⼤多数⽹页内容是超⽂本传输协议⽂件。同样,“80”是超⽂本传输协议⽂件的常⽤端⼝号,因此⼀般也不必写明。⼀般来说⽤户只要键⼊统⼀资源定位符的⼀部分(www.luffycity:80/news/index.html?id=250&page=1)就可以了。
由于超⽂本传输协议允许服务器将浏览器重定向到另⼀个⽹页地址,因此许多服务器允许⽤户省略⽹页地址中的部分,⽐如 www。从技术上来说这样省略后的⽹页地址实际上是⼀个不同的⽹页地址,浏览器本⾝⽆法决定这个新地址是否通,服务器必须完成重定向的任务。
HTTP请求格式(请求协议)
URL包含:/index/index2?a=1&b=2;路径和参数都在这⾥。
请求头⾥⾯的内容举个例⼦:这个length表⽰请求体⾥⾯的数据长度,其他的请求头⾥⾯的这些键值对,陆续我们会讲的,⼤概知道⼀下就可以了,其中有⼀个user-agent,算是需要你记住的吧,就是告诉你的服务端,我是⽤什么给你发送的请求。
以京东为例,看⼀下user-agent
看⼀个爬⾍的例⼦,爬京东的时候没问题,但是爬抽屉的时候必须带着user-agent,因为抽屉对user-agent做了判断,来判断你是不是⼀个正常的请求,算是反扒机制的⼀种。
打开我们保存的demo.html⽂件,然后通过浏览器打开看看就能看到页⾯效果。写上⾯这些内容的意思是让你知道有这么个请求头的存在,有些是有意义的,请求头我们还可以⾃⼰定义,就在requests 模块⾥⾯那个headers={},这个字典⾥⾯加就⾏。
HTTP响应格式(响应协议)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。