关于http协议的详细分析

一、OSI七层模型和TCP/IP模型及对应协议

七层模型,亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
在这里插入图片描述
1.七层模型

OSI七层模型基本作用
application layer(应用层)为应用程序提供网络服务
presentation layer(表示层)数据格式化、加密、解密
session layer(会话层)建立、维护、管理会话连接
transport layer(传输层)建立、维护、管理端到端连接
network layer(网络层)IP寻址和路由选择
data link layer(数据链路层)控制网络层与物理层之间的通信
physical layer(物理层)比特流传输

2.七层模型相关协议

OSI七层模型功能TCP/IP协议族
应用层文件传输、电子邮件、文件服务、虚拟终端TFTP、HTTP、SNMP、FTP、SMTP、DNS、RIP、Telnet
表示层数据格式化,代码转换,数据加密没有协议
会话层解除或建立与别的接点的联系没有协议
传输层提供端对端的接口TCP,UDP
网络层为数据包选择路由IP、ICMP、OSPF、BGP、IGMP、ARP、RARP
数据链路层传输有地址的帧以及错误检测功能SLIP、CSLIP、PPP、MTU、ARP、RARP
物理层以二进制数据形式在物理媒体上传输数据ISO2110、IEEE802、IEEE802.2

3.数据传输过程
在数据的实际传输中,发送方将数据送到自己的应用层,加上该层的控制信息后传给表示层;表示层如法炮制,再将数据加上自己的标识传给会话层;以此类推,每一层都在收到的数据上加上本层的控制信息并传给下一层;最后到达物理层时,数据通过实际的物理媒体传到接收方。接收端则执行与发送端相反的操作,由下往上,将逐层标识去掉,重新还原成最初的数据。
由此可见,数据通讯双方在对等层必须采用相同的协议,定义同一种数据标识格式,这样才可能保证数据的正确传输。
(1)物理层Physical(以二进制数据形式在物理媒体上传输数据)
作用:数据实际传输。
科学家要解决的第一个问题是,两个硬件之间怎么通信。具体就是一台发些比特流,然后另一台能收到。于是,科学家发明了物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是数模转换与模数转换)。这一层的数据叫做比特。
(2)数据链路层Data Link(传输有地址的帧以及错误检测功能)
作用:MAC地址编址,MAC地址寻址,差错校验。
现在通过电线我能发数据流了,但是我还希望通过无线电波,通过其它介质来传输,还要保证传输过去的比特流是正确的,要有纠错功能。
于是,发明了数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
(3)网络层Network(为数据包选择路由)
作用:IP地址编制,路由选择(静态路由和动态路由)。
如果我有多台计算机,怎么找到我要发的那台。或者,A要给F发信息,中间要经过B,C,D,E,但是中间还有好多节点如K,J,Z,Y。我怎么选择最佳路径?这就是路由要做的事。
于是,发明了网络层。即路由器,交换机那些具有寻址功能的设备所实现的功能。这一层定义的是IP地址,通过IP地址寻址。所以产生了IP协议。
(4)传输层Transport(提供端对端的接口协议,TCP/OCP等)
作用:对报文进行分组(发送时)、组装(接收时),提供传输协议选择、TCP(传输控制协议)或者UDP(用户数据报协议),端口封装,差错校验。
现在我能发正确的比特流数据到另一台计算机了,但是当我发大量数据时候,可能需要很长时间。例如发送一个视频格式的数据,网络会中断好多次(事实上,即使有了物理层和数据链路层,网络还是经常中断,只是中断的时间是毫秒级别的)。
那么,我还要保证传输大量文件时的准确性。于是,我要对发出去的数据进行封装。就像发快递一样,一个个地发。
TCP是用于发大量数据的,我发了1万个包出去,另一台电脑就要告诉我是否接受到了1万个包,如果缺了3个包,就告诉我是第1001,234,8888个包丢了,那我再发一次。这样,就能保证对方把这个视频完整接收了。
UDP是用于发送少量数据的。我发20个包出去,一般不会丢包,所以,我不管你收到多少个。在多人互动游戏,也经常用UDP协议,因为一般都是简单的信息,而且有广播的需求。如果用TCP,效率就很低,因为它会不停地告诉主机我收到了20个包,或者我收到了18个包,再发我两个。如果同时有1万台计算机都这样做,那么用TCP反而会降低效率,还不如用UDP,主机发出去就算了,丢几个包你就卡一下算了,下次再发包你再更新。
(5)会话层Session(解除与建立与别的接口的联系)
作用:确定数据是否要经过网络传输。
现在我们已经保证给正确的计算机,发送正确的封装过后的信息了。但是用户级别的体验好不好?难道我每次都要调用TCP去打包,然后调用IP协议去找路由,自己去发?当然不行,所以我们要建立一个自动收发包,自动寻址的功能。于是,发明了会话层。会话层的作用就是建立和管理应用程序之间的通信。
(6)表示层Presentation(数据格式化,代码转换,数据加密)
现在我能保证应用程序自动收发包和寻址了。但是我要用Linux给window发包,两个系统语法不一致,就像安装包一样,exe是不能在linux下用的,shell在window下也是不能直接运行的。于是需要表示层,解决不同系统之间的通信语法问题。
(7)应用层Application(文件传输,电子邮件,文件服务,虚拟终端)
作用:传输的数据根据应用层的协议进行服务。

二、TCP/IP四层模型

1.四层模型简介

四层模型功能与协议
应用层Hytera自由传输协议
传输层TCP、UDP
网络层IP、ICMP
物理链路层根据需求选择不同物理链路

在这里插入图片描述
2.OSI七层和TCP/IP四层的关系

(1)OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。

(2)OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。

(3)OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
TCP:transmission control protocol 传输控制协议
UDP:user data protocol 用户数据报协议

3.TCP/IP数据包说明
IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP段,属于端到端的传输;
在这里插入图片描述

三、TCP的三次握手、四次挥手

1.TCP报文
在这里插入图片描述

序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号

确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加1。只有ACK=1时才有效。

ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息

SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接

FIN:结束标志,用于释放连接,为1表示关闭本方数据流

2.三次握手
在这里插入图片描述

第一次:客户端发送初始序号x和syn=1请求标志

第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1

第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1

3.四次挥手
在这里插入图片描述

第一次:客户端请求断开FIN,seq=u

第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v

第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1

第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1
四、HTTP协议分析

1.http协议简介
http超文本传输协议,互联网应用最为广泛的应用,通常用在web客户端使用web浏览器访问时使用的协议,HTTP协议是建立在TCP协议之上的一种应用。 常用的浏览器有火狐浏览器、windows系统自带的IE浏览器、谷歌浏览器,当我们想要访问一个网页时,在浏览器中输入对应的网址(例如访问www.baidu.com),就可以看到我们想要是访问的页面,那么这个背后到底是怎么实现的呢?作为普通的上网者不会去关注实现的过程,但是作为一个运维人员或从事互联网相关岗位的人员,需要清晰的掌握是其背后实现的过程。
2.用户访问网站的基本流程
在这里插入图片描述

第一步:用户在浏览器中输入想要访问页面(例如[www.baidu.com](http://www.baidu.com))回车后系统首先会在本地查找是否有DNS缓存或者查看hosts文件中是否有记录,如果有就直接从本地获取对应的IP地址,一般用户第一次请求是没有缓存记录的,hosts文件通常用来做内部测试使用的。

第二步:系统将浏览器的解析请求交给客户端本地配置的dns服务器让其解析(Ldns local dns),如果有就直接返回客户端的相应的解析记录,客户端本地缓存dns解析记录,如果没有dns服务器将请求交给其他dns服务器。

第三步:LDNS将请求交给dns服务器从(.)根开始请求对[www.baidu.com域名对应的IP](http://www.baidu.com域名对应的IP)地址,并根据各层级分层查找,如果还没有找到,表示企业的域名管理员没有将域名配置完成,即网站域名还有配置完成,找到baidu.com对应的解析记录(例如1.1.1.1)。

第四步:dns服务器将对应的解析记录交给ldns服务器,ldns服务将解析缓存起来,通常缓存有TTL生存值。

第五步:dns服务器返回给客户端解析记录,客户端将解析记录缓存到本地,下次访问的时候能够快速访问网页。

第六步:客户端浏览器获取到了www.baidu.com对应的IP地址,接下来,浏览器会请求获得IP地址对应的服务器,网站服务器收到请求后返回相应的数据。
五、http协议相关介绍

http:Hyper Text Transfer Protocol(超文本传输协议),是互联网应用最为广泛的一种网络协议,主要用于Web服务。通过计算机处理文本信息,格式为HTML(Hyper Text Mark Language)超文本标记语言来实现。
http协议www(万维网,简称web)应用b/s结构(browser/server)浏览器/服务器架构。HTTP协议诞生发展到现在经历了若干版本,其中最主要的版本为HTTP 1.0,HTTP 1.1, http 1.0是第一个得到广泛使用的版本,http 1.1为当前使用的主流版本。

1.HTTP 0.9简介
此版本已经过时,它的组成很简单,只允许客户端发送GET请求,而且还不支持请求头。由于没有协议头,造成了http 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言。仅用于用户传输html文档,因为网络的快速发展,只能看网页已经不能满足日常需求,会有视频,图片等需求,所以就出现了升级版本。

2.HTTP 1.0简介
第一个得到广泛使用的http版本,http 1.0在http 0.9的基础上增加了HTTP请求头,可支持更多的请求方法,并且能够对多媒体对象进行处理(如图像,视频)。http 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立TCP连接,服务器完成请求处理后断开TCP连接,服务器不跟踪每个客户,也不记录过去的请求。
(1)引入MIME(Multipurpose Internet Mail Extesions)机制:多用途互联网邮件扩展,引入这个技术后,http可以发送多媒体(比如视频 、音频等)信息。此机制让http不再只支持html格式,还支持其他格式来进行发送了。
(2)引入了keep-alive机制,支持持久连接的功能(但keep-alive原理是在首部添加了某个字段而形成的,并非原生就支持此功能)。
(3) 引入支持缓存功能。
3.HTTP 1.1简介
重点是修复了http设计中的缺陷,从可扩展性、缓存处理、带宽优化、持久连接、host头(讲解web虚拟主机)、错误通知、消息传递、内容协商等多个方面做了相关的改进,http 1.1是当前互联网主流的http版本。
在连接方面http 1.1支持持久连接,在一个tcp连接上可以传送多个http请求和响应,减少了建立和关闭连接的消耗和时间延迟,原生直接支持持久连接功能(presistent)。
在请求头方面,http 1.1增加了更多的请求头和响应信息,用来增强http功能,例如host主机头功能,可以让web浏览器使用主机头来明确表示要访问服务器的哪个web站点,这样就可以使用web服务器在同一个IP地址和端口号上配置多个虚拟web站点。
http 1.1的持久连接,也需要增加新的请求头来帮助实现。
例如:
connection请求头的值为keep-alive时,表示客户端通知服务器返回本次请求结果后保持连接;
connection请求头的值为close时,表示客户端通知服务器返回本次请求结果后关闭连接。http 1.1还提供了身份认证和状态管理和cache缓存机制相关的请求头和响应头等。
4.http 2.0简介
提供了HTTP语义优化的传输。spdy:google引入的一个技术,能够加速http数据交互,尤其是使用ssl加速机制,但是spdy现在用的还不多。
目前常用的版本就是http 1.0和http 1.1版本。

六、Web网页资源类型

1.HTML文本架构

<html>
     <head>  #设置文档头部 
          <title> TITLE </title>  #设置文档标题 
     </head> 
         <body>  #网页文件内容 
               <h1>H1</h1>  #最大的标题(一号标题) 
               <p></p>  #创建一个段落 
               <h2>H2</h2>  #二号标题 
         <p><a href="admin.html">ToGoogle</a></p>  #创建指向位于文档内部书签的链接 
         </body> 
</html>

2.HTML文档的生成方式
静态:开发者编写什么就显示什么,一旦编写完成,就不会有任何改变。静态页面的维护和更新相对比较麻烦,静态页面一般适用更新较少的宣传展示网站。
动态:通过编译语言编写的程序后输出html格式的结果。
动态语言有:php,jsp,asp,.net等。
备注:这些脚本都必须有相应的解释器,比如说php需要有php解释器。
3.静态和动态的方式
(1)静态
在这里插入图片描述
过程详解

(1)Web服务器向内核注册socket;

(2)客户端通过浏览器,向Web服务器发起request;

(3)Web服务器收到客户端的request;

(4)如果用户请求的资源在服务器本地,http服务会向系统内核申请调用;

(5)内核调用本地磁盘里的数据,并将数据发给http服务;

(6)http将用户请求的资源通过response报文,最终响应给客户端;

特点

(1)每个页面都有一个固定url地址,一般以html等形式为后缀,而且地址中不含有?或&特殊符号;

(2)网页内容发布到网站服务器上,无论是否有用户访问,每个页面的内容都是保存在网站服务器文件系统上,也就是说静态网页是实实在在存在服务器上的文件,每个网页都有一个独立的文件;

(3)网页内容固定不变,因此容易被搜索引擎收录(优点);

(4)当网站信息量很大时完全依靠静态网页比较困难(缺点);

(5)网页的交互性差,在程序和功能实现方面有很大的限制(缺点);

(6)能够接受更多的并发访问量;

常见扩展名

纯文本文件:.html、.htm、.xml、.shtml、.js、.css等;

图片类文件或数据文档:.jpg、.gif、.png、.bmp、.txt、.doc、.ppt;

视频类流媒体文件:.mp4、.swf、.avi、.wmv、.flv;

(2)动态
在这里插入图片描述
过程
与静态不同的是,如果用户请求的是动态内容,那么此时http服务会调用后端的解析器,由动态语言去处理用户的请求,如果需要请求数据,会向内核申请调用,从而向磁盘中获取用户指定的数据,通过解释器运行,运行的结果通常会生成html格式的文件。然后构建成响应报文,最终发回给客户端。
特点

(1)动态网页的url后缀是.php、.jsp、.asp、.netd,一般在动态网页网址中会有标志性的符号?或&,在大多数情况下后端都需要数据库支持,服务器上有相应的解析程序来运行动态网页;

(2)动态网页可以实现更多的功能(用户注册、登录、在线调查、订单管理等);

(3)动态网页并不是独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并可能通过读数据库来返回一个完整的网页内容,例如每个用户的登录账号密码;

(4)动态网页中的?,在搜索引擎的收录方面存在一定的问题,搜索引擎一般不会从一个网站的数据库访问全部页面,或者处于技术方面的考虑,所有蜘蛛一般不会抓取网址中?后面的内容,因此在企业通过搜索引擎进行推广时,需要针对采用动态网页的网站做一定的技术处理(伪静态技术),以便适应搜索引擎的抓取要求。

4.http协议的报文
HTTP报文中存在很多行的内容,一般是由ASCII码串组成,各字段长度是不确定的。
HTTP的报文可分为两种:请求报文与响应报文
(1)request Message(请求报文)
客户端 -→ 服务器端
由客户端向服务器端发出请求,不同的网站用于请求不同的资源(html文档)。
请求报文格式

请求行 + 请求首部 + 空白行 + 请求实体

注意:http请求头部格式的长度是可变的。
在这里插入图片描述
请求行
由请求方法字段+请求URL字段+HTTP协议版本组成,用来标识客户端请求资源时使用的请求方法,请求的资源,请求的协议版本是什么,它们直接使用“空格”进行分隔。

method:表示请求的方式。
常见的方式有get、head、post、put等。

request-URL:请求的是哪个资源,哪个URL。
可以是相对路径,如/images/log.jpg,也可以是绝对路径,如http://www.baidu.com/images.banner.jpg

version:请求的协议版本是什么,http协议版本,格式HTTP/<major>.<minor>,例如HTTP/1.0,HTTP/1.1;

HTTP请求方法
常用的HTTP请求方式是GET、POST、HEAD。
在HTTP通信过程中,每个HTTP请求报文中都会包含一个HTTP请求方法,用于告知客户端向服务器端请求执行某些具体的操作,下面列举几项常用的HTTP请求方法。

http请求方法描述
GET用于客户端向服务器发送请求资源信息,并返回资源信息。通常是可以缓存,相当于你问别人借东西,别人需要将东西借给你,你需要得到具体的资源。
Head跟GET方法类似,但不需要服务器响应请求资源,而返回头部响应首部。只需要响应首部即可,就是告诉我有或者没有,不需要缓存界面给我。
POST基于html页面将数据发送给服务器,服务器通常需要存储提交的数据,通常存放在mysql这种关系型数据库中。比如:需要存储用户账户和密码一般会采用post方式。
PUT与GET方式相反,向服务器发送资源,服务器通常需要存储此资源(存放位置通常是文件系统)。比如:使用你在博客网站也写了一篇文档,保存到服务器中就需要采用put。
DELETE请求服务器端删除URL指定的资源。
MOVE请求服务器将指定的页面移至另一个网络地址。
OPTIONS探测服务器端对请求的URL所支持使用的请求方法。
TRACE跟踪一次请求过程中所经历的代理服务器、防火墙或者网关等。

URI(Uniform Resource Identifier)统一资源标示符
用于标识某一互联网资源名称的字符串,通过这种标识来允许用户对资源可通过特定的协议进行交互操作。在Web上可用的每种资源,包括HTML文档、图像、视频片段、程序等,由一个通用资源标识符进行定位。所以我们可以使用URI来标识每个资源的名称。
URL(Uniform Resource Locator)统一资源定位符
用于描述一个特定服务器上某资源的特定位置。
对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的url,它包含的信息指出文件的位置以及浏览器怎么处理它。
URL的格式分为三个部分

i. scheme(方案)(也叫协议):http://

ii. Internet 地址:一般这个地址指的是服务器:www.baidu.com:8080

iii. 特定服务器上的资源:download/bash-4.3.1-1.rpm

下图是用wireshark工具抓取http请求报文的显示结果。在首部后的“\r\n”表示一个回车和换行,以此将该首部与下一个首部隔开。
在这里插入图片描述
下图是curl命令获取http请求报文。
在这里插入图片描述
请求首部
由关键字+关键字的值组成,之间使用“:”进行分隔,格式Name: Value,请求首部的作用是通过客户端将请求的相关内容告知服务器端。
HEADERS:首部可以不止一个。
在这里插入图片描述

Client-IP:客户端IP地址;

Host:请求主机,可以基于域名或者IP;

Referer:指明了请求当前资源原始资源的url,使用referer可以防盗链;

User-Agent:用户代理,一般而言是浏览器;

Accept首部:指客户端可以接受哪些编码的类型;

Accept:服务端能够发送的媒体的类型;

Accept-Charset:接受的字符集;

Accept-Encoding:支持压缩的压缩格式;

Accept-Lanage:所能接受的语言编码格式;

空白行
请求首部之后会有一个空白行,通过发送回车字符和换行符,用于通知服务器端以下的内容将不会再出现请求首部的信息。
请求实体
用户需要请求的内容到底是什么。
在这里插入图片描述
条件式请求首部:(http 1.1才会使用到)
当发送请求时,先问问对方是否满足条件,如果满足条件就请求,不满足就不请求。
跟安全相关的请求:
Authorization
Cookie
Upgrade-Insecure-Requests:升级不安全的请求。如访问百度
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
响应报文格式

起始行 + 响应首部 + 空白行 + 响应实体

在这里插入图片描述
起始行
也称为状态行,用于服务器端响应客户端请求的状态信息。
由版本号+状态码+原因短语组成,例如“ HTTP/1.1 200 OK”。

<version>: 响应时客户端请求的是什么版本,服务器端就需要响应什么版本。

<status>: 请求的状态码是什么。

<reason-phrase>: 响应状态码的信息是什么,原因短语,这个状态码所响应的意义,易读信息。
状态码说明
1XX信息状态码,用于指定客户端相应的某些操作。
2XX成功状态码,请求一个资源,这个资源在,表示成功。
3XX重定向状态码,有时返回的是一个新地址,而非结果。
4XX客户端类错误,请求的资源不存在,或者请求时,这个资源拒绝访问,没有权限。
5XX服务器类的错误信息,向服务器发起请求,服务器发现需要运行一个脚本,从而调用解析库。如果在调用过程中出错就会出现这个情况。或者脚本有语法错误,也可以导致这个问题。

常见状态码

状态码说明
200http请求访问成功返回的状态码。
201文件上传成功后返回状态码。
307Internal Redirect 内部重定向。
301move permanently,永久重定向,会返回一个地址,并告诉你所请求的地址将永久挪到那个新地址了。
302found,临时重定向,临时放到某个地方,会在响应报文中使用“location:新位置”。
304not modified,资源没有做任何修改。
403forbidden,请求被拒绝。
404not found,请求的资源不存在。
405method not allowed,使用的方法不被允许,不支持。
500internal server error,服务器内部错误。
502bad gateway,代理服务器从上游服务器收到一条伪响应;上一层服务器返回一个无法理解的报文,所以代理服务器就会表示错误。
503service unavailable,服务暂时不可用。

响应首部
在这里插入图片描述
参数解释

Accept-Ranges:服务器支持的请求:字节。

Cache-Control:缓存类型。

No-cache:代表不缓存过期资源,缓存会向源服务器进行有效确认。

No-store:代表不进行任何缓存。

Proxy-revalidata:表示共享缓存,如果本地已经有缓存,还要去检查是否有改变。

No-transform:不得对资源进行转换或转变。

Private:用缓存的内容回应先访问该资源的用户。

Connection:持久连接http/1.1中采用的协议。

Content-Length:传输长度。

Content-Type:服务器发送或接受的mime类型。

DATE:当前的gmt时间,表示消息发出的时间,相差8个小时。

Last-Modified:需要和expires结合使用,用来控制请求文件的有效时间,当请求的资源子有效时间,从本地缓存中获取数据,当有效时间过期后才从服务器更新数据。

Pragma:表示是否缓存。

Servre:服务器web服务的版本。

Etag:在网络上有一些缓存服务器,另外,浏览器自身也有缓存功能。
基于一个前提:图片不会经常改动,服务器在返回状态码时200同时在etag中添加一个标签,当浏览器再次访问该图片的时候,就会去服务器校验这个值,如果图片没有变化,直接使用缓存里面的值,这样可以减轻服务器的负担,有加快了访问速度。

Cookie相关的HTTP拓展头
(1)Cookie:客户端将服务器设置的Cookie返回到服务器;
(2)Set-Cookie:服务器向客户端设置Cookie;
(3)Cookie2(RFC2965):客户端指示服务器支持Cookie的版本;
(4)Set-Cookie2(RFC2965):服务器向客户端设置Cookie。
RFC2965:w3c定义的cookie的标准的第二个版本

Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。

Cookie的流程
服务器在响应消息中用Set-Cookie头将Cookie的内容回送给客户端,客户端在新的请求中
将相同的内容携带在Cookie头中发送给服务器。从而实现会话的保持。
流程如下图所示:
在这里插入图片描述
类似请求报文,起始行后面一般有若干个头部字段。每个头部字段都包含一个名字和一个值,两者之间用冒号分割。格式 Name:Value。
例如:
Content-Type: test/html; charset=utf-8
Content-Length: 78
在这里插入图片描述
空白行
最后一个响应首部信息之后就是一个空行,通过发送回车符和换行符,通知客户端空行下无首部信息。
响应实体
响应实体中装载了要返回给客户端的数据。这些数据可以是文本,也可以是二进制(例如图片、视频)。
在这里插入图片描述
5.http的事务
包含了一个HTTP请求,和对应请求的响应就叫做一个http事务,也可以说http事务就是一个完整的HTTP请求和HTTP响应的过程。
http协议默认情况下每个事务都会打开和关闭一个新的连接,所以会相当耗费时间和带宽,由于TCP慢启动特性,所以每条新的连接的性能本身就会有所降低,所以可打开的并行连接的数量上限是有限的。所以使用持久连接这种模式比默认情况下不使用持久连接的方式会好一点,它的好处表现在其请求和tcp断开的过程所消耗的时间会被减少。
6.HTTP资源
资源就是通过HTTP协议可以让用户通过浏览器或用户代理能够通过基于http协议向服务器端请求并获取的内容,像html文档,一张图片等。
资源类型:是通过MIME进行标记。
格式:major/minor 主标记和次标记
常用MIME类型

MIME类型文件类型
test/htmlhtml、htm文本类型
text/plaintext文本类型
image/jpegjpeg图像类型
image/gifgif图像类型
vedio/mpeg4音频标记类型
application/vnd.ms-powerpoint动态资源的标记方式

CGI
Common Gateway Interface(通用网关接口)
在这里插入图片描述
web服务器发现需要执行脚本,就通过CGI协议跟后端的应用程序打交道,把用户的请求动态交给服务器,这个服务器的结果通过CGI协议返回给http服务器。
7.其它相关知识
(1)一次Web资源请求的具体过程。

(1)客户端在Web浏览器输入需要访问的地址;

(2)Web浏览器会请求DNS服务器,查询解析到指定域名和Web服务器的地址;

(3)客户端与请求的Web服务器端建立连接(TCP三次握手);

(4)TCP建立成功之后,发起HTTP请求;

(5)服务器端收到客户端HTTP请求之后,会处理该请求;

(6)处理客户端指定请求的资源;

(7)服务器构建响应报文,响应给客户端;

(8)服务器端将此信息记录到日志中;

(2)http如何并发的接收多个用户请求。
因为http默认是工作在阻塞模型下的,默认一次只接收一个请求,处理完请求后再去接收下一个请求,所以只能一个一个来。
所以我们希望并发响应用户请求,需要多进程模型。web服务器自己会生成多个子进程响应用户请求,也就是说,当一个用户请求发到Web服务器,Web主进程不会直接响应用户请求,而是生成一个子进程响应这个用户请求,这样当子进程和此用户建立连接之后。Web的主进程就会再等待另一个用户的请求,当第二个用户请求过来之后,再生成一个子进程响应第二个用户请求。以此类推。所以每一个用户请求都由一个子进程来处理。

七、开源协议的介绍

在这里插入图片描述
1.BSD
BSD开源协议是一个给予使用者很大自由的协议。基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。但"为所欲为"的前提是当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

1.如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议;

2.如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议;

3.不可以用开源代码的作者/机构名字和原来产品的名字做市场推广;

协议介绍
BSD开源协议(original BSD license、FreeBSD license、Original BSD license)是一个给于使用者很大自由的协议,BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
2.Apache Licence 2.0
(Apache License, Version 2.0、Apache License, Version 1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

需要给代码的用户一份Apache Licence;

如果你修改了代码,需要在被修改的文件中说明;

在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、商标、专利声明和其他原来作者规定需要包含的说明;

如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布或销售。
3.GPL
(GNU General Public License)
我们很熟悉的Linux就是采用了GPL。GPL协议和BSD,Apache Licence等鼓励代码中用的许可很不一样。GPL不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织以及商业软件公司开发的免费软件了。
GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。
4.LGPL
(GNU Lesser General Public License)
LGPL是GPL的一个主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。
但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
5.MIT
(The MIT License)
MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他限制。也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。
6.MPL
(Mozilla Public License)
MPL协议允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者。这种授权维护了商业软件的利益,它要求基于这种软件的修改无偿贡献版权给该软件。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值