什么是HTTP协议
1、超文本传输协议(HTTP)是一种分布式、合作式超媒体信息系统,是互联网上应用最广泛的一种网络协议
2、超文本传输协议(HTTP)允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器(通过交换报文来完成网页请求和响应)
3、HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一种无状态的协议(同一个客户端的这次请求和上次请求是没有对应关系)。
4、HTTP可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等(数据表现形式是可输入的和可协商性的)。
5、HTTP除了应用于超文本传输外,还可以应用于名称服务器和分布式对象管理系统之类的系统。可以通过扩展它的请求方法、错误代码和报文来实现
6、目前我们使用的HTTP协议是HTTP/1.1版本
HTTP协议的关键点:
1、HTTP是建立在TCP/IP协议之上,面向应用层的超文本传输协议
2、它由请求和响应组成,完全符合标准的客户端服务器的请求响应模型
3、协议很轻便简单,请求与请求之间没有关联,是无状态性的协议(无状态是指协议对事务的处理没有记忆能力,为了弥补无状态性需要扩展cookie等方式建立连接)
简单:客户端向服务器请求服务时,只需传送请求方法和路径,请求方法常用的有GET、HEAD、POST,每种方法规定了客户端与服务器联系的不同类型。使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无状态:它的请求-响应模型为:客户端每次向服务器发起一个请求时都建立一个连接,服务器处理完客户端发送的请求后即断开连接
HTTP协议的工作原理
1、HTTP协议工作于客户端-服务器架构上。客户端通过URL向服务器发送所有请求,服务器根据接收到的请求,向客户端发送响应信息。
2、HTTP协议定义客户端如何向服务器发送请求,以及服务器如何将响应请求传送给客户端。所以HTTP协议采用了请求\响应模型
以下是 HTTP 请求/响应的步骤:
1、客户端连接到Web服务器:
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求:
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应:
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接:
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容:
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例1:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器解析出HTTP的请求报文,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器
请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
4、Web服务器接到HTTP请求后进行处理,生成相应的HTTP响应(HTTP Response),然后发送给浏览器。
其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;
客户端的职能
1、向服务器发送请求
2、接收服务器返回的报文并解释成可读的信息供我们阅读
服务端的职能
服务端在接收到客户端发送的请求后会开始处理请求
备注:
服务端的处理过程如下:
服务器软件一直在监听端口是否有新的请求到达,如iss或tomcat在建立Web站点后,默认会一直监听80端口等待HTTP请求达到服务器
⑴建立连接:如果客户端已经打开一条服务器的持久连接,则可以直接使用,否则,客户端需要在服务器打开一条新的连接
⑵接收请求报文:连接上有数据时,Web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来
如:请求报文如下
GET https://new.qq.com/omn/20190323/20190323A0C7MW.html
Client
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/63.0.3239.132 Safari/537.36(伪装成客户端,防止反爬虫)
Host: new.qq.com
⑶接收后会被如下表示
Name:Method Value:GET
Name:Version 1.1
Name:Host Value:https://new.qq.com/omn/20190323/20190323A0C7MW.html
Name:User-Agent Value:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
⑷处理请求:当请求被接收和表示后,服务器就可以根据请求报文进行处理了。例如:post方法中提取报文主体的数据并插入到数据库中
⑸访问资源:请求处理完后,比如Web会根据数据生成一系列的HTML页面或图片等信息。此步骤将访问这些储存在服务器上的物理数据
⑹构建响应:Web服务器在识别资源后,构造响应报文。响应报文中包含状态码、响应头、主体等内容
⑺发送响应:服务器将响应的数据发送给客户端机器
⑻记录日志:请求结束后,Web服务器会在日志文件中添加一条请求记录
HTTP中的一些专业术语
1、连接:为通信而在两个程序之间建立的传输层虚拟电路
2、消息:HTTP通信中的基本单元,它由一个结构化的八比特字节序列组成,通过连接得到传送
3、请求:一种HTTP请求消息,从客户端到服务器的消息叫做请求消息
4、响应:一种HTTP响应消息,从服务器返回到客户端的消息叫做响应消息
5、资源:一种网络数据对象或服务。资源可以有多种表现方式(如多种语言、数据格式、大小、分辨率等)
6、实体:实体是请求或响应的有效承载信息。一个实体包含元信息和内容,元信息以实体头域形式表现,内容以消息主体(entity-body)形式表现
7、表现形式:一个响应包含的实体是由内容协商决定的。有可能存在一个特定的响应状态码对应多个表现形式
8、变量:在某个时刻,一个资源对应的表现形式可以有一个或多个(一个URL请求一个资源,但返回的是此资源对应的表现形式,这根据内容协商决定的)。每个表现形式称作一个变量
9、客户端:为发送请求建立连接的程序
10、用户代理:初始化请求的客户端程序。常见的如浏览器、编辑器或其他的终端用户工具
11、服务器:服务器时一个应用程序,它同意请求端的连接,并发送响应
12、源服务器:存在资源或资源在其上被创建的服务器被称为源服务器
13、代理:代理是一个中间程序,它既可以担当客户端的角色,也可以担当服务器的角色。代理代表客户端向服务器发送请求。客户端的请求经过代理,会在代理内部得到服务或者经过一定的转换转至其他服务器。 透明代理需要代理认证和代理识别,而不修改请求或响应。非透明代理需要需要修改请求或响应,以便为用户代理提供附加服务。除非透明行为或非透明行为被显示地声明,否则HTTP代理既是透明代理,也是非透明代理
14、网关:网关其实是一个服务器,扮演着代表其他服务器为客户端提供服务的中间者。与代理不同,网关接收请求,仿佛它就是请求资源的源服务器。请求的客户端可能觉察不到它正在同网关通信
15、隧道:隧道也是一个中间程序,它是一个在两个连接之间充当盲目中继的中间程序。一旦隧道处于活动状态,它不能被认为是这次HTTP通信的参与者,虽然HTTP请求可能已经把它初始化了。当两端的中继连接都关闭的时候,隧道就不存在了
16、缓存:缓存里存放可缓存的响应,是程序响应消息的本地储存。缓存是一个子系统,控制消息的存储、获取和删除。任意客户端或服务器上都有可能存在缓存,但缓存不能存在于一个充当隧道的服务器里
17、可缓存的:响应是可缓存的是指可以将这个响应缓存保存为副本,之后能用此副本继续响应后续的请求
18、显示过期时间:当响应的显示过期时间达到后,缓存必须要对其缓存的副本进行重验证,否则就不能利用此副本去响应后续的请求
19、年龄:一个响应的年龄是从被源服务器发送或被源服务器成功验证到现在的时间
20、上游/下游:上游和下游描述了消息的流动:所有消息都是从上游到下游的
21、内向和外向:内向和外向是指消息的请求和响应路径:内向即移向源服务器,外向即移向用户代理
报文
客户端与服务器之间的信息传递使用的载体叫做报文。报文分为请求和响应两部分
1、客户端向服务器发送一个请求报文
请求报文包含请求的方法、URL、协议版本、请求头部和请求数据
2、服务器反馈给客户端一个响应报文
响应的内容包括协议版本、成功或错误响应码、服务器信息、响应头部和响应数据
Uniform Resource Locator(统一资源定位符)
假设请求发送的地址为:www.example.com.index.html
浏览器会将地址解析为:
Host:www.example.com
Name:Uri Value:index.html
1、URI就是HTTP中所使用的统一资源标识符(Uniform Resource Identifiers),用来建立连接和传输数据。
2、我们日常使用的URL则是一种特殊类型的URL,包含了用于查找某个资源的足够信息
3、URL的全称是Uniform Resource Locator,是互联网用来标识某一处资源的地址
它的基本格式如下:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
即:<方案>://<用户名>:<密码>@主机:端口/路径;参数?查询#片段
URL主要有三个作用:
1、HTTP是URL的方案方案告诉客户端使用什么样的协议去访问服务器
2、HOST:www.example.com指服务器的位置
3、/index.html是资源路径,说明了请求的是服务器上哪个特定的本地资源
例2:
详细解释URL:http://www.kath2.com/news/index.asp? ID=210&pag=1#name
URL一般分为以下几部分:
1、协议部分:该URL的协议部分为"HTTP:",这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如:HTTPS、FTP等。在"HTTP:"后面的"//"为分隔符
2、域名部分:该URL的域名部分为"www.kath2.com。一个URL中也可以使用IP地址作为域名使用
3、端口部分:跟在域名后面的是端口,域名和端口之间使用" :"作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口。如,HTTP默认的端口为80,HTTPS的默认端口是443
4、虚拟目录部分:从域名后的第一个"/"开始到最后一个"/"为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中虚拟目录是"/news/"
5、文件名部分:从域名后的最后一个"/"开始到"?"为止是文件名部分。本例中文件名部分为"index.asp"
5_1、如果没有"?",则是从域名后最后一个"/"开始到"#"为止是文件名部分
5_2、如果没有"?"和"#" ,那么从域名后最后一个"/"开始到结束都是文件名部分。文件名部分也不是必须部分,如果省略该部分,则使用默认的文件名
6、锚部分:从"#"开始到最后,都是锚部分。本例中锚部分是"name",锚部分也不是一个URL所必须的部分
7、参数部分:从"?"开始到"#"为止之间的部分为参数部分,又称搜索部分、查询部分。本例中参数部分为"ID=210&pag=1"。可以允许有多个参数,参数与参数之间用"&"作为分隔符
拓展:
使用Fiddler模拟发送Web请求
1、选择Get请求
2、填写请求地址
3、填写请求头:需要使用真实浏览器的值,防止反爬虫
4、如果是post请求,则会有请求主体,此部分(Request Body)填写请求主体
5、发送请求
OSI参考模型
OSI RM:即开放系统互连参考模型,它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
每一层都有其不同的含义以及网络协议
物理层:作用为提供比特流传输。以太网、调制解调器、电力线通信、光导纤维、同轴电缆、双绞线等
数据链路层:作用为提供介质访问、链路管理等。Wi-Fi(IEEE 802.11)、ATM、PPP、L2TP、PPTP等
网络层:作用为寻址和路由选择。协议有IP(IPV4、IPV6),ICMP、IGMP等
传输层:作用为建立主机端到端连接。协议有TCP、UDP、TLS、DCCP等
会话层:作用为建立、维护和管理会话。
表示层:作用为处理数据格式、数据加密等
应用层:作用为提供应用程序间的通信。协议有HTTP、HTTPS、DNS、FTP、SSH、POP3等
TCP/IP协议
1、TCP/IP协议是一个协议集合。大家叫的时候方便说,所以统称为TCP/IP。
2、TCP/IP协议族中有一个重要的概念是分层,TCP/IP协议按照层次分为以下四层:应用层、传输层、网络层、数据链路层
IP协议:
1、IP(Internet protocol),这里的IP不是值得我们通常所说的192.168.1.1.这个IP指的是一种协议,而后面的数字值得是IP地址。IP协议的作用在于把各种数据包准确无误的传递给对方,其中两个重要的条件是IP地址,和MAC地址(Media Access Control Address)。
2、由于IP地址是稀有资源,不可能每个人都拥有一个IP地址,所以我们通常的IP地址是路由器给我们生成的IP地址,路由器里面会记录我们的MAC地址。而MAC地址是全球唯一的,除去人为因素外不可能重复。
TCP协议(Transmission Control Protocol,传输控制协议):
1、如果说IP协议是找到对方的详细地址。那么TCP协议就是把安全的把东西带给对方。各有分工,互不冲突。
2、按层次分,TCP属于传输层,提供可靠的字节流服务。什么叫字节流服务呢?这个名字听起来让人不知所以然,下面听下我通俗的解释。所谓的字节流,其实就类似于信息切割。比如你是一个卖自行车的,你要去送货。安装好的自行车,太过庞大,又不稳定,容易损伤。不如直接把自行车拆开来,每个零件上都贴上收货人的姓名。最后送到后按照把属于同一个人的自行车再组装起来,这个拆解、运输、拼装的过程其实就是TCP字节流的过程。
3、TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。
TCP的特点有:
- TCP是面向连接的运输层协议,一个开放的协议标准,独立于硬件和操作系统的协议。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(使用统一的网络地址分配的方案。网络中的每台电脑都具有唯一的IP地址。)
- TCP是一个标准的高层协议,提供可靠交付的服务
- TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
- 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。
面向有连接型和面向无连接型
这种类型不要求建立和断开连接,发送端可任何时候发送数据,接收端也不知道自己何时从哪里接受数据,这种情况下,接收端需要时常确认是否收到数据,彼此也不需要确认对方是否存在
发送数据之前,需要在收发主机之间建立一条通信线路,在通信传输前后,专门进行建立和断开连接的处理,如果与对端之间无法通信,可避免发送无谓的数据
三次握手
1、TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
2、为了确保信息能够确保准确无误的到达,TCP采用了著名的三次握手策略
3、所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
下面来看看三次握手的流程图:
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
四次挥手
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
下面来看看四次挥手的流程图:
第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。