zoukankan      html  css  js  c++  java
  • 一篇文章吃透《图解HTTP》

     最近看了《图解HTTP》,整理一番,仅整理关键知识点

    第一章 了解web及网络基础

    第二章 简单的HTTP协议

    第三章 HTTP报文中的HTTP信息

    第四章 返回结果的HTTP状态码

    第一章:了解web及网络基础

    计算机与网络设备通信和人与人通信一样,也需要有规则,也即协议。协议中存在着各种各样的内容,从电缆规则到IP地址选定方法,寻找异地用户的方法,双方建立通信的顺序,以及WEB页面显示需要处理的步骤等

    TCP/IP协议是与互联网相关联的各类协议族的总称

    TCP/IP协议分成四层:应用层、传输层、网络层、数据链路层

    层次化的好处是如果有地方要改变设计时,只需要把变动的层更改掉,而不必把所有整体更改

    同时,层次化之后,每个层级只考虑分派给自己的任务,而不需要搞清楚其他层次的功能,功能分立,各层之间接口规划好,使每层的设计更加简单和专注,这也是一种设计思想

    TCP/IP协议各层的作用如下:
    应用层决定了向用户提供应用服务时通信的活动,比如HTTP协议、FTP(文本传输协议)和DNS(域名系统)服务

    传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输TCP协议和UDP协议在传输层

    网络层用来处理在网络上流动的数据包,数据包时网络传输的最小单位,该层规定了通过怎样的路径到达对方计算机,并把数据包传给对方,IP协议

    链路层用来处理连接网络的硬件部分,包括控制操作系统、网卡、光纤等物流可见部分,硬件的范畴均在链路层的作用范围之内

    利用TCP/IP协议进行网络通信时,会通过分层顺序与对方进行通信,发送端从应用层向下走,接收端则从应用端向上走(两端相对接的是链路层)

    发送端在层与层之间传输数据时,每经过一层时必定会打上一个该层的首部信息

    反之接收端在层与层传输数据时,每经过一层时会把对应的首部消去

    这种把数据信息包装起来的做法称为封装

    详细描述下与HTTP协议关系密切的协议:IP、TCP、DNS

    负责传输的IP协议:

    IP协议位于网络层,作用是把各种数据包传给对方,确定传送成功要满足两个重要条件:IP地址和MAC地址

    IP地址指明了节点被分配的地址,MC地址是指网卡所属的固定地址(即物理地址),IP地址可以MAC地址进行配对,IP地址可变换,但是MAC地址基本上不会更改

    延申:ARP协议,是一种用于解析地址的协议,根据通信方的IP地址可以反查出对应的MAC地址

    确保可靠的TCP协议:

    TCP位于传输层,提供可靠的字节流服务,可靠是指能够确认数据是否正常交付,字节流服务是指将大块数据分割成报文端为单位的数据包进行管理

    为了确保数据能到达目标,TCP协议采用了三次握手策略,握手过程中使用了TCP的标志:SYN和ACK

    发送端首先发送一个带有SYN标志的数据包给对方,接收端收到后回传一个带有SYN/ACK标志的数据包以标识传达确认信息,最后发送端再回传一个带ACK标志的数据包,代表握手结束。

    如果握手过程中中断,TCP协议会以相同顺序再次发送相同的数据包,TCP还有别的手段确保通信可靠性

    负责域名解析的DNS协议:

    DNS服务和HTTP协议一样位于应用层,提供域名到IP地址之间的解析服务

    主机名或者域名访问对方计算机对人类来说更具有易读性,但对于计算机来说更擅长数字,为了解决这一问题,DNS服务出现了

    DNS服务提供通过域名查找IP地址,或逆向从IP地址反查域名的服务

    那么综合以上,我们可以了解到IP协议、TCP协议和DNS再使用HTTP协议进行通信中所发挥的作用,引申我们就可以了解

    从浏览器输入一个域名后到页面渲染的整个过程也就是:

    1-DNS域名解析

    DNS服务将域名解析为IP地址,具体过程是先检查浏览器缓存有无这个域名对应的IP地址,如果没有,会检查操作系统的hosts文件、以及路由器缓存,如果还是没有命中,浏览器会请求本地域名服务器去解析,本地服务器一般是接入的网络服务商提供的

    如果本地服务器缓存内没有,并且也没办法解析,会继续向根服务器发起请求解析,根域名服务器未查到则返回一个顶级域名服务器的地址,本地服务器向顶级域名服务器发起请求,顶级域名服务器返回给本地服务器这个域名的解析服务器地址,本地服务器向域名解析服务器发起请求,这时就能收到域名和IP地址的对应关系,本地域名服务器将结果保存到缓存中并返回结果给客户端

    客户端得到目标服务器的IP地址和端口号

    2-应用层:浏览器生成一个针对目标服务器的HTTP请求报文

    3-传输层:通过三次握手建立TCP连接,TCP协议将HTTP请求报文分割成报文段

    4-网络层:将报文段打包,通过ARP协议搜索地址后发送

    5-链路层:根据以太网协议将数据分成帧,进行发送

    6-服务端收到数据是逆转过来解包,重组报文端,从链路层到应用层, 获得HTTP请求,请求结果也是同样里用TCP/IP协议进行回传

    第六步引申:

    假如服务器配置了 HTTP 重定向,就会返回一个 301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)

    URI:统一资源标识符

    某个协议方案表示的资源的定位标识符,协议方案可以是https、http、ftp等

    绝对url的完整格式 

    http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch=1

    协议方案名://登录信息@服务器地址:服务器端口号/带层次的文件路径?查询字符串#片段标识符

    登录信息可选、服务器端口号可选(不写用默认端口)、查询字符串和片段标识符都是可选项

    第二章:简单的HTTP协议

    HTTP协议和TCP/IP协议族的其他众多协议一样,用于客户端和服务端之间的通信。

    请求访问资源的一端称为客户端,提供资源响应的一端为服务端,如果仅对于一条通信线路而言,客户端和服务端的角色是固定的。

    请求报文:请求访问某个页面资源,由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成

    响应报文:服务器讲处理结果以响应的的形式返回,由协议版本、状态码、用于解释状态码的原因短语、可选的响应首部字段以及实体主题构成

    HTTP/1.1中可用的方法

    • GET:获取资源
    • POST:传输实体的主体
    • PUT:传输文件,HTTP自身的PUT方法不带验证机制,所以一般WEB网站不使用该方法,除非加上验证机制或者REST标准下
    • HEAD:获取报文首部,和GET方法一样,但是不返回报文实体
    • DELETE:删除文件,与PUT相反的方法,方法本身无验证机制,所以一般也不使用,除非加上验证机制或者REST标准下
    • OPTIONS:询问支持的方法
    • TRACE:追踪路径,不常用

    关于持久连接:

    HTTP协议最初的版本,是每进行一次HTTP通信就要断开一次TCP链接,逐渐无法满足较多资源的情况,会增加通信量的开销

    为解决这一问题,HTTP/1.1 引入了持久连接,即HTTP keep-alive

    持久连接的特点是只要任意一端没有明确提出断开状态,则保持TCP连接状态

    持久连接的好处:减少了TCP重复建立和断开所造成的额外开销,减轻了服务端的负载,同时减少了开销的时间后,使HTTP请求和响应能更快结束,页面显示速度也更快

    HTTP是无状态协议,HTTP协议自身不保存请求和响应之间的通信状态,优点是减少服务器的CPU和内存资源的消耗,简单快速

    但是随着WEB的不断发展,比如一个用户登录到一个网站上,跳转到其他页面后也需要保持登录态,因此网站此时需要掌握是谁发出的请求,保存用户的状态。

    为了HTTP协议能够实现保存状态功能,引入了Cookie技术

    Cookie技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态

    Cookie会根据服务端发出的响应报文的Set-Cookie首部字段信息,通知客户端保存Cookie,值就是Set-Cookie的内容,当下次客户端再向服务器发送请求时,会自动在请求报文中加入Cookie值后发出

    服务器收到Cookie后,会先去检查是哪个客户端发过来的连接请求,然后对比服务器上的记录,如没有则保存,如果有就可以得到之前的状态信息

    总结上面就是:客户端发送请求后,服务端响应报文的Set-Cookie首部字段会带入一些信息,客户端保存这些信息,在下次请求时放在请求报文的Cookie首部字段里,服务端收到新请求后对比之前保存的Cookie信息确认状态

    (从这里可以理解我们的jmeter如何去获取Cookie值的,先首次调用登录接口,然后用一个提取器去获取到返回结果的header里Set-Cookie里的字段,用正则表达式去筛选出想要的字段,放到统一cookie管理器中,下次接口请求时就会发出cookie了,从而用jmeter实现了长连接)

    (Cookie不一定只有一个字段,可能有很多个字段信息key-value对应)

    (注意分清header和body,首部字段都在header里,内容在body里)

    第三章:HTTP报文中的HTTP信息

     用于HTTP协议交互的消息被称为HTTP报文,分为请求报文(客户端发出)、响应报文(服务端发出),本身是由多行数据构成的字符串文本

    HTTP大致分为报文首部和报文主体,通常并不一定要有报文主体

    • 报文首部:内容及属性,即请求行or状态行+首部字段 即request headers
    • 报文主体:应被发送的数据 即request body

    其中报文首部具体又细分为: 

    • 请求行:请求方法、请求URI、HTTP版本
    • 状态行:表明响应结果的状态码,短语和HTTP版本
    • 首部字段:表明请求和响应的各种条件和属性的各类首部,请求/响应请求首部字段=通用首部字段+请求/响应首部字段+实体首部字段

    第四章:返回结果的HTTP状态码

    状态码告知从服务器返回的请求结果,由三位数字和原因短语组成

    • 2XX 请求被正常处理 200 OK请求被正常处理;204 No Content 请求处理成功但无资源可以返回;206 服务端处理了客户端发起的范围请求
    • 3XX 重定向 301 永久性重定向;302 Found 临时性重定向;304 Not Modified 服务器资源未改变,可以使用客户端缓存
    • 4XX 客户端错误 400 请求报文存在语法错误;401 请求需要被认证或者认证失败;403 请求资源访问被服务器拒绝,多见于未获得授权时
    • 5XX 服务器错误 500 服务端在执行请求时发生错误;503服务器现在无法处理请求,可能处于停机或者超负载状态

    第六章、HTTP首部

    综上所述,HTTP请求报文由方法、URI、HTTP版本、HTTP首部字段(以上报文首部)、报文主体组成

    HTTP响应报文由HTTP版本、状态码、HTTP首部字段(以上报文首部)、报文主体组成

    首部字段是为了给客户端和服务器提供报文主体大小、所使用的语言、认证信息等内容

    常见的一些首部字段列举:

    首部字段名:字段值

    通用首部字段:

    首部字段名  说明 字段值举例
    Cache-Control [kæʃ]  控制缓存的行为

    no-cache  不缓存过期内容;no-store 不缓存任何内容

    Connection 连接管理 keep-alive 长连接
    Date 创建报文日期时间 Wed, 07 Jul 2021 08:32:27 GMT
    Pragma 报文指令 no-cache 和第一个一起用,保证所有HTTP版本都不返回缓存
    Trailer 报文之后后记录的首部字段 Expries 报文主体之后出现了首部字段Expries
    Transfer-Encoding 指定报文主体的传输编码方式  
    Upgrade 升级为其他协议 比如WebSocket
    Via 代理服务器的相关信息  
    Warning 错误通知  

     请求首部字段:

    首部字段名  说明 字段值举例
    Accept  可处理的媒体类型

    application/json, text/plain, */*

    Accept-Charset  优先字符集  
    Accept-Encoding 优先的内容编码 gzip
    Accept-Language 优先的语言 zh-CN,zh;q=0.9
    Authorization Web认证信息  
    Expect 期待服务器特定行为  
    From 用户的电子邮箱地址  
    Host 请求资源的所在服务器  
    Referer 原始的请求方URI  一般精确到/path
    User-Agent HTTP客户程序的信息  
    Cookie  开始状态管理时,客户端向服务器传的cookie信息  

     响应首部字段:

    首部字段名 说明 字段值举例
    Accept-Ranges 是否接受字节范围请求  
    Location 令客户端重定向制定URI  
    Server 当前服务器的安装信息  
    Vary 代理服务器缓存的管理信息  
    Set-Cookie Cookie 服务器接收到的Cookie信息   

    实体首部字段:

    首部字段名 说明 字段值举例
    Allow  资源可支持的HTTP方法  
    Content-Encoding 实体主体适用的编码方式  
    Content-Language 实体主体适用的编码方式  
    Content-Length 实体主体的大小  
    Content-Location 实体主体的大小  
    Content-MD5 实体主体的报文摘要  
    Content-Range  实体主体的位置范围  
    Content-Type 实体主体的媒体类型 application/json; charset=UTF-8 
    Expires 实体主体过期的日期时间  Thu, 01 Jan 1970 00:00:00 GMT
    Last-Modified 资源的最后修改日期时间  

     

    第七章:HTTPS

     HTTP的优点:无连接无状态,简单快捷灵活

    HTTP的缺点:不加密的协议,明文通信,可能会被窃听;不验证通信双方身份,可能会被伪装;不严重报文完整性,有可能被篡改

    HTTPS是披着SSL外壳的HTTP,拥有加密、证书和完整性保护功能

    使用SSL时,HTTP先和SSL通信,再由SSL和TCP通信

    SSL采用公开密钥加密的加密处理方式,发送方使用对方的公开密钥进行加密处理,对方收到后使用自己的私有密钥进行解密

    HTTPS的缺点:消耗更多的CPU以及内存资源,所以敏感数据才使用;CA证书购买要付费

    第九章、基于HTTP的功能追加协议

    为了处理一些HTTP的瓶颈问题,产生的协议,这里单独说一下webSocket协议

    一旦web服务器与客户端之间建立起WebSocket协议的通信链接,之后所有的通信都依赖这个专用协议进行,通信过程中可以互相发送任意格式的数据

     

    第十章、构建Web内容的技术

    HTML 

    HTML(HyperText Markup Language,超文本标记语言)是为了发送 Web 上的超文本(Hypertext)而开发的标记语言。

    超文本是一种文档 系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立 关联,即超链接文本。

    标记语言是指通过在文档的某部分穿插特别的字符串标签,用来修饰文档的语言。我们把出现在 HTML文档内的这种特殊字符串叫做 HTML标签(Tag)。

    平时我们浏览的 Web 页面几乎全是使用 HTML写成的。由 HTML构 成的文档经过浏览器的解析、渲染后,呈现出来的结果就是 Web 页面。

    CSS(Cascading Style Sheets,层叠样式表)可以指定如何展现 HTML 内的各种元素,属于样式表标准之一。

    即使是相同的 HTML文档, 通过改变应用的 CSS,用浏览器看到的页面外观也会随之改变。CSS 的理念就是让文档的结构和设计分离,达到解耦的目的。

     

    第十一章、Web攻击技术

     SQL注入攻击

    OS命令注入攻击

    HTTP首部注入攻击

    密码破解,有以下两种手段:通过网络的密码试错;对已加密密码的破解,还有SQL注入攻击逃避认证,跨站脚本攻击窃取密码信息等方法

    通过网络的密码试错,主要有两种方法:穷举法和字典攻击。穷举法从现实角度可能会花费数年时间

    字典攻击时指利用事先收集好的候选密码,枚举字典中的密码,尝试通过验证,比如生日做密码可以把生日数值化保存成字典,进行尝试;或者利用别处泄露的ID密码进行攻击

    对已加密密码的破解,web在保存密码时一般不会以明文的方式保存,通过散列函数(MD5)做散列处理或者加salt的手段对要保存的密码本身加密,攻击者使用某些手段获取到密码数据后,要通过解码等手段,把加密处理的密码还原成明文形式

    后门程序(Backdoor),开发设置的隐藏入口

     

     

  • 相关阅读:
    【python】变量定义及全局局部变量
    【python】重要的内置函数
    【python】迭代器iterator
    Java序列化与反序列化
    java中的IO操作总结
    Java中List Set Map 是否有序等总结
    java.lang.Class.getDeclaredMethod()方法详解
    一个servlet处理多个请求(使用Method的反射机制)
    java类的访问权限
    java中的基本数据类型存放位置
  • 原文地址:https://www.cnblogs.com/zhuwf/p/14668353.html
Copyright © 2011-2022 走看看