美文网首页
http详解

http详解

作者: pengweinan | 来源:发表于2018-10-18 11:16 被阅读0次

    看过很多次http相关知识了,但没做过什么总结,这里就仔细总结下吧。

    tip下,我是根据《图解http》总结的,这里有原版下载:链接:http://pan.baidu.com/s/1jI64ar0 密码:cfft。

    1、网络基础TCP/IP:

    Http协议是TCP/IP协议中的一个子集,所以这里先摘要一下TCP/IP协议族。

    1.1、协议族的分层:应用层、传输层、网络层和数据链路层。

    应用层:决定了向用户提供应用服务时通信的活动。比如:FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务、http协议。

    传输层:对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。(TCP(Transmission Control Protocol传输控制协议、UDP(User Data Protocol,用户数据报协议)。

    网络层:用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位,该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层的作用就是在众多的选项内选择一条传输录像。

    链路层:用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(网络适配器、即网卡),

    首先作为发送端的客户端在应用层(http协议)发出一个想看某个Web页面的http请求。接着,为了传输方便,在传输层(TCP协议)把从应用层收到的数据(http请求报文)进行分割,并在各个报文上打上标记序号及端口号后发送给网络层。在网络层(IP协议)增加作为通信目的地的MAC地址后转发给链路层。

    发送端在层与层之间传输数据时,每经过一层必会打上一个该层所属的首部信息。反之,接受端在层与层之间传输时,每经过一层会把对应的首部消去。

    这种把数据信息包装起来的做法叫做封装。1.2、与http协议密切相关的3个协议,IP、TCP、DNS。

    IP协议位于网络层,注意IP协议并不是常说的IP地址。IP协议的作用是把各种数据包传送给对方。要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件就是IP地址和MAC地址。

    IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对,IP地址可以换,但MAC地址基本不会更改。

    TCP 位于传输层, 提供可靠的字节流服务。所谓的字节流服务( Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段( segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 一言以蔽之,TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。

    为了准确无误地将数据送达目标处, TCP 协议采用了三次握手( three-way handshaking) 策略。 握手过程中使用了 TCP 的标志( flag) —— SYN( synchronize) 和ACK( acknowledgement) 。发送端首先发送一个带 SYN 标志的数据包给对方。 接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。 最后, 发送端再回传一个带 ACK 标志的数据包, 代表“握手”结束。若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。

    DNS( Domain Name System) 服务是和 HTTP 协议一样位于应用层的协议。 它提供域名到 IP 地址之间的解析服务。计算机既可以被赋予 IP 地址, 也可以被赋予主机名和域名。 比如www.hackr.jp。用户通常使用主机名或域名来访问对方的计算机, 而不是直接通过 IP地址访问。 但主机名或域名是字母数字配合的表示形式,计算机只是处理一长串数字。为了解决这个问题,DNS 服务应运而生。 DNS 协议提供通过域名查找 IP 地址, 或逆向从 IP 地址反查域名的服务。

    2、http请求方法、请求报文及Cookie

    请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。

    响应报文基本上由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

    HTTP 是一种不保存状态, 即无状态( stateless) 协议。 HTTP 协议自身不对请求和响应之间的通信状态进行保存。 也就是说在 HTTP 这个级别, 协议对于发送过的请求或响应都不做持久化处理。使用 HTTP 协议, 每当有新的请求发送时, 就会有对应的新响应产生。 协议本身并不保留之前一切的请求或响应报文的信息。用户登录到一家购物网站, 即使他跳转到该站的其他页面后, 也需要能继续保持登录状态。 针对这个实例, 网站为了能够掌握是谁送出的请求, 需要保存用户的状态。HTTP/1.1 虽然是无状态协议, 但为了实现期望的保持状态功能, 于是引入了 Cookie 技术。 有了 Cookie 再用 HTTP 协议通信, 就可以管理状态了

    GET和POST

    GET 方法用来请求访问已被 URI 识别的资源。 指定的资源经服务器端解析后返回响应内容。 也就是说, 如果请求的资源是文本, 那就保持原样返回; 如果是像 CGI( Common Gateway Interface, 通用网关接口) 那样的程序, 则返回经过执行后的输出结果。

    POST 方法用来传输实体的主体。虽然用 GET 方法也可以传输实体的主体, 但一般不用 GET 方法进行传输, 而是用 POST 方法。 虽说 POST 的功能与 GET 很相似, 但POST 的主要目的并不是获取响应的主体内容。

    PUT 方法用来传输文件。

    DELETE 方法用来删除文件, 是与 PUT 相反的方法。 DELETE 方法按请求 URI 删除指定的资源。

    HEAD: 获得报文首部,HEAD 方法和 GET 方法一样, 只是不返回报文主体部分。 用于确认

    URI 的有效性及资源更新的日期时间等。

    OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。(返回支持的方法:GET、POST等)

    Cookie:

    Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

    Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息, 通知客户端保存 Cookie。 当下次客户端再往该服务器发送请求时, 客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后, 会去检查究竟是从哪一个客户端发来的连接请求, 然后对比服务器上的记录, 最后得到之前的状态信息。

    请求报文和响应报文首部内容:

    请求行

    包含用于请求的方法, 请求 URI 和 HTTP 版本。

    状态行

    包含表明响应结果的状态码, 原因短语和 HTTP 版本。

    首部字段

    包含表示请求和响应的各种条件和属性的各类首部

    报文首部信息:

    以Content-Type来表示报文主体的对象类型

    为Cookie服务的两个字段:

    通用首部字段:

    一、Connection 首部字段具备如下两个作用。

    1、控制不再转发给代理的首部字段

    2、管理持久连接

    二、Cache-Control  能够控制缓存的行为

    三、Date 表明创建 HTTP 报文的日期和时间。

    四、Trailer 会事先说明在报文主体后记录了哪些首部字段。 该首部字段可应用在 HTTP/1.1 版本分块传输编码时。

    五、Transfer-Encoding 规定了传输报文主体时采用的编码方式。

    六、Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信, 其参数值可以用来指定一个完全不同的通信协议。

    上图用例中,首部字段Upgrade指定的值为TLS/1.0。请注意此处两个字段首部字段的对应关系,Connection的值被指定为Upgrade。Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade。对于附有首部字段Upgrade的请求,服务器可用101 Switching

    Protocols状态码作为响应返回。

    报文主体和实体主体的差异

    报文(message)

    是HTTP通信中的基本单位,由8位组字节流(octet sequence,其中octet为8个比特)组成,通过HTTP通信传输。

    实体(entity)

    作为请求或响应的有效载荷数据( 补充项) 被传输, 其内容由实体首部和实体主体组成。

    HTTP 报文的主体用于传输请求或响应的实体主体。通常, 报文主体等于实体主体。 只有当传输中进行编码操作时, 实体主体的内容发生变化, 才导致它和报文主体产生差异。

    从服务器返回的状态码:

    200 OK,表示从客户端发来的请求在服务器端被正常处理了。

    204 No Content  该状态码代表服务器接收的请求已成功处理, 但在返回的响应报文中

    不含实体的主体部分。一般在只需要从客户端往服务器发送信息, 而对客户端不需要发送新信息内容的情况下使用。

    206 Partial Content 该状态码表示客户端进行了范围请求, 而服务器成功执行了这部分的GET 请求。 响应报文中包含由 Content-Range 指定范围的实体内容。

    301 Moved Permanently 永久性重定向。 该状态码表示请求的资源已被分配了新的 URI, 以后应使用资源现在所指的 URI。 

    302 Found  临时性重定向。该状态码表示请求的资源已被分配了新的 URI, 希望用户( 本次) 能使用新的 URI 访问。

    303 See Other 该状态码表示由于请求对应的资源存在着另一个 URI, 应使用 GET方法定向获取请求的资源。

    304 Not Modified 该状态码表示客户端发送附带条件的请求时, 服务器端允许请求访问资源, 但未满足条件的情况。 304 状态码返回时, 不包含任何响应的主体部分。 

    400 Bad Request  该状态码表示请求报文中存在语法错误。 当错误发生时, 需修改请求

    的内容后再次发送请求。 

    401 Unauthorized 该状态码表示发送的请求需要有通过 HTTP 认证( BASIC 认证、DIGEST 认证) 的认证信息。 另外若之前已进行过 1 次请求, 则表示用 户认证失败。

    403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了。 

    404 Not Found 该状态码表明服务器上无法找到请求的资源。 

    500 Internal Server Error该状态码表明服务器端在执行请求时发生了错误。也有可能是Web

    应用存在的 bug 或某些临时的故障。

    503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护, 现在无法

    处理请求。 

    HTTP 通信时, 除客户端和服务器以外, 还有一些用于通信数据转发的应用程序, 例如代理、 网关和隧道。 它们可以配合服务器工作。这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器, 并且能接收从那台服务器发送的响应再转发给客户端。

    代理

    代理是一种有转发功能的应用程序, 它扮演了位于服务器和客户端“中间人”的角色, 接收由客户端发送的请求并转发给服务器, 同时也接收服务器返回的响应并转发给客户端。

    网关

    网关是转发其他服务器通信数据的服务器, 接收从客户端发送来的请求时, 它就像自己拥有资源的源服务器一样对请求进行处理。 有时客户端可能都不会察觉, 自己的通信目标是一个网关。

    隧道

    隧道是在相隔甚远的客户端和服务器两者之间进行中转, 并保持双方通信连接的应用程序。

    相关文章

      网友评论

          本文标题:http详解

          本文链接:https://www.haomeiwen.com/subject/dgofzftx.html