http相关概念

  1. HTTP 协议是什么? 工作原理是什么?
    首先,HTTP 协议是什么?
    HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。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 请求/响应的一般步骤:

客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。

发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。

客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

HTTP协议的基本特性:

基于TCP/IP协议之上的应用层协议。
基于“请求-响应”的模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。
媒体独立的
只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
无状态协议
HTTP协议自身不对请求和响应之间的通信状态进行保存,不做持久化处理。使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。但是,随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次响应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。
2. HTTP 报文结构
2.1 HTTP 请求报文
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成

在这里插入图片描述
在火狐浏览器下检查元素,可以得到如下请求头数据:

# **请求头**
GET https://baidu.com/ HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: BAIDUID=BF36A476D664064C16520D998155BCFB:SL=0:NR=10:FG=1; BIDUPSID=BF36A476D664064C16520D998155BCFB; PSTM=1554014888; BDUSS=Fo5RVM0Vnd3UHlrOTczQlFQQkltb1VnR3Z0ZnR6T0JpRnVWclp1THFNakRPeUJkSVFBQUFBJCQAAAAAAAAAAAEAAAAEDXgrsrvI59f2s6zIywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOu-FzDrvhcT; BD_UPN=13314352; BD_HOME=1; H_PS_PSSID=1428_21119_31253_31186_30908_30823_31086_31164_31195; sug=3; sugstore=0; ORIGIN=2; bdime=0
Upgrade-Insecure-Requests: 1

2.1.1 常见头部字段详解
Host:主机和端口号
Connection:客户端与服务连接类型, 默认为keep-alive。
User-Agent: 客户浏览器的名称。
Accept:浏览器或其他客户端可以接受的MIME文件类型。
keep-alive:在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个 HTML文件和相关的图形文件),不需要每次都去请求建立连接。具体使用方式:1). Client 发起一个包含 Connection:keep-alive 的请求,HTTP/1.1使用 keep-alive 为默认值。 2). Server收到请求后: 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接; 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。3). 如果client收到包含 Connection:keep-alive 的响应,向同一个连接发送下一个请求,直到一方主动关闭连接
Referer:表明产生请求的网页来自于哪个URL。示例:有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据 referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载。
Accept-Encoding:指出浏览器可以接受的编码方式。 也是为了压缩文件并加速文件传递速度。浏览器在接收到 Web 响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
Accept-Language:语言种类。
Accept-Charset: 字符编码。
Cookie:浏览器用这个属性向服务器发送Cookie
Content-Type:POST请求里用来表示的内容类型。
2.1.2 Cookie 与 Session 的异同
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。

Cookie:通过在客户端记录的信息确定用户的身份。
Session:通过在服务器端记录的信息确定用户的身份。
2.1.3 请求方法详解,以及 GET 与 POST的区别
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。

HTTP1.0 定义了三种请求方法: GET、POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

GET 与 POST 主要区别在于:

GET 是从服务器上获取数据,POST 是向服务器传送数据。
GET 是不安全的,传输过程中会将请求参数放在请求的 URL 中;POST 请求参数在请求体当中,包含在 Content-Type 消息头里,指明该消息体的媒体类型和编码,操作是对用户不可见的。
GET 传送的数据量小,受 URL 长度的限制;POST 传输的数据量较大,被默认为不受限制(比如请求中包含许多参数或者文件上传操作等)。
GET在浏览器回退是无害的;POST 需要再次提交请求。
参数的数据类型,GET 只接受 ASII 编码;POST无限制。

在这里插入图片描述
在火狐浏览器下检查元素,可以得到如下响应头数据:

# **响应头**
HTTP/1.1 200 OK
Bdpagetype: 2
Bdqid: 0x8ffa65bb0003213b
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Wed, 15 Apr 2020 12:10:20 GMT
Expires: Wed, 15 Apr 2020 12:10:19 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=155; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1428_21119_31253_31186_30908_30823_31086_31164_31195; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1586952620022191156210374716545434853691
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
  1. HTTP 和 HTTPS
    HTTP (HyperTextTransferProtocol) 协议,80端口,超文本传输协议是一种发布和接收HTML页面的方法。
    HTTPS (HypertextTransferProtocoloverSecureSocketLayer),443端口,简单讲是HTTP的安全版,在HTTP下加入SSL 层。
    为深入理解HTTP和HTTPS,我们从以下几个问题出发进行求证。

HTTPS 协议的主要作用:

一是建立一个信息安全通道,来保证数据传输的安全;
二是确认网站的真实性。
HTTPS 和 HTTP 的区别主要如下:

https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
4. 在浏览器中输入www.baidu.com 后执行的全部过程
首先需要 DNS 服务器解析出 www.baidu.com 的 IP 地址
1). 这是需要知道默认网关的 mac,于是,使用 RAP 协议获得默认网关的 mac
2). 组织数据发送给网关,(IP 还是 DNS 服务器的,但是 mac 地址是默认网关的mac)
3). 默认网关拥有转发数据的能力,将数据转发给路由器
4). 路由器根据自己的路由协议,选择合适的较快的路径转发数据给目的网关
5). 目的网关(即,DNS服务器所在的网关) 把数据转发给 DNS 服务器
6). DNS 服务器解析出 www.baidu.com 域名对应的 IP地址,并将其原路返回给请求的 client

得到 www.baidu.com 对应的 IP 后,进行 TCP 三次握手建立连接
1). 第一次握手:建立连接时,客户端发送 SYN=J 包到服务器,并且客户端进入 SYN_SENT 状态,等待服务器确认(SYN,同步序列编号)
2). 第二次握手:服务器收到 SYN=J 包,会发送 SYN+ACK 包给客户端,其中,ACK 为确认包 (ACK=J+1),同时服务器会发送自己的 SYN=K 包,此时,服务器进入 SYN_RECV状态
3). 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK=K+1,此包发送完毕,客户端和服务器进入ESTABLISHED (TCP连接成功) 状态,完成三次握手

基于 HTTP 协议实现与 web 服务器的数据通信。
1). 浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件。
2). web 服务器接收到数据请求后,查询自己的服务器得到相应的响应,原路返回给浏览器,即服务器把 Response 文件对象发送回给浏览器。
3). 浏览器分析 Response 中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。浏览器会自动再次发送 Request 去获取图片,CSS文件,或者JS文件。
4). 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。

四次挥手,释放 TCP 连接
1). 客户端关闭到服务端的连接,所以客户端发送一个 FIN 包,并且客户端进入FIN_WAIT1 状态
2). 服务器收到FIN 包,会向客户端发送一个 ACK 包,确认序号为收到的序号加1。此时,服务端进入 CLOSE_WAIT 状态,收到 ACK 的客户端会进入 FIN_WAIT2 状态
3). 服务器关闭到客户端的连接,所以服务端发送一个 FIN 包 给客户端,并且 服务端进入 LAST_ACK 状态
4). 客户端收到该 FIN 包会进入 TIME_WAIT 状态,并向服务端发回 ACK 报文确认,收到 ACK 后服务端进入 CLOSED 状态,等待2MSL 时间后无任何响应,客户端进入 CLOSED 状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值