http详解

http

http是超文本传输协议,是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息, 客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

HTTP三点注意事项

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http交互流程

  1. 建立TCP链接
  2. 发出请求文档
  3. 发出响应文档
  4. 释放TCP链接

建立TCP链接

tcp(传输控制协议)是一种面向链接的、可靠的、基于字节流的传输层通信协议。TCP建立需要三次握手,释放需要4次挥手

什么是三次握手

所谓三次握手是指:建立tcp链接时,需要client与server发送三个包,确认链接的建立,这一过程由lcient执行connect触发

第一次握手

client将SYN设置为1,seq=随机值j,将数据包发送给server,进入SYN_SEND状态,等待server确认

第二次握手

server收到数据包由标志位SYN=1知道,是请求建立链接,将ACK设置为1,ack=j+1,作为响应client的请求,将SYN设置为1,seq=随机值k,发送给client确认,erver进入SYN_RECV状态,因为是建立链接这些数据在一个包中。

第三次握手

client收到响应,检查ACK=1?,ack=j+1?,若都符合,将ACK设置为1,ack=k+1,发送给server,client进入establish状态,server收到响应,检查ACK=1?,ack=k+1?若都符合进入establish状态,三次握手完成,TCP建立链接,开始通信。

四次挥手

即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭

第一次挥手

client发送一个FIN,用来关闭client到server的数据传送,cliient进入FIN_WAIT_1状态

第二次挥手

server收到FIN后,发送一个ack给client,确认序列号为收到序列号+1(与SYN相同,一个FIN占用一个序号),server进入CLOSE_WAIT状态

第三次挥手

server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态

第四次挥手

client收到FIN后,client进入TIME_WAIT状态,接着发送一个ack给server,确认序列号为收到序列号+1,server进入CLOSED状态,完成四次挥手

请求报文

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成

请求行

由请求方法字段、URL字段、协议版本字段三部分构成,它们之间由空格隔开。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

请求头

请求头由key/value对组成,每行为一对,key和value之间通过冒号(:)分割。请求头的作用主要用于通知服务端有关于客户端的请求信息。

典型的请求头有:

  • User-Agent:生成请求的浏览器类型
  • Accept:客户端可识别的响应内容类型列表;星号用于按范围将类型分组。/表示可接受全部类型,type/表示可接受type类型的所有子类型。
  • Accept-Language:客户端可接受的自然语言
  • Accept-Encoding:客户端可接受的编码压缩格式
  • Accept-Charset:可接受的字符集
  • Host:请求的主机名,允许多个域名绑定统一个ip地址
  • connection:链接方式
  • Cookie:存储在客户端的扩展字段

空行

最后一个请求头之后就是空行,用于告诉服务端以下内容不再是请求头的内容了。

请求内容

请求内容主要用于POST请求,与POST请求方法配套的请求头一般有Content-Type(标识请求内容的类型)和Content-Length(标识请求内容的长度)

响应报文

HTTP响应报文由状态行、响应头、空行和响应内容4个部分构成。

状态行

由HTTP协议版本、状态码、状态码描述三部分构成,它们之间由空格隔开。

响应头

一般情况下,响应头会包含以下,甚至更多的信息。

  • Location:服务器返回给客户端,用于重定向到新的位置
  • Server:包含服务端用来处理请求的软件信息及版本信息
  • Vary:标示不可缓存的请求列表
  • Connection:链接方式
    对于请求端来讲:close是告诉服务端,断开连接,不用等待后续的求请了。keeplive则是告诉服务端,在完成本次请求的响应后,保持连接,等待本次连接后的后续请求。

对于响应端来讲:close表示连接已经关闭。keeplive则表示连接保持中,可以继续处理后续请求。Keep-Alive表示如果请求端保持连接,则该请求头部信息表明期望服务端保持连接多长时间(秒),例如300秒,应该这样写Keep-Alive: 300

空行
最后一个响应头之后就是空行,用于告诉请求端以下内容不再是响应头的内容了。

响应内容

服务端返回给请求端的文本信息。

HTTP请求方式

  • GET: 向特定的资源发出请求。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  • PUT:向指定资源位置上传其最新内容。
  • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
  • DELETE:请求服务器删除 Request-URI 所标识的资源。
  • TRACE:回显服务器收到的请求,主要是用于测试或者诊断
  • CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  • PATCH:是对 PUT 方法的补充,用来对已知资源进行局部更新 。

HTTP状态码

  • 200:请求成功
  • 201:以创建,成功请求并创建了新的资源
  • 203:非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
  • 204:无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
  • 301:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
  • 302:临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
  • 307:临时重定向。与302类似。使用GET请求重定向
  • 400:客户端请求的语法错误,服务器无法理解(给服务端传的参数和服务端指定接收的字段不同)
  • 403:服务器理解请求客户端的请求,但是拒绝执行此请求
  • 404:服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面(找不到路径)
  • 405:客户端请求中的方法被禁止(请求方法不对,比如服务端设置get请求,客户端使用post请求)
  • 500:服务器内部错误,无法完成请求

URL 和 URI的区别

URL:统一资源定位符

是Internet上资源的地址,可以定义为引用地址的字符串,用于指示资源的位置以及用于访问它的协议。

URI:统一资源标识符

是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符。通过使用位置,名称或两者来标识Internet上的资源;它允许统一识别资源。

原文地址:https://www.cnblogs.com/mengxiangji/p/11186344.html