Http协议

HTTP请求跟网络分层的关系

一个数据包从A主机传输到B主机可能发生的问题

在这里插入图片描述
1:可能发生数据丢包,两台主机之间往往通过非常多的网络设备连接在一起,可能发生数据丢失
2:数据重复,有数据丢失我们就需要数据重传,数据重传多次就可能发生数据重复(之前丢失的数据可能不是真正的丢失,而是网络的延迟)
3:数据完整性校验:通过网络设备进行数据转发的时候,有很多设备都有可能被人篡改,或者本身设备的问题,会导致数据的错误,所以需要进行数据完整性校验
4:网络传输中,数据传输的介质是不一样的,比如在内网层面直接通过网线进行传输,但是连接到公网的话通常会用到光纤进行连接,所以要执行不同的介质之间信号的转换,包括无线路由器,包括光纤到无线的脉冲的信号转换
5:距离比较远的话还会出现信号衰减的问题

我们可以把上述遇到的问题进行分层,不同的分层解决不同的问题,不同的层次结构之间可以定义一些标准化的接口,让他们之间可以进行数据通信,网络分层降低了网络的复杂性,可以具有更高的可扩展性

在这里插入图片描述
为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层之间的接口保持不变 ,就不会影响到其他层

网络分层的两种方法
1: OSI(Open System Interconnection Reference Model):开放系统互联参考模型,由美国国际标准化组织提出来
2:TCP/IP协议簇,这种分层方式最早由美国军方提出(他们认为会话层和表示层应该由程序自己控制,就把这两层合并到应用层)

下图中间表格表示每一层对应的协议
在这里插入图片描述
一个Http请求的分层解析流程

在这里插入图片描述
http协议是基于TCP/IP协议之上的应用层协议,超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

①输入域名之后,最开始浏览器会把你的域名解析出来,因为客户端跟服务端交互不认域名,认IP地址。然后看浏览器里有没有这个域名对应的DNS的相关信息的缓存,如果有就能直接拿到服务端的IP地址,如果没有的话,就会发出DNS请求获取服务器的IP地址。DNS其实也是一台服务器,有自己的IP地址,通常是自己配在你的操作系统上的,这个时候应用端会构造一个DNS的请求报文,然后应用层会调用传输层的接口,DNS使用UDP实现数据传输,所以会调用传输层的UDP协议实现数据的传输,传输层会在DNS请求报文的基础上加一个UDP的请求头,传输层会把数据交给网络层

在这里插入图片描述
②网络层会在UDP的请求报文的基础上加上一个IP的请求头,然后网络层把加了IP请求头的报文交给数据链路层,数据链路层会实现二层寻址,会把自己的Mac头加上去,并且会把对应的请求报文应该要去交给下一个机器的Mac地址也加上去,这个Mac会通过网络层的ARP协议找到,ARP会通过IP找到对应的Mac地址,然后数据链路层通过物理介质(物理层)把数据传出去,通常传到路由器上面
在这里插入图片描述
③路由器实质上是三层的设备(网络层,数据链路层,物理层),最开始通过物理层连接,物理层把数据交给数据链路层,数据链路层会看MAC地址是不是已经给我了,如果给了,就执行解析,没有给,就丢弃,然后数据报文传送到网络层,网络层会看数据应该传给的下一个路由器的地址是多少,会通过运营商的网络接口传到运营商的路由器上面

在这里插入图片描述

④运营商这边会有自己的DNS服务器,如果你配置的运营商的DNS服务器地址的话,会直接去找你对应的域名,就会拿到对应的IP地址(就是我们刚刚请求DNS的请求报文的IP地址(下图紫色框),然后原路返回)
在这里插入图片描述

原路返回的流程如下图,应用层拿到返回的报文之后(就是拿到了请求的DNS信息),就拿到了域名对应的IP地址,就可以进行http请求报文的发送
在这里插入图片描述

⑤Http是基于TCP协议来实现的,所以调用传输层的时候传的是TCP的一些参数,TCP会往下面调网络层的协议,会加上IP头,然后数据链路层会加数据链路层的Mac头,然后就会进行数据的传输,这个时候传到运营商就不熟找DNS了,而是找我们刚刚找到的对应的服务器的IP地址

在这里插入图片描述
⑥可能我本地用地联通的,而服务器用的是电信的,不同的运营商之间有专线进行连接
在这里插入图片描述

⑦服务器拿到数据包之后同样会进行一层一层的解析,到数据链路层看数据是不是给我了,给我了的话就进行解析,传到网络层了看看IP地址是不是自己,如果是,接着进行解析,然后会解析TCP的端口(80端口),之后传输层会把请求报文交给应用程序,这个应用层就拿到了请求报文,然后解析Http的请求报文,解析完了之后,会构造一个Http的响应报文。
在这里插入图片描述
⑧然后把这个响应报文交给TCP协议,然后一步一步地返回
在这里插入图片描述

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
释放 TCP连接;
浏览器将该 html 文本并显示内容;

HTTP请求的完整过程

当用户在浏览器输入网址回车之后,网络协议都做了哪些工作呢?
1.首先干活的是浏览器应用程序,他要解析出URL中的域名
⒉.根据域名获取对应的ip地址,首先从浏览器缓存中查看,如下可以查看浏览器中域名对应ip的解析
1chrome : / /net-internals / #events(比如这就是Chrome浏览器的日志)
如果没有则从本机域名解析文件hosts (letchosts)中查看,还没有则从LDNS (Localdnssever) 、Rootsenver域名服务器、国际顶级域名服务商的DNS 的层层解析
3.拿到IP地址后,浏览器就可以发起与服务器的三次握手
4.握手建立之后,就开始组装http请求报文,发送报文
5.服务器收到请求报文之后开始,请求报文解析,生成响应数据,发送响应数据6.浏览器收到响应之后,开始渲染页面

在这里插入图片描述

在这里插入图片描述

HTTP协议

超文本传输协议,虽然名字里面有传输,但是并没有做与传输有关的事情,HTTP协议的传输是交由TCP协议进行的

HTTP协议是一种无状态的以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活地互动
无状态:本身不存储用户的信息
请求/应答方式:request/response
可扩展:可以在协议的基础上添加我们自己的一些头部的字段
自描述消息格式:可以是文字,图片,音视频,可以根据消息类型知道对应的数据是什么类型
基于网络的超文本:HTML

HTTP的报文格式

数据在网络中进行传输,不管是请求数据还是响应数据,都是由以下几部分组成

在这里插入图片描述

  • 起始行:如果是请求数据的话,就有可能是 GET /index.html HTTP/1.1这种形式,响应数据可能是HTTP/1.1 200 OK这种形式

  • 头部字段集合:可以有响应头,也可以有请求头,有的头是通用的,比如Connection可以出现在响应头里面,也可以出现在请求头里面

  • 空行:空行是一定有的

  • 消息正文:在请求数据的时候可以有,在响应数据的时候也可以有,但是不是必须的

请求行的报文格式

在这里插入图片描述

  • 请求方法(Method):如GET/HEAD/PUT/POST,表示对资源的操作
  • 请求目标(URI):通常是一个URI,标记了请求方法要操作的资源
  • 版本号(VERSION):表示报文使用的HTTP协议版本

响应行报文格式

在这里插入图片描述

  • 版本号:表示报文使用的HTTP协议版本
  • 状态码:一个三位数,用代码的形式表示处理的结果,比如200是成功,500是服务器错误,403是访问请求被拒绝
  • 原因(REASON):作为数字状态码补充,是更详细解释的文字,帮助人理解原因
  • 换行:换行是必须要有的

HTTP头字段

头部字段是key-value的形式,key和value之间用:分隔,最后用CRLF换行表示字段结束,比如前后分离时经常遇到的要与后端协商传输数据的类型Content-type:application/json,key就是Content-typevalue就是application/json。HTTP头字段非常灵活,不仅可以使用标准里的Host、Connection等已有头,也可以任意添加自定义头,这就给HTTP协议带来了无限的扩展可能。

头字段注意事项

  • 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符"-",但不能使用下划线""(有的服务器不会解析带"_“的头字段)。字段名后面必须紧接着”:",不能有空格,而":"后的字段值前可以有多个空格;
  • 字段的顺序是没有意义的,可以任意排列不影响语义;
  • 字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie。

常用头字段

HTTP协议中有非常多的头字段,但基本上可以分为四大类:

  • 请求字段:请求头中的头字段;如Host,Referer。
  • 响应字段:响应头中的头字段,如: Server,Date ;
  • 通用字段:在请求头和响应头里都可以出现,如Content-type,Connection ;

Host:用来表示当前的连接是跟哪一个服务建立的
Referer:比如图片要防盗图的话,可以通过这个字段进行图片来源的判断,判断当前请求是从哪个地方来的,如果是从其他网站来访问我们某台服务器的资源的话,就可以拒绝访问,在防盗链中经常运用
server:标识使用的是哪种类型的服务器(ngnix,apache)
Date:不一定是在响应字段里面,也可以出现在请求头里面
Content-type:如果是出现在请求头里面,代表数据传输到服务器的时候,我们使用的格式,如果是出现在响应头(服务端返回到客户端),我们可以了解到服务端传了什么类型的数据到客户端,我们可以对数据进行解析
Connection:可以出现在响应字段里面,也可以出现在请求头里面

参考文献

视频:240分钟搞懂HTTP和HTTPS协议?
Http协议详解(深入理解)
HTTP协议超级详解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值