八分钟由浅入深,专家带你理性认识HTTP协议

Posted StuQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八分钟由浅入深,专家带你理性认识HTTP协议相关的知识,希望对你有一定的参考价值。

实现一个Web服务器的必要前提是了解HTTP协议。本文作者唯品会高级开发工程师列旭松,曾出版《php核心技术与最佳实践》。文章主要从HTTP协议相关知识介绍入手,由浅入深对HTTP协议进行理性解读。同时本文也是作者正在筹备中的新书部分章节。详细了解作者可直达文章底部。
HTTP协议简介
浏览器背后的故事

八分钟由浅入深,专家带你理性认识HTTP协议

图1-1 浏览器访问URL过程

浏览器与Web服务器使用HTTP协议进行通信,那么什么是HTTP协议呢?接下来我们会详细介绍HTTP协议的相关知识。

TCP/IP协议

HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识。由于TCP/IP协议族包含众多的协议,在这里我们无法一一讨论。接下来,我们仅介绍理解HTTP协议需要掌握的TCP/IP协议族的一些相关知识点。如果想深入理解TCP/IP协议,可以参考经典书籍《TCP/IP详解》。TCP/IP协议族分层TCP/IP协议族是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层和数据链路层。如图1-2所示:

八分钟由浅入深,专家带你理性认识HTTP协议

图1-2 TCP/IP协议族分层

分层的好处是把各个相对独立的功能解耦,层与层之间通过规定好的接口来通信。如果以后需要修改或者重写某一个层的实现,只要接口保持不变也不会影响到其他层的功能。接下来,我们将会介绍各个层的主要作用。

 应用层

应用层一般是我们编写的应用程序,其决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。处于应用层的协议非常多,比如:FTP(File Transfer Protocol,文件传输协议)、DNS(Domain Name System,域名系统)和我们本章讨论的HTTP(HyperText Transfer Protocol,超文本传输协议)等。

 传输层

传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

 网络层

网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。

 链路层

链路层用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interface Card,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。数据包封装上层协议数据是如何转变为下层协议数据的呢?这是通过封装(encapsulate)来实现的。应用程序数据在发送到物理网络之前,会沿着协议栈从上往下传递。每层协议都将在上层协议数据的基础上加上自己的头部信息(链路层还会加上尾部信息),以为实现该层功能提供必要的信息。如图1-3所示:

八分钟由浅入深,专家带你理性认识HTTP协议

图1-3 数据包封装

发送端发送数据时,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接收端接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除。过程如图1-4所示:

八分钟由浅入深,专家带你理性认识HTTP协议

图1-4 数据传输过程

由于下层协议的头部信息对上层协议是没有实际的用途,所以在下层协议传输数据给上层协议的时候会把该层的头部信息去掉,这个封装过程对于上层协议来说是完全透明的。这样做的好处是,应用层只需要关心应用服务的实现,而不用管底层的实现。TCP三次握手从上面的介绍可知,传输层协议主要有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:TCP协议提供面向连接、字节流和可靠的传输。使用TCP协议进行通信的双方必须先建立连接,然后才能开始传输数据。TCP连接是全双工的,也就是说双方的数据读写可以通过一个连接进行。为了确保连接双方可靠性,在双方建立连接时,TCP协议采用了三次握手(Three-way handshaking)策略。过程如图1-5:

八分钟由浅入深,专家带你理性认识HTTP协议

图1-5 TCP三次握手

TCP协议三次握手的描述如下:

第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务端的确认。

第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。

第三次握手:客户端接收到服务端的SYN+ACK报文段后,会想服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

当三次握手完成后,TCP协议会为连接双方维持连接状态。为了保证数据传输成功,接收端在接收到数据包后必须发送ACK报文作为确认。如果在指定的时间内(这个时间称为重新发送超时时间),发送端没有接收到接收端的ACK报文,那么就会重发超时的数据。

DNS服务

八分钟由浅入深,专家带你理性认识HTTP协议

图1-6 DNS服务原理

HTTP与TCP/IP、DNS的关系

到现在,我们介绍了与HTTP协议有密切关系的TCP/IP协议和DNS服务,接下来我们通过图1-7来整理一下HTTP协议与它们之间的关系:

八分钟由浅入深,专家带你理性认识HTTP协议

图1-7 HTTP与TCP/IP、DNS的关系

本文已经作者授权转载,版权及内容解释权归原作者所有。


直播预告

「 StuQ公开课联合知乎Live,为程序员策划的围绕热点技术、实战案例、职场软技能培养、职业成长规划等涵盖多技术领域技术内容的主题Live直播,1月17日晚八点 ,将由本文作者列旭松,唯品会高级工程师,分享他的7余年PHP实战开发经验。理论+实战案例分享,解读《深入PHP扩展开发》。详细了解阅读下图:


更多Live大咖分享,戳「 阅读原文 」了解围观。

以上是关于八分钟由浅入深,专家带你理性认识HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章

由浅入深了解超文本传输协议http

一文带你由浅入深Netty异步非阻塞世界(持续更新~~~)

程序大牛由浅入深,带你学习面向对象编程

一文带你精通CAS,由浅入深,直击灵魂

网络知识补习❄️| 由浅入深了解HTTPHTTP 的演变

由浅入深,带你探索C语言指针的魅力