HTTP问题总结

HTTP相关内容

1.HTTP协议简介

  • HTTP协议是一种网络协议。网络协议:计算机通信网络中两台计算机之间进行通信必须遵守的规定or准则。
  • HTTP协议属于应用层协议
  • HTTP协议在传输层使用的是可靠的数据传输协议TCP协议
  • TCP/IP协议族中和HTTP协议关系比较密切的协议: IP,TCP,DNS。分属于:网络层、传输层、应用层。
    • IP简介
    • 位置:网络层
    • 作用:把各种数据包传送给对方, 依赖于IP地址和MAC地址,用到ARP协议。
    • TCP简介
    • 位置:传输层
    • 作用:提供可靠的字节流服务
    • 性能分析:
      • 三次握手,保证通信可靠性。用到TCP标志位:SYN,ACK.
      • 持久连接,节省通信量。从HTTP/1.1版本开始支持。
        • 特点:任意一端没有明确提出断开连接,则保持TCP连接状态。
        • 好处:
          1)减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载
          2)减少开销的那部分时间,使HTTP请求和响应能够更早地结束,提高Web页面显示速度
          3)支持发送流水线请求,也就是说在发送请求1之后的回应到来之前就可以发送请求2。也可以认为,一次连接发送多个请求.
    • DNS简介
    • 位置:应用层
    • 作用:实现了IP地址到域名地址的解析
    • 解析方式:递归+迭代
      1)递归查询:主机–>本地域名服务器
      2)迭代查询:本地域名服务器–>根域名服务器

2.HTTP请求的完整过程

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

  1. 建立TCP连接
    在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

  2. Web浏览器向Web服务器发送请求命令
    一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

  3. Web浏览器发送请求头信息
    浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

  4. Web服务器应答
    客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

  5. Web服务器发送应答头信息
    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

  6. Web服务器向浏览器发送数据
    Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

  7. Web服务器关闭TCP连接
    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

3.HTTP状态码

  • 分5类:1xx,2xx,3xx,4xx,5xx(6xx).
  • 分类分析:
    • 1xx: 消息
      • 这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应
      • 100 Continue
        客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝
      • 101 Switching Protocols
        服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade消息头中定义的那些协议
      • 102 Processing
        由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行.
    • 2xx: 成功
      • 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受
      • 200 OK
        请求成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态
      • 201 Created
        请求已经被实现,而且有一个新的资源已经依据请求的需要而建立其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 ‘202 Accepted’。
      • 202 Accepted
        服务器已接受请求,但尚未处理。最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。
        返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成
      • 203 Non-Authoritative Information
        服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
      • 204 No Content
        服务器成功处理请求,但不需要返回任何实体内容,并且希望返回更新了的元信息.
        如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化
      • 205 Reset Content
        服务器成功处理请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图.
      • 206 Partial Content
        服务器已经成功处理部分GET请求。类似于 FlashGet 或者迅雷这类的 HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
      • 207 Multi-Status
        由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
    • 3xx: 重定向
      • 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
      • 300 Multiple Choices
        被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
      • 301 Moved Permanently
        被请求的资源已永久移动到新位置,并且将来任何对此资源的引用使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的
      • 302 Move temporarily
        请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
      • 303 See Other
        对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源.303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。
      • 304 Not Modified
        如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体
      • 305 Use Proxy
        被请求的资源必须通过指定的代理才能被访问
      • 307 Temporary Redirect
        请求的资源临时从不同的URI响应请求。新的临时性的URI应当在响应的 Location 域中返回.
    • 4xx: 请求错误
      • 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理.
        这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
      • 400 Bad Request
        1)语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
        2)请求参数有误。
      • 401 Unauthorized
        当前请求需要用户验证
      • 402 Payment Required
        该状态码是为了将来可能的需求而预留的。
      • 403 Forbidden
        服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交
      • 404 Not Found
        1)请求失败,请求所希望得到的资源未被在服务器上发现
        2)404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
        3)出现这个错误的最有可能的原因是服务器端没有这个页面。
      • 405 Method Not Allowed
        请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表
      • 406 Not Acceptable
        请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体
      • 407 Proxy Authentication Required
        与401响应类似,只不过客户端必须在代理服务器上进行身份验证
      • 408 Request Timeout
        请求超时
      • 409 Conflict
        由于和被请求的资源的当前状态之间存在冲突,请求无法完成
        冲突通常发生于对 PUT 请求的处理中。例如,在采用版本检查的环境下,某次 PUT 提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成
      • 410 Gone
        被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的
      • 411 Length Required
        服务器拒绝在没有定义 Content-Length 头的情况下接受请求
      • 412 Precondition Failed
        服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个
        这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
      • 413 Request Entity Too Large
        服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围
      • 414 Request-URI Too Long
        请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见
      • 415 Unsupported Media Type
        对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
      • 416 Requested Range Not Satisfiable
        如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。
      • 417 Expectation Failed
        在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。
      • 421 too many connections
        从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围
      • 422 Unprocessable Entity
        请求格式正确,但是由于含有语义错误,无法响应
      • 423 Locked
        当前资源被锁定
      • 424 Failed Dependency
        由于之前的某个请求发生的错误导致当前请求失败,例如 PROPPATCH
      • 426 Upgrade Required
        客户端应当切换到TLS/1.0。
      • 451 Unavailable For Legal Reasons
        该请求因法律原因不可用
    • 5xx,6xx:服务器错误
      • 这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
      • 500 Internal Server Error
        服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现
      • 501 Not Implemented
        服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求
      • 502 Bad Gateway
        作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应
      • 503 Service Unavailable
        由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复
        注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接
      • 504 Gateway Timeout
        作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应
      • 505 HTTP Version Not Supported
        服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本
      • 506 Variant Also Negotiates
        代表服务器存在内部配置错误
      • 507 Insufficient Storage
        服务器无法存储完成请求所必须的内容。这个状况被认为是临时的
      • 509 Bandwidth Limit Exceeded
        服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用
      • 510 Not Extended
        获取资源所需要的策略没有被满足
      • 600 Unparseable Response Headers
        源站没有返回响应头部,只返回实体内容

4.TCP/IP协议族简介

  • 定义
    TCP/IP是一组协议的代名词,包括许多别的协议,组成了TCP/IP协议簇。其中比较重要的有SLIP协议、PPP协议、IP协议、ICMP协议、ARP协议、TCP协议、UDP协议、FTP协议、DNS协议、SMTP协议等
  • TCP/IP模型
    • 分层定义:解耦
    • 层次划分4:
      • 网络接口层—>OSI:物理层+数据链路层
        用来处理连接网络的硬件部分。包括:控制操作系统、硬件的设备驱动、网卡及光纤等物理可见部分。
      • 网际层—>OSI:网络层
        • 用于实现异构网络之间的互联。包括:路由选择、存储转发、拥塞控制等。
        • 提供了主机之间的逻辑通信
      • 传输层—>OSI:传输层
        • 传输层提供了进程之间的逻辑通信
        • 复用和分用。
          • 复用:指发送方不同的应用进程都可以使用同一个传输层协议传送数据;
          • 分用:指接收方的传输层在剥去报文首部后,能把这些数据正确交付到目的进程。
        • 差错监测,包括报文的首部数据部分
      • 应用层—>OSI:会话层+表示层+应用层
        向用户提供应用服务实时通信的活动。
      • 模型示意图<插入图片>
        HTTP问题总结_第1张图片
        HTTP问题总结_第2张图片

5.HTTP协议

  • 协议特点:无状态
    • 定义:同一个客户第二次访问同一个服务器上的页面时,服务器的响应和第一次被访问时的相同。因为服务器不记得曾经访问过的客户,也不记得为其服务过多少次。
    • 好处:
      1)更快的处理大量事务。
      2)确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。
  • 保持状态措施:cookie+数据库
    • cookie
      • 引入意义
        登录认证的web页面不能管理状态,每次跳转需要在请求报文添加参数来管理信息。如果让服务器管理全部客户端状态则会成为负担,保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入Cookie技术。
      • 工作原理
        Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态,Cookie会根据从服务器端发送的响应报文内的一个叫Set-Cookie的首部字段,通知客户端保存Cookie,当下次客户端再次往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。
  • HTTP/1.1协议支持的请求方法
    • POST
      • 功能:GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。
      • 克服了GET方法中的信息无法保密和数据量太小的缺点。
      • 该方法的响应是不可缓存的,除非响应里有合适的Cache-Control或者Expires头域
    • DELETE
      • 功能:DELETE方法请求源服务器删除请求URI指定的资源
      • 该方法的响应是不能被缓存的.
    • PATCH
      • 功能:用来更新局部资源。
      • 区分于PUT:PATCH方法是新引入的,是对PUT方法的补充,用来对已知资源进行局部更新。put虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象
    • GET
      • 功能:GET 方法用于获取由 Request-URI 所标识的资源的信息
      • 默认方法:GET方法是默认的HTTP请求方法,例如当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是 GET 方法向服务器获取资源。
      • 使用GET方法来提交表单数据存在的问题
        • GET方法提交的表单数据只经过了简单的编码,存在着安全隐患。
        • 提交的数据量不能太,这是因为浏览器对URL的长度有限制,而提交的数据是作为URL请求的一部分。
        • 该方法的响应是可缓存
    • HEAD
      • 功能:获取请求实体的头域信息而不需要传输实体主体
      • 与GET区分:与 GET 方法几乎是相同的,它们的区别在于 HEAD 方法只是请求消息报头,而不是完整的内容
      • 用途:这个方法通常被用于测试超链接的有效性,是否可以访问,以及最近是否更新。
      • 该方法的响应是可缓存的。
    • OPTIONS
      • 用来查询针对请求URI指定的资源支持的方法。(响应Allow:GET,POST)
      • 该方法的响应是不能缓存的。
    • TRACE
      • 用于激发一个远程的,应用层的请求消息回路
      • TRACE方法让客户端测试到服务器的网络通路,回路的意思如发送一个请求返回一个响应,这就是一个请求响应回路
      • 不能缓存
    • MOVE
      请求服务器将指定的页面移至另一个网络地址。
    • COPY
      请求服务器将指定的页面拷贝至另一个网络地址。
    • LINK
      请求服务器建立链接关系。
    • UNLINK
      断开链接关系。
    • WRAPPED
      允许客户端发送经过封装的请求。
    • Extension-mothed
      在不改动协议的前提下,可增加另外的方法。

6.URL

  • 功能:用于描述一个网络上的资源。
  • 基本格式:schema://host[:port]/path/[;url-params][?query-string]#fragment
  • 格式说明:
    • 带方括号[]的为可选项
    • scheme:指定底层使用的协议(例如:HTTP, HTTPs, ftp, mailto,file,telnet)
    • host: HTTP服务器的IP地址或者域名
    • port: HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明。例如HTTP://www.cnblogs.com:8080/
    • path: 由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
    • url-params:用于指定特殊参数的可选项
    • query-string:可选,用于给动态网页(如使用CGI、ISAPI、PHP、JSP、ASP、ASP.NET等技术制作的网页)传递参数,多个参数用“&”符号隔开,每个参数的名和值用“=”符号隔开。
    • fragment(锚用):用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释
  • 格式举例
    • HTTP://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
    • schema: HTTP
    • host: www.mywebsite.com
    • port: 80,没有端口号时默认为80
    • path: /sj/test
    • url-params: id=8079
    • query-string: name=sviergn&x=true
    • anchor: stuff

参考文章:
http://blog.csdn.net/ochangwen/article/details/51626969
http://www.cnblogs.com/linjiqin/p/3560152.html
https://www.cnblogs.com/liangxiaofeng/p/5798607.html
https://baike.baidu.com/item/HTTP状态码/5053660?fr=aladdin

你可能感兴趣的:(网络)