一、HTTP简介
浏览器从 web 服务器(或者叫应用服务器)上使用 HTTP 协议下载网站,HTTP 协议是基于一种 请求-响应(request-response)模型的。客户端(你的浏览器)从运行在物理机器上的 web 应用请求数据,web 应用反过来对你的浏览器请求进行响应。
重要的一点是,要记住通信总是由客户端(你的浏览器)发起的,服务器(也就是 web 服务器)没有办法创建一个链接,发送没有经过请求的数据给你的浏览器。如果你从 web 服务器上接收到数据,一定是因为你的浏览器显示地发送了请求。
HTTP特点
1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Conten-Type加以标记。
3、无连接:无连接的含义是限制每次连接只处理一个请求、服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4、无状态:HTTP协议是无状态协议。无状态是指对于事务处理没有记忆能力。
缺少状态意味着若后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时,它的应答就较快。
HTTP请求过程
HTTP协议定义了客户端怎样向万维网服务器发送请求以及服务器如何响应客户端的方式。从层次的角度上来讲,HTTP是面向事务的(transaction-oriented)应用层协议,它是万维网可靠交换文件的基础。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。我们来看看HTTP是怎样发送请求并接收文件的:
1、客户端请求连接到服务器: 每个万维网都有一个服务器进程,这个进程一直监听TCP的80端口,来发现是否有客户端向他发起请求。当发现有向他发起建立连接的请求,就建立起一个套接字TCP连接。
2、发送HTTP请求: 当建立起TCP连接后,客户端就通过套接字向服务器发送一个请求报文,这个报文包含了请求行、请求头、空行和请求数据4部分。
3、服务器接收请求并返回响应: 服务器首先解析客户端发送的报文然后定位到需要的资源,通过套接字将响应报文发送给客户端。同理一个响应也由状态行、响应头部、空行和响应数据4部分组成。
4、释放TCP连接: 如果请求头中connection字段为close则服务器立即关闭TCP连接,如果为keep-alive,则连接会持续一段时间后关闭。
5、客户端解析资源: 客户端会首先解析状态行,如果状态行成功,则解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
我们接下来看一个访问清华大学院系设置的例子来看看整个过程:URL为 http://www.tsinghua.edu.cn/chn/yxsz/index.htm
(1)、浏览器分析链接指向页面的URL
(2)、浏览器向DNS服务器请求解析域名对应的IP地址
(3)、DNS解析出IP地址后浏览器根据IP地址和默认的80端口与服务器建立TCP连接
(4)、浏览器发起取文件命令GET/chn/yxsz/index.htm,该请求作为TCP三次握手的第三个报文的数据发送给服务器
(5)、服务器作出响应并将文件发送给浏览器
(6)、释放TCP连接
(7)、浏览器解析数据并显示
&esmp; 因此我们可以看到http协议是基于TCP/IP协议之上的,我们通过一个图示来展示这个过程;

HTTP协议的特点
4.1 无状态(stateless)
http的无状态是指,同一个客户端第二次访问该服务器上的相同资源时,返回的内容与上一次相同(假设服务器没有更新该页面)。也就是说HTTP协议自身不对请求和响应之间的通信状态进行保存。这样设计的原因在于能够大量地处理事物确保协议的可伸缩性。但是随着web技术的发展,这样特点的协议不能很好地满足业务的发展,例如我们登陆到某个网站时,当我们浏览该网站其他页面时我们也需要保持登陆状态,以便能够进行与服务器的交互。因此在http/1.1中虽然使用了无状态的特点,但是引入了cookies–session机制来支撑这种状态保持的需求。
HTTP请求/响应的步骤
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
2、应用:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容。
http报文结构
http有两类报文:请求报文和响应报文,如下图所示:


5.1 开始行
开始行用于区分是请求报文还是响应报文,在请求报文中,开始行叫做请求行,在响应报文中,开始行为响应行,开始的三个字段用空格隔开。
5.1.1 请求行
5.1.1.1 方法
http/1.1中定义了很多方法来指定对所请求对象的操作,常见的方法有GET和POST两种方法。它们的区别如下:
GET方法: 它的请求参数包含在URL里面,数据在URL中是可见的,而且GET方法请求提交的数据只能为1024个字节。
POST方法: POST请求的参数数据不包含在参数里面,而是通过请求体body传输的,可以想象如果你在登陆时将参数放在URL里面是不安全的。此外POST请求对提交的数据大小不做限制。
5.1.1.2 URL
这个没什么可说的,就是你需要访问资源的URL。
5.1.1.3 版本
就是使用的http协议的版本,例如http/1.1
5.1.2 响应行
响应行中的版本也是http协议所使用的版本;状态码就是当前响应的类型,如下:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
5.2 首部行
5.2.1 请求行
请求行用来说明服务器要使用的附加信息,下面列出了一些常用的请求行
Accept: 请求报头域,说明了客户端希望接收哪些类型的信息,例如 text/xml表示客户端希望接受的数据类型是xml类型,application/json代表客户端希望接收的数据类型是json类型。看一个例子:Accept:application/xml;q=0.5,application/json;q=0.9,text/html
将按照如下顺序进行produces的匹配 ①text/html ②application/json ③application/xml
参数为媒体类型的质量因子,越大则优先权越高(从0到1)
Accept-Language: 客户端希望接收的语言类型
Accept-Encoding: 客户端可接受的内容编码
Host: 用于指定请求资源的主机IP和端口
Cookie: 网站为了辨别用户会话进行会话跟踪而存储在本地的数据,它的主要功能是维持当前会话。我会在后面详细解释
Referer: 表示这个请求是从哪个页面发送过来的,服务器可以用这个信息来统计源和做防盗链。
User-Agent: 它可以是服务器知道客户端使用的操作系统及版本等等各种信息
Content-Type: MIME类型,在http协议中,表示发送端发送的实体数据的数据类型,具体类型可参考: https://tool.oschina.net/commons
Content-Length: 请求体里面的数据长度
5.2.1 响应行
在响应行中表明了对客户端的应答信息
Date: 标识响应产生的时间
Last-Modified: 指定资源最后修改的时间
Content-Type: 文档类型,指定返回的数据类型是什么
Content-Encoding: 指定响应内容的编码
Content-Length: 指定了返回的实体的长度,以字节为单位。
Server: 包含了服务器的信息,比如名称,版本号等等
Set-Cookies: 设置cookies,告诉浏览器需要将此内容放在cookies中,下一次携带这个参数
Expire: 指定响应过期的时间
5.3 实体主体
5.3.1 请求体
请求体中一般承载的是POST请求中的表单数据,对于GET请求,请求体一般为空,对于POST请求中的数据大小,就位于请求头中的content-length字段中。需要注意的是在使用POST请求时,需要指定你所提交的数据是什么类型,也就是Content-Type字段中的值,因此在使用POST请求需要首先了解请求库中的请求体参数是什么类型的,然后设置请求头的字段,不然可能无法正常响应。
5.3.2 响应体
响应体是最重要的部分了,因为响应的正文数据都在响应体中,响应体中的数据也有不同的类型,因此我们写爬虫的时候就是解析的响应体里面的数据,通过解析HTML或者json数据来获取数据。响应体的数据也在content-type中指明了它的类型。
6、cookies & session

1137

被折叠的 条评论
为什么被折叠?



