HTTP详解

  • URL 的基本概念

我们先来看看浏览网页的基本过程,如果在浏览器地址栏输网址:http://www.baidu.com会发生什么?
1. 浏览器通过 DNS 服务器 查找域名对应的 IP 地址。
2. 向IP地址对应的Web服务器发送请求。
3. Web服务器响应请求,发回 HTML文本页面。
4. 浏览器解析HTML内容,并显示出来。

我们向浏览器中输入的地址,实际上就是一个url(统一资源定位符),URL 就是地址。
URL 的一般格式是:protocol://hostname[:port]/path/[;parameters][?query]#fragment
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 互联网上的每个网页文本文件都有一个唯一的 URL,它包含的信息指出⽂件的位置以及浏 览器应该怎么处理它。
URL 的格式由三部分组成:
第一部分是协议(或称为服务方式,如 HTTP、FTP 协议等等)。
第二部分是存有该资源的主机 IP 地址(或者域名,有时也包括端口号)。
第三部分是主机资源的具体地址(目录和文件名等)。
其中:第一部分和第二部分用 “://” 分割 第二部分和第三部分用 “/” 分割
1 :// 2 / 3 —–> http://www.baidu.com/channel/teacher.shtml#ac

  • 关于DNS

DNS 是计算机域名系统 (Domain Name System 或 Domain Name Service) 的缩写,由解析器和域名服务器组成的。 域名服务器是指保存有该网络中所有主机的域名和对应 IP 地址,并具有将域名转换 为 IP 地址功能的服务器。其中域名必须对应1个 IP 地址,而IP 地址不一定会有域名。

  • 关于HTTP与HTTPS

HTTP 协议(HyperText Transfer Protocol,超文本传输协议)目的是为了提供一种发布和接收HTML页面的方法。
HTTP 是基于 TCP 协议之上的。在 TCP/IP 协议参考模型的各层对应的协议如下图,其中 HTTP 是应用层的协议。默认 HTTP 的端口号为 80,HTTPS的端口号为 443。

  • HTTP工作原理

Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:
1. 建立TCP连接在HTTP开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与 IP协议共同构建Internet,即著名的TCP/IP协议族,因此 Internet被称作是TCP/IP网络。HTTP协议是比TCP协议更高层次的应用层协议,根据规则, 只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般 TCP 连接的端口号是80。
2. Web浏览器向Web服务器发送请求命令一旦建立了 TCP 连接,Web浏览器就会向Web服务器发送请求命令

例如:GET/sample/hello.jsp  HTTP/1.1。
3. Web浏览器发送请求头信息浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一行空白行来通知服务器,告诉它已经结束了该头信息的发送。
4. Web服务器应答客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK 应答的第一部分是协议的版本号和应答状态码。
5. Web服务器发送应答头信息正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自身的数据及被请求的文档。
6. Web 服务器向浏览器发送数据 Web 服务器向浏览器发送头信息后,它会发送一行空白行来表示头信息的发送到此为结束,接着,它就以Content-Type 应答头信息所描述的格式发送用户所请求的实际数据。
7. Web服务器关闭TCP连接,一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接,然后如果浏览器或者服务器在其头信息加了这行代码 Connection:keep-alive 那么TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,同时还节约了网络带宽。

  • 浏览器与服务器的信息交互过程

1. 浏览器向DNS获取web服务器 www.seu.edu.cn 的 IP 地址:202.119.24.11。
2. 浏览器与IP地址为202.119.24.11的服务器进行TCP连接,端口号为 80。
3. 浏览器执行HTTP协议,发送GET/seu/welcome.htm命令,请求读取该文本文件。
4. www.seu.edu.cn服务器返回/seu/welcome.html文件到客户端。
5. 断开TCP连接。
6. 浏览器解释/seu/welcome.html文本文件内容,并显示其中的内容。

  • HTTPS

​​​​​​​HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是 HTTP 的安全版。即HTTP下加入SSL层,HTTPS 的安全基础是SSL。其所用的端口号是 443。
SSL:安全套接层,是 Netscape 公司设计的主要用于 Web 的安全传输协议。 在传输层对网络连接进行加密,保障在Internet上数据传输的安全。

  • 与HTTP的区别

​​​​​​​HTTPS和HTTP的区别主要为以下四点:
1. HTTPS协议需要到CA申请证书,一般免费证书很少,并且收费。
2. HTTP是超文本传输协议,信息是明文传输,而HTTPS则是具有安全性的 ssl 加密传输协议。
3. HTTP和HTTPS使用的是完全不同的连接方式,并且的端口号也不一样,前者是80,后者是443。
4. HTTP的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
当你在浏览器的地址栏上输入HTTPS开头的网址后,浏览器和服务器之间会在接下来进行大量的通信。这些复杂的步骤的第一步,就是浏览器与服务器之间协商一个在后续通信中使⽤的密钥算法。这个过程简单来说是这样的:
1. 浏览器把自身支持的一系列Cipher Suite(密钥算法套件,简称 Cipher)[C1,C2,C3, …]发给服务器。
2. 服务器接收到浏览器的所有Cipher 后,与自己支持持的套件作对比,如果找到双方都支持的 Cipher,则告知浏览器。
3. 浏览器与服务器使用匹配的 Cipher 进行后续通信。如果服务器没有找到26(了解)关于 HTTP 和HTTPS匹配的算法,浏览器将给出错误信息。

  • HTTP的请求与响应

​​​​​​​1. 当用户在浏览器的地址栏中输入一个URL并按回车后,浏览器会向HTTP 服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。GET是从服务器上获取数据,POST是向服务器传送数据

GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是 URL 的一部分。例如:http://www.baidu.com/s?wd=Chinese。
POST 请求参数在请求体当中,消息长度没有限制并且以隐式的方式进行发送,通常用来向 HTTP 服务器提交量比较大的数据(例如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头中,指明该消息体的媒体类型和编码。
注意:避免使用Get方式提交表单,因为有可能会导致安全问题。例如在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。
2. 当我们在浏览器输入URL为http://www.baidu.com的时候,浏览器会发送一个Request请求去获取http://www.baidu.com的html文件,服务器把Response文件对象发送回给浏览器。
3. 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,如Images,CSS,JS文件等。浏览器会自动再次发送 Request去获取图片,CSS,或者JS文件等。
4. 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。

  • 客户端HTTP请求

​​​​​​​URL 只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP 请求到服务器的请求消息,包括以下格式:
请求行 、请求头部 、空白行 、 请求数据四个部分组成,下图给出了请求报文的一般格式。

示例

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5
37.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image
/webp,*/*;q=0.8
Referer: http://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E
4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A
; BDUSS=nF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdO
d1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFaq3ldWqt5XN;
H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=123147
53; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NS
PbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0

常用的请求报头

1. Host
Host:对应地址URL中的 Web 名称和端口号,用于指定被请求资源的Internet主机和端口号,它通常从HTTP的URL中提取出来
2. Connection
Connection:表示客户端与服务连接类型
Client发起一个包含 Connection:keep-alive 的请求,HTTP/1.1 使用keep-alive为默认值。
Server收到请求后:如果 Server支持 keep-alive,回复一个包含 Connection:keep-alive的响应,不关闭连接;如果 Server 不支持 keep-alive,回复一个包含Connection:close的响应,关闭连接。
如果client收到包含Connection:keep-alive 的响应,向同一个连接发送下一个请求,直到一端主动关闭连接。keep-alive 在很多情况下能够重新连接,减少资源消耗,缩短响应时间,例如当浏览器需要多个文件时(如多个 HTML文件和相关的图形文件),不需要每次都去请求建立连接。
3. Upgrade-Insecure-Requests
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http资源时自动替换成 https请求,让浏览器不再显示 https中的 http 请求警报。

HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错,但是很多网站对 https 没有技术概念,在填写的数据中不免出现 http 的资源。
4. User-Agent
User-Agent:是客户浏览器的名称。
5. Accept
Accept:指浏览器或其他客户端可以接受的 MIME(多用途互联网邮件扩展)文件类型,服务器可以根据它判断并返回适当的文件格式。
举例:
Accept: */* :表示什么都可以接收。
Accept:image/gif :表明客户端希望接受 GIF 图像格式的资源。
Accept:text/html :表明客户端希望接受 html文本文件。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8 :表示浏览器支持的 MIME 类型分别是 html文本、xhtml 和 xml文档、所有的图像格式资源。q 是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定 q 值,则默认为 1,按从左到右排序顺序;若被 赋值为 0,则用于表示浏览器不接受此内容类型。Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的。Application:用于传输应用程序数据或者二进制数据。
6. Referer
Referer:表明产生请求的网页来自于哪个 URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪 Web 请求来自哪个页面,是从什么网站来的等。
7. Accept-Encoding
Accept-Encoding:指出浏览器可以接受的编码格式。编码格式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到 Web 响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多个 Encoding 同时匹配, 按照 q 值顺序排列,本例中按顺序支持 gzip,identity 压缩编码,支持 gzip 的浏览器会返回经过 gzip 编码的 HTML文件。如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
8. Accept-Language
Accept-Langeuage:指出浏览器可以接受的语言种类,如 en 或 en-us 指英语,zh 或者 zh-cn 指中文,当服务器能够提供一种以上的语言版本时要用到。
9. Accept-Charset
Accept-Charset:指出浏览器可以接受的字符编码。
10. Cookie
Cookie:浏览器用这个属性向服务器发送 Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
11. Content-Type
Content-Type:POST请求里用来表示的内容类型。

举例:Content-Type = Text/XML; charset=gb2312:

指明该请求的消息体中包含的是纯文本的 XML 类型的数据,字符编码采用“gb2312”。

  • 服务器HTTP响应

​​​​​​​HTTP 响应也由四个部分组成,分别是: 状态行 、 消息报头 、 空白行 、 响应正文

常用的响应报头

1. Cache-Control:must-revalidate, no-cache,
private。

这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要从新请求服务器,不能从缓存副本中获取资源。
Cache-Control 是响应头中很重要的信息,当客户端请求头中包含 Cache-Control:max-age=0 请求,明确表示不会缓存服务器资源时,Cache-Control 作为作为回应信息,通常会返回 no-cache,意思就是说,"那就不缓存呗"。
当客户端在请求头中没有包含 Cache-Control 时,服务端往往会定,不同的资源不同的缓存策略,例如说 oschina 在缓存图⽚资源的策略就是Cache-Control:max-age=86400,这个意思是,从当前时间开始,在86400 秒的时间内,客户端可以直接从缓存副本中读取资源,而不需要向服务器请求。
2. Connection:keep-alive
这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp 连接也是一个长连接,客户端可以继续使用这个 tcp 连接发送 http 请求。
3. Content-Encoding:gzip

告诉客户端,服务端发送的资源是采用gzip 编码的,客户端看到这个信息后,应该采用gzip 对资源进行解码。
4. Content-Type:text/html;charset=UTF-8
告诉客户端,资源文件的类型,还有字符编码,客户端通过 utf-8 对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。
5. Date:Sun, 21 Sep 2014 06:18:21 GMT

这个是服务端发送资源时的服务器时间,GMT 是格林尼治所在地的标准时间。http 协议中发送的时间都是 GMT 的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。
6. Expires:Sun, 1 Jan 2000 01:00:00 GMT
这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有 Cache-Control:max-age=*这个响应头准确的,因为 max-age=date 中的 date 是个相 对时间,不仅更好理解,也更准确。
7. Pragma:no-cache 这个
含义与 Cache-Control 等同。
8.Server:Tengine/1.4.6
这个是服务器和相对应的版本,只是告诉客户端服务器的信息。
9. Transfer-Encoding:chunked
这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是 0长度的,当客户端读到这个 0长度的块时,就可以确定资源已经传输完成了。
10. Vary: Accept-Encoding
告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,现在这个字段用处并不大,因为现在的浏览器都是支持压缩的。

  • 响应状态码

100~199 :表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200~299 :表示服务器成功接收请求并已完成整个处理过程。常用200(OK请求成功)。
300~399 :为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移⾄新的url)、307 和 304(使用缓存资源)。
400~499 :客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
500~599 :服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。​​​​​​​

  • Cookie与Session

​​​​​​​服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:通过在客户端记录的信息确定用户的身份。

Session:通过在服务器端记录的信息确定用户的身份。

​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值