当前位置: 首页 > 后端技术 > PHP

搞定服务器面试-HTTP协议知识点整理

时间:2023-03-29 18:48:49 PHP

HTTP协议知识点整理一、HTTP协议简介1.含义HTTP协议是超文本传输??协议(HyperTextTransferProtocol)的缩写,它用于服务器之间浏览器和服务器传输文本、图片、音频和视频等超文本数据的约定和规范。当前主流的HTTP协议版本为HTTP/1.12。它是无状态的,每个请求都是一个独立的、不相关的应用层协议。支持B/S和C/S模式,灵活可扩展,可添加头域实现任意功能可靠性强,“尽可能”基于TCP/IP协议保证数据传递通信开销小,简单且速度快,传输成本低,节省传输时间3.工作原理HTTP协议采用请求/响应模型。客户端向服务器发送请求消息,请求消息包括请求方法、URL、协议版本、请求头和请求数据。服务器响应状态行,其中包括协议版本、成功或错误代码、服务器信息、响应标头和响应数据。客户端向服务器发送请求,创建TCP连接,指定端口号,默认为80,连接到服务器。服务器监听浏览器请求。一旦监听到客户端请求,分析出请求类型,服务器就会返回状态信息给客户端。和数据内容。客户端与服务器建立TCP连接。客户端向服务器发送请求,建立TCP连接,并指定服务器的通信端口号,默认为80。发送HTTP请求消息客户端通过TCP连接向服务器发送HTTP请求消息。请求报文由四部分组成:请求行、请求头、空行和请求数据。服务器接收请求消息并返回响应消息。服务端继续监听80端口,一旦监听到请求数据,就会立即分析请求报文,定位到请求的资源。服务器将请求的资源组成一个响应消息,并将其发送回客户端。响应消息由4部分组成:状态行、响应头、空行和响应数据。断开TCP连接如果Connection头是close,服务器会主动关闭TCP连接,客户端会被动关闭连接并释放TCP连接。如果Connection头是keep-alive,连接会保持一段时间,在这段时间内可以继续接收请求。客户端接收并解析响应消息。客户端首先解析状态行,查看表示请求是否成功的状态码。然后解析每个响应头域,得到响应数据的长度、字符集、编码等信息。浏览器读取响应数据HTML,按照HTML的语法格式化,显示在浏览器窗口中。二、HTTP协议请求方式1、GET:获取资源GET方式用于请求访问URI标识的资源。服务器解析指定资源并返回响应内容。2.POST:传输实体主体POST方法用于传输实体主体。虽然也可以使用GET方法来传输实体的主体,但一般不使用GET方法进行传输,而是使用POST方法。虽然POST的功能和GET很相似,但是POST的主要目的并不是获取响应的主要内容。3.PUT:传输文件PUT方法用于传输文件。就像FTP协议的文件上传一样,需要在请求报文的body中包含文件内容,然后保存到请求URI指定的位置。但是由于HTTP/1.1的PUT方式没有认证机制,任何人都可以上传文件,存在安全问题,所以一般的网站都不会使用这种方式。如果配合Web应用的认证机制,或者类似的架构设计采用REST(REpresentationalStateTransfer)标准的网站,PUT方法可能会开放使用。4、HEAD:HEAD获取消息头的方法与GET方法相同,只是不返回消息体。用于确认URI的有效性和资源更新的日期和时间等。5.DELETE:删除文件DELETE方法用于删除文件,与PUT方法相反。DELETE方法通过请求URI删除指定的资源。但是HTTP/1.1的DELETE方法本身并没有像PUT方法那样的认证机制,所以一般的网站不会使用DELETE方法。当与Web应用程序的身份验证机制结合使用时,或者当符合REST标准时,它仍然可以开放使用。6.OPTIONS:查询支持的方法OPTIONS方法用于查询请求URI指定的资源所支持的方法。7.TRACE:TracingthepathTRACE方法是Web服务器将之前的请求通信环回给客户端的一种方法。发送请求时,在Max-Forwards头域中填入值,每通过一个服务器该数字减1。当值刚好减为0时,停止传输,最后收到请求的服务器返回状态码200OK响应。通过TRACE方法,客户端可以查询发送的请求是如何被修改/篡改的。这是因为连接到源目标服务器的请求可能会通过代理进行中继,TRACE方法用于确认连接过程中发生的一系列操作。但是TRACE方式不是很常用,容易引起XST(Cross-SiteTracing,跨站跟踪)攻击,所以通常不使用。3、HTTP常见状态码状态码的职责是描述客户端向服务器端发送请求时返回的请求结果。借助状态码,用户可以知道服务器是正常处理了请求还是发生了错误。1.1XXInformational(信息性状态码,收到的请求正在处理中)2.2XXSuccess(成功状态码,表示请求已正常处理)200OK表示客户端发送的请求已正常处理服务器端。204NoContent该状态码表示服务器收到的请求已成功处理,但返回的响应消息中不包含实体的主体。此外,不允许返回任何实体的主体。例如,当浏览器处理请求后返回204响应时,浏览器显示的页面将不会更新。一般用于客户端只需要向服务器发送信息,不需要向客户端发送新信息的情况。206PartialContent该状态码表示客户端发出范围请求,服务器成功执行了这部分GET请求。响应消息包含Content-Range指定范围内的实体内容。3.3XXRedirection(重定向状态码,完成请求需要额外操作)301MovedPermanently永久重定向。此状态代码表示已为请求的资源分配了一个新的URI,并且将来应该使用该资源现在引用的URI。也就是说,如果你已经将该资源对应的URI保存为书签,你应该根据Location头域提示的URI重新保存。302Movetemporary临时重定向。这个状态码表示请求的资源已经分配了一个新的URI,希望用户(此时)可以使用新的URI访问。类似于301MovedPermanently状态码,但是302状态码代表的资源不是永久移动的,只是暂时的。也就是说,被移动的资源对应的URI以后可能会发生变化。例如,用户将URI保存为书签,但并没有像出现301状态码时那样更新书签,而是保留了返回302状态码的页面对应的URI。304NotModified此状态码表示当客户端发送带条件的请求时,服务器允许请求访问资源,文档内容(自上次访问或根据请求的条件)没有改变.4.4XXClientError(客户端错误状态码,服务器无法处理请求)400BadRequest该状态码表示请求报文中存在语法错误。当出现错误时,需要修改请求内容,重新发送请求。401Unauthorized该状态码表示发送的请求需要通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外,如果之前有请求过,则表示用户认证失败。以401返回的响应必须包括适用于所请求资源的WWW-Authenticate标头以质询用户信息。当浏览器第一次收到401响应时,会弹出一个用于验证的对话窗口。403Forbidden此状态代码表示对所请求资源的访问已被服务器拒绝。对文件系统的未授权访问,访问权限的一些问题(试图从未授权的源IP地址访问)等可能是403的原因。404NotFound这个状态码表示在服务器上找不到请求的资源.405MethodNotAllowed表示服务器不允许当前请求使用的HTTP方法。例如,使用GET方法请求需要POST方法的数据。5.5XXServerError(服务器错误状态码,服务器处理请求错误)500InternalServerError该状态码表示服务器端在执行请求时发生了错误。Web应用程序中可能存在错误或一些临时故障。502BadGateway此状态代码表示服务器与网关/代理之间的通信存在错误。503ServiceUnavailable该状态码表示服务器暂时过载或正在停机维护,现在无法处理请求。504GatewayTimeoutGatewayTimeout该状态码表示服务器作为网关或代理,没有及时收到上游服务器的请求。4、HTTP协议的公共头字段0.End-to-end头和Hop-by-hop头HTTP头字段将被定义为缓存代理和非缓存代理行为,分为两种类型。逐跳报头(Hop-by-hopHeader)逐跳报头只??对与当前浏览器直连的服务器(如Nginx反向代理)有效。经过缓存或代理服务器后,逐跳报头不会转发给上游服务器。例如,Keep-Aliveheader仅表示浏览器尝试与直接Nginx保持连接,而不管Nginx与后续服务器之间的连接。代理服务器要根据自己的需要对这些头部进行处理和修改。HTTP/1.1版本之后,如果要使用逐跳报头,必须提供Connection报头字段。下面列出了HTTP/1.1中的逐跳标头字段。上面ConnectionKeep-AliveProxy-AuthenticateProxy-AuthorizationTrailerTETransfer-EncodingUpgrade这8个头域的作用在第4节有介绍,除了这8个头域外,其他所有域都属于端到端头(End-to-endHeader).端到端标头(End-to-endHeader)端到端标头用于在浏览器和最终处理请求的服务器之间传递信息。例如,Accept头表示客户端想从后端服务器获取的数据类型,与中间代理服务器无关。代理服务器不得修改这些标头。1.通用头域通用头域是指请求消息和响应消息都使用的头域。Cache-Control控制缓存行为的工作机制。指令的参数是可选的,多个指令用,分隔。Cache-Control:max-age=0,no-cacheCache-Control:private,must-revalidatecacherequestinstruction指令参数说明no-cache不强制向源服务器重新认证no-store不缓存请求的任何内容或响应max-age=[seconds]requiredmaxResponsemax-stale(=[seconds])optional接收过期的响应min-fresh=[seconds]required期望指定时间内的响应仍然有效no-transformnoproxyChangemediatypeonly-if-cached不能从缓存中获取资源cache-extension-new指令token(token)缓存响应指令参数说明public没有可以向任何一方提供响应的缓存private可以省略只返回一个responsetoaspecificuserno-cacheValiditymustbeconfirmedbeforecachingcanbeomittedno-store不缓存请求或响应的任何内容no-transformnoproxy不能改变媒体类型must-revalidatenocacheablebutmustbeconfirmedwiththesourceserverproxy-revalidatenointermediaterequired缓存服务器将确认缓存响应的有效性max-age=[seconds]所需响应的最大年龄值s-maxage=[seconds]所需响应的最大年龄值需要来自公共缓存服务器缓存扩展新命令令牌(令牌)的响应ConnectionConnection可以承载3种不同类型的标记。Managepersistentconnections(keep-alive/close)设置代理服务器不应转发的头字段(逐跳头)的任何标签值,用于描述此连接的非标准选项。HTTP/1.1版本默认的连接是持久连接(keep-alive)。因此,客户端在长连接上不断发送请求。当服务器要显式断开连接时,将Connection头域的值指定为close。连接:cloneHTTP/1.1之前的版本默认连接是非持久连接。因此,如果要在旧版本的HTTP协议上保持持久连接,需要将Connection头域的值指定为keep-alive。Connection:keep-aliveConnection也可以用来设置逐跳header,比如Connection:Upgrade,表示在这个连接中,Upgrade是逐跳header,不应该通过代理服务器原样。Connection:UpgradeDate记录创建HTTP消息的日期和时间。日期:2020年12月31日星期四14:42:39GMTTrailer声明在消息正文之后记录哪些标头字段。这个头字段一般在HTTP/1.1分块传输编码时使用。HTTP/1.1200OK...预告片:ExpiresExpires:2004年9月28日星期二23:59:59GMTTransfer-Encoding指定消息正文的传输编码方法。HTTP/1.1传输编码方法仅对分块传输编码有效。Transfer-Encoding:chunkedUpgrade用于检测HTTP协议和其他协议是否可以使用更高版本进行通信,其参数值可用于指定完全不同的通信协议。Upgrade:TLS/1.0Connection:Upgrade头字段Upgrade中指定的值为TLS/1.0。Upgrade头字段只影响客户端和相邻服务器之间的升级对象。因此,在使用第一个字段Upgrade时,需要额外指定Connection:Upgrade。对于带有Upgrade标头字段的请求,服务器可以返回101SwitchingProtocols状态代码作为响应。Via记录了通信中间代理服务器的相关信息。当消息通过代理或网关时,会先将服务器的信息添加到头域Via中,然后再转发。Via:1.0gw.hackr.jp(Squid/3.1),1.1a1.example.com(Squid/2.7)Keep-Alive设置连接的超时时间和最大请求??数。保持活动:超时=10,最大值=10002。实体头域实体头域是指请求消息和响应消息中包含的实体部分所使用的头域,包括内容的更新时间等与实体相关的信息。Allow为当前请求声明服务器支持的HTTP方法。当服务器接收到不受支持的HTTP方法时,它会使用状态代码405MethodNotAllowed进行响应。同时,所有支持的HTTP方法都会被写入到头字段Allow中并返回。允许:GET、HEAD、DELETEContent-Type指定请求或响应正文的MIME类型。内容类型:application/x-www-form-urlencodedContent-Type:text/html;charset=utf-8Content-Encoding设置数据使用的编码类型。Content-Encoding:gzipContent-Language请求体使用的自然语言(指中文或英文等语言)Content-Language:zh-CNContent-Length请求体或响应体的字节长度。Content-Length:3148Expires设置响应数据的缓存过期时间。缓存服务器收到包含头域Expires的响应后,会用缓存响应请求,响应的副本会一直保留到Expires域的值指定的时间。当指定的时间到期后,缓存服务器会在发送请求时转向源服务器请求资源。当源服务器不希望缓存服务器缓存资源时,最好在Expires字段中写入与头字段Date相同的时间值。但是当头域Cache-Control指定了max-age指令时,缓存过期时间会根据max-age来设置。Expires:Thu,01Dec202116:00:00GMTLast-Modified设置响应数据的最后修改时间。最后修改时间:2021年11月15日星期二12:45:26GMT最后修改时间:2015年10月21日星期三07:28:00GMT3。请求头域是客户端向服务器端发送请求报文时使用的头域。包含请求的附加内容、客户端信息、响应内容的优先级等信息。Host表示请求将发送到的服务器的主机名和端口号。如果使用服务请求的标准端口号,端口号可以省略。Host:www.abc.org:8080Host:www.abc.orgAccept告诉(服务器)客户端可以处理的内容的MIME类型。Accept:text/plainAccept:text/htmlAccept:image/*Accept-Charset告诉(服务器)客户端可以处理的字符集类型。Accept-Charset:utf-8Accept-Charset:iso-8859-1Accept-Charset:utf-8,iso-8859-1;q=0.5,*;q=0.1Accept-Encoding告诉(服务器)客户端可以处理什么编码formatAccept-Encoding:gzip,deflateAccept-Encoding:gzip,compress,brAccept-Encoding:br;q=1.0,gzip;q=0.8,*;q=0.1origin标识跨域资源请求(请求服务器设置Access-Control-Allow-Originresponsefield)Origin:http://www.abc.comUser-AgentHTTP客户端程序信息,包括应用类型、操作系统、软件开发商和版本号等User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.88Safari/537.36Cookie由服务器通过Set-Cookie头发送,存储在客户端的HTTPcookie信息中。Cookie:名称=值;名称2=值2;name3=value3Authorization设置用于HTTP身份验证的凭据。Authorization:BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ==Referer当前请求的源页面地址,表示当前页面是通过这个源页面中的链接进入的。服务端一般使用Referer请求头来标识访问源,可用于资源防盗链、统计分析、日志记录、缓存优化等。Referer:http://www.abc.org/wikiX-Forwarded-For如果客户端在访问服务器的过程中需要经过HTTP代理或者负载均衡服务器,可以通过获取服务器的IP地址最初发起请求的客户端。X-Forwarded-For:client1,proxy1,proxy2X-Forwarded-For:201.1.213.125,72.42.33.28,110.132.218.178Forwarded包含代理服务器客户端的信息,即修改或丢失的信息。转发:by=;for=<标识符>;主机=<主机>;proto=转发:for=192.0.2.60;原型=http;by=203.0.113.43TE告诉服务器客户端可以处理响应的传输编码和相对优先级。它与头字段Accept-Encoding非常相似,但用于传输编码。除了指定传输编码之外,还可以指定伴随尾部字段的分块传输编码方法。要应用后者,只需将尾部分配给字段值即可。TE:gzip,deflate;q=0.5TE:trailersProxy-Authorization包含用户代理提供给代理服务器进行身份验证的凭据。该标头通常在服务器返回407ProxyAuthenticationRequired响应状态码和Proxy-Authenticate标头后发送。代理授权:<类型><凭据>代理授权:基本dGlwOjkpNLAGfFY54。当从服务器向客户端返回响应消息时使用响应头字段。包含响应的额外内容,也需要客户端附加额外的内容信息。Age响应主体在代理缓存中暂存的秒数。Age:3600ETag特定版本资源的标识符。可以大致理解为响应体数据的MD5值。当responsebody没有变化时,不需要将response数据全部返回,只需要判断header即可。ETag:"737060cd8c284d8af7ad3082f209582d"位置将客户端重定向到指定的URI。位置:http://www.abc.org/pubAccess-Control-Allow-Origin指定哪些网站可以参与跨站资源共享。Access-Control-Allow-Origin:*Access-Control-Allow-Origin:Set-Cookie设置HTTPCookieSet-Cookie:UserID=123;Max-Age=3600;Version=1Proxy-Authenticate代理服务器对客户端的认证信息。Proxy-Authenticate标头需要与407ProxyAuthenticationRequired响应一起发送。Proxy-Authenticate:Basicrealm="UsagidesignAuth"欢迎关注

猜你喜欢