Http协议网络原理概述

时间:2022-11-07 20:56:21

简介

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特点

  1. ​简单快速​​: 客户向服务器请求服务时,只需要传送请求方法和路径。请求方法常用的有​​GET、HEAD、POST​​。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  2. ​灵活​​: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. ​无连接​​: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  4. ​无状态​​: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
  5. ​支持B/S及C/S模式​

2.URL的作用

URL,全称是UniformResourceLocator,中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

从上面的URL可以看出,一个完整的URL包括以下几部分:

  1. ​协议部分​​: 该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的"//"为分隔符
  2. ​域名部分​​: 该URL的域名部分为“​​www.aspxfans.com​​”。 一个URL中,也可以使用IP地址作为域名使用
  3. ​端口部分​​: 跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
  4. ​虚拟目录部分​​: 从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是"/news/"
  5. ​文件名部分​​: 从域名的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
  6. ​锚部分​​: 从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
  7. ​参数部分​​: 从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分,查询部分。本例中的参数部分为“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一般由三部分组成:

  1. 协议(或称为服务方式)
  2. 存有该资源的主机IP地址(有时也包括端口号)
  3. 主机资源的具体地址。如目录和文件名等

URI是以一种抽象的,高层次概念定义统一资源标识,而且URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个URL都是URI,但不一定每个URI都是URL。这是因为URI还包括一个子类,即统一资源名称(URN),它命名资源但不指定如何定位资源。上面的mailto、news和isbn URI都是URN的示例。

3.请求响应

请求request

客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(​​request line​​)、请求头部(​​header​​)、空行和请求数据四个部分组成。

Http协议网络原理概述

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。

Get请求例子,使用Charles抓取的request:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/,/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflflate, sdch
Accept-Language zh-CN,zh;q=0.8
复制代码

​第一部分​​:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。

GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

​第二部分​​:请求行,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

​第三部分​​:空行,请求头部后面的空行是必须的

即使第四部分的请求数据为空,也必须有空行。

​第四部分​​:请求数据也叫主体,可以添加任意的其他数据。

POST请求例子:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727;
.NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
复制代码

​第一部分​​:请求行,第一行明了是post请求,以及http1.1版本。(从0开始)

​第二部分​​:请求头部,第二行至第六行。

​第三部分​​:空行,第七行的空行。

​第四部分​​:请求数据,第八行。

响应response

一般情况下,服务器接收并处理客户端发过来的请求后会放回一个HTTP的响应消息。HTTP响应也由四个部分组成,分别是:​​状态行、消息报头、空行和响应正文​​。

Http协议网络原理概述

例子:

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head> <body>
<!--body goes here-->
</body>
</html>
复制代码

​第一部分​​:状态行,由HTTP协议版本号,状态码,状态消息 三部分组成。

第一行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

​第二部分​​:消息报头,用来说明客户端要使用的一些附加信息。

第二行和第三行为消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

​第三部分​​:空行,消息报头后面的空行是必须的

​第四部分​​:响应正文,服务器返回给客户端的文本信息。

空行后面的html部分为响应正文。

Http协议网络原理概述

​常见状态码​​:

  • 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协议的三次握手,四次挥手过程解析:

这图书本上有:

Http协议网络原理概述

HTTP2.0 全双工,半双工。

​第一次握手​​:发送syn(seq=x)包时,希望像接收端建立连接,并初始化序列号。此时发送端进入syn_sent状态

​第二次握手​​:接收端接收到了syn包,发送ack+syn包,并初始化序列号,并将发送的序列号+1放入确认应答号中。此时接收端进入syn_rcvd状态

​第三次握手​​:发送ack包,给确认应答号+1,表示收到了接收端的报文,进入establelisten状态服务端收到了客户端的报文后,也进入了establelisten状态

​注意​​:这里的第三次握手是可以携带数据的,因为发送端已经确认了服务端有接受和发送的能力。而其他两次并没有确认对方的接受能力

为什么说三次握手呢?而不是两次,四次?

  1. ​避免旧的重复连接初始化造成混乱​​:
    假设我们发送端前面发送了一个序列号为90的syn报文,此时网络中拥塞了,此时发送端可能会连续发起多次请求。但是此时的序列号为90的报文也到了,如果是两次握手的话,接收端接受到就会进入establelisten状态(进入这个状态后就可以发送数据),然而当发送方判断这是一个历史连接,发送RST报文终止连接,但此时服务端已经进入了establelisten状态,并且可能发送了数据。断开的话,白白造成了服务端的资源浪费。为了避免旧的重复连接,必须在建立连接之前就杀掉这个重复连接,这就必须要三次握手才能实现
  2. ​同步初始化序列号​​:
    序列号的作用:
  • 使对方有序的接受数据包
  • 避免对方接收重复的数据包
  • 可以知道自己发送出去的数据包,哪些是被接收的
    三次握手的话,客户端发送一个syn报文,服务端接受到后发送syn+ack报文,表示客户端的初始化序列号已经收到。客户端在回复ack报文,表示服务端的初始化序列号也已经收到。这样才能确保双方序列号都被同步了。如果是两次握手,只能保证一方的序列号被成功接收
  1. ​防止资源浪费​​:
    客户端发送syn报文时,可能被网络拥塞了,也有可能服务端的ack+syn报文拥塞了,那么客户端就会重发syn报文。如果是两次握手的话,服务端每来一个syn报文,就会建立一个连接,这样就会造成冗余连接,造成不必要的资源浪费

​小结​​:

为什么不使用两次握手:无法防止历史连接的建立,会造成资源浪费,不能同步双方序列号 为什么不使用四次握手:三次握手已经足够,再多一次握手只会造成更多的连接时延

Http协议网络原理概述

​第一次挥手​​:主动断开方(客户端,服务的都可以)向对方发送一个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 七层 底向上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

简化后的四层分别是:主机到网络层(比特)、网络层(数据帧)、传输层(数据包)、应用层(数据段)。

Http协议网络原理概述

Http协议网络原理概述

1.​​应用层​

应用层是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。

应用层为用户提供的服务和协议:文件传输服务(​​FTP​​)、远程登录服务(​​ssh​​)、网络管理服等。

上述的各种网络服务由该层的不同应用协议和程序完成。

应用层的主要功能如下:

​用户接口​​:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。

​实现各种服务​​:该层具有的各种应用程序可以完成和实现用户请求的各种服务。

2.​​表示层​

表示层是对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。

其主要功能是处理用户信息的表示问题,如编码、数据格式转换和加密解密等。

表示层的具体功能如下:

​数据格式处理​​:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。

​数据的编码​​:处理字符集和数字的转换。

​压缩和解压缩​​:为了减少数据的传输量,这一层还负责数据的压缩与解压缩。

​数据的加密和解密​​:可以提高网络的安全性。

3.​​会话层​

会话层是用户应用程序和网络之间的接口,主要任务是:​​组织和协调两个会话进程之间的通信​​,并对数据交换进行管理。

当建立会话时,用户必须提供他们想要连接的远程地址。

4.​​传输层​

OSI上3层:​​应用层、表示层、会话层​​的主要任务是数据处理——资源子网

OSI下3层:​​网络层、数据链路层、物理层​​的主要任务是数据通讯——通讯子网

传输层是OSI模型的第4层,它是通信子网和资源子网的接口和桥梁,起到承上启下的作用

5.​​网络层​

主要任务是:数据链路层的数据在这一层被转换为,然后通过路径​​选择、分段组合、顺序、进/出路由​​等控制,将信息从一个网络设备传送到另一个网络设备。

一般情况下,数据链路层是解决同一网络(局域网)内节点之间的通信,而网络层主要解决不同子网间的通信。

6.​​数据链路层​

在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是:

在物理层提供的比特流的基础上,​​通过差错控制、流量控制方法,使有差错的物理线路变​​为无差错的数据链路,即向网络层提供可靠的通过物理介质传输数据的方法。

具体工作是:接收来自物理层的位流(比特流)形式的数据,通过差错控制等方法传到网络层;同样,也将来自上层的数据,封装成 3 转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。

帧:帧(frame)是数据链路层的传输单元。将上层传入的数据添加一个头部和尾部,组成了帧。

7.​​物理层​

主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。尽可能屏蔽掉具体传输介质和物理设备的差异。

​小结​​:

在7层模型中,每一层都提供一个特殊的网络功能。

从网络功能的角度观察:

​物理层、数据链路层、网络层​​:主要提供数据传输和交换功能,即节点到节点之间通信为主;

​传输层(第4层)​​:作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;

​会话层、表示层和应用层​​:以提供用户与应用程序之间的信息和数据处理功能为主;

总结

  1. ​HTTP特点​​:简单快速、灵活、无连接、无状态、支持B/S及C/S模式
  2. ​URL的作用​​: 全称是UniformResourceLocator,中文叫统一资源定位符.URI是统一资源标识符,用来唯一的标识一个资源。
  3. ​请求响应​​:
  • request: 请求行(​​request line​​)、请求头部(​​header​​)、空行和请求数据四个部分组成.
  • response: HTTP响应也由四个部分组成,分别是:​​状态行、消息报头、空行和响应正文​
  1. ​三次握手&四次挥手​​:
  • 为什么不使用两次握手:无法防止历史连接的建立,会造成资源浪费,不能同步双方序列号
  • 为什么不使用四次握手:三次握手已经足够,再多一次握手只会造成更多的连接时延
  1. ​OSI七层协议​​ :
  • 原七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层.
  • 简化后:网络接口层,网络层,传输层,应用层.
  • 传输层为界:上三层(应用层、表示层、会话层)信息和数据处理,下三层(物理层、数据链路层、网络层)数据传输交换.