HTTP相关知识1.HTTP的概念超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应用层协议。它被设计用于Web浏览器和Web服务器之间的通信,但它也可以用于其他目的。HTTP遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。HTTP是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然通常基于TCP / IP层,但可以在任何可靠的传输层上使用2.URL和URIURI:uniform resource identifier 统一资源标识符,一种资源的标识,它是一种抽象的资源标识,即可以是相对的,也可以是绝对的。URL:uniform resource location 统一资源定位符,一用来标识抽象或物理资源的一个紧凑字符串。3.HTTP报文HTTP报文由报文首部、空行、报文主体构成:其中的空行用于区分报文首部和报文主体内容,是由一个回车符和一个换行符组成的。 无论是请求报文还是响应报文都需要有报文首部,而报文主体有些请求报文是没有的。而请求报文的一般格式如下:而响应报文的格式是这样的:其中最常见的属性如下:URL, 即http访问的地址request method, 报文的请求方式status code, 状态码以及状态短语Accept Encoding, 内容编码Connection, 连接方式Cookie, 添加的cookie内容Host, 目标主机User-Agent, 客户端浏览器的相关信息Set-Cookie, 指定想要在Cookie中保存的内容请求方式(request method)——常见GET和POSTGET方法可以用来请求访问已经被URL识别的资源。指定的资源经过服务端解析后返回响应的内容。简单来说,就是请求的资源是文本的话,那么就保持原样返回。POST方法可以用来传输实体的主体。两者区别:1.使用目标不同POST与GET都用于获取信息,但是GET方式仅仅是查询,并不对服务器上的内容产生任何作用结果;每次GET的内容都是相同的。POST则常用于发送一定的内容进行某些修改操作。2.大小不同由于不同的浏览器对URL的长度大小有一定的字符限制,因此由于GET方式放在URL的首部中,具体的大小要依浏览器而定。POST方式则是把内容放在报文内容中,因此只要报文的内容没有限制,它的大小就没有限制。3.安全性不同上面也说了GET是直接添加到URL后面的,直接就可以在URL中看到内容。而POST是放在报文内部的,用户无法直接看到。总的来说,GET用于获取某个内容,POST用于提交某种数据请求,从使用场景来看,一般用户注册的内容是私密的,应该使用POST方式来保持私密,而当需要查询某个内容时,需要快速响应,则使用GET。常见status code状态码200 通常的成功 OKGET:请求的对应资源会作为响应返回。响应将包含描述或操作的结果。 POST:返回处理对应请求的结果204 成功处理请求,没有返回任何内容 No Content表示服务器接收到的请求已经处理完毕,但是服务器不需要返回响应。比如,客户端是浏览器的话,那么浏览器显示的页面不会发生更新。206 Partial Content成功处理了部分GET请求301 Moved Permanently请求的网页已永久移动到新位置,永久性重定向302 Found网站临时性重定向,暂时不能访问(备案、被查)303 See Other该状态码表示由于请求对应的资源存在另一个URI,并指定必须使用GET方法定向获取请求的资源。和302不同的是,302是不会改变上次的请求方法304 Not Modified访问不了,并返回和上次一样的话,表示资源未被修改过,还是和上次访问时一样。307 Temporary Redirect临时重定向,和302、303类似,不同的是,不会指定客户端要用什么样的方法请求,400 Bad Request表示客户端中存在语法错误,导致服务器无法理解该请求。客户端需要修改请求的内容后再次发送请求。401 Unauthorized即用户没有必要的凭据。该状态码表示当前请求需要用户验证。403 Forbidden服务器已经理解请求,但是拒绝执行它。404 Not Found服务器找不到请求的网页。500 Internal Server Error服务器遇到错误,无法完成请求。503 Service Unavailable由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是暂时的.内容编码 Accept Encoding由于有些报文的内容会过大,为了减少传输时间,HTTP会采取一些压缩的措施,例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式gzip。总的来说内容编码的格式有以下几种:gzip:GNU压缩格式compress:UNIX系统的标准压缩格式deflate:是一种同时使用了LZ77和哈夫曼编码的无损失压缩格式identity:不进行压缩持久化connection正常发送HTTP时,我们需要建立TCP的连接,然后再发送报文:如果每次都要发送HTTP报文都需要经历上面的拿过过程,无疑将会耗费很多时间在建立和断开连接的过程中,因此HTTP使用了connection属性,用于指定连接的方式,当当设置成keep-alive时,就会建立一条持久化的连接。这样就不需要每次都建立连接在中断连接:(HTTP1.1中connection默认开启keep-alive)报文首部总结4.HTTP方法HTTP支持几种不同的请求命令,这些命令被称为 HTTP 方法(HTTP method)。每 条 HTTP 请求报文都包含一个方法。这个方法会告诉服务器要执行什么动作(获取 一个 Web 页面、运行一个网关程序、删除一个文件等)。下表是一些常见的HTTP方法:PUT传输文件PUT方法用于传输文件,就像FTP协议的上传一样,要求在请求报文的主题中包含文件内容,然后保存到请求URI指定的位置。由于PUT方法不带验证机制,任何人都可以任何人都可以上传文件,存在安全性问题,因此一般的web网站不适用该方法。DELETE删除文件DELETE方法用来删除文件,是与put相反的方法,DELETE方法按照请求url删除指定的资源。其本质和PUT方法一样不带验证机制,所以建议少用DELETE方法。HEAD获取报文首部HEAD和GET方法一样,只是不返回报文主体部分,通常用于确认url的有效性及资源更新的日期时间等。5.HTTPS的概念HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单来说就是是HTTP的安全版本,即在HTTP下加入SSL层,HTTPS的安全基石是SSL,因此加密的详细内容就需要SSL。由于HTTP有以下几个缺点:传输的时候使用明文,这显然会被不法者截取干一些见不得人的勾当。没有认证机制,这样我们就可以伪造一些HTTP访问,这显然会造成一些困扰。比如Jmeter就是典型的例子,伪造一大堆的HTTP URL然后压力测试,这也就是DOS攻击的一种。无法验证报文的完整性,比如一个HTTP的报文已经被不法者截取并且篡改,而服务器端却无法验证。HTTP与HTTPS的区别正是由于以上这些缺点,HTTPS作出了以下一些改变:HTTP 是明文传输,HTTPS 通过 SSL\TLS 进行了加密;HTTP 的端口号是 80,HTTPS 是 443;HTTPS 需要到 CA 申请证书,一般免费证书很少,需要交费;HTTP 的连接很简单,是无状态的。而 HTTPS 协议则是由 SSL+HTTP; 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全;HTTPS的缺点:通信的速度变慢,由于需要加密,一个握手就多了好几个往返;对用户的机器负载的增加。补充:HTTP协议与TCP协议TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。6.TCP与UDP的区别TCP面向连接(如拨打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接;TCP提供可靠的服务。即通过TCP连接传送的数据,无差错,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;TCP面向字节流,实际上是把TCP数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络上出现拥塞不会使源主机的发送效率降低(对实时应用很有用,如IP电话,实时视频会议等);每一条TCP连接只能是点到点;UDP支持一对一,一对多,多对一,多对多的交互通信;TCP的首部开销20字节;UDP的首部开销小,只有8个字节;TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可靠信道;7.流媒体协议:RTP、RTCP、RTSP、MMS、HLS、HTTP progressive streaming当前在internet上传送音频和视频等信息主要有两种方式:下载,完整下载一个视频,再去播放流式传输,如优酷、爱奇艺等视频网址作用:RTP位于传输层(通常是UDP)之上,应用程序之下,实时语音、视频数据经过模数转换和压缩编码处理后,先送给RTP封装成为RTP数据单元,RTP数据单元被封装为UDP数据报,然后再向下递交给IP封装为IP数据包。这么说RTP是没有保证传输成功的,要保证成功,就要用到RTCP,RTCP消息含有已发送数据的丢包统计和网络拥塞等信息,服务器可以利用这些信息动态的改变传输速率,甚至改变净荷的类型。RTCP消息也被封装为UDP数据报进行传输。部分参考:https://juejin.im/post/5afad7…