《透视HTTP协议》:这一次彻彻底底的理解什么是HTTP?

2024-04-25 14:56:00 浏览数 (1)

HTTP版本介绍

蒂姆伯纳斯李提出了 万维网的三个重要组成:uri(统一资源标识符)html超文本标记语言描述超文本,http 超文本传输协议,用于传输超文本

  • http0.9 纯文本,因为设想的只能读取资源,因此只有get请求方式。 传输完毕后里面断开连接
  • http1.0 (没有普及强制要求)随着各种媒体技术的发展,照片音乐开始可以在网络中传输并且 人们开始为http协议提供建议。因此这个版本中有很多新增的功能点 和我们现在用的差不多

比如增加head,post请求方法,协议状态码,协议版本号,httpheader 头信息,传输内容也不仅仅是超文本还有图片,媒体音乐视频等。但是此时http1.0只是个备忘录记录 可以做到的事情和实践。没有多大意义。

还没有被要求所有浏览器都按照这套协议来兼容

  • http1.1:(浏览器大战后推出1.1强制兼容)å兼容这套协议变得普及是在浏览器大战之后,在http 1.0之后做了小幅修改 正式变成标准。所有浏览器网关什么的都必须遵守这套标准。

增加了put,delete请求方式,增加了缓存管理和连接管理,允许数据进行chunk分块便于传输大文件,强制要求传输host头。

http 在研究一个领域时,首先得弄清楚 这个名词的定义是什么,帮助我们建立初步的认识:

  • ht:hupor text,超文本 图片链接视频等。比如html就是超文本标记语言 可以在网络中多个点进行传输

http传输的是超文本,而不是chunk,数据包电信号二进制这些底层的东西。

  • t:transform 传输。从a到b到c是传输,多个点之间流转数据就是传输
  • p:protocol 协议,多方之间协定好的一套规则,通过这套规则 多方可以进行沟通(租房协议等)

互联网有很多协议,超文本用http传输,文件通过ftp,邮件通过其他的协议。

http是上层传输超文本的,但是ISO网络模型里面 http通常,利用dns找到域名对应的ip地址,利用ip寻址和路由找到正确的端口号,依赖 tcp传输层进行分块安全的传输。

http里面相关的概念有哪些?

和http相关的应用技术有哪些?

  • 浏览器:web browser ,超文本浏览器,可以看到是http里面的客户端,用于发起http请求的一方,服务端响应之后 浏览器可以通过html排版,js显示动态效果等。user agent用户代理,代理用户发起http请求
  • 网络:整个互联网是通过成千上万个小网组成。这里面并不只有http协议,还有ftp,邮件,即时通讯等协议。但是http是最简单的,所以这些协议都可以变成http传输,也是很多邮箱网页版,微信网页版可以在网络运行的原因。封装了http
  • 服务器:硬件软件之分。硬件就是物理设备,软件就是存放资源的机器。收到请求之后吧资源返还回去。或者执行业务逻辑。服务器只有很少几个apache和nginx是比较出名的。apache最早出来创业一般选,nginx是高性能的
  • cdn:http在两个端点之间传输中间要经过很多层,其中就有cdn:内容分发网络,可以用来代替源服务器网站返回内容。核心是利用http的缓存和代理机制,提高客户端的响应速度 除此之外还可以所很多事情来放大服务器的能力。cdn也被用来当做服务器里面的一个产品进行宣传(我家服务器的cdn怎么怎么样)
  • 爬虫:用户代理背后的可不仅仅是真实的用户也可能是机器人爬去服务器的数据,这些机器人就叫爬虫。
  • 爬虫一般是浏览器放出来爬去数据放到自己的数据库中保证浏览器能够在搜索里面找到(不然你搜一个东西你都不知道有没这有这个内容,因此会提前爬去放到数据库也就是搜索有答案而不是没有答案,因为网站的建立者不允许这个浏览器爬去数据因此搜索不到。爬虫又会浪费服务器资源占用带宽等,因此出现了反爬虫。 之后又出现了君子协定:服务器和浏览器供应商之间规定哪些可以爬哪些不可以爬(robots.txt)

和http相关的协议有哪些协议?

  • *tcp/ip协议:指的是一系列网络协议的统称(其中tcp还有udp都是传输层,ip协议里面也用到arp协议广播),只不过这两个协议最核心。 *这个网络四层协议栈中最上层是应用层,然后后是tcp协议(传输层),然后ip协议(网络层),最底层是链接层(网卡模块里面电信号这些)

tcp和ip可以看到是两个不同的层协议。

ip用于寻址和定位,互联网的每个计算机都有一个唯一的ip地址用来找到目标计算机和当前计算机,寻址的时候会用到arp协议广播找到目标计算机(向一个子域里面同时发送信号,哪个响应就是目标)

tcp在ip两端连接的基础上进行安全可靠的字节流传输,安全可靠证明数据不会丢失。

http是传输协议,规定传输格式协议如何,具体传输的工作是tcp,而tcp传输的前提是要得知目的地的情况下所以借助于ip协议。所以_http的传输是在tcp的链接上进行可靠安全的传输tcp在用ip协议找到ip地址进行通信_

  • dns:域名转换为ip地址。域名和ip地址是在一个表里面存放的。根dns全世界有13个(没有中国,美国最多)不可能每次ip协议找ip地址都要跟跟dsn吧。所以计算机领域解决问题的标准方式又出现了加分层。根dns下面分为成千上万个dns,越往下表里的内容越少。这样我们访问的时候是逐层往上查询ip的,每次访问也会用算法去更新dns里面的ip表(之后大概率也会用到所以会更新缓存)
  • https全称是http over ssl/tls。互联网对传输时不安全的可以被黑客破解传输的是什么而且是铭文传输有很大危险,所以ssl使用加密的安全算法加密了传输的http数据,位于http的下层加密http数据,
  • ssl由网景公司发明,3.0的时候改名为tls不过大多数人还是叫ssltls。
  • 代理:在客户端和服务器之间的中间人。根据是否能看到背后的客户端服务端有匿名,透明这种是否隐藏背后的客户端服务器的代理;也有根据 代理的是目标是客户端还是服务端分为 正向代理(代替客户端发起请求 访问外国网站就是理由这个转发)反向代理(代替服务端响应客户端请求)

之前讲的cdn就是透明代理和反向代理

四层结构 和OSI 七层网络模型结构 是什么?

四层协议也叫tcpip协议栈。而OSI是一套规范是从四层协议里面进一步拆分得出来的,现在网络协议其实 也没有太按照OSI只不过是官方出的一套标准

四层协议栈分层结构是什么样的?

  • 最底层是***链接层,代表着最底层的以太网:网卡。** *每个网卡都有一个唯一的mac地址,因此也叫mac层
  • 链接层上层是_网络互联层,网络层用ip协议表示互联网设备。ip协议定义了ip地址,组成了互联网大网络,等到通信的时候再把ip地址转换为mac地址。这层保证两个机器可以进行链接_
  • 传输层:在链接层链接的两点之间 进行传输数据,分为tcp可靠数据(连续数据流)udp不可靠(数据包顺序发送乱序接受 不管丢包)
  • *应用层; *在传输层的基础上开发_传输的数据格式数据协议等内容。(比如http协议)_

osi七层网络结构有哪些?

由于网络协议太多(其中也包含tcp/ip,每家的网络分层都不一样,因此官方出了一个标准模版,大致是七层),因此出了一个标准(osi)但是也并不是强制七层只是一个参考(具体多了哪三层就是:

最底层的光纤网线;把应用层分的更细了:会话层,表示层,应用层

  • 物理层:网络通信的物理介质形式(比如网线,光纤)
  • 数据链路层:对应的就是四层模型里面的链接层(mac,网卡这些基于网线上层的网卡)
  • 网络层:对应四层模型里面的 网络层(ip协议,出现ip地址。互联网用ip地址组成网络)
  • 传输层:对应四层模型里面的 传输岑(链接的基础上进行数据传输 tcpudp)
  • 会话层(这层以及后面的两层都是四层模型里面的应用层):维护网络的链接状态,保证可以正常会话
  • 表示层:把数据转换为可理解的语义
  • 应用层:具体的应用程序

七层并不是严格按照这个协议来的,只是太多协议了得来个标准 你得包含这些必须有的东西。但是实际上tcp已经包含了会话管理,编码转换,这些东西

什么是三层转发,四层路由

四层路由是指网络层(网络互联)拿到ip地址后通过ip和port来规划最快的传输路径,是ip层本身做的。将ip转换为mac给到三层路由

三层转发是链路层 (数据链路 mac工作的层次可以拿到mac信息,mac地址工作的地方,一般是arp协议广播给对应的计算机

DNS域名系统详解

DNS域名系统详解

域名系统为什么诞生

由于***mac层是十六进制的很难记忆,所以出现了ip地址,用四段数字标识mac地址进行转换。** *由于包装了一层所以可以在ip层这里做些骚操作,只要保证最后可以访问到正确的mac地址就行。

ip地址随着用的越来越多也感觉到不方便了,因此又出现了域名系统,dns。同样也可以在这层做一些骚操作只要最终可以访问到up,ip可以访问到mac就行

域名系统如何查找对应域名的ip地址。

域名的表示方式其实是_有层次的(多个点)最左边是主机名,最右边是顶级域名。_

域名服务器的类型

  1. 根域名服务器 *:最顶层的域名服务器, *管理着 顶级域名服务器。比如_返回com,cn,org这些最右侧的域名服务器的ip地址_

存储com,cn....的域名服务器IP地址

  1. 顶级域名服务器:管理着各自com,cn域名下的权威域名服务器(比如com服务器可以返回带com的所有服务器的ip地址,cn可以返回带cn的所有服务器的ip地址)返回apple.com的ip地址

com,cn。存储着xxx.com,xxx.cn下面的服务器ip地址

  1. 权威域名服务器:管理着_当前域名下所有主机的ip地址_。返回xxx.apple.com的ip地址

也就是存储个各大公司下面所有服务器的ip地址,比如apple.com公司下面所有的ip地址

从最顶层往下查找最顶层的跟服务器只有13个月,从上至下查询比如先找com,在招apple.vom,在招xxx apple.com这个域名下服务器的ip地址。

dns有哪三个缓存?三个缓存 操作系统 主机映射文件 非域名服务器

首先不可能所有访问都去跟服务器去找,所以_操作系统会做一部分缓存并且很多大公司都会做自己的非权威域名服务器作为用户访问域名服务器的代理返回。这些非权威域名服务器特别特别多,而且一般都离用户很近,所以访问速度也很快。其次操作系统里面有个主机映射文件叫 ect/hosts_。

如果系统里面找不到dns记录就会去hosts文件中找,如果host也没有还可以去非权威域名服务器找,如果这里也没有就必须从根开始找了

浏览器访问网页发送请求过程

一,tcp三次握手建立链接

  1. 浏览器使用tcp协议发送请求携带syn段请求进行链接
  2. 服务器使用tcp协议 返回syn和ack确认收到(syn是收到的syn值)
  3. 客户端使用tcp协议发送 syn和ack值(syn 1,ack是收到的值)

二,tcp建立链接,发送http消息

  1. 三次握手建立成功后,客户端_浏览器就会发送http报文_(具体报文里面有什么下一个memo说)
  2. 服务端收到http报文后使用tcp协议发送ack确认消息
  3. 服务器处理收到的报文消息然后使用http消息回复
  4. 客户端收到服务端的报文后,同样也是先用tcp协议ack回复确认收到消息
  5. 客户端接着处理服务端的消息回复,然后使用http消息发送继续发送报文
  6. 服务器使用tcp协议回复ack收到
  7. 服务器处理请求报文使用http协议回复

。。。。。

可以看到建立了三次链接后 每次收到消息之前都需要先回复tcp消息在回复http消息。这也说明了http协议是基于tcp协议的。

优先处理完tcp协议然后在处理http协议(也是因为 tcp确保安全可靠的链接如果可靠才会继续进行处理)

HTTP请求/响应报文信息组成

http请求报文里面有哪些东西?

请求和响应的报文结构都是一样的:

起始行(请求行/状态行),头部(请求头/响应头),空行,数据实体(真正的纯超文本数据)

  1. 请求行/状态行:

请求行里面的结构是请求方法(get) 空格分隔 请求目标(uri代表访问的资源) 空格分隔 http协议版本号

状态行的结构是 报文使用的协议版本 空格 状态码(200,400这些)空格 原因(解释状态码的文字)

  1. _请求头和响应头的结构_是一样的:key的规则 不区分大小写,不能使用空行和下划线可以使用连字符,key的:前面不能有空格但是:后面可以有空格(:前面有空格服务器会返回400请求错误)

请求头的_keyvalue大致分为以下几种_:

  1. 通用字段:date(通常只出现在响应头里,表示报文创建的时间)
  2. 请求字段:hosts字段强制必须有的,user-agent(描述发起请求的客户端 比如浏览器chrome很多网站用chrome来伪装)
  3. 响应字段:server(代表提供web服务软件和版本号,通常不穿)
  4. 实体字段:描述body的字段,比如contentlength
hosts为什么必须传?

因为_一个主机服务器可能托管多个域名(比如在ect/host文件中 配置多个域名对应一个ip地址)这个时候服务器就得知道得分配给哪个域名处理_(就是依据这个hosts分发给对应的域名)

http有哪些请求方法?

  • get:获取服务器资源,请求实体在body中返回。
  • head:和get一样,区别是没有body,只用来看响应头的信息(比如只想查看服务最后更新时间,服务资源是否存在等响应头里面的信息)
  • post:服务器提交数据,和数据库的create一样,新建数据
  • put:也是操作服务器数据的,不过这里操作的是已经存在的,类似update

非常用方法:

  • delete:删除服务器某个资源 不过一般服务器不会执行这个方法
  • connect:告诉服务器和另外一个主机建立链接(也不用,一般不实现
  • options:询问服务器可以对这个资源做什么处理,在响应头的allow字段里面返回可行的处理方法。
  • trace:可以知道请求响应的链路是什么,由于会泄露服务器信息所以服务器一般也不实现。

这些http请求方法只是标准,具体服务器执行什么是看服务器如何处理的。

http的URI

uri格式解析
  • scheme:使用的解析协议,比如http,https,ftp,email,file用于针对后面出现的字符解析
  • 使***用分隔符/:** *: 为什么用分隔符因为host可能用中文,而中文是需要转义的,所以需要知道哪个地方是host从而进行编码转义。
  • host:port。代表访问的主机和对应的端口号
  • path:访问的资源路径
  • *?query:查询参数。 *通过key-value表达
uri的转义规则

uri用的是ascii码,如果碰到非ASCII码则会进行转义,转义规则非常粗暴 百分号加上对应字符的十六进制:% 字符的十六进制。

如果uri里面有_中文或者日文,则先转义为UTF-8的形式在转换成十六进制前面添加%_,规则是:% 对应中文的utf-8编码的十六进制

HTTP的优点和缺点有哪些?

http的特点有哪些

http的优点有哪些?

  • 简单,灵活,易于扩展

这个肯定是优点了,heade和body的设计非常简单,因为简单也因此设备足够多学习的人也多才能造就现在的丰富生态。

  • 无状态(http本身不关心状态,无需额外的空间存储状态信息

不需要像tcp那样需要保存是否链接的状态,也正因为tcp担任了这个职责所以http才可以无状态的发送不关心主机是否建立链接。

只是传输请求数据和响应数据,也因此是灵活扩展的,比如可以运行在unix的domainsocket之上也可以运行在tlsssl包装加密数据的上层。http的下层是可以随意变化的。

这个是双刃剑!无状态因此不需要占用额外的空间也因此处理效率会变高且不涉及状态流转等复杂的逻辑;但是也_正因为无状态对于需要连续操作且需要请求方状态信息的请求也会无能为力(比如购物需要登录,收藏,下单付款等 这些请求都需要用户的状态信息)这就要求http既无状态又 有状态(不希望占用存储空间同时希望带上信息)好在有cookie可以实现有状态_

  • 可靠传输(借助与tcp等底层协议尽可能保证可靠不丢失)
  • 应用层协议(不关心网络层协议,tcpip隔离了网络层)
  • 请求应答(cs架构)一问一答双刃剑 不适用于im,但是可以在http基础上延伸出来websocket

http的缺点有哪些

  • 明文传输,好处是可以使用tcpdump或者抓包软件获取到进行修改调试;但是缺点也同样如此 黑_客可以在网络访问的链路上截获你的请求获取你的信息_。 比如一些免费wifi陷阱就是让你链接上他的网络之后你所有的请求都可以被他拿到如果这时候你登录了银行等重要信息,这些信息就会被泄露
  • 不安全:这里的不安全不只是说数据泄露其不安全的范畴更宽:身份校验和数据完整性上

身份校验上 http并没有提供有效的手段 验证通信双方的真实性,这就很有可能被劫持后修改你的hosts让你访问到错误的页面,从而你填写隐私信息被盗用

数据完整性 上 也_无法验证数据传输过程中有没有被修改_,如果想做md5等数据加密但是由于数据是铭文的,黑客同样可以修改md5值。

好在这些问题在https中解决了

对头阻塞问题

http1.1里面规定了 是一问一答的请求方式,如果前一个请求的响应没回来,那么后续的请求也不会进行发送,因此会发生对头阻塞问题;

其次tcp也有对头阻塞问题,tcp的阻塞是因为他的特性决定的如果前一个包没有收到即使后面的数据收到了也不会更上层因为tcp要保证数据是完整的,不完整的时候会放在缓存里只能等待所有包的数据都回来才会给上层。

注意每个协议都有每个层的阻塞和其他问题。这里说的是http的阻塞,但是tcp也有阻塞这个概念。不要混淆了这两个问题。这个专栏讨论的都是http协议层的东西,像之前看的那本网络怎样链接那本书 讲的是tcp,ip,mac,网卡这些东西,没有涉及到http。

0 人点赞