• Http协议网络原理概述


    简介

    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)、空行和请求数据四个部分组成。

    请求行以一个方法符号开头,以空格分开,后面跟着请求的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
    复制代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的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
    复制代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

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

    响应response

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

    例子:

    HTTP/1.1 200 OK
    Date: Fri, 22 May 2009 06:07:21 GMT
    Content-Type: text/html; charset=UTF-8
    
     
    
    
    
    复制代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第一部分:状态行,由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定义了三种:GETPOSTHEAD方法

    HTTP1.1新增五种:OPTIONSPUTDELETETRACECONNECT方法。

    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状态

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

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

    1. 避免旧的重复连接初始化造成混乱:

      假设我们发送端前面发送了一个序列号为90的syn报文,此时网络中拥塞了,此时发送端可能会连续发起多次请求。但是此时的序列号为90的报文也到了,如果是两次握手的话,接收端接受到就会进入establelisten状态(进入这个状态后就可以发送数据),然而当发送方判断这是一个历史连接,发送RST报文终止连接,但此时服务端已经进入了establelisten状态,并且可能发送了数据。断开的话,白白造成了服务端的资源浪费。为了避免旧的重复连接,必须在建立连接之前就杀掉这个重复连接,这就必须要三次握手才能实现

    2. 同步初始化序列号:

      序列号的作用:

    • 使对方有序的接受数据包

    • 避免对方接收重复的数据包

    • 可以知道自己发送出去的数据包,哪些是被接收的

      三次握手的话,客户端发送一个syn报文,服务端接受到后发送syn+ack报文,表示客户端的初始化序列号已经收到。客户端在回复ack报文,表示服务端的初始化序列号也已经收到。这样才能确保双方序列号都被同步了。如果是两次握手,只能保证一方的序列号被成功接收

    1. 防止资源浪费:

      客户端发送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层):作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;

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

    总结

    1. HTTP特点:简单快速、灵活、无连接、无状态、支持B/S及C/S模式

    2. URL的作用: 全称是UniformResourceLocator,中文叫统一资源定位符.URI是统一资源标识符,用来唯一的标识一个资源。

    3. 请求响应

      • request: 请求行(request line)、请求头部(header)、空行和请求数据四个部分组成.
      • response: HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
    4. 三次握手&四次挥手:

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

      • 原七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层.
      • 简化后:网络接口层,网络层,传输层,应用层.
      • 传输层为界:上三层(应用层、表示层、会话层)信息和数据处理,下三层(物理层、数据链路层、网络层)数据传输交换.
  • 相关阅读:
    SPI 实验
    Linux检查Docker镜像,容器的磁盘空间
    Flink-CEP基于web日志检测暴力破解和异地登陆行为代码示例
    CN_广域网WAN@PPP协议
    linux安装mysql
    怎么给自己的网站主页配置SSL证书?
    增减网络20220101
    C练习题_14
    vulhub中GitLab 任意文件读取漏洞复现(CVE-2016-9086)
    我的Vue之旅 09 数据数据库表的存储与获取实现 Mysql + Golang
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127728595