当前位置: 首页 > 后端技术 > Python

HTTP

时间:2023-03-25 21:17:58 Python

详解爬虫又叫网络爬虫,那么在讲解爬虫之前,我们需要了解什么是网络?网络是由若干个节点和连接这些节点的链路组成的,那么由网络组成的这个庞大的网络就叫做互联网,而我们今天要说的HTTP(超文本传输??协议)就是互联网上的一种应用。它是最广泛使用的网络协议之一,由万维网联盟(WorldWideWebConsortium)开发和发布。文章主要讲解一个HTTP请求的全过程(DNS解析暂且不谈):HTTP起源、TCP/IP协议、TCP连接建立、客户端请求、服务器响应、TCP连接断开。HTTP相关知识。文章较长,建议收藏或转发阅读!一、引言1.起源今天,我们能够在网络中自由畅游,得益于计算机科学家TimBerners-Lee的创意。1991年8月6日,TimBerners-Lee在欧洲粒子物理研究所(CERN)的NeXT计算机上正式推出了世界上第一个网站(http://info.cern.ch),确立了基本概念和技术互联网系统的出现,从而拉开了互联网信息时代的序幕。Berners-Lee的提议包含了网络的基本概念,并逐渐建立了所有必要的工具:提出了HTTP(HypertextTransferProtocol)超文本传输??协议,允许用户通过点击超链接访问资源;提出使用HTML超文本标记语言(HypertextMarkupLanguage)作为创建网页的标准;统一资源定位器URL(UniformResourceLocator)被创建为网站地址系统,即今天仍在使用的http://wwwURL格式;创建了第一个Web浏览器,称为FortheWorldWideWebbrowser,这也是一个Web编辑器;创建第一个Web服务器(http://info.cern.ch)和第一个描述项目本身的网页。2.特点HTTP协议有五个特点:支持客户端/服务器模式。简单快捷:客户端向服务器端请求服务时,只需要传递请求方式和路径即可。灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type标记(Content-Type是用于指示HTTP数据包中内容类型的标识符)。无连接:无连接的意思是限制每个连接只能处理一个请求。服务器处理完客户端的请求并收到客户端的响应后,断开连接。这样,可以节省传输时间。Stateless:无状态是指协议对事务处理没有记忆,服务器不知道客户端处于什么状态。即我们向服务器发送HTTP请求后,服务器会根据请求向我们发送数据,但是发送之后,不会记录任何信息(Cookie和Session的诞生,后面再说)。二、TCP/IP协议我们经常听到一句话,那就是:HTTP是一个基于TCP/IP传输数据的协议簇。如何理解上面的句子?我们来看看TCP/IP的四层模型来理解。从上图我们可以清楚的看出HTTP使用的传输层协议是TCP协议,而网络层使用的是IP协议(当然还有很多其他的协议),所以HTTP是建立在TCP/IP之上的协议簇传输数据。同样我们可以看到ping的是ICMP协议,这就是为什么有时候我们用vps可以上网,但是pinggoogle却不行,因为它使用的是不同的协议。TCP/IP协议簇大致是如何工作的?我们来看下图:可以看到数据在发送端被一层层封装,在数据接收端被一层层解包,最后应用层获取到数据。3.建立TCP连接了解了TCP/IP协议簇的大致工作原理后,我们来看看HTTP是如何建立连接的。1、TCP包头信息前面我们说过,HTTP是基于TCP/IP传输数据的协议簇,所以用HTTP建立连接也是建立TCP连接。TCP是如何建立连接的?我们来看看TCP数据包的信息结构。TCP数据包=TCP头信息+TCP数据体,TCP头信息包含6种控制位(上图红框内),这6个标志位代表TCP连接的状态:URG:urgentdata(紧急数据)---这是一条紧急消息ACK:ConfirmthatPSHhasbeenreceived:提示接收端应用程序应立即从tcp接收缓冲区中读取数据RST:表示要求对方重新建立连接SYN:表示请求是建立连接FIN:意思是通知对方本端将关闭连接。2.连接建立过程了解了TCP头信息后,我们就可以正式的看一下TCP连接建立的三次握手了。三向握手解释:客户端发送一个syn=1的位码,随机生成一个seqnumber=1234567的数据包给服务器,服务器从SYN=1知道客户端请求建立连接(client:Iwanttoconnectyou)andtheserverreceivestherequest最后确认连接信息,发送acknumber=(client'sseq+1),syn=1,ack=1给A,随机生成一个seq=7654321的数据包(server:OK,let'sconnect)然后client收到最后检查ack号是否正确,即第一次发送的seq号+1,位码ack是否为1,正确则client会发送acknumber=(server'sseq+1),ack=1,server收到后,确认seq值,ack=1,则连接建立成功。(客户:好的,我来了)面试官:为什么HTTP建立连接需要三次握手,而不是两次或四次?请求客户端连接到服务器后,客户端就可以开始向服务器请求资源,然后开始发送HTTP请求。1、HTTP请求报文结构我们之前说过,TCP数据包=TCP头信息+TCP数据体。我们已经讨论过TCP头信息。下面说一下TCP数据体,也就是我们的HTTP请求报文。2.HTTP请求示例我们来看一个实际的HTTP请求示例:①是请求方法,HTTP/1.1定义了8种请求方法:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE、最常见的两种GET和POST,如果是RESTful接口,一般会使用GET、POST、DELETE、PUTGET、POST、DELETE、PUT②是请求对应的URL地址,与消息头的Host属性③是协议名和版本号④是HTTP消息头,消息头包含几个属性,格式为“属性名:属性值”,服务端根据这个获取客户端的信息⑤为消息体,将页面形式的组件值通过param1=value1¶m2=value2的键值对形式编码成格式字符串,携带多个请求参数的数据。不仅消息体可以传递请求参数,请求URL也可以传递请求参数,类似“/chapter15/user.html?param1=value1¶m2=value2”。请求头中有很多参数,猪哥就不一一解释了,只介绍两个低级的防捡参数:User-Agent:所使用的操作系统和浏览器的名称和版本客户。有些网站会限制请求浏览器Referer:上一个网页的地址,表示请求来自哪里。有些网站会限制请求的来源。一致。1.HTTP响应报文结构2.HTTP响应示例3.响应状态码在响应报文中,我们重点关注以下内容:服务器的响应状态码,这个在面试中也很容易问到。下面猪哥只列出分类和详细的状态码自行上网查找。6.断开连接服务器响应后,一个会话就结束了。这个时候会不会断开连接?1.断开是长连接还是短连接,我们需要区分HTTP版本:在HTTP/1.0版本中,客户端和服务端完成一次请求/响应后,之前建立的TCP连接会断开,然后进行下一次request会再次建立TCP连接,也就是所谓的短连接。HTTP1.0发布仅半年后(1997年1月),HTTP/1.1版本发布,带来了一个新功能:客户端和服务器端完成一次请求/响应后,允许TCP连接不断开,意思是下一次请求会直接使用这个TCP连接而不用重新抖动建立新的连接,也叫长连接注意:长连接是指一个TCP连接允许多个HTTP会话,HTTP永远是一个请求/response,会话结束,HTTP本身没有长连接。HTTP1.1早在1999年就推广普及了,所以现在浏览器在请求的时候会在请求头中携带一个参数:Connection:keep-alive,意思是浏览器需要和服务器进行长连接,服务器可以同时设置是否愿意建立长连接。2、长连接的优缺点服务器端建立长连接有优缺点:优点:当网站中有大量静态资源(图片、css、js等)时,长连接可以打开,发送TCP连接后可以传几张图片。缺点:客户端请求一次,不请求,但是服务端开一个长连接资源,被占用,资源浪费严重。所以是否开启长连接和长连接时间需要根据网站本身合理设置。ps:不要小看这个TCP连接。在一个完整的客户端HTTP请求中(DNS寻址、建立TCP连接、请求、等待、解析网页、断开TCP连接),建立TCP连接的时间占比还是很高的。大的。3、断开过程是建立TCP连接时三次握手,四次挥手断开TCP连接!前面讲TCP/IP协议的时候,我们提到了标志位:FIN的意思是通知对方要关闭连接,那为什么要挥四次才能断开呢?这是给大家的课后作业。你可以在留言中给出你的理解,看看是否正确。7.题外话1.面试必答题:http三次握手,四次挥手面试官:为什么建立连接需要三次握手,而关闭连接需要四次挥手?给大家布置作业,留言说说你的看法吧!2、http2.0HTTP/1.1已经为我们服务了20年,而HTTP/2.0其实是在2015年发布的,只是现在还没有推广。也可以去网上查一下HTTP/2.0新特性的相关资料3.http&rpc因为http响应慢,请求头大的缺点,在微服务时代,大家都用rpc来调用服务。对rpc相关概念感兴趣的同学可以在线自行学习。4、http&httpshttp有两大缺点,就是明文和完整性无法保证,所以目前会逐渐被HTTPS取代,HTTPS知识猪哥会在下一期为大家讲解。