linux网络 | 深度学习http的相关概念
前言:本节内容讲述http。 本节主要讲述http的一些相关概念, 见一见的http的样子。 在文章中, 博主将先会重新回忆一下OSI的七层模型。 然后讲两个前置知识。 最后就是带着友友见一见http的格式。做完这些, 本节内容就算是圆满结束。 而后面的章节还会带着友友们模拟http协议。 那么, 废话不多说, 开始我们的学习吧!
ps:http是基于tcp协议的, 本节内容建议学习了tcp协议后在观看哦!
目录
重谈OSI的七层模型
域名
url
什么是url
为什么url能够定位资源
url字符串中的各个含义
url的参数
HTTP的请求和响应
请求
编辑 请求行
报头
响应
telnet进行请求
重谈OSI的七层模型
这七层模型分别是:应用层,表示层,会话层,传输层,网络层,数据链路层 和 物理层。
- 首先物理,链路,网络,这三层我们接触不到。
- 然后传输层我们用了socket接口。
-
关键是会话层,会话层是我们建立和断开连接管理的。建立链接也就是我们写的服务端的accept接口,断开连接也就是我们写的客户端的connect接口。我们如何理解这个会话,我们在写tcp服务端的时候,利用的是子进程维护整个tcpserver。父进程创建子进程后就退出了。而我们的服务,是不是就是一般都要变成守护进程,守护进程一般都要独立于一个会话,所以,理解会话层会话,其实就是理解服务要自成一个个的会话,所以叫会话层。
- 表示层 : 就是我们今天定义的协议,就是固有的格式。序列化反序列化就是固有转换到网络格式。
- 什么是应用层 : 就是我们的计算器。就是我们对于数据的处理。ServerCal。也比如我们的qq客户端这些, 都叫做应用层。
域名
https://www.baidu.com/ ---这就是域名。关于这个域名,其实和ip地址都可以在浏览器进行访问。只不过生活中我们不用ip地址,我们用域名。
域名最终会被我们的浏览器解释成为ip地址。在进行网络通信时,根本上用的还是ip地址。
http和https是我们默认进行浏览器时使用的协议,这两个协议的端口号默认是固定下来的,http叫做443,https叫做80。
对于客户端,端口号自动分配,但是对于服务端来说他的端口号必须固定,否则一旦改了,客户端就找不到服务了。所以,如果有人问,为什么我们使用http和https访问时没有加端口号,是因为我们在访问http和https的时候,浏览器默认给我们加了端口号。
url
什么是url
我们有时候遇到好看的网页会分享给我们的朋友,而这个网页的链接,就叫做url。全称:统一资源定位符。
统一资源定位符就是说:所有网络上的资源,都可以用唯一的字符串标识,并且可以获取到。
为什么url能够定位资源
这一串字符串中。http或者https,就是端口号,它标识了一台主机上的一个服务;然后,后面的域名,能够表示全网的唯一一台主机;域名后面是资源路径,就能标识主机下的资源路径,即照片,文章等文件在该台主机下的哪个路径下面。这个路径,也叫做web路径。web路径不同于linux的绝对路径和相对路径。他是什么本节不谈。后面再谈。
url字符串中的各个含义
url的参数
上面我们说url中有一个参数。 这个参数如何理解呢?
我们在访问浏览器的时候,我们是不是要搜索?
然后, 我们在搜索输入的内容,其实就是我们访问资源时传进去的参数。
就比如上面,我们搜索helloworld,那么域名后面的q=一个参数,这个参数此时就变成了helloworld.
这里面有一个问题,如果我们输入的参数, 带有ur!的特殊字符。 那么这个时候,提交的这个参数, 就要被编码和解码。 这个编码的过程,叫做encode;这个解码的过程,叫做decode 。
下面看一下解码的规则:
这个解码的规则,其实就是将这个字符按照Asicc码转变为十六进程。
我们平时进行搜索的时候,从来没有编码和解码过, 所以我们不需要担心这个编码和解码, 浏览器默认为我们做了。
HTTP的请求和响应
请求
http的请求和响应都是以行为单位,来排列请求格式。
第一行叫做请求行, 然后后面的许多行内容, 都叫做报头。 报头和第三部分用空格分开, 第三部分叫做请求正文。这里面的一行一行的, 都已/r/n作为分隔符。
其实上面的是逻辑结构, 就类似于二维数组。在内存中, 其实上就是一串的连续空间:
请求行
首先来看请求行, 这个请求行分为三个部分, 每一部分都是用空格分开。 第一个部分是Method。 就是请求的方法,方法只有两种:GET、POST。
第二部分叫做URL, 以空格作为分隔符, 第二部分叫做URL。 就是用来定位资源。
第三部分就是http协议的版本, 一般常见的就是1.0, 1.1, 2.0.
报头
报头是由多行构成的, 每一行都是http请求的属性。 大部分都是Key_Value的结构。
对于正文部分, 我们为了区分正文部分和报头, 所以两部分之间使用了空行分隔:
问题是,虽然报头的最后面试空行,我们就能判断我们是不是读取到了一个完整的报头。也就能保证我们读取到了完整的报头。
但是, 我们怎么保证我们读取到了完整的正文呢?我们怎么保证我们有没有正文呢?所以, 在报头的众多行中。换句话说,在http请求的众多属性中,就有一个属性,用来描述正文部分的长度。这个属性就叫做Content-Length:
所以, 对于请求, 他的整个应该是这样子的:
响应
我们的响应和请求行是类似的。 包头部分内容不变, 都是一些KV属性。
但是正文部分变成了我们要访问的资源。比如html, png, jpg等等。
然后这里讲述一下相应行:关于这个HTTP的version,请求端和响应端都有这个version。当我们使用浏览器进行请求时,浏览器那个版本(request),服务器哪个版本(response),双方要进行交换,然后协商。看看服务端为客户端提供哪些功能。状态码就是404这种,就是表示我们请求的资源的状态状态码描述就是字符串版本的资源状态的描述,也就是解释一下404是什么意思。
telnet进行请求
所以,对于请求和响应,一来一回就是请求和响应。
下面我们用telnet进行一下请求,就能看到,第一行是HTTP/1.1 200 0K,也就是百度服务器的HTTP版本是1.1,然后状态码是200,描述是OK说明我们请求到资源了。然后后面的一堆就是报文,每一行都是一个属性,然后其中由Content-Length。然后还有空行,说明后面是正文。
——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!