一文详解HTTP协议

HTTP协议

在这里插入图片描述
http协议一般是由一个请求报文和一个回应报文所组成。
一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。
上图所示,是请求报文的样式:

一般是由:请求方法(post/get/head) 空格 统一资源标识符URI 空格  HTTP版本号  换行
         HTTP头部结构
         空行
         请求数据

对应的我们可以看一段http报文:

POST /search HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: http://www.google.cn/  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: www.google.cn 
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  

hl=zh-CN&source=hp&q=domety

可以看出HTTP头部的格式由以下几部分组成:

  • Host: 请求接受服务器的地址,可以IP或者域名
Host: www.google.cn
  • Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
Referer: http://www.google.cn/  
  • Accept Charset :通知服务器可以发送的编码格式
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */* 
  • User - Agent :发送请求的应用名称
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) 
  • Connection:指定与连接相关的属性
Connection: Keep-Alive  ,表示长连接
  • Accept Language:通知服务器可以发送的语言
Accept-Language: zh-cn 
  • Accept Enconding:通知服务器可以发送的数据压缩格式
Accept-Encoding: gzip, deflate 
  • Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  

在这里插入图片描述
HTPP响应报文:
在这里插入图片描述
**协议版本:**HTTP1.0/1.1(提供长连接服务);
状态码:

  • 1** 请求已经收到继续处理;
  • 2** 表示成功;
  • 3** 表示资源重定向;
  • 4** 表示客户端请求出错;
  • 5** 表示服务器端出错;

常用状态码:

  • 200:客户端请求成功,继续;
  • 201:请求已经被实现,而且一个资源已经依据请求的需要而建立;
  • 202:已经接受请求,但请求并未处理完成;
  • 301:永久重定向;
  • 302:临时重定向;
  • 304:未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存已经访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源;
  • 400:客户端语法有错误,服务器无法理解;
  • 403:服务器拒绝提供服务;
  • 404:客户端请求资源不存在;
  • 408:请求超时;
  • 500:服务器内部错误;
  • 501:服务器不支持的请求;
  • 502:作为网关或者代理服务器,从远程服务器收到了一个无效响应;
  • 503:由于超载或者系统维护,服务器暂时无法处理客户端的请求。
    响应头部:
  • Sever:服务器应用软件的名称和版本;
  • Content-Type:响应正文的类型;
  • Content-Length:响应正文的长度;
  • Content-Charset:响应正文所使用的字符集编码;
  • Content-Encoding:响应正文所使用的数据压缩格式;
  • Content-Language:响应正文所使用的语言;
    在这里插入图片描述

详解HTTP

HTTP与HTTPS

https其实HTTP协议和SSL协议加在一起的协议,端口号为443,http端口号为80.SSL协议可以为基于TCP协议的一切应用层协议提供服务。

这里拓展一下,基于TCP协议的应用层协议有FTP(文本传输协议,端口20或者21),talent(远程连接协议, 端口号23),SMTP(邮件传输协议 25);
基于UDP的应用层协议主要TFTP(简单文件传输协议,端口号为69),DNS(域名解析协议),IP电话,流式多媒体通信。

SSL
主要提供数据加密,数据完整性,身份验证机制来保证数据传输过程中的安全;

  • 数字签名:通过非对称的加密算法验证对端的身份,私钥加密,公钥解密,如果能够被发送方的公钥解开,接收方就可以认定这段消息是由发送方传递过来的;
  • 数据的加密:通过对称加密,实现数据的加解密过程,对称加密算法有AES,3DES,DES;利用对称加密算法进行数据加密之前需要在通信两端部署相同的密钥。
  • 消息完整性验证:利用摘要算法(也就是MAC算法),利用MAC算法,算出消息的MAC值,并将其加在消息之后一起传送给接收方;接收方接到后,利用同样的密钥和MAC算法算出消息的MAC值,并和原消息进行比对,如果两者一致,则说明报文没有改变,否则则说明在传输过程中报文被修改,接收者将丢弃该报文;
  • 利用非对称加密保证公钥本身的安全:对称加密算法和MAC算法都需要通信双方拥有相同的钥匙,因此SSL利用非对称加密算法来保证通信双方的公钥安全,以保证第三方无法获取该密钥。原理是利用SSL服务器的公钥加密加密密钥,将加密后的密钥发给SSL服务器,此时只有服务器可以用自己的私钥解开该消息,得到对称加密算法和MAC算法所需要的公钥。(这里非对称加密算法有RSA算法);
  • 数字证书:那么又有一个问题,我们怎么保证SSL服务器的公钥顺利被客户端拿到手呢?此时需要一个权威机构来下发这个公钥,这个机构就是CA,CA签发数字证书,里面包含了用户的公钥以及其身份信息,并由CA保证其数字证书的真实性。

接下来看一下HTTPS协议完整流程:
在这里插入图片描述
总结:由于https协议需要申请CA证书,因此需要一定费用;但是对于HTTP的明文传输,https的安全性强;端口号http80,https443;http的连接很简单,是无状态的,https协议是SSL+http协议构建的,安全。

面试问题

URI和URL的关系?

**URI(uniform resource identifier)**统一资源标识符,用来标识唯一的一个资源,是一个通用的概念。

URI包括两个子集:URN和URL

  1. URN标识名称,通过描述资源的名字来标识资源,URN即使资源的位置发生变动,URN也不会变化;
  2. URL标识位置(地址),通过资源的位置来标识资源。基本的URL格式为 “协议://IP地址/路径和文件名”,如:ftp://ftp.is.co.za/rfc/rfc1808.txt
    URL对于我们而言,就是将URL输入到浏览器地址栏上就可以访问到对应资源。

HTTP版本

在HTTP/1.0中默认使用的是短链接,也就是说,浏览器和服务器每进行一次HTTP操作,就需要建立一次连接,但是任务结束,连接就会被中断;如果客户端浏览器访问的某个HTML或者其他类型的Web页中包含有其他的Web资源,如JS,图像文件,CSS等,就会建立一个HTTP会话;

但从HTTP/1.1起,默认使用长连接,用以保持连接特性,使用长连接的HTTP协议,会有响应头加入连接方式:Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。keep-alive不会永久保持连接,他又一个保持的时间,可以在不同的服务器软件中设定这个时间。

浏览器输入一个网址,运行过程

1. 查询DNS,获取域名所对应的IP地址

1.1 检查浏览器缓存,检查本地hosts文件中是否有这个网址的映射,如果有,就调用这个IP地址映射,解析完成;
1.2 如果没有,则查找本地DNS解析器缓存是否有这个网址的映射,如果有,就调用这个IP地址映射,解析完成;
1.3.如果没有,则查找填写或分配的首选DNS服务器,成为本地DNS服务器(LDNS)。服务器接到查询时,如果要查询的域名包含在本地配置的区域资源中,返回解析结果,查询结束,此结果具有权威性。如果要查询的域名不由本地的DNS服务器区域解析,但服务器缓存了此网址的映射关系,返回解析结果,查询结束,此结果不具有权威性;(LDNS一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能很好,一般都会缓存域名解析结果)
1.4如果本地DNS服务器也失败:
如果采用转发模式(迭代),本地DNS就把请求发送给13台根DNS,根DNS服务器收到请求后,会判断这个域名(如.com)是谁来授权管理,并返回一个顶级域名服务器的IP,本地DNS服务器收到顶级域名服务器的IP后,继续向该顶级域名服务器IP发送请求,该服务器如果无法解析,则会找到负责这个域名的下一级DNS服务器(权限域名服务器)的IP给本地DNS服务器,循环往复直至查到映射,将解析结果返回到本地DNS服务器,再由本地DNS服务器返回解析结果,查询完成。

采用递归:此DNS服务器就会把请求转至上一级DNS服务器,如果上一级DNS服务器不能解析,则继续向上请求,最终解析结果依次返回本地DNS服务器,本地DNS服务器在返回给客户机,查询完成。

2. 得到目标服务器的IP地址及端口号(http 80端口 https 443端口),会调用系统库函数socket,请求一个TCP流套接字,客户端向服务器发送HTTP请求报文;

2.1 应用层:客户端发送HTTP请求报文;
2.2传输层:加入源端口,目的端口,建立连接,实际发送数据之前,三次握手客户端和服务器建立起一个TCP连接;
2.3 网络层:加入IP头,路由寻址;
2.4 数据链路层: 加入frame头,传输数据;
2.5 物理层:物理传输比特。

4. 服务端经过物理层-数据链路层-网络层-传输层-应用层,解析请求报文,发送HTTP响应报文;

5. 四次挥手,关闭连接

6. 客户端解析HTTP响应报文,浏览器显示HTML。

在DNS解析过程中,会出现一个DNS劫持攻击,因为一个DNS输入进去,浏览器首先会查本地缓存,进而查找主机的HOST文件缓存,黑客可以修改HOST文件里面对应的IP地址,将其改成自己的,这样就会跳转到一个假的页面。
效果:无法达到正确的界面,或者跳转到一个假的网址界面。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值