http详解
http
http是超文本传输协议,是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息, 客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
HTTP三点注意事项
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
http交互流程
- 建立TCP链接
- 发出请求文档
- 发出响应文档
- 释放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上的资源;它允许统一识别资源。