1.1 HTTP协议简介
咱们平常生活中常常会使用浏览器访问Web站点,可是你们有思考过在这个过程当中到底发生了什么吗?为何咱们在浏览器地址栏上面输入要访问的URL后就能够访问到Web页面呢?浏览器
1.1.1 浏览器背后的故事
当咱们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,而后经过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通讯,而通讯的协议就是HTTP协议。服务器
咱们能够把这个过程类比成一个电话对话的过程。当咱们要打电话给某我的,首先要知道对方的电话号码,而后进行拨号。打通电话后咱们会进行对话,固然要对话确定须要共同的语言,若是一我的说国语,而另外一我的说英语,那确定不能进行沟通的。在本例中,电话号码至关于上面的IP地址,而共同语言至关于HTTP协议。网络
咱们经过一个简单的图来阐述这个过程:
浏览器与Web服务器使用HTTP协议进行通讯,那么什么是HTTP协议呢?接下来咱们会详细介绍HTTP协议的相关知识。并发
1.1.2 TCP/IP协议
HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,因此要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识。网站
因为TCP/IP协议族包含众多的协议,在这里咱们没法一一讨论。接下来,咱们仅介绍理解HTTP协议须要掌握的TCP/IP协议族的一些相关知识点。若是想深刻理解TCP/IP协议,能够参考经典书籍《TCP/IP详解》。操作系统
TCP/IP协议族分层3d
TCP/IP协议族是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层和数据链路层。如图所示blog
分层的好处是把各个相对独立的功能解耦,层与层之间经过规定好的接口来通讯。若是之后须要修改或者重写某一个层的实现,只要接口保持不变也不会影响到其余层的功能。接下来,咱们将会介绍各个层的主要做用。接口
1) 应用层域名
应用层通常是咱们编写的应用程序,其决定了向用户提供的应用服务。应用层能够经过系统调用与传输层进行通讯。
处于应用层的协议很是多,好比:FTP(File Transfer Protocol,文件传输协议)、DNS(Domain Name System,域名系统)和咱们本章讨论的HTTP(HyperText Transfer Protocol,超文本传输协议)等。
2) 传输层
传输层经过系统调用向应用层提供处于网络链接中的两台计算机之间的数据传输功能。
在传输层有两个性质不一样的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
3) 网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了经过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。
4) 链路层
链路层用来处理链接网络的硬件部分,包括控制操做系统、硬件设备驱动、NIC(Network Interface Card,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的做用范围以内。
数据包封装
上层协议数据是如何转变为下层协议数据的呢?这是经过封装(encapsulate)来实现的。应用程序数据在发送到物理网络以前,会沿着协议栈从上往下传递。每层协议都将在上层协议数据的基础上加上本身的头部信息(链路层还会加上尾部信息),觉得实现该层功能提供必要的信息。如图所示:
发送端发送数据时,数据会从上层传输到下层,且每通过一层都会被打上该层的头部信息。而接收端接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除。过程如图所示:
数据传输过程
因为下层协议的头部信息对上层协议是没有实际的用途,因此在下层协议传输数据给上层协议的时候会把该层的头部信息去掉,这个封装过程对于上层协议来讲是彻底透明的。这样作的好处是,应用层只须要关心应用服务的实现,而不用管底层的实现。
TCP三次握手
从上面的介绍可知,传输层协议主要有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特色是:TCP协议提供面向链接、字节流和可靠的传输。
使用TCP协议进行通讯的双方必须先创建链接,而后才能开始传输数据。TCP链接是全双工的,也就是说双方的数据读写能够经过一个链接进行。为了确保链接双方可靠性,在双方创建链接时,TCP协议采用了三次握手(Three-way handshaking)策略。
过程如图所示:
TCP协议三次握手的描述以下:
第一次握手:客户端发送带有SYN标志的链接请求报文段,而后进入SYN_SEND状态,等待服务端的确认。
第二次握手:服务端接收到客户端的SYN报文段后,须要发送ACK信息对这个SYN报文段进行确认。同时,还要发送本身的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。
第三次握手:客户端接收到服务端的SYN+ACK报文段后,会想服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。
当三次握手完成后,TCP协议会为链接双方维持链接状态。为了保证数据传输成功,接收端在接收到数据包后必须发送ACK报文做为确认。若是在指定的时间内(这个时间称为从新发送超时时间),发送端没有接收到接收端的ACK报文,那么就会重发超时的数据。
1.1.3 DNS服务
前面介绍了与HTTP协议有着密切关系的TCP/IP协议,接下来介绍的DNS服务也是与HTTP协议有着密不可分的关系。
一般咱们访问一个网站,使用的是主机名或者域名来进行访问的。由于相对于IP地址(一组纯数字),域名更容易让人记住。但TCP/IP协议使用的是IP地址进行访问的,因此必须有个机制或服务把域名转换成IP地址。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务。
以下图所示,展现了DNS服务把域名解析成IP地址的过程:
DNS服务是经过DNS协议进行通讯的,而DNS协议跟HTTP协议同样也是应用层协议。因为咱们的重点是HTTP协议,因此这里不打算对DNS协议进行详细的分析,咱们只须要知道能够经过DNS服务把域名解析成IP地址便可。
1.1.4 HTTP与TCP/IP、DNS的关系
到如今,咱们介绍了与HTTP协议有密切关系的TCP/IP协议和DNS服务,接下来咱们经过下图来整理一下HTTP协议与它们之间的关系:
HTTP与TCP/IP、DNS的关系 从上图中能够知道,当客户端访问Web站点时,首先会经过DNS服务查询到域名的IP地址。而后浏览器生成HTTP请求,并经过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并经过TCP/IP协议返回给客户端。