HTTP原理

HTTP原理

简介

HTTP (HyperText Transfer Protocol)中文叫超文本传送协议。是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是一个无状态的协议。无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接, 这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。
HTTP 遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有 HTTP连接都被构造成一套请求和应答。

传输流程

HTTP协议定义了客户端怎么向万维网(www)服务器发送请求以及服务器如何响应客户端的方式。从层次的角度上来讲,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服务器请求解析域名(www.tsinghua.edu.cn)对应的IP地址
(3)、DNS解析出IP地址后浏览器根据IP地址和默认的80端口与服务器建立TCP连接
(4)、浏览器发起取文件命令GET/chn/yxsz/index.htm,该请求作为TCP三次握手的第三个报文的数据发送给服务器
(5)、服务器作出响应将文件发送给浏览器
(6)、释放TCP连接
(7)、浏览器解析数据并显示

http报文结构

在这里插入图片描述

请求报文和响应报文

请求行

方法
  http/1.1中定义了很多方法来指定对所请求对象的操作,常见的方法有GET和POST两种方法。它们的区别如下:
  GET方法: 它的请求参数包含在URL里面,数据在URL中是可见的,而且GET方法请求提交的数据只能为1024个字节。
  POST方法: POST请求的参数数据不包含在参数里面,而是通过请求体body传输的,可以想象如果你在登陆时将参数放在URL里面是不安全的。此外POST请求对提交的数据大小不做限制。

Get与POST的区别

GET与POST是我们常用的两种HTTP Method,二者之间的区别主要包括如下五个方面:

  1. 功能上讲,GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;

  2. REST服务(一组架构约束条件和原则)角度上说,GET是幂等的,即读取同一个资源,总是得到相同的数据,而POST不是幂等的,因为每次请求对资源的改变并不是相同的;进一步地,GET不会改变服务器上的资源,而POST会对服务器资源进行改变;

  3. 请求参数形式上看,GET请求的数据会附在URL之后,即将请求数据放置在HTTP报文的 请求头 中,以?分割URL和传输数据,参数之间以&相连。特别地,如果数据是英文字母/数字,原样发送;否则,会将其编码为 application/x-www-form-urlencoded MIME 字符串(如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII);而POST请求会把提交的数据则放置在是HTTP请求报文的 请求体 中。

  4. 安全性而言,POST的安全性要比GET的安全性高,因为GET请求提交的数据将明文出现在URL上,而且POST请求参数则被包装到请求体中,相对更安全。

  5. 请求的大小看,GET请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。

URL
统一资源标识符,就是需要访问资源的URL。

版本
  使用的http协议的版本,例如http/1.1

响应行(状态行)

响应行中的版本也是http协议所使用的版本;
状态码就是当前响应的类型,如下:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误

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

在这里插入图片描述

首部行

请求行
  请求行用来说明服务器要使用的附加信息,下面列出了一些常用的请求行
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: 请求体里面的数据长度

响应行
  在响应行中表明了对客户端的应答信息
Date: 标识响应产生的时间
Last-Modified: 指定资源最后修改的时间
Content-Type: 文档类型,指定返回的数据类型是什么
Content-Encoding: 指定响应内容的编码
Content-Length: 指定了返回的实体的长度,以字节为单位。
Server: 包含了服务器的信息,比如名称,版本号等等
Set-Cookies: 设置cookies,告诉浏览器需要将此内容放在cookies中,下一次携带这个参数
Expire: 指定响应过期的时间

实体主体

请求体
  请求体中一般承载的是POST请求中的表单数据,对于GET请求,请求体一般为空,对于POST请求中的数据大小,就位于请求头中的content-length字段中。需要注意的是在使用POST请求时,需要指定你所提交的数据是什么类型,也就是Content-Type字段中的值,因此在使用POST请求需要首先了解请求库中的请求体参数是什么类型的,然后设置请求头的字段,不然可能无法正常响应。

响应体
  响应体是最重要的部分,因为响应的正文数据都在响应体中响应体中的数据也有不同的类型,因此我们写爬虫的时候就是解析的响应体里面的数据,通过解析HTML或者json数据来获取数据。响应体的数据也在content-type中指明了它的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值