时间:2019-03-20
作者:Dobby_Kim
内容前瞻:
1:什么是互联网?什么是万维网?
2:URI,URL,URN是什么?有什么区别?
3:一个完整的 URL 是由哪几个部分组成的?
4:什么是域名?什么是 DNS?DNS域名解析过程,nslookup及 ping命令的使用
5:什么是 HTML?
6:什么是HTTP协议?
7:服务器与客户端,请求和响应。Chrome开发者工具及 curl命令的使用
8:常见 HTTP请求方式介绍,GET和 POST ?
9:常见 HTTP状态码介绍
10:什么是HTTPS协议?HTTP 和 HTTPS协议有什么区别?
1:什么是万维网?
上图由三个醒目的"W"组成,WWW即万维网。
万维网(World Wide Web) 亦被成为"Web" 或 "WWW"。
提到了万维网 就不得不提到互联网(Internet) 以及 二者的关系。
真正意义上的互联网创始于1983年,有些人则认为是1969年。我个人比较倾向于1983年这个说法。
1969年美国国防部创建了第一个分组交换网 APPANET,而1983年TCP/IP协议成为了APPANET上的标准协议,使得所有使用TCP/IP协议的计算机都能利用互连网(注意是互连网,网络由节点和链路组成,而网络之间通过路由就可以形成更大的网络,这个更大的网络就叫做互连网)进行相互通信,于是人们将1983年作为互连网的诞生时间。
internet(小写i开头)被称作为互连网,它泛指由多个计算机网络互连而成的计算机网络。
而Internet(大写I开头)则被成为互联网或因特网则是指全球最大的,开放的,由众多网络相互连接而成的互联网,它采用TCP/IP协议族作为通信的规则。
简单的来说,可以将互联网理解为由多个计算机,软件,路由,电缆等组成的网络与网络之间通过TCP/IP协议族实现数据电子传输的全球化的,开放的网络集合体。
说到这里,就不得不说下,在万维网诞生之前,互联网能做些什么了。
互联网在当时主要的功能有:邮件,以及ftp文件下载。包括现在的即时通讯软件如QQ都是基于互联网的概念发展出的产物。本文不会拓展这些知识点(实际上我不会,日后学习了再补充)
那么什么是万维网呢?
万维网成立的时间为1994年,(此文创建日期为2019年,万维网才仅仅25岁)通常我们所说的网上冲浪的那个"互联网",实际上是万维网。正因为有了万维网,才会有现在五彩缤纷的网络世界。
万维网的创始人为伯纳斯·李,他创造了万维网,写了世界上第一个浏览器,同时也写了世界上第一个网页。附上维基百科链接:伯纳斯.李
万维网是一个由许多互相连接的"超文本"组成的系统,通过互联网进行访问,在这个系统中,每一个有用的事物都称为一样"资源",并且由一个全局的"统一资源标识符"所标识着,这些资源通过"超文本传输协议"传送给用户,而用户则通过点击链接来获取这些资源。
这张图中 http 所表示的就是上文提到过的"超文本传输协议"即 (Hypertext Transfer Protocol)它是万维网的基本协议,而TCP/IP则是传输层的协议,它的1983年被立为互联网的标准协议,主要解决的问题是数据如何在网络中传输, HTTP是应用层的协议,主要解决如何包装数据 。TCP/IP协议和HTTP协议的关系是传输层与应用层的关系,传输数据使用TCP/IP协议,但如果没有应用层,用户便无法识别数据的内容,所以要想使数据的传输变得有意义就要使用到应用层的协议。在还没有万维网之前人们使用互联网发送邮件,应用层的协议为SMTP,使用互联网下载传输文件 使用的协议为 FTP,直到出现了万维网,出现了缤纷多彩的网页世界。万维网的基本协议为http协议,这是一个同SMTP,FTP一样在应用层的协议
也就是说 :
万维网是基于互联网之上发展出的产物 ,万维网只是互联网所能提供的服务之一,是一项靠互联网运行的服务。
2:URI,URL,URN是什么?有什么区别?
回顾上文对万维网的定义:
万维网是一个由许多互相连接的 "超文本" 组成的系统,通过互联网进行访问,在这个系统中,每一个有用的事物都称为一样"资源",并且由一个全局的"统一资源标识符"所标识着,这些资源通过"超文本传输协议"传送给用户,而用户则通过点击链接来获取这些资源。
上文简单介绍了万维网和互联网的联系。本小节将简单介绍URI,URL,URN的概念与区别。
在浏览器中,我们通过输入网址访问到某某网站的页面。那么,有没有想过我们是如何获取到这样一个页面的呢?这个过程其实很复杂,但是可以知道,我们"获取"页面的这样一个过程 本质是通过使用浏览器下载了这个页面。那么是从哪里下载的呢?答案是服务器,而下载的这个页面 即是 服务器上的"资源"。这个小节不会介绍获取资源的过程,重点在于访问资源的方法:——URI,URL,URN
我在学习URI,URL和URN时,因为实在搞不清他们之间的区别,也上网查阅了很多资料,发现大多数能解释清楚这三个名词的概念的人很少。
首先要知道的是:
URI:Uniform Resource Identifier 统一资源标识符
URL:Uniform Resoure Locator 统一资源定位符 俗称网址
URN:Uniform Resource Name 统一资源名称
这里在解释这几个抽象的名词之前我先举一个例子。
这是一张从百度上找的名片,名片里面是xxx公司 名字假设是小红 职位是总经理,名片由电话,传真,手机,以及地址信息组成。
我们将重点放在 小红这个人的定义 以及 地址的信息上。
小红这个人的定义是什么呢?或是说小红是谁?
四川省爱购网xxx公司的总经理小红
小红所在的地址是什么呢?
四川省清溪路xxx
当明确了这几个内容以后,就可以将URI,URL,URN同名片做一个形象的比喻
实际上 这张名片 就等同与URI
小红的地址 等同于URL
小红是谁 则等同于URN
URI
URI即统一资源标识符 英文为:Uniform Resource Identifier
URI可以进一步分为 URL,URN
参考以下权威的RFC举出的例子:
1:ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
2:http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
3:ISBN: 9787115275790(3 并非是RFC的例子)
以上三个例子都属于URI,前两个例子不仅仅是URI同时也是一个URL,为什么呢?因为它不仅仅是一个标识符 而且是一个访问资源的地址且 遵从某种协议。当然第三个例子是一个URN也说明了 并不是所有的URI就都是一个 URL。总之,URI是一个标识符它可能就是一个URL 或 是一个URN-
URL和URN
URL即统一资源定位符 英文为:Uniform Resoure Locator
URL俗称网址,通过URL你可以去访问一个资源且可以确定一个唯一的地址
URN则是统一资源名称 英文为:Uniform Resource Name
通过URN你可以确定一个唯一的资源,但是仅仅是确定而已,如果需要某种途径去访问它 还是需要URL
例如:ISBN: 9787115275790 它对应的资源是《JavaScript 高级程序设计(第三版)》
综上所述:
URL 和 URN 是URI的子集
任何东西,只要能够唯一地标识出来,都可以说这个标识是 URI 。如果这个标识是一个可获取到上述对象的路径,那么同时它也可以是一个 URL ;但如果这个标识不提供获取到对象的路径,而是仅仅作为这个对象的名字那么它就是一个URN
URI,URL,URN的关系可以表示为:
图片截取于 转!!URL和URI区别
3:一个完整的 URL 是由哪几个部分组成的?
以URL https://www.baidu.com/s?wd=hello&rsv_spt=1#5
为例
- protocol:
protocal即协议,https是一种协议也是URL的开头部分
协议包括FTP,HTTP,file等等 - hostname:
hostname 即主机名 指存放资源的服务器的域名系统(DNS)主机名或是IP地址
如www.baidu.com
关于域名和DNS在后面会有详细的介绍 - port
port即端口,省略时使用协议的默认端口 需要知道的几个端口号为:
ftp协议默认端口:21
http协议默认端口:80
https协议默认端口:443
代理服务器默认端口:1080 (翻墙)
MySQL 默认端口:3306 - path
path即路径 由零或多个"/" 符号分隔开的字符串 一般用来表示主机的一个目录或文件地址 本例中 path为" /s " - query & parameters
如本例中 查询的单词为hello
query以?开头 传递 参数信息;参数可以为多个 并以 & 分隔开每个参数名和值以
key=value的传递并呈现在url上 - anchor
anchor即锚点 指定了跳转到网页的哪个位置
如本例中:https://www.baidu.com/s?wd=hello&rsv_spt=1#5
就规定了跳转到网页锚点为5的位置
锚点在URL的最后 以#开头
4:什么是域名?什么是 DNS?DNS域名解析过程,nslookup及 ping命令的使用
在清楚一个完整的URL应该包含什么内容之后,先抛去协议不谈,我们简单地谈一下域名。
一个完整的URL应该包含主机名即hostname
上文对hostname的定义:
hostname 即主机名 指存放资源的服务器的域名系统(DNS)主机名或是IP地址
这句话听起来并不是那么好理解,但实际上很简单
一个完整的URL写在协议之后的 是一个域名 或者是一个 IP地址
像www.baidu.com
就是一个域名,而113.116.xx.xx
就是一个IP地址
首先,跑题性地先说一下IP
IP 英文为 Internet Protocol 意思为网络之间互连的协议
也就是为计算机网络相互连接进行通信而设定的协议
IP 地址 Internet Protocol Address则是用来在网络中标记一台电脑的一串32位二进制数字了
先解释一下什么是 内网IP和外网IP
内网IP
简单来说,内网IP就是局域网内使用的IP
例如:网吧
网吧中的网线都是连接在同一个交换机上的,也就是说它们的IP地址是由交换机或者是路由器进行分配的,并且每一个IP各不相同,每一台电脑都可以通过internet(注意是小写的internet,即互连网) 访问到局域网内的另一台电脑。
怎样查询自己的内网IP呢 ?
很简单:在cmd中 输入ipconfig
即可查询外网IP
外网IP的概念则是建立在Internet(大写的Internet 即 互联网)之上的。
外网IP是由ISP(Internet Service Provider)分配的 如电信,联通,移动等等
在下文所说的IP地址也都是外网IP地址 那么如何查询自己电脑的IP呢?
很简单:点击查询IP地址
通过简单的百度查询就可以知道自己的IP地址以及ISP是哪一家-
内网IP和外网IP的区别
简单来说:
外网IP标示了你在互联网上的地址
内网IP则标示了你在局域网里面的地址
还是以网吧举例:
当你在网吧上网时,首先要向网关发出请求,然后再由网关(一般是路由器)
由外网IP转到互联网上,接收数据之后再发送到内网IP上
图片截取于百度
既然谈完了IP,我们就了解了想去访问服务器上的资源除了遵循协议,还有就是实际上是要通过服务器的IP地址来进行访问的。
那么 这么长的IP地址 怎么能记得住呢?
所以,域名就出现了。
域名是什么?
域名即:Domain Name
刚刚已经说了www.baidu.com
就是一个域名 它和IP地址的作用是等价的。
想一想记住 baidu 要 比记住一大串IP地址方便得多。问题是,谁去将百度的IP翻译成百度这个域名呢。
所以,DNS就出现了。
DNS的全称为:Domain Name System
即:域名解析系统。负责域名解析的计算机被称为域名解析服务器。
也就是说DNS是一个将域名翻译成IP的系统。
早在APPANET时代,整个网络上只有数百台计算机,那个时候使用一个叫做hosts的文件,hosts文件列出了所有的主机的名字以及相应的IP地址。只要输入一台主机的名字 计算机很快就可以将这台主机的名字转换为机器能够识别的IP地址。当然,直到现在,这种客户端的静态解析方法仍然在使用,hosts文件在windows系统中存放在C:\Windows\System32\drivers\etc这个文件夹中,只需要在hosts文件中添加 IP 域名
这种格式的内容 就可以使计算机优先在本地上完成域名的一个静态解析。但是现在的域名解析远远不止这么简单。
要了解域名解析的过程,首先要知道以下几个知识。
- 互联网的域名结构
每一个域名都由标号序列组成,各标号之间使用"." 隔开
在说清楚域名的结构之前必须要提一个重要的概念 :根域
www.baidu.com实际上完整的域名是www.baidu.com.(请看清出com后面多出了一个点) 不仅仅是百度 所有的域名后面实际上都跟着一个 " . ",一般,我们在浏览器输入时会省略这个 " . " 而忽略这个 " . "也变成了习惯,所以,如果你现在输入www.baidu.com. 这个域名的话,肯定是访问错误的。
而 被忽略的 " . " 却是最重要的根域 因为,它象征着一切的开始
从根域其后面依次是顶级域名,二级域名,三级域名...
如:www.baidu.com
其中 com 是顶级域名
baidu 是二级域名
www 是三级域名
-
域名服务器
上文提到域名服务器是用来进行域名解析,提供DNS服务的服务器。
但是域名服务器又可以划分为不同层级的服务器。
这些服务器的具体工作在后文有介绍,所以先把这些服务器的名字记住。
它们是:根域名服务器,顶级域名服务器,权限域名服务器,本地域名服务器。
1:根域名服务器:全世界根域名服务器只有13个不同的IP地址的域名,它们分别是
a.root-servers.net ,b.root-servers.net .... m.root-servers.net
当然只有13个域名不代表全世界只有13台根域名服务器。 全球设置了很多这些服务器的镜像站点,其实想一想 如果只有13台根域名服务器,那么互联网的世界应该会一团乱糟。
2:顶级域名服务器
顶级域名服务器负责管理该顶级域名服务器下注册的所有二级域名
3:权限域名服务器
权限域名服务器可以理解为域名所有者服务器下设置了相应权限的域名服务器。
4:本地域名服务器
如果现有一台计算机,通过ISP如电信连接到了互联网,那么ISP就会给这台计算机分配给一个DNS服务器,这个服务器并非权威的DNS服务器。其实查询本地域名服务器操作很简单 只需要打开cmd 输入ipconfig/all
命令就可以获取
如我的本地DNS为:
本地DNS服务器,可以自己去设置 比如你可以设置为8.8.8.8 (Google 免费的DNS服务器) 一般都为自动获取。 递归查询与迭代查询
本机向本地域名服务器查询方式为递归查询
本地域名服务器向根域名服务器等权威服务器查询的方式为迭代查询
这两点需要知道。
本文不会介绍递归查询和迭代查询(实际上我不太会,日后补充,多多见谅...)
简单了解这几个概念后,我们就来看一下
一个完整的DNS查询过程是怎样的
以查询www.baidu.com为例
- 客户端本地hosts文件查询
在上文提到过hosts文件,它是最早的域名解析模型,也沿用至今。当在浏览器输入栏上输入一个域名时,浏览器当然不知道这是什么东西,它会第一时间在本地的hosts文件中寻找是否有对应的IP地址。 - 当在hosts文件中查询失败后,计算机就要向本地DNS服务器发起查询请求了
这个请求方式为递归查询,本地DNS服务器首先会检查自己的缓存,如果缓存中有www.baidu.com对应的IP地址则直接返回给客户端,这种应答方式 是 非权威性的应答方式 - 如果本地DNS服务器的缓存中没有查询域名对应的缓存的IP地址则会从 本地DNS服务器的配置文件中 读取 13个根域名服务器的地址 然后开始向权威服务器进行迭代查询。
- 向13个根域名所对应的服务器中的一台发起请求
- 根域名服务器拿到请求后,判断www.baidu.com是com.这个顶级域名下的 于是告诉本地域名服务器 你去 com. 域的服务器找吧 并给了本地DNS服务器一个IP地址
- 本地域名服务器通过IP地址找到了com域的服务器并向com域的服务器发起请求,com域的服务器发现 你这个请求时baidu.com这个域的 ,并给了本地DNS服务器一个IP地址。
- 本地DNS服务器拿着IP地址找到了baidu.com域的服务器并向baidu.com这个域的服务器发起了请求,baidu.com收到后 查了一下 发现 有www.baidu.com对应的IP于是告诉本地DNS服务器
- 本地DNS服务器拿到了www.baidu.com的IP地址后将其返回给了客户端,并将这个信息保存在高速缓存中(本文不涉及高速缓存的知识点)
这就是一次较为完整的DNS查询过程。
接下来我们对上述过程进行一个验证。
验证的方法是使用Linux中的一个命令,即:
dig
dig 命令有多种用法 在本文使用的命令为dig xxx.com +trace
此命令的含义为:从根服务器开始追踪一个域名,并在本地做迭代且记录查询过程
windows上不支持此命令.
在Linux终端上输入:
-
向本地DNS服务器获取根服务器的13个IP及所对应的主机名称。
第二步是向其中的一台根域服务器(1.png括号对应的IP)发送www.baidu.com的查询请求,这台根域名服务器返回了com.顶级域的服务器IP(未显示)和名称将信息传递给。
-
向com.域的一台服务器请求,www.baidu.com,他返回了baidu.com.域的服务器IP和名称.(未显示)
-
向baidu.com.域的服务器请求www.baidu.com
可以看到查询的服务器是b.gtld-servers.net 它返回了一个baidu.com.域的服务器的IP地址和名称(未显示)
-
可以看到本地DNS服务器到了www.baidu.com.域后,发现 你找的这个域名 有个别名是
www.a.shifen.com 于是就去请求a.shifen.com.域里的服务器。最终接收到了ns2.baidu.com.域的服务器返回给本地DNS的IP地址
其实上述过程十分复杂,我本人也只是照葫芦画瓢,需要进行查缺补漏以后有时间还会进行详细的总结以及修正。- . -
刚刚使用了Linux下的dig +trace命令,这个命令是从根域名服务器开始追踪一个域名并在本地上记录迭代查询过程的一个命令
接下来还会介绍两个命令:nslookup 及 ping命令 (windows及Linux都支持此命令)
- nslookup
nslookup 命令的作用检测网络中DNS服务器能否正确实现域名解析的工具
这里只介绍简单的用法 即:nslookup DomainName
如使用nslookup www.baidu.com
第一个服务器代表的就是 本地域名服务器 可以看到本地域名服务器的IP地址为10.198.1.1这同上文中我们使用ipconfig/all 获取的本地DNS的地址是一致的
在下一行中可以看到 返回的是一个非权威应答 即说明本地DNS服务器有缓存www.baidu.com这个域名所对应的IP地址并且返回了两个IP,这两个IP都是可以直接访问到百度的服务器地址
接下来是ping命令 - ping
ping命令一般用于检测网络是否通畅 ,检验网络的状况及时延。ping向目标主机(地址)发送一个请求的数据包,要求目标主机收到请求后给予答复,从而 判断网络的相应时间,以及本机是否与目标主机地址处于联通的状态。
例如:
ping www.baidu.com
如上例所示 主机向百度发送了32个字节的数据通过ping命令 不仅可以看到 百度的IP地址为14.215.177.39还可以通过时延来判断网络的好坏。ping命令也有很多用法,本文只通过这一个案例做简单的介绍。
5:什么是 HTML?
HTML即:Hypertext Markup Language
翻译成中文是超文本标记语言。
网页的本质就是超文本标记语言,它通过结合其他的web技术如脚本语言,组件等等 可以创造出功能强大的网页。超文本标记语言是万维网编成的基础,或者可以说万维网是建立在超文本基础之上的。我们再浏览器输入网址后,浏览器为我们跳转到了一个页面,这个页面的内容就是用HTML写出来的,浏览器将HTML翻译成我们可以看得懂的,直观且美观的网页。
6:什么是HTTP协议?
HTTP协议在上文已经有一定的介绍了。
HTTP即:超文本传输协议(Hypertext Transfer Protocol)
一个URL中,开头的部分即是一种协议 如:http ,https,ftp,file 等等。
万维网的诞生也可以说是HTTP协议的诞生。
我们都知道互联网的诞生本质上是互连网遵从了一种规范 即数据传输的规范:TCP/IP。
HTTP协议是在应用层上的协议,主要解决的问题是数据该如何包装起来。
那么数据怎么包装呢?包装的方式其实就是HTML
超文本传输协议,允许将超文本标记语言(HTML)的文档从web 服务器传输到客户端的浏览器 。这就是HTTP协议。
当然或许你有一些疑惑,在输入绝大部分网站的URL时都是以 https进行开头的,不要着急,关于HTTPS协议会在后文介绍。
7:服务器与客户端,请求和响应。Chrome开发者工具及 curl命令的使用
客户端即是访问者,服务器即是被访问的对象。
或者可以简单地理解为,一个是浏览网页的,一个是提供网页服务给浏览者浏览的。
那么客户端从输入URL 到 页面的呈现 到底发生了什么呢?
这个问题在本文不会给出详细的解答。但是我们可以知道客户端和服务器之间一定存在着某种"沟通"。
这种沟通就是请求(Request)和 响应(Response)
在我们输入了URL之后,浏览器给服务器发送了一个request,web服务器接收到request后进行处理,然后返回给浏览器一个response,浏览器通过解析response中的HTML,我们就看到网页了。这里面暂时不讨论中间或有经过代理服务器的因素。
在学习请求和响应之前,我们需要知道Chrome浏览器开发者工具以及curl命令的使用。
- curl命令的使用
curl命令是一个功能强大的网络工具,可以通过 http 协议 ftp 协议进行文件的下载,获取页面内容或接口响应等等功能
本文的目的在于学习请求和响应。对于curl 的一些强大的功能 不会过多介绍,希望日后也能在我翻阅自己的文章时,回顾并重新学习。
- curl url
这个命令也是curl 最简单的命令,作用为获取页面内容 如:curl "https://www.baidu.com"
获取到的是百度的首页信息 以HTML的格式显示 - -s/--slient
静音模式,减少输出的信息,比如进度 - -v/--verbose
显示整个HTTP访问的过程。 - -G/--get
以get的方式来发送数据(默认) - -X/--request <command>
指定发送的命令 curl 默认的HTTP动词为GET 使用 -X 参数可以支持其他动词,如POST - -H/--header<header>
指定请求头参数 需要以key:value的形式进行指定 - -d/--data<data>
使用-d 可以发送带参数的请求默认方式为 post提交方式
除了上述的命令外,curl还有许多功能,在本文仅仅介绍了本文会使用的一些命令。
在了解了简单的curl 命令后 敲入命令:
curl -s -v -- "https://www.baidu.com"
在命令行返回数据中 最后面可以看到图示内容:
第一个 [5 bytes data] 后面到 空格为止的内容就是请求的内容
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.64.0
Accept: */*
// 注意有空格
第二个 [5 bytes data] 后面到空格为止的内容就是响应 的内容
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Fre, 22 Mar 2019 16:33:55 GMT
Etag: "5886041d-98b"
Last-Modified: Mon, 23 Jan 2017 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
//注意有空格
首先来看一下请求:
HTTP请求包括四个部分:
1:请求行
在本例中请求行为:GET / HTTP/1.1
GET是请求方法 或者 你可以叫它请求动词 在后续中后将到GET的具体含义
/ 则是代表路径 也就是path
HTTP/1.1是对应的协议版本号
2:请求头
请求头的存在形式是以key:value形式存在的本例中 请求头为:
Host: www.baidu.com
User-Agent: curl/7.64.0
Accept: */*
当然也自己添加一些请求头的信息 使用 curl -H "key:value"
如:curl -s -v -H "Dobby:Kim" -- "https://www.baidu.com"
注意自定义的请求头信息也要以key:value的形式进行添加
可以看到输入了这个命令后 请求头中 就增加了我自定义的请求头信息
Dobby:Kim
3:空行
空行非常重要,在请求头后使用空行发送换行符是为了通知服务器后面的内容不再有请求头的信息了
4:数据/数据体
本例中请求的信息中是没有数据的,那么如何增加数据呢
需要改变请求动词 以及 增加一个
curl -d "data"
的命令使用命令:
curl -X POST -d "lubenweiniubi" -s -v -H "Dobby:Kim" -- "https://www.baidu.com"
可以看到请求的信息中 GET变成了POST
同时在请求头中多出了两个信息:
Content-Length:13 以及 Content-Type:application/x-www-form-urlencoded
这个Content-Length 实际上就是我上传数据的字符串长度
lubenweiniubi
正好是13个字符长度而Content-Type 则对应的是一种编码格式
在curl 命令中 虽然看不到请求体的内容 但是 后面在介绍Chrome开发者工具后 我们就可以在开发者工具中的
Form Data
选项卡看到 数据体的内容了。
接下来看一下响应:
HTTP响应包括四个部分:
1:状态行
本例中 HTTP/1.1 200 OK
是对应的状态行 HTTP/1.1仍然是协议 200 是HTTP 中的一种状态码 代表成功 关于更多的状态码在后文会有介绍 OK不用说 是对状态码的描述信息
2:响应头
本文中 响应头为:
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Fre, 22 Mar 2019 16:33:55 GMT
Etag: "5886041d-98b"
Last-Modified: Mon, 23 Jan 2017 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
可以看到响应也是以key:value的形式存在的
简单看一下 Content-Length 应该代表的是响应给客户端内容的大小
Content-Type则表示 返回的响应页面的格式是text/html
Date则表示响应的时间 总之这些响应头的内容同 请求头的格式一样都是以key:value形式保存的
3:空行
空行的作用是告诉客户端浏览器 后面已经没有响应头的内容了
4:要下载的内容
要下载的内容即服务器返回的HTML页面。
<!DOCTYPE html>... ... ...
介绍了curl 命令后 进入到Chrome 开发者工具的学习,Chrome开发者工具实际上要比curl 命令更常用一些
- Chrome开发者工具的使用
依然以www.baidu.com举例:
1:打开Chrome浏览器 按F12
2:在浏览器输入框中输入 百度的URL
你会看到在开发者工具中的Elements选项卡下出现了很多类似标签一样的东西
这就是呈现在你面前的网页所对应的HTML文档在Elements选项卡右边有一个Network选项卡,找到并点击
你会看到这样的东西:
如果你没有看到Method,Status这样的内容可以在Name处单机鼠标右键将这些选项卡调出来,因为这些选项卡非常重要
3:点击第一个www.baidu.com GET 200 ...
的文件
你会看到这样的东西
将Response Headers 和 Request Headers的内容打开并点击 旁边的view source
不用说,Request Headers是请求头的内容 Response Headers则是响应头的内容。
现在我们对请求和响应做一个简单的总结:
1:请求的请求行信息为:请求动词 路径 协议/版本号
2:响应的响应头信息为:协议/版本号 HTTP状态码 状态码描述信息
3:无论是请求和相应 它们的第三部分永远是一个回车 (\n)
4:一个请求最多多包含四部分 最少是三部分
5:如果在请求时没有写路径那么默认为/ 这里的路径包括查询参数 但是不包括锚点
下面通过对HTTP常见请求方式的介绍,来更具体地使用Chrome开发者。
8:常见 HTTP请求方式介绍,GET和 POST的区别 ?
常见的HTTP请求方式有:
GET,POST,PUT,PATCH,HEAD DELETE等等
- GET
GET请求是用来获取的。
向一个指定的资源发出请求,请求这个资源的页面信息,并返回实体主题 - POST
POST请求是用来提交的。
POST请求向指定的资源提交数据如 提交表单,上传文件等等 - PUT
PUT请求 是指向指定资源上传最新的内容
它与POST请求很像 通俗地解释就是:
新建一条记录就用POST 更新一条记录就用PUT
本文不会讨论这些请求的本质意义上的区别,仅作简单的介绍 - DELETE
DELETE请求用于删除指定的资源 - HEAD
HEAD请求资源的首部信息 并且这些首部信息与GET请求方法请求时返回的内容一致。HEAD请求的应用场景为在下载一个大文件前先获取其大小再决定是否要下载 - PATCH
请求方法 PATCH 用于对资源进行部分修改
HTTP协议中,PUT方法用来对资源进行整体的覆盖,POST方法没有对标准的补丁格式提供支持,不同于PUT方法,而与POST方法类似,PATCH请求方法是非等幂的,它以为者连续多个相同的请求会产生不同的效果。
除了上述六种请求方式 还有 OPTIONS 和 CONNECT 请求方式
在此 不对其介绍(实际上我目前不会... 日后一定补充 - . -)
附上 所有方法的MDN链接地址
GET
POST
PUT
DELETE
PATCH
HEAD
OPTIONS
CONNECT
接下来着重对比和学习GET和POST请求 。
实际上GET和POST如果要想讲出来它们的本质以及区别又是一项巨大的工程量。
推荐博客:GET和POST两种请求方法的区别
本文仅仅介绍GET和POST的应用场景 ,至于二者的具体区别 在日后,我会单独写一个长篇博客 进行学习。
其实应用场景已经在上面介绍完毕了:
最简单的应用场景:
GET请求一个页面,POST提交一些数据。
在使用Chrome开发者 并在浏览器输入框输入 百度的网址后
我们看到www.baidu.com这个主页面文件 后面的Method 是GET
接下来,尝试一下登陆百度,首先要退出百度账号,点击clear 即红点点右边的那个⚪,勾选Preserve log 这个Preserve log是用来保存日志的。
在我登陆百度的时候 Network 下面的日志出现了一个?login的文件
可以看到它右边的Method 对应的是POST请求方法
点击进去,可以看到多出了一个Form Data 选项卡
而Form Data里面对应的就是请求体的内容。里面可以看到username 以及password 对应的key:value形式的数据 当然,password 所对应的东西是一大长串加密的数据,这得益于https协议的保护机制。
其实,这一小节我想说明的东西很简单就是GET和POST到底应用在什么场景:
GET应用在资源的访问上
POST的应用一定是需要上传某些数据的时候。
9:常见 HTTP状态码介绍
状态码其实大家都见过,而且最常见的应该就是404了吧。
想一想 当出现404页面的时候 上面说了些什么? 绝大部分是这句话:页面找不到了
其实可以这样理解:状态码就是服务器对浏览器说的话。
本小节会简单介绍一些常见的HTTP状态码。
在介绍常见的状态码前,先了解一下以这些数字开头的状态码代表什么含义
- 1xx : 信息响应(不常用)
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务端错误
MDN:HTTP状态码
本文不会将所有的状态码全部介绍,仅会介绍常用的状态码 希望了解更多可点击上方MDN的链接
200
请求成功301
被请求的资源已永久移动到新位置,通常会发送HTTP Location来重定向到正确的新位置。返回301请求码进行跳转被Google认为是将网站地址由 HTTP 迁移到 HTTPS 的最佳方法302
请求的资源暂时驻留在不同的URI下面401
当前的请求需要进行用户的验证。403
403是HTTP协议中的一个状态码,可以理解为 没有权限访问此网站,服务器接收到了用户的请求,并理解了请求,但是拒绝为其提供服务404
HTTP 404 即 Not Found
请求所希望得到的资源未被在服务器上发现
通常是因为,用户所访问的网页已经被删除被移动 或从未存在。500
500状态码表示内部服务器错误,服务器遇到了不知道如何处理的情况。502
此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。503
服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。
常见的http状态码介绍完毕。
10: 什么是HTTPS协议?HTTP 和 HTTPS协议有什么区别?
在上文中 被反复使用到的百度及现在绝大部分网站 使用的协议都是HTTPS协议
那么什么是HTTPS协议呢?
要说HTTPS协议 就不得不说到HTTP协议产生了什么问题。
当你访问一个网站,默认了HTTP协议作为应用层,那么传输的内容实际上是明文传输的。当你去传输一些私人的信息时,例如信用卡账号,密码等 黑客就可以轻易地从网络流量中截取你发送的信息。
HTTP暴漏出的问题有以下几点:
- 窃听风险:
第三方可获取通信内容 - 篡改风险
第三方可修改通信内容 - 冒充风险
第三方可冒充他人身份参与通信
为了解决HTTP带来的诸多问题
SSL及TLS加密技术就诞生了
SSL 即 Secure Sockets Layer
SSL协议位于TCP/IP协议和各种应用层协议之间 为数据通讯提供着安全支持
TLS 即 Transport Layer Security 它是SSL的升级版并且比SSL更加标准化,且更加安全
现在可以解释HTTPS究竟是什么了
(图片截取于博客浅谈HTTPS协议和SSL,TLS之间的区别)
现在回到HTTPS的定义:
HTTPS 即 Hypertext Transfer Protocol Secure 中文为超文本传输安全协议。
简单解释就是HTTP协议的安全版。它使用了SSL/TLS作为HTTP应用层的子层。并使用端口443 而非 HTTP使用80端口和TCP/IP进行通信。HTTPS协议需要使用到ca申请证书,且SSL依靠证书来验证服务器的身份,并未浏览器和服务器之间的通信进行加密。
HTTP协议和HTTPS协议的区别:
- https协议需要ca申请证书,证书需要一定的费用
- http即超文本传输协议 信息属于明文传输,而https则具有SSL加密传输协议支持。
- 端口号不同,http的端口号是80 https的端口号为 443
- https协议是由http+ssl进行构建的可进行加密传输,身份认证等功能要比http协议更加安全