欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

网络应用和应用层协议的区别,linux应用编程学习教程

墨初 知识笔记 128阅读

P协议是提供给浏览器使用此时我们就明白浏览器就是一个客户端与之对应在远端一定还有一个服务端浏览器客户端与浏览器服务端之间通过HTTP协议进行网络数据传输。此时从服务端客户端层面我们对HTTP协议就有了第二层的理解最后我们根据浏览器的功能来对HTTP进行最后一层认识明白当我们访问浏览器访问某个客户端执行某代码此时浏览器就会帮我们与远端的浏览器服务端建立连接三次握手然后用户就可以在浏览器中输入数据某链接IP地址此时浏览器服务端获取到该数据之后结合上述浏览器功能的概念它首先就会根据IP地址向指定服务器发送HTTP请求来建立连接三次握手当目标服务端收到该请求后根据对应HTTP请求此时目标服务器就会将自己的网页文本数据作为响应最终浏览器将该网页文本数据返回到客户端浏览器浏览器客户端根据其内置代码HTML/CSS/JavaScript对网页文本数据进行渲染和展示最终将一个Web展现在用户的面前。首先根据上述过程我们就发现一个协议不仅可以在客户端和服务端之间使用也可以在服务端和服务端之间使用并且结合上述理解此时我们就可以合理的明白为什么说HTTP协议是提供给浏览器应用程序使用为什么浏览器客户端和浏览器服务端之间的网络通信协议也一定是HTTP协议。原来是因为浏览器的功能导致因为浏览器的功能是作为第三方应用辅助用户与服务器建立联系。然而因为这一用户需求需要被满足所以市场上就出现了非常多具备该功能的浏览器谷歌/微软…而当市场上有了这么多的浏览器之后因为每个浏览器都是不同的公司研发的所以在网络数据处理方面使用的一定都是自己定制的协议那么此时就会导致很多问题如用户因为每个浏览器协议不同使用某些功能的方法不同使用成本增加服务器因为每个浏览器协议不同当任何一个浏览器想要访问该服务器时就会发送不同协议的请求如果该服务器都要满足的话该服务器就要兼容所有浏览器使用的协议从而实现响应服务器响应成本增加。所以为了解决上述问题HTTP协议应运而生。明白HTTP协议就是一款专门为所有浏览器设计的协议这也就是为什么我们每次在访问服务器时使用的都是HTTP协议这也就是为什么我们上述说浏览器客户端和浏览器服务端之间使用的一定是HTTP因为浏览器服务端想要访问Web服务器就必须使用HTTP间接导致当数据从浏览器客户端到浏览器服务端的过程也必须是HTTP。

HTTP理论概念理解

当此时有了上述知识的理解之后我们对HTTP就有了一定的宏观层面认识HTTP在网络数据传输我们就清晰了。浏览器负责与服务器建立连接HTTP负责规范浏览器与服务器之间的资源传递。然而对于浏览器如何完成与服务器建立连接这个工作在之前学习中我们已经明确socket API所以此时我们的重点就在于解决HTTP如何规范浏览器和服务器之间的资源传递。

上述我们说HTTP的重点在于规范浏览器和服务器之间的资源传递为什么称为是资源传递呢所以此时我们需要明白对于HTTP协议而言它也被称为超文本传输协议如何理解超文本传输协议呢传输协议对于目前的我们来说非常简单不就是规定数据传输的格式序列化和网络通信的方式报文所以同理我们只需要搞定什么叫做超文本就ok啦那么什么叫做超文本呢根据日常我们自身对浏览器的使用上来看可以知道我们在浏览器上可以说是无所不能无所不用其极的可以访问任意一个Web服务器哔哩哔哩/酷狗音乐/爱奇艺/学习通然后获取到该服务器上的任意数据音频/视频/图片发现对于浏览器而言服务器中的内容这么的五花八门浏览器想要以第三方的身份完成这份工作压力也是非常大的单单接收服务器内容就已经是一个挑战所以浏览器为了能够成功吃上这碗饭它就必须提供对应的解决方法最终同理协议不统一问题HTTP协议再次应运而生。此时我们对超文本协议HTTP就有了一定的理解原来其中超文本的意思指的就是HTTP协议不仅可以处理纯文本数据对于音频、视频、图片等数据它也能处理并且对于这些五花八门的数据后续我们就统称为资源。当然上述我们说HTTP身为超文本传输协议具有接收音频、视频、图片的能力但是并不代表HTTP协议有处理解析这些资源的能力HTTP协议只是规定不同类型资源的传输格式通过对不同类型资源封装不同格式的报文达到拥有识别这些资源的能力浏览器就算是合格了。最后具体一个视频或者是一个音频如何被处理我们进行简单了解首先明白一个视频和一个音频想要被处理肯定和硬件离不开和硬件离不开那么根据计算机系统的层次结构向上走它就必须有对应的硬件驱动程序如音频驱动程序声卡、视频驱动程序显卡再向上走就来到操作系统那么此时我们就明白一个被HTTP协议标识的音频/视频数据二进制最终是如何被操作系统三下五除二给搞定的具体过程感兴趣你就深入那么再向上走此时就来到系统调用明白操作系统是一个好人它为了我们可以处理音频/视频等数据肯定会封装一套系统调用API给我们使用所以对于我们客户端上的播放器应用程序本质应该就是一个对系统调用API的封装程序。显然只要有这套逻辑在能发现浏览器是否具备处理音频/视频的能力就看它自己是不是够勤奋封装不封装。

认识URL

搞定了上述知识此时我们对HTTP协议为什么被称为超文本传输协议就有了一定的理解那么承接上述所说HTTP协议到底是如何规范浏览器和服务器之间的资源传递呢想要搞懂这个问题此时我们需要先来了解一下有关URL相关的知识。

什么是URL呢简简单单URL就是Uniform Resource Locator的缩写意思就是统一资源定位符也就是我们平时使用的链接或者说是网址。所以我们就明白URL一定是在浏览器中被使用并且URL一定包含了某服务器的IP地址和端口号。当我们有了这两个认识同理每个浏览器在使用IP地址和端口号向某个服务器发送HTTP请求时HTTP协议肯定规定HTTP请求中一定需要包含URL中对应位置的数据IP地址端口号所以当HTTP请求拥有了需要从URL特定位置读取特定数据这个过程那么此时就间接导致URL的格式一定是不可变的HTTP天生就知道的并且因为所有浏览器使用的都是HTTP协议那么最后就一定会导致所有浏览器使用的URL格式一定是一样的。如下就是一个HTTP协议下的URL

如上图所示就是一个经典的HTTP协议下的URL当然目前的URL都是基于HTTPS协议下具体有什么区别后续详解。此时从上述URL中我们就可以很好的发现一个URL的首部一定是该URL使用协议的名称表示告诉浏览器此时该URL需要使用HTTP协议进行解析第二部分www.example.com也被称为域名本质就是服务器的IP地址在URL中使用域名而不直接使用IP地址的原因很简单本质就是让用户可以更加轻松的明白该IP地址域名表示的具体是那个服务器www.baidu.com当然你可以使用特定的方法对域名进行解析让其变成一个IP地址ping在域名之后也就是URL的第三部分path表示的就是对应资源在目标服务器上的路径。值得注意的是这个路径只有在浏览器和服务器建立连接之后也就是浏览器将Web服务器的网页文本渲染之后显示网页此时我们才能通过URL指定不同的路径来访问服务器上的资源。否则我们在浏览器和服务器建立连接之前浏览器向服务器发送连接请求时URL中的路径默认只能是服务器设置好的默认路径当然也就是网页文本数据所在的路径如index.html/default.html最终成功将网页文本返回给我们。

通过上述一系列的描述此时我们对URL无论是从概念层面还是从因果关系层面我们都有了一定的理解明白URL的使用场景浏览器明白为什么URL必须是统一的数据格式以及URL标准格式中不同数据代表的含义明白URL的作用原来就是在浏览器向Web服务器发送HTTP请求时提供一个标准的、浏览器已知的数据格式供给浏览器获取到用户数据IP地址端口号而已。明白这些之后此时我们就会发现一个问题都说访问一个Web服务器不仅需要IP地址还需要对应IP主机中的某一个端口号在URL中域名表示IP地址很好理解那么什么表示端口号呢答案是协议名称也就是HTTP表示的就是端口号。如何理解呢同理此时我们明白两个点其一在之前学习使用套接字实现服务端和客户端网络通信之时对服务端IP地址和端口号进行初始化时我们就有谈到一个服务端它的端口号和IP地址是不允许随意修改的必须是众所周知的只有这样用户在访问该服务器时才能以最低的成本正确的访问到。以该目的出发所以当HTTP协议的设计者在规定HTTP协议时它就规定HTTP协议中必须自带一个默认端口号80当URL中没有显式的指定端口号时默认访问的就是目标IP主机中的80号端口。所以因为该HTTP规定此时大多数的Web服务器就会在本地将该服务器的端口号设置为80也就是对应该服务器使用协议中默认的端口号。本质好处也就是让用户可以直接使用域名访问某服务器降低用户的使用复杂度和成本。

什么是urlencode/urldecode
首先明确这块知识我们如果展开将会非常的复杂。为了能够有层次感、有逻辑的讲解此时我们就需要先进行铺垫。明白在我们平时自己使用浏览器时微软浏览器/谷歌浏览器我们并不是直接在浏览器上通过域名去访问某个服务器而是利用该浏览器上对应的搜索引擎必应/谷歌/百度通过在该搜索引擎中输入中文/英文百度/哔哩哔哩来获取到浏览器服务器上提供给用户使用的对应Web服务器的链接URL然后用户点击该链接实现与目标服务器建立连接当然该建立连接的过程还是通过浏览器为我们发送HTTP请求完成。所以这也就是为什么一般浏览器会有两个输入窗口原来是一个输入窗口负责直接对URL进行解析一个输入窗口负责通过搜索引擎对其进行处理。

明白了上述知识此时对于学习urlencode和urldecode我们就有了切入点但该切入点关注的是为什么要进行urlencode和urldecode的问题。在此之前我们需要对什么是urlencode和urldecode做出一定的理解拆开来看urlencode和urldecode本质还是encode编码和decode解码的其中一种类型。所以想要搞定urlencode和urldecode我们只要搞定什么是encode和decode就行。而谈到编码和解码就不得不谈到我们最为熟悉的ASCII码表或者是GBK国标码亦或者是UnicodeUTF-8。明确编码的本质和定制协议是相同的编码也是一种协议定制过程当然为什么要进行编码就不用我多说了谁让傲娇的计算机只认识二进制呢同理 所以此时就诞生了ASCII码表用对应的二进制序列来表示某些特定的字母/符号GBK用对应的二进制序列表示某些中文汉字字符Unicode用二进制序列表示全世界语言的字符。所以同理对于urlencode和urldecode来说它们本质也就是一种协议定制过程一种对字符数据进行协议转换的过程一种将某形式数据转化为另一种形式数据的过程映射。明白了这点之后此时对于urlencode和urldecode的深层次理解我们就明确了此时只需要套公式将对应urlencode和urldecode之间的转换过程规则给完善我们就大功告成。规则将需要转码的字符数据转为16进制然后从右到左取4位(不足4位直接处理)每2位做一位前面加上%编码成%XY的形式。源码请看该链接urlencode/urldecode源码。

拓展编码相关知识 此时好奇的我对字符类型编码已经有了属于自己的理解那么我就很好奇对于图片、音频是采用什么方式进行编码的呢首先从大概念来讲对于图片的编码方式称为JPEG/PNG对于音频的编码方式称为MP3/AAC当然编码方式都是人设计的上述属于常见编码方式。并且明确无论如何编码对什么数据进行编码本质还是在对二进制序列进行编码只不过此时二进制序列的另一头代表的数据不同其中对于图片来说我们要明白一张图片一定是由很多很多的像素组成所以我们就把一张图片看成是一个有范围的像素集而因为像素包括的元素有颜色、亮度、透明度等…所以我们在编码过程本质就是在对颜色、亮度、透明度进行编码对不同颜色、不同亮度、不同透明度组成的像素进行编码从而完成对图片的编码。音频同理只不过音频也有其独特的属性如音色等…最终我们对电波进行编码实现对声音编码。当然无论是具体过程还是基本概念都不是我们三言两语就能够讲清楚的此时我们只是简单的了解而已。

明确了上述知识之后我们对urlencode和urldecode是什么就算搞明白了那么此时我们就承接上述所说以浏览器的两个窗口为切入点来看看到底为什么要进行urlencode和urldecode。在上述讲解HTTP概念时我们说过因为浏览器是使用HTTP协议向Web服务器发送HTTP请求而浏览器服务端的数据又来自于浏览器客户端所以浏览器客户端和浏览器服务端之间使用的协议也是HTTP协议。浏览器客户端在与浏览器服务端建立连接时发送的也一定是HTTP请求所以同理浏览器客户端和浏览器服务端在进行网络数据传输时也一定要使用URL。行文来到此处很关键此时一定就需要结合上述对两个窗口的理解如我们使用浏览器时使用的Web服务器搜索窗口那么此时我们就只能按照URL规定的格式进行数据输入输入协议名称输入分隔符输入域名输入分隔符输入默认网页文本所在路径index.html而如果我们使用的是另一个窗口浏览器自带的搜索引擎窗口那么此时我们就可以输入任意字符类型的数据中文/英文/符号ok明确这点很关键所以你发现了什么是不是就有了一定的因果关系。也就是因为搜索引擎中的任意字符数据按照上述的理解一定是发送给浏览器服务端的而浏览器客户端是通过什么形式发送给浏览器服务端呢是不是HTTP协议是不是URL。所以如果我们要将搜索引擎中的任意字符数据成功的发送到浏览器服务端那么此时就需要对其进行编码。举例我们在搜索引擎中输入的是URL默认格式中包含的字符如//、等…那么此时浏览器客户端在将该字符数据转化为URL时是不是就会导致URL的格式出现错乱呢所以为了规避这个问题此时就有了urlencode和urldecode。这个非常好理解本质和我们之前在自己实现网络版本计算器时一样就是在对客户端发送给服务端的数据进行处理只不过此时是一个编码过程的处理。

HTTP宏观概念理解

明确了上述有关URL的所有知识此时我们继续承接上述所说正式回答HTTP协议到底如何规范浏览器和服务器之间的资源传递问题。本质也就是明确HTTP协议规定了那些内容来保证浏览器和服务器之间通信能够正确进行。同理对比我们在网络版本计算器中自己实现客户端和服务端的场景明白定制一个网络通信协议除了对数据进行序列化和反序列化最关键的就在于如何对序列化数据进行格式控制添加报头/分隔符以便于接收方在读取数据时有一定的抓手从而顺利的读取到预期数据。所以同理HTTP协议HTTP协议在规定浏览器请求时除了规定该HTTP请求中对应数据使用何种方式进行序列化和反序列化更重要的是它还需要规定其它内容来对被序列化反序列化完成的数据进行处理从而让Web服务器能够依据该请求正确做出响应。当然同理Web服务器在做出响应时HTTP协议除了对响应数据进行序列化反序列化过程同理它也需要对响应数据的其它内容进行规定。那么HTTP协议到底对序列化数据进行了那些内容的规定本质也就是对序列化数据进行了那些格式控制呢添加字段如下图所示


如上图且结合我们在网络版本计算器中自定义协议的过程明白HTTP请求和HTTP响应就如同是我们自己对结构化数据进行处理时构建的Request类和Response类。在浏览器构建HTTP请求将用户数据发送给Web服务器这个过程本质第一步就是在将用户数据依据HTTP协议规定的数据格式进行用户数据结构化然后再将该结构化数据按照HTTP协议规定的方法进行序列化最终得到请求体也就是HTTP报文中的有效载荷。然后再对该有效载荷进行封装也就是上述谈到的对序列化数据进行添加报头/标识符操作而这个添加报头的过程对于HTTP协议来说也就是上图所示在请求体之前添加请求行请求头空行等操作。并且HTTP还规定此时请求行中必须带有请求方法GET/POST、URL资源路径、协议版本字段当然此时请求头中具体包含那些字段有待后续深入学习最后HTTP还规定报头数据格式以\r\n为分隔符也就是以行的形式进行分割当对端在读取报文时就可以依据这一规定以行的方式区分不同的字段以空行的方式识别出报头和有效载荷。同理HTTP响应报文服务端处理对应请求构建HTTP响应的过程本质还是一个对响应数据资源路径某资源根据HTTP协议规定格式进行结构化然后再对该结构化响应数据进行序列化的过程。最终根据HTTP响应规定的处理方法对序列化数据进行如上图所示的状态行协议版本、状态码200/404/500、状态码描述成功/未找到/服务器异常响应头空行等报头的添加以及\r\n分隔符的添加最终同理以行为抓手区分字段空行区分报头和有效载荷。

实践HTTP请求和HTTP响应

该部分知识我们留到下篇博客中详解主要是因为时间原因谁让今天是10月24号呢

总结通过上述大量的文字描述对HTTP协议在概念层面我们就算搞定啦本质剩余知识也就是HTTP协议的实践过程看看具体在使用过程中是否和我们的概念相印证印证非常关键 ⭐好书推荐

【内容简介】

《Python从入门到精通》本书以零基础读者为对象用范例引导读者学习深入浅出地介绍了Python的相关知识和实战技能。 本书从Python基础入手介绍了Python的开发环境、各种数据类型的操作方法、流程控制、函数等Python内核技术以及使用Python处理文件、处理错误与异常等各种应用最后列举了Python在重要领域的项目实战内容全面且深入。

京东购买链接Python从入门到精通
当当购买链接Python从入门到精通

标签:
声明:无特别说明,转载请标明本文来源!