简介
HTTP协议是Hyper Text Transfer Protocol
(超文本传输协议)的缩写,是用于从万维网(www:World Wide Web
)服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务器框架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,想客户端发送响应信息。
一、HTTP协议
1.HTTP特点
-
简单快速
: 客户向服务器请求服务时,只需要传送请求方法和路径。请求方法常用的有GET、HEAD、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 -
灵活
: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 -
无连接
: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 -
无状态
: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 -
支持B/S及C/S模式
2.URL的作用
URL,全称是UniformResourceLocator,中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:
从上面的URL可以看出,一个完整的URL包括以下几部分:
-
协议部分
: 该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的"//"为分隔符 -
域名部分
: 该URL的域名部分为“www.aspxfans.com”。 一个URL中,也可以使用IP地址作为域名使用 -
端口部分
: 跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口 -
虚拟目录部分
: 从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是"/news/" -
文件名部分
: 从域名的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名 -
锚部分
: 从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分 -
参数部分
: 从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分,查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
URI和URL的区别
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的URI一般由三部分组成:
-
访问资源的命名机制
-
存放资源的主机名
-
资源自深的名称,由路径表示,着重强调于资源
URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
采用URL可用用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部分组成:
- 协议(或称为服务方式)
- 存有该资源的主机IP地址(有时也包括端口号)
- 主机资源的具体地址。如目录和文件名等
URI是以一种抽象的,高层次概念定义统一资源标识,而且URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个URL都是URI,但不一定每个URI都是URL。这是因为URI还包括一个子类,即统一资源名称(URN),它命名资源但不指定如何定位资源。上面的mailto、news和isbn URI都是URN的示例。
3.请求响应
请求request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request line
)、请求头部(header
)、空行和请求数据四个部分组成。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
Get请求例子,使用Charles抓取的request:
第一部分
:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。
GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
第二部分
:请求行,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
第三部分
:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
第四部分
:请求数据也叫主体,可以添加任意的其他数据。
POST请求例子:
第一部分
:请求行,第一行明了是post请求,以及http1.1版本。(从0开始)
第二部分
:请求头部,第二行至第六行。
第三部分
:空行,第七行的空行。
第四部分
:请求数据,第八行。
响应response
一般情况下,服务器接收并处理客户端发过来的请求后会放回一个HTTP的响应消息。HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
。
例子:
第一部分
:状态行,由HTTP协议版本号,状态码,状态消息 三部分组成。
第一行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分
:消息报头,用来说明客户端要使用的一些附加信息。
第二行和第三行为消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分
:空行,消息报头后面的空行是必须的
第四部分
:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
常见状态码
:
- 200 OK //客户端请求成功
- 400 Bad Request//客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized//请求未经授权,这个状态代码必须和WWW- Authenticate报头域以前使用
- 404 Not Found//请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error//服务器发生不可预期的错误
- 503 Server Unavailable//服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP请求方法有
HTTP1.0定义了三种:GET
,POST
和 HEAD方法
。
HTTP1.1新增五种:OPTIONS
,PUT
,DELETE
,TRACE
和CONNECT
方法。
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 注意:
- 方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
- HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
4.三次握手&四次挥手
TCP协议的三次握手,四次挥手过程解析:
这图书本上有:
HTTP2.0 全双工,半双工。
第一次握手
:发送syn(seq=x)包时,希望像接收端建立连接,并初始化序列号。此时发送端进入syn_sent状态
第二次握手
:接收端接收到了syn包,发送ack+syn包,并初始化序列号,并将发送的序列号+1放入确认应答号中。此时接收端进入syn_rcvd状态
第三次握手
:发送ack包,给确认应答号+1,表示收到了接收端的报文,进入establelisten状态服务端收到了客户端的报文后,也进入了establelisten状态
注意
:这里的第三次握手是可以携带数据的,因为发送端已经确认了服务端有接受和发送的能力。而其他两次并没有确认对方的接受能力
为什么说三次握手呢?而不是两次,四次?
-
避免旧的重复连接初始化造成混乱
:
假设我们发送端前面发送了一个序列号为90的syn报文,此时网络中拥塞了,此时发送端可能会连续发起多次请求。但是此时的序列号为90的报文也到了,如果是两次握手的话,接收端接受到就会进入establelisten状态(进入这个状态后就可以发送数据),然而当发送方判断这是一个历史连接,发送RST报文终止连接,但此时服务端已经进入了establelisten状态,并且可能发送了数据。断开的话,白白造成了服务端的资源浪费。为了避免旧的重复连接,必须在建立连接之前就杀掉这个重复连接,这就必须要三次握手才能实现 -
同步初始化序列号
:
序列号的作用:
- 使对方有序的接受数据包
- 避免对方接收重复的数据包
- 可以知道自己发送出去的数据包,哪些是被接收的
三次握手的话,客户端发送一个syn报文,服务端接受到后发送syn+ack报文,表示客户端的初始化序列号已经收到。客户端在回复ack报文,表示服务端的初始化序列号也已经收到。这样才能确保双方序列号都被同步了。如果是两次握手,只能保证一方的序列号被成功接收
-
防止资源浪费
:
客户端发送syn报文时,可能被网络拥塞了,也有可能服务端的ack+syn报文拥塞了,那么客户端就会重发syn报文。如果是两次握手的话,服务端每来一个syn报文,就会建立一个连接,这样就会造成冗余连接,造成不必要的资源浪费
小结
:
为什么不使用两次握手:无法防止历史连接的建立,会造成资源浪费,不能同步双方序列号 为什么不使用四次握手:三次握手已经足够,再多一次握手只会造成更多的连接时延
第一次挥手
:主动断开方(客户端,服务的都可以)向对方发送一个FIN结束请求报文,并设置序列号和确认号,随后主动断开方进入FIN_WAIT1
状态,这表示主动断开方已经没有业务数据要发给对方了,准备关闭SOCKET
连接了。
第二次挥手
:被动断开方收到FIN断开请求后会发送一个ACK响应报文,表明同意断开请求。随后被动断开方就进入CLOSE-WAIT状态(等待关闭状态),此时若被动断开方还有数据要发送给主动方,主动方还会接受。被动方会持续一段时间。 主动方收到ACK报文后,由FIN_WAIT_1转换成FIN_WAIT_2状态。
第三次挥手
:被动断开方的CLOSE-WAIT(等待关闭)结束后,被动方会向主动方发送一个FIN+ACK
报文 表示被动方的数据都发完了。然后被动方进入LAST_ACK状态。
第四次挥手
:主动断开方收到FIN+ACK
断开响应报文后,还需进行最后确认,向被动方发送一个ACK确认报文,然后主动方进入TIME_WAIT状态,在等待完成2MSL时间后,如果期间没有收到被动方的报文,则证明对方已正常关闭,主动断开方的连接最终关闭。 被动方在收到主动方第四次挥手发来的ACK报文后,就关闭了连接。
简单理解:
第一次:主动方:我要断开连接(FIN) 第二次:被动方:好的,知道了,但我还有些数据要发(ACK),等我发完 第三次:被动方:我的数据已经发完了(FIN+ACK) 第四次:主动方:确认没有了吗?(ACK),没有我就关了哦。 被动方:看来他要关了。
SYN
:同步序列编号(Synchronize Sequence Numbers)
Client将标志位SYN设置为1
,随机产生一个值seq=1 该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段种第一个字节的序列编号。
ACK
:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统以及成功接收所有数据。
序列号
:在建立连接时就由计算机随机生成,每发送一次数据,该序列号+1,用来解决网络中包乱序的问题
确认应答号
:表示下一次期望收到的报文序列号,表示以前的数据报都已经收到了,用来解决网络中丢包的问题
控制位
:
ACK:该位为1时,确认应答号是有效的,除了建立连接开始的syn包时,其他包该位必须为1 RST:该位为1时,表示出现异常,强制连接断开 SYN: 该位为1时,表示希望建立连接,并且初始化序列号 FIN: 该位为1时,希望正常断开连接,通信双方互相交换FIN,表示可以断开
5.OSI七层协议
OSI 七层 由 底向上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
简化后的四层分别是:主机到网络层(比特)、网络层(数据帧)、传输层(数据包)、应用层(数据段)。
1.应用层
应用层是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。
应用层为用户提供的服务和协议:文件传输服务(FTP
)、远程登录服务(ssh
)、网络管理服等。
上述的各种网络服务由该层的不同应用协议和程序完成。
应用层的主要功能如下:
用户接口
:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。
实现各种服务
:该层具有的各种应用程序可以完成和实现用户请求的各种服务。
2.表示层
表示层是对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。
其主要功能是处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
表示层的具体功能如下:
数据格式处理
:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。
数据的编码
:处理字符集和数字的转换。
压缩和解压缩
:为了减少数据的传输量,这一层还负责数据的压缩与解压缩。
数据的加密和解密
:可以提高网络的安全性。
3.会话层
会话层是用户应用程序和网络之间的接口,主要任务是:组织和协调两个会话进程之间的通信
,并对数据交换进行管理。
当建立会话时,用户必须提供他们想要连接的远程地址。
4.传输层
OSI上3层:应用层、表示层、会话层
的主要任务是数据处理——资源子网
OSI下3层:网络层、数据链路层、物理层
的主要任务是数据通讯——通讯子网
传输层是OSI模型的第4层,它是通信子网和资源子网的接口和桥梁,起到承上启下的作用
5.网络层
主要任务是:数据链路层的数据在这一层被转换为,然后通过路径选择、分段组合、顺序、进/出路由
等控制,将信息从一个网络设备传送到另一个网络设备。
一般情况下,数据链路层是解决同一网络(局域网)内节点之间的通信,而网络层主要解决不同子网间的通信。
6.数据链路层
在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是:
在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变
为无差错的数据链路,即向网络层提供可靠的通过物理介质传输数据的方法。
具体工作是:接收来自物理层的位流(比特流)形式的数据,通过差错控制等方法传到网络层;同样,也将来自上层的数据,封装成 3 转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。
帧:帧(frame)是数据链路层的传输单元。将上层传入的数据添加一个头部和尾部,组成了帧。
7.物理层
主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。尽可能屏蔽掉具体传输介质和物理设备的差异。
小结
:
在7层模型中,每一层都提供一个特殊的网络功能。
从网络功能的角度观察:
物理层、数据链路层、网络层
:主要提供数据传输和交换功能,即节点到节点之间通信为主;
传输层(第4层)
:作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
会话层、表示层和应用层
:以提供用户与应用程序之间的信息和数据处理功能为主;
总结
-
HTTP特点
:简单快速、灵活、无连接、无状态、支持B/S及C/S模式 -
URL的作用
: 全称是UniformResourceLocator,中文叫统一资源定位符.URI是统一资源标识符,用来唯一的标识一个资源。 -
请求响应
:
- request: 请求行(
request line
)、请求头部(header
)、空行和请求数据四个部分组成. - response: HTTP响应也由四个部分组成,分别是:
状态行、消息报头、空行和响应正文
-
三次握手&四次挥手
:
- 为什么不使用两次握手:无法防止历史连接的建立,会造成资源浪费,不能同步双方序列号
- 为什么不使用四次握手:三次握手已经足够,再多一次握手只会造成更多的连接时延
-
OSI七层协议
:
- 原七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层.
- 简化后:网络接口层,网络层,传输层,应用层.
- 传输层为界:上三层(应用层、表示层、会话层)信息和数据处理,下三层(物理层、数据链路层、网络层)数据传输交换.