图解HTTP协议笔记
只做一些重点笔记,描述性文字就不一一赘述
TCP/IP协议簇
什么是TCP/IP协议簇
我们通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的,而我们的HTTP属于他的一个子集
计算机与网络设备需要相互通信,双方就必须基于相同的方法,也就是要遵循一定的规则,这个规则就称为协议
包括诸如:TCP,IP,FTP,HTTP,UDP,DNS等等
TCP/IP的分层有哪些
应用层、传输层、网络层、数据链路层
分层的好处:每个层次之间可以自由改动,而不需要大规模的改动整体,设计更加简单,类似Java设计模式中的接口隔离原则,我们每层只需要设计我们自己需要的功能即可
各各层次之间的功能
应用层
决定了向用户提供应用服务时通信的活动
TCP/IP协议族预存了各类通信的应用服务,我们常见的FTP,DNS服务就处于这一层,我们的HTTP协议也处在这一层
传输层
传输层对上上层的应用层,提供处于网络连接之间两台主机之间的数据传递
传输层有两个性质不同的协议,一个是TCP:控制传输协议,一个是UDP:用户数据报协议
网络层
用来处理在网络上流动的数据包
数据包是网络传输的最小单位,该层规定了通过怎样的路径(传输路线)到对方的计算机,并把数据包传送给对方
链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件设备驱动、NIC:网络适配器,网卡
TCP/IP传输通信流
举例说明:
客户端在应用层生成数据(HTTP报文),传输层将传递过来的数据报文进行分割,并且在每个报文上面打上标记序号以及端口号发送给网络层,在网络层,加上了作为通信目的地的MAC地址后转发给链路层。
接收端在链路层接收到数据,按序往上传递一直到应用层,这样一个HTTP请求才算完成
接收端在层与层之间传输时,会把对应的首部去掉
什么是IP协议
按层次分,我们的IP网际协议位于网络层,它的作用是把各种数据包传送给对方,而确保传送到对方那里,需要满足各类条件,其中两个重要条件就是IP地址和MAC地址
IP地址
指明了节点被分配到的地址,可以变换
MAC地址
是指网卡所属的固定地址,基本上不可改变
IP间通信依赖于MAC地址,也就是通信一般是需要中转的,我们不能一直保证通信双方一直处于同一局域网下,而进行中转的时候,会利用下一站中专设备的MAC地址来搜索下一个中转目标,采用的是ARP协议
ARP简单来说就是一中用于解析地址的协议,他可以根据通信方的IP地址就可以反差出对应的MAC地址
什么是路由选择
在达到通信目标前的中转过程中,那些计算机和路由器等网络设备只能获取粗略的传输路线,有点类似我们的送快递,只要货物到了集散中心,就可以了
什么是TCP协议
按层次,TCP应该位于传输层,提供可靠的字节流服务
字节流服务
为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。
可靠的传输服务
能把数据精确的传递给对方,夸张的讲,为了保证数据能精确的传递给对方,这里就可以说是三次握手策略
三次握手策略
发送端首先发送一个带有SYN标记的数据包给对方,接收端收到之后,回传一个带有SYN/ACK标志的数据包用来标识传达确认信息。最后发送端再回传一个带ACK标志的数据包,代表握手结束,当然,如果某个阶段被打断,则代表失败,TCP协议会在按照相同的顺序发送相同的数据包,这里是简要介绍一下,更详细的我将会在TCP/IP详解那本书的笔记中解释
什么是DNS服务
DNS服务是和HTTP协议一样位于应用层的协议,他提供了域名到IP地址之间的解析服务
就拿百度来说,他的域名我们大家都清楚www.baidu.com他有很多ip地址其中一个是202.108.22.5,DNS的功能就是我输入www.baidu.com,DNS服务可以查到他的IP地址,相反的,也可以通过ip地址查到他的域名
URI和URL的区别
URI:统一资源标识符
URL:统一资源定位符,我们平常使用较多的是URL,例如我们访问web页面时输入的地址就是URL
URI的格式
表示指定的URI,要使用涵盖全部必要信息的绝对URI、绝对URL以及相对URL。相对URL,是指从浏览器中基本的URI处指定的URL,
绝对URI格式
区别
1、含义bai不同
URI,是uniform resource identifier,统du一资源标识符,用来zhi唯一的标识一dao个资源。
URL是uniform resource locator,统一资源定zhuan位器,它是shu一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
2、位置不同
绝对URL(absolute URL)显示文件的完整路径,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关。
绝对的URI指以scheme(后面跟着冒号)开头的URI,你可以把绝对的URI看作是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。如果使用文件系统作类比,绝对的URI类似于从根目录开始的某个文件的径。
3、表现形式不同
URL:目前URI的最普遍形式就是无处不在的URL或统一资源定位器。
URI是以某种统一的(标准化的)方式标识资源的简单字符串。
通俗的讲
URI强调的是给资源标记命名,URL强调的是给资源定位,但是你会发现,URL显然比URI包含信息更多,我通过URL也可以知道张三是总经理,并且我还知道了他的地址,所以大多数情况下大家觉得给一个网络资源分别命名和给出地址太麻烦,干脆就用地址既当地址用,又当标记名用,所以,URL也充当了WWW万维网里面URI的角色,但是他比URI多了一层意义,我不光知道你叫什么,我还知道你在哪里。我们在浏览器输入的都是URL,因为我们输入的目的是为了找到某一个资源,当然你输入的是URI也是没错的,因为URL也是URI。
总结:URI标记了一个网络资源,仅此而已; URL标记了一个WWW互联网资源(用地址标记),并给出了他的访问地址。
——解决思路———————-
url是一个地址,uri是一个资源。
你最好去了解下rest和odata,这样对uri的理解可以深刻些。
HTTP协议
关于请求报文,请求体,字段代表的含义,我在这里就不多少了,因为太多太繁杂,且有一定的基础都明白,我这就调个人觉得重要的做笔记
不保存状态协议
什么是不保存状态协议
我们听了很多说HTTP是不保存状态的协议,不保存状态协议即无状态协议,HTTP协议自身不对请求和响应之间的通信状态进行保存,也就是说在HTTP这个级别,是不做持久化处理的,HTTP是无状态的,也就是说,它是不对通信状态进行保存的。它并不知道之前通信的对方是谁。这样设计的目的就是为了让HTTP简单化,能够快速处理大量的事务!
也就是说,上一次的请求对这次的请求没有任何影响,服务端也不会对客户端上一次的请求进行任何记录处理。
但是现如今很多需要保持状态的会话,我们就引入了很多技术,例如cookie技术,我们后续会提到
如何解决HTTP无状态的问题?
可以通过Cookie和Session来保存状态信息。
Cookie和Session有以下明显的不同点:
1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。
持久连接节省通信量
什么是持久连接
HTTP协议的早期版本,没进行一次通信就要断开一次连接,也就是说完成三次握手,就要进行一次断开连接,现如今一个网站包含很多内容,请求会很多,请求图片,文档等等等等,就产生了大量的通信量开销
为了解决这种问题,HTTP引入了持久连接
定义
-
非持久连接:每个连接处理一个请求-响应事务。
-
持久连接:每个连接可以处理多个请求-响应事务。
持久连接情况下,服务器发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。任意一段没有明确断开连接,则会TCP的链接状态
- HTTP/1.0 使用非持久连接。 HTTP/1.1 默认使用持久连接。
关于这点有很多优秀的博客
例如https://blog.csdn.net/neninee/article/details/79634187?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160804378819724848187398%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=160804378819724848187398&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-79634187.first_rank_v2_pc_rank_v29&utm_term=%E6%8C%81%E4%B9%85%E8%BF%9E%E6%8E%A5
https://blog.csdn.net/liqing19850102/article/details/12041491?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160804378819724848187398%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=160804378819724848187398&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-12041491.first_rank_v2_pc_rank_v29&utm_term=%E6%8C%81%E4%B9%85%E8%BF%9E%E6%8E%A5
什么是管线化
持久连接使得多数请求得以管线化的形式发送,不用一个一个等待着发送请求,可以同时发送请求