![e2eb096266c59e3c7e02bf7db511801d.png](https://i-blog.csdnimg.cn/blog_migrate/b5030f3dfb46126f12a856c4cf5a9830.jpeg)
1、浅谈HTTP基本思路
1.1、从输入一个网址开始
先介绍一下网址,准确来说应该是URL(Uniform Resource Locator),中文:统一资源定位符。简单来说,它就是以 http:// 开头的那一串东西,例如http://geekfz.cn 。但实际上除了 ”http://“ ,网址还可以以其他一些文字开头,例如:”ftp://“ 、 ”file://“ 、 ”mailto://“ 等。
之所以有各种各样的URL,是因为尽管我们通常是使用浏览器来访问web服务器的,但实际上浏览器并不只有这一个功能,它也可以用来在FTP服务器上下载和上传文件,同时具备电子邮件客户端的功能。可以说,浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要一些东西来判断应该使用其中哪种功能来访问相应的数据,而各种不同的URL就是用来干这个的,比如访问Web服务器是用 http:“ ; 访问FTP服务器时使用 ”ftp:“。
常见的各种URL:
![2e351b115f3404691fa659c2ce53f172.png](https://i-blog.csdnimg.cn/blog_migrate/0ebc79ef669d8a22fd09e23c5c58cb55.jpeg)
1.2、URL解析
输入网址回车后,浏览器要做的第一步工作就是对URL进行解析,从而生成发送给web服务器的请求消息。
web浏览器解析URL的过程:
![7309d7e11f86d4976667416dd6590472.png](https://i-blog.csdnimg.cn/blog_migrate/a73191ac63330e4e9593390c0a99e581.jpeg)
根据HTTP的规格,URL包含图中(a)的这几种元素。
其中(b)的URL示例表示要访问http://www.lab.glassroom.com这个web服务器上路径名为/dir/file.html的文件,也就是位于/dir/目录下的filel.html这个文件。
web服务器的文件路径如图:
![847cd4b8bc49993cb6bc06110fd5dd4a.png](https://i-blog.csdnimg.cn/blog_migrate/754770b92266144469f476709ccef20b.jpeg)
1.3、HTTP的基本流程
HTTP协议定义了客户端和服务器之间交互的消息内容和步骤。
基本流程如图:
![23bd2f27ff553e079651e448fa1f3b2c.png](https://i-blog.csdnimg.cn/blog_migrate/a43d607e5d3dc7f954788ec5ef7cc782.jpeg)
首先,客户端会向服务器发送请求消息。请求消息中包含的内容是“对什么” 和 ”进行怎样的操作“ 两部分。其中相当于 ”对什么“ 的部分称为URI,统一资源标识符。一般来说,URI的内容是一个存放网页数据的文件名或者一个CGI程序(对web服务器程序调用其他程序的规则所做的定义就是CGI,而按照CGI规范来工作的程序就称为CGI程序。)的文件名,例如 “/dir//file.html” "/dirl/program.cgi/"等。换句话说就是,这里可以写各种访问目标,而这些访问目标统称为URI,统一资源标识符。
相当于 “进行怎样的操作” 的部分称为方法。方法表示需要Web服务器完成怎样的工作,其中典型的例子包括读取URI表示的数据,将客户端输入的数据发送给URI表示的程序等。
HTTP的主要方法:
![850f26d4e0ee54bc9a40eddf21f6972f.png](https://i-blog.csdnimg.cn/blog_migrate/8e6348ceae3d598f57094af475a728bf.jpeg)
收到请求消息之后,Web服务器会对其中的内容进行解析,通过URI和方法来判断 “对什么” “进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存在响应消息中。在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误。
1.4、HTTP请求消息
对URL进行解析之后,浏览器确定了Web服务器和文件名,接下来就是根据这些信息生成HTTP请求消息了。实际上,HTTP消息在格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息。
HTTP消息的格式:
![68a2c5b334b412d26d8d808aca5e8cbb.png](https://i-blog.csdnimg.cn/blog_migrate/77656558a580f44ff7cb6a8da084bafd.jpeg)
实例:
![53d2e35b24515f1a452cdb06b724f137.png](https://i-blog.csdnimg.cn/blog_migrate/5be1c35b97d68f2cdd66ed600190a081.jpeg)
![bc2c0394d5477efe55a5ee6c1d592dd0.png](https://i-blog.csdnimg.cn/blog_migrate/058f58b37c6be4ff086adec150277559.jpeg)
GET和POST方法请求消息对比
![05bec8ef214884b1bba47bc6c18c82c5.png](https://i-blog.csdnimg.cn/blog_migrate/960ac0fe7238d24888bdbb89c9f4e7ca.jpeg)
HTTP中主要的头字段:
![41613a294f98bdf9bb5f39c2927958ff.png](https://i-blog.csdnimg.cn/blog_migrate/f8ba511a904a74f9c043c992cd055ff1.jpeg)
![a8cd42acd9e8ed4c432c11dc44948885.png](https://i-blog.csdnimg.cn/blog_migrate/7c4991a55617bc39e3bc898dbbd508f8.jpeg)
1.5、HTTP响应消息
响应消息的格式以及基本思路和请求消息是相同的,差别只在第一行上。在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。状态码和响应短语表示的内容一致,但它们的用途不同。状态码是一个数字,它主要用来向程序告知执行的结果;相对地,响应短语则是一段文字,用来向人们告知执行的结果。
HTTP状态码概要:
![861e00dea79725071913dfdf5c322827.png](https://i-blog.csdnimg.cn/blog_migrate/4db390fe11bd39f3b03f766ec0ede7c3.jpeg)
由于每条请求消息中只能写1个URI,所以每次只能获取1个文件,如果需要获取多个文件,必须对每个文件单独发送1条请求。比如1个网页中包含3张图片,那么获取网页加上获取图片,一共需要向Web服务器发送4条请求。
Web服务器完全不关心这4条请求获取的文件到底是1个网页上还是不同网页上的,它的任务就是对每一条单独的请求返回1条响应而已。
1.6、实例展示
下面展示了浏览器与web服务器之间交互消息的一个实例。在这个实例中,我们需要获取一张名为sample.html的网页,网页中包含一张名为picture.jpg的图片。下图展示了这个过程中产生的消息。
![def1d3b3c73a12315fd36c206940ab8b.png](https://i-blog.csdnimg.cn/blog_migrate/02057f15a00e2ef3ad4a00870b736654.jpeg)
![978b3c7784e667951154d84a8e1eba34.png](https://i-blog.csdnimg.cn/blog_migrate/51f4b357557559f62012ff92318c039a.jpeg)
![b704dcb6515d944f15331924ca708d97.png](https://i-blog.csdnimg.cn/blog_migrate/009d522926a434d05b45f678aa20aabf.jpeg)
参考资料
《网络是怎样连接的》