HTTP学习

HTTP相关问题是面试高频考点,或是要求描述该协议,或是要求同TCP协议、Socket连接进行对比,再或者,会展开询问其请求方式及不同方式的用途,和是否支持断点续传等,本博客为博主自己对搜集资料的汇总和学习式的解析,可能存在部分缺陷或者遗漏,欢迎各位指出错误,希望也能为正在努力学习/面试的你提供到一点小小的帮助。

网络七层协议

开始介绍HTTP之前,先了解一下网络七层协议,这部分不深究。面试时,部分较为专业的面试官会很喜欢问此类问题,这个只是看起来烦,花点时间看看理解一下,答出来有加分呦→ →,HTTP就位于该模型的第七层,TCP位于第四层,以下摘为自百度的概念

OSI是一个开放性的通信系统互连参考模型。OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端,点到点的数据流

7 应用层

与其它计算机进行通讯的一个应用(比如某vx),它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序就需要实现OSI的第7层。示例:HTTPFTPSMTP等。

6 表示层

这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,也就是传输的数据表现成什么样子,是加了密的一坨啊,还是ASCII码啊,等等。示例:加密,ASCII等。

5 会话层

它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等(如用navigate打开mysql的连接,创建一个session,开始会话,然后执行SQL,关闭session则关闭会话)。

4 传输层

这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。主要是面向连接的TCP传输控制协议.另一个是不面向连接的UDP用户数据报协议

3 网络层

这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,主要是IP协议

2 数据链路层

一类是局域网中数据连路层协议:MAC子层协议,有LLC子层协议,以太网就位于该层.另一类是广域网的协议如:HDLC,PPP,SLIP.

1 物理层

关心的是接口,信号,和介质,只是说明标准,如EIA-232接口,以太网,fddi令牌环网

 

HTTP的概念

HTTP 全称HyperText Transfer Protocol (超文本传输协议)的缩写,是一种建立在 TCP 上的无状态连接。HTTP 是互联网的基础协议,用于客户端与服务器之间的通信,它规定了客户端和服务器之间的通信格式,包括请求与响应的格式。这里解释一下无状态连接的意思:服务端不会记录客户端的状态,即两次访问之间没有什么关联,举个例子,你第一次去小卖部里买东西,觉得跟老板说了两句话已经算熟悉了,过了一周又去,想跟老板套近乎要优惠,但是老板完全不会记得你是谁。这也是为什么需要cookie来记录用户信息,而因为cookie的不可靠和传输数据大小限制,有有了保存在服务端的session。也可以说,借着cookie和session,HTTP在某种意义上实现了有状态连接的功能。

下图展示了HTTP的基本工作流程:客户端发起请求,服务端处理请求,并将处理结果返回给客户端。

 

报文的概念

报文是在 HTTP 应用程序之间发送的数据块。这些数据块以一些文本的元信息 (meta 标签中的信息) 开头,描述了报文的内容及含义。

1 HTTP请求报文

HTTP请求报文由3部分组成(请求行+请求头+请求体):

 

1.1 请求行:

①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。

②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。

③是协议名称及版本号。

1.1.1 HTTP请求报文头属性

Accept 
请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。 
如下报文头相当于告诉服务端,俺客户端能够接受的响应类型仅为纯文本数据啊,你丫别发其它什么图片啊,视频啊过来,那样我会歇菜的~~~

如    Accept:text/plain   

Accept属性的值可以为一个或多个MIME类型的值(描述消息内容类型的因特网标准, 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据),这里注意,是客户端能接受的返回类型,而不是服务端能接受的类型。

其余头信息如Accept-language 字面就可以理解,即为客户端可接受的语言(中文zh_CN啊,英文啊)具体需要深入学习的,可以再查资料,都展开的话内容就太多了,需要用到的时候,再具体去学吧,你知道,它是在请求体里的就好。

Cookie

Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23   

前面提过,cookie是保存在客户端的,保留访问者属性的工具,cookie以键值对的形式保存数据,前/后台代码均可设置cookie的有效期,也可以通过将有效期设置为当前时间前一秒直接删除cookie。通过jsessionid可以保证用户访问到正确的session

Referer(引用)
表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。

Cache-Control

缓存控制

1.2 请求头:

④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。

与缓存相关的规则信息,均包含在header中

1.3 请求体:

⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

 

 

2 HTTP响应报文

HTTP的响应报文也由三部分组成(响应行+响应头+响应体)

2.1 响应行:

①报文协议及版本; 
②状态码及状态描述;

可以看到,响应报文里面多了一个响应状态码,用来表示客户端此次请求的处理结果

HTTP的响应状态码由5段组成:

  • 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
  • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
  • 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
  • 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  • 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

一般来说,工作中最常见的就是访问地址错误(404),服务器错误(500),处理成功(200),这里提一点,不要看到所有接口返回200就觉得高枕无忧了,博主在工作中不止一次遇到有人接口调用完全正常,返回200,但是后台逻辑存在错误导致返回值错误的问题。比如,对正确逻辑来说,请求参数为 a ,需要返回的是false字段,结果接口状态200,返回true,这是小白可能会犯的错(我也是小白),值得注意的是,这个状态码其实是可以自己定义的,很多公司也会自己定义一些状态码来针对不同的业务和不同的错误信息。

2.2 响应头:

③响应报文头,也是由多个属性组成;

2.3 响应体:

④响应报文体,即我们真正要的“干货”

 

断点续传

这里提一下,博主在面试时被问过关于HTTP断点续传的问题,这里也搜罗总结一下。

HTTP是支持断点续传的,断点续传,字面意思,就是中断文件传输后,紧接着上一次的进度继续传输,可通过设置HTTP头 Range和Content-Range字段实现这个功能,而服务端文件若在中断前后反升了变化,此时若不作任何处理则会导致文件不一致的问题,大家可以看一下这篇简书的文章,简短明了,https://www.jianshu.com/p/012c8a4dc661,文章里有小错误,无伤大雅,主要看我们想看的东西

长连接、短连接

这里再多一句嘴,关于长、短连接的概念

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

 

请求方式

常见的HTTP请求方式有GET POST PUT DELETE等

先说一下GET,这是最常见的请求方式,访问服务器展示某列表啊等等通常都是GET

  • 最常见的请求方式
  • 指定请求路径,向服务器请求资源
  • 只获取资源,不对服务器数据进行修改
  • 不发送 body

其次是POST,POST是带一个请求体的,可以将想发到服务器的内容置于请求体(这里与响应体统称为body)中,这一点,在操作postman模拟请求参数的时候就能看出来,传递参数的方式与GET不同

这里提一下HEAD,与GET使用完全相同,没有请求体没有body,响应里也没有,但是用于下载需求时,头信息里有文件的大小,可用于显示下载的进度

 

HTTP与TCP、SOCKET的关系

TCP是一种面向连接、可靠的、基于字节流的传输层通信协议,在因特网协议族中,tcp(位于传输层)是位于IP层之上,应用层之下的中间层,不同主机的应用层之间经常要可靠的,像管道一样的连接,但是ip层(网络层)不提供这样的流机制,而是提供了不可靠的包交换。

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

提到了TCP,再提一下TCP的三次握手和SYN攻击概念:

      建立起一个TCP连接需要经过“三次握手”:

      第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

      第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

      第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

      握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求。

SYN攻击就是利用三次握手的第二次握手时进行的,这时候服务器处于SYN_RECV状态,等待客户端进行确认ACK,SYN会伪造不存在的源IP,就会有大量的链接处于等待或重试发送SYN+ACK包,导致该阶段队列持续增长,进而导致后续正常的请求被丢弃 (此段三次握手及SYN攻击概念引用CSDN博客https://blog.csdn.net/qq_35001776/article/details/84391140 ) 

而socket(套接字)连接可以选定指定的传输层协议如TCP、UDP作为通信协议,可以把socket理解成一套接口。提供基于传输层协议(如TCP、UDP)的创建连接、互相传输数据、关闭连接等的操作API,socket连接不被关闭就是长连接。

HTTP连接服务端无法主动发消息,Socket连接双方请求的发送先后限制。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。

HTTP  :客户端发送请求,服务端响应

socket:双方互传数据

 

总结:HTTP为应用层一种传输协议 TCP是一种位于传输层的传输协议,HTTP基于TCP,socket是一套操作传输的API,可以基于TCP也可以基于其它协议,HTTP只能是执行请求-响应模式,socket套接字创建的连接则没有这个限制

博主后续会跟进学习cookie 、session 、socket连接和https的相关知识,此篇博客仅供参考,有错误欢迎指出,觉得不错可以点个赞~

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值