爬虫又称网络爬虫 ,因此在讲解爬虫以前,咱们有必要了解一下什么是网络 ?网络是由若干节点和链接这些节点的链路构成,而后网络与网络之间所串连成的庞大网络叫作互联网 ,而咱们今天要讲的HTTP (HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为普遍的一种网络协议,它是由万维网协会(World Wide Web Consortium)制定发布。css
文章主要以一次HTTP请求的整个过程来说解(DNS解析不讲):HTTP起源、TCP/IP协议、创建TCP链接、客户端请求、服务端响应、断开TCP链接,文章最后还捎带讲了与HTTP相关知识。文章较长,建议收藏或转发后阅读! html
1、简介
1.起源
今天咱们可以在网络中畅游,都得益于一位计算机科学家蒂姆·伯纳斯·李 的构想。1991年8月6日,蒂姆·伯纳斯·李在位于欧洲粒子物理研究所(CERN)的NeXT计算机上,正式公开运行世界上第一个Web网站(info.cern.ch ),创建起基本的互联网基础概念和技术体系,由此开启了网络信息时代的序幕。 面试
伯纳斯·李的提案包含了网络的基本概念并逐步创建了全部必要的工具:
提出HTTP (Hypertext Transfer Protocol) 超文本传输协议,容许用户经过单击超连接访问资源;
提出使用HTML 超文本标记语言(Hypertext Markup Language)做为建立网页的标准;
建立了统一资源定位器URL (Uniform Resource Locator)做为网站地址系统,就是沿用至今的http://www URL格式;
建立第一个Web浏览器 ,称为万维网浏览器,这也是一个Web编辑器;
建立第一个Web服务器 (info.cern.ch )以及描述项目自己的第一个Web页面。
2.特色
HTTP 协议一共有五大特色:浏览器
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。
无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即咱们给服务器发送 HTTP 请求以后,服务器根据请求,会给咱们发送数据过来,可是,发送完,不会记录任何信息(Cookie和Session孕育而生,后期再讲)。
2、TCP/IP协议
咱们常常听到一句话就是:HTTP是一个基于TCP/IP协议簇来传递数据 。安全
如何理解上面那句话?咱们来看看TCP/IP四层模型 就明白了。 服务器
从上图咱们能够清晰的看到HTTP使用的传输层协议为
TCP协议 ,而网络层使用的是
IP协议 (固然还使用了不少其余协议),因此说
HTTP是一个基于TCP/IP协议簇来传递数据 。
一样咱们能够看到ping 走的ICMP协议,这也就是为何有时候咱们开vps能够上网,可是ping google却ping不通的缘由,由于走的是不一样的协议。网络
那TCP/IP协议簇大体是如何工做的,咱们再来看看下图: tcp
咱们能够看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层得到数据。
3、创建TCP链接
咱们知道了TCP/IP协议簇大体的工做原理以后,咱们来看看HTTP是如何创建链接的。编辑器
1.TCP包头信息
前面我们讲过HTTP是一个基于TCP/IP协议簇来传递数据 ,因此这HTTP创建链接也就是创建TCP链接,TCP如何创建链接,一块儿来看看TCP包信息结构吧。 ide
TCP报文包=TCP头信息+TCP数据体 ,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就表明着TCP链接的状态:
URG:紧急数据(urgent data)---这是一条紧急信息
ACK:确认已收到
PSH:提示接收端应用程序应该当即从tcp接受缓冲区中读走数据
RST:表示要求对方从新创建链接
SYN:表示请求创建一个链接
FIN:表示通知对方本端要关闭链接了
2.创建链接过程
了解了TCP包头信息以后,咱们就能够正式看看TCP创建链接的三次握手了。
三次握手讲解:
客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求创建联机(客户端:我要链接你)
服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)
客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则链接创建成功。(客户端:好的,我来了)
面试官:为何http创建链接须要三次握手,不是两次或四次 答:三次是最少的安全次数,两次不安全,四次浪费资源
4、客户端请求
客户端与服务器链接上了以后,客户端就能够开始向服务器请求资源,就能够开始发送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、PUT
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
③是协议名称及版本号
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
⑤是报文体,它将一个页面表单中的组件值经过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体能够传递请求参数,请求URL也能够经过相似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
请求头参数很是多,猪哥就不一一说明,只说明两个低级的反扒参数:
User-Agent:客户端使用的操做系统和浏览器的名称和版本,有些网站会限制请求浏览器
Referer:先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源
5、服务端响应
服务器在收到客户端请求处理完须要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。
1.HTTP响应报文结构
2.HTTP响应实例
3.响应状态码
响应报文中咱们重点关注下:服务器的响应状态码,面试也很容易问到,下面猪哥只列出分类,详细状态码自行上网查找了解。
6、断开链接
在服务器响应完毕后,一次会话就结束了,请问这时候链接会断开吗?
1.长短链接
是否断开咱们须要区分HTTP版本:
在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应以后,会将以前创建的TCP链接断开 ,下次请求的时候又要从新创建TCP链接,这也被称为短链接
在HTTP1.0发布仅半年后(1997年1月) ,HTTP/1.1版本发布并带来一个新的功能:在客户端与服务器完成一次请求/响应以后,容许不断开TCP链接,这意味着下次请求就直接使用这个TCP链接而再也不须要从新握手创建新链接,这也被称为长链接
注意:长链接是指一次TCP链接容许屡次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP自己不存在长链接之说。
早在1999年HTTP1.1就推广普及,因此如今浏览器在请求时请求头中都会携带一个参数: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.0
HTTP/1.1已经为咱们服务了20年,而HTTP/2.0其实在2015就发布了,可是尚未推广开来,关于HTTP/2.0新特性你们也能够去网上查阅相关资料
3.http&rpc
由于http响应慢 、请求头体积大 等缺点,因此在微服务时代,你们都使用rpc来调用服务,rpc相关概念感兴趣同窗自行网上学习。
4.http&https
http还有两个很大的缺点就是明文 且不能保证完整性 ,因此目前会渐渐被HTTPS代替,HTTPS知识猪哥下期将会为你们讲解。