文章目录
1、TCP/IP网络模型
OSI七层网络模型:自下而上分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP网络模型分为4层,自下而上分别为:
- 链路层:
- 对应OSI的物理层、数据链路层;
- 处理数据在媒介上的表示、传输以及与硬件交互的细节。
- 网络层:
- IP层负责IP数据报的路由转发,所有的TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。
- 网络层(IP)提供了一种尽力而为、无连接、不可靠的数据报交付服务,IP负责将IP数据报(又叫分组),放入数据链路层传输,负责分片和重组逻辑。
- 传输层:
- 为端主机上运行的应用程序提供端到端服务,包括TCP和UDP。
- TCP提供了带流量控制、拥塞控制、有序、可靠的流交付,TCP需要处理丢包检测重传、重排序等IP层不处理的问题,TCP面向连接,不保留消息边界;
- 而UDP提供的功能基本上没有超越IP,不提供速率控制和差错控制,不保证可靠性,UDP只是提供一套端口号,用于复用、多路分解(即把收到的UDP数据报交给应用层对应程序处理)和校验数据完整性(只检错不纠错),UDP面向非连接,保留消息边界。
- 应用层:
- 对应OSI的会话层、表示层、应用层;
- 负责处理特定应用的细节,通常应用的实现都是基于TCP/IP或者UDP/IP,具体如HTTP、FTP、DNS、SSH协议等。
- 应用层与应用细节相关,与网络数据传输无关,而之下的三层(链路层、网络层、传输层)则对应用一无所知,但需要处理通信的细节。
1.1、IP协议
IP是TCP/IP协议族中的核心协议,为传输层提供IP数据报的交付能力,它负责将IP数据报从网络一端传递到另一端,实现数据转发。IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。
发送端:接收来自传输层协议的数据单元(PDU),添加IP首部封装为IP数据报,交给下一层链路层协议。
接收端:接收来自链路层的PDU,去掉IP首部,根据首部的协议类型,将数据分发给上一层传输层的TCP、UDP或者其他协议。
IP主要包含三方面内容:IP编址方案、分组封装格式及分组转发规则。
- 路由器:
工作于网络层,是IP层的核心设备,实现传输层之下的所有层。路由器有两个或两个以上的网络接口,用于连接两个或多个网络,负责将IP数据报(分组)从一个网络接口转发到另一个网络接口,带有多网络接口(网卡)的主机也能承担转发分组的功能,这种主机称为作为路由器使用的主机。
- IP协议格式:
- IP数据报应该是包括
- IP首部:其前20字节是所有IP分组必须具有的,
- 4位协议版本号字段:区分IPv4、IPv6;
- 4位首部长度:表示IP首部长度。最大数值是15 * 4个字节;
- 8位服务类型:
- 16位总长度:
- 16位标识:
- 3位标志字段:
- 13位分片偏移:
- 8位生存时间TTL:
- 8位协议字段:区分数据报承载TCP、UDP等哪种协议;
- 16位头部校验和。
- 32位源IP地址:
- 32位目的IP地址;
- 选项字段:最多40字节;
- 数据负载
- 不透明的负载(Payload)来自于TCP、UDP或者其他,对于IP层透明,无须解释。
- IP首部:其前20字节是所有IP分组必须具有的,
- IP数据报应该是包括
- IP协议转发流程:仅从网络层分析:
- A发出目的地址为C的IP数据报,查询路由发现下一跳为E
- A将数据报发送给E
- E查询路由表发现下一跳为F,将数据报发送给F
- F查询路由表发现目的地C直接连接,将数据发送给C
1.2、TCP协议
传输控制协议:提供面向连接、可靠、有序、字节流传输服务。TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
-
三次握手过程:在正式使用之前,先要检测网络是否通畅,具体过程:
- 客户端准备建立TCP连接时,向服务端发出连接请求报文段(首部中同步位SYN=1,初始序号seq=x)。这时,客户端TCP进程进入SYN-SENT(同步已发送)状态。
- 服务端收到连接请求报文段后,如果同意建立连接,则向客户端发送确认报文段(同部位SYN=1,确认位ACK=1,确认号ack=x+1,初始序号seq=y)。这时,TCP服务端进入SYN-RCVD(同步收到)状态。
- 客户端收到服务端的确认后,还要向服务端发送确认报文段(确认位ACK=1,确认号ack=y+1,序号seq=x+1)。A进入ESTABLISHED(已建立连接)状态。
- B收到A的确认后,也进入ESTABLISHED状态。
总结:请求连接则置同步位SYN=1,确认连接就置确认位ACK=1(TCP规定,SYN报文段不能携带数据,但要消耗一个序号;ACK报文段可以携带数据,但如果不携带数据则不消耗序号)。
-
四次挥手过程:挥手就是断开连接的过程,具体过程:
- A的应用进程先向B发送连接释放报文段(终止控制位FIN=1,序号seq=u),并停止发送数据,进入FIN-WAIT-1(终止等待1)状态。
- B收到连接释放报文段后即发出确认报文段(确认位ACK=1,序号seq=v,确认号ack=u+1),然后B进入CLOSE-WAIT(关闭等待)状态。此时A到B方向的连接已经释放,B若要发送数据,A仍要接收。
- A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- B若没有要向A发送的数据了,就发送连接释放报文段(终止位FIN=1,序号seq=w,确认号ack=u+1),然后B就进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文段后,必须对此发出确认(ACK=1,ack=w+1,seq=u+1)。然后进入TIME-WAIT(时间等待)状态。此时,TCP连接还没有释放掉。必须经过2倍最长报文段寿命(MSL)时间后(通常MSL=2分钟,保证A发送的最后一个ACK报文段能够到达B,防止“已失效的连接请求报文段”出现在本连接中),TCP连接结束。
总结:请求释放连接则置FIN=1,确认释放则置ACK=1。
-
保活计时器:
- 客户端主机出现故障时,服务器会白白等待下去。为此需要设置保活计时器。服务器每收到一次客户的数据,就重置计时器,时间通常是两小时。若两小时没有收到客户端的数据,服务器就发送一个探测报文段,以后每隔75秒发送一次。若一连发送9个探测报文段后仍无客户的响应,服务器就认为客户端出现了故障,接着的关闭这个连接。
- 在 Linux 操作系统层级,也有三个跟 Keep-alive 有关的全局配置项:
- net.ipv4.tcp_keepalive_time = 7200 seconds (2 hours):间隔时间
- net.ipv4.tcp_keepalive_probes = 9:探测无响应时,可以发送的最多连续探测次数
- net.ipv4.tcp_keepalive_intvl = 75 seconds:探测无响应时,连续探测之间的最长间隔
控制位:字段长位8位,每一位从左到右分别位CWR、ECE、URG、ACK、PSH、RST、SYN、FIN;这就控制标识就叫做控制位。
FIN标志:用于断开连接,为1时,表示今后都不会再有数据发送了;
SYN标志:用于建立连接,为1时,表示希望建立连接。
RST标志:为1时,表示TCP连接中出现异常必须强制断开连接。
PSH标志:为 1时,表示传输的数据立刻给上层应用,为0时,不需要立刻传送可以进行缓存。
ACK标志,为1时,表示确认应答的字段为有效,在三次握手时,SYN包之外该位必须为1。
URG标志,为1时,表示时需要紧急处理的数据。
ECE标志,当为1时,表示从对方到这边的网络有拥堵。
CWR标志,与ECE表示都用于IP首部的ECN字段。
2、HTTP协议
2.1、简介
超文本传输协议:Hyper Text Transfer Protocal的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。
- 所有的万维网文件都必须遵守此标准。
- 为web浏览器与web服务器之间的通信而设计,但也可以用于其他目的。
- 基于TCP/IP通信协议传递数据。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
2.2、工作原理
浏览器作为HTTP客户端,通过url发起一个请求时:
- 浏览器根据访问的域名找到其IP地址。
- DNS查找过程如下:
- 浏览器缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)
- 系统缓存:搜索是否存在且是否过期
- 路由器缓存
- ISP(互联网服务提供商) DNS缓存
- 若应用CDN后,DNS 返回的不再是 IP 地址,而是一个CNAME(Canonical Name ) 别名记录,指向CDN的全局负载均衡:
- 看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点;
- 看用户所在的运营商网络,找相同网络的边缘节点;
- 检查边缘节点的负载情况,找负载较轻的节点;
- 其他,比如节点的“健康状况”、服务能力、带宽、响应时间等;
- DNS查找过程如下:
- 与web服务器建立TCP套接字连接,发送HTTP请求;
- web服务器接收到请求后,向客户端发送响应信息。
当返回内容之后,服务器会检测connection的状态,如果connection的状态是close的话则服务器会主动关闭这个tcp连接,客户端则会被动去关闭这个连接,最终我们释放了整个tcp。
如果connection是keepalive的状态,这个连接就会持续一段时间,在这个时间段内双方就可以保持通信,最后客户端收到的也就是客户端浏览器收到的是一个静态的html的内容,它会自己取解析并且展示给用户。这就是整个http协议工作的整个流程。
- 无连接:限制每次连接只能处理一个请求,服务器处理客户端请求,并收到客户端应答后,即断开连接。
- 无状态:协议对于事务处理没有记忆能力;
- 单向:只能由客户端发起请求,服务端不能主动推送消息。
2.3、协议版本
2.3.1、HTTP/1.0
在HTTP/1.0
中,一个http请求收到服务器响应后,会断开对应的TCP连接。这样每次请求,都需要重新建立TCP连接,这样一直重复建立和断开的过程,比较耗时。为了充分利用TCP连接,可以设置头字段Connection: keep-alive
,这样http请求完成后,就不会断开当前的TCP连接,后续的http请求可以使用当前TCP连接进行通信。
大部分的浏览器对于1.0的支持已经废弃掉了。
2.3.2、HTTP/1.1
主流目前支持的版本号应该是1.1,其将Connection
写入了标准,默认值为keep-alive
。除非强制设置为Connection: close
,才会在请求后断开TCP连接。
基于文本传输,单个TCP连接,在同一时间只能处理一个http请求(虽然存在Pipelining技术支持多个请求同时发送,服务端必须按顺序返回响应;但由于实践中存在很多问题无法解决,所以浏览器默认是关闭,所以可以认为是不支持同时多个请求)。
页面资源请求时,浏览器会同时和服务器建立多个TCP连接,在同一个TCP连接上顺序处理多个HTTP请求。所以浏览器的并发性就体现在可以建立多个TCP连接,来支持多个http同时请求。
- 缺陷
- 高延迟 — 队头阻塞(Head-Of-Line Blocking)
- 当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。
- 明文传输 — 不安全性:传输内容没有加密,中途可能被篡改和劫持
- 不支持服务端推送
- 高延迟 — 队头阻塞(Head-Of-Line Blocking)
2.3.3、Http/2
基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接。
传输方式:在同一个域名下开启一个TCP connection
,每个http请求以流(stream)的方式在此连接上传输,每个stream是由若干帧(frame) 组成,frame是HTTP/2资源传输的最小单元,frame中的字段identifier
标识此帧属于哪一个流,identifier相同的frame属于同一流,服务端将identifier相同的帧解析成可用数据。在这个TCP connection中,同时传输了多个流的帧数据,这就是HTTP/2的多路复用。
每一个帧(frame) 都包含length、type、flags、stream identifier、frame playload等字段, 这里说下帧的type字段,在HTTP/2的标准中定义了10种不同的帧type。
- HEADERS(包含HTTP头和可选的优先级参数)
- DATA(流的核心内容)
- PRIORITY(流的优先级)
- RST_STREAM(终止流)
- SETTINGS(设置此连接的参数)
- PUSH_PROMISE(服务器推送)
- PING(测量RTT)
- GOAWAY(终止连接)
- WINDOW_UPDATE(协商一端要接收多少字节,流量控制)
- CONTINUATION(继续传输头部数据)
frame的PRIORITY字段用于标识流的权重(1-256)和依赖关系,以正确的顺序请求资源对于用户体验至关重要。
- 客户端通过对象的依赖关系告诉服务器哪些资源应该优先传输
- 权重让服务器知道拥有共同依赖关系资源的优先级
服务器根据依赖关系和权重进行带宽分配,高优先级的资源获得更多的带宽。
多路复用让http请求变得廉价,创建一个新流的成本很低,理论上可以同时发起无限个请求,不过我们可以在stream的SETTINGS字段上设置SETTINGS_MAX_CONCURRENT_STREAMS用于限制最大并发数。
-
二进制分帧:
- 没有改变 HTTP1 的语义,只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流。
- 服务器单位时间接收到的请求数变多,可以提高并发数。最重要的是,为多路复用提供了底层支持。
-
多路复用:
- 解决了http1.1的线头阻塞问题,一个域名对应一个连接,一个流代表了一个完整的请求-响应过程。帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多个流。
-
服务端push推送:
- 当TCP connection建立后,服务器可以主动推送资源而非客户端发起请求,服务端推送是基于frame的PUSH_PROMISE字段来实现的。而且服务端push的资源是可以被缓存的。
- 浏览器可以通过PUSH_PROMISE字段判断资源是否已经缓存,然后通过发送RST_STREAM帧用于终止推送。在这个过程中,服务端只是推送了资源的地址,并没有直接推送资源的实体,这样的目的也是为了减少不必要的资源传输。
-
头压缩
- 在HTTP1.x中,HTTP协议都是由状态行,消息头,主体构成,在传输过程中,主体内容一般都是经过gzip压缩,或者传说的本身就是二进制流(视频,图片)等,而消息头和状态行都是纯文本传输的。
- 而且很多消息头中的字段冗余如 COOKIE,UserAgent等,浪费了大量带宽,增加了网络延时。很多时候请求消息头的大小甚至超过了主体内容的大小。
- HTTP/2通过维护静态字典和动态字典的方式来压缩首部
- 静态字典中包含了常见的头部名称或者头部名称和值的组合,如method:GET;
- 动态字典中包含了每个请求特有的键值对,如自定义的头信息,针对每个TCP connection,都需要维护一份动态字典;
- 都不存在的内容,使用了哈夫曼(霍夫曼)编码来压缩体积。
2.3.4、Http/3
HTTP2.0不足:
- 建立连接时间长(本质上是TCP的问题)
- 队头阻塞问题(分为TCP层丢包重传机制导致、HTTP层1.x协议的 pipeline导致,2.0解决了后者);
- 移动互联网领域表现不佳(弱网环境)
HTTP3.0由来:
TCP协议相对缓慢,谷歌决定-基于UDP来开发新一代HTTP协议。
在UDP基础上改造一个具备TCP协议优点的新协议:QUIC协议,Quick UDP Internet Connections的缩写,直译为快速UDP互联网连接。
HTTP3.0又称为HTTP Over QUIC,其弃用TCP协议,改为使用基于UDP协议的QUIC协议来实现。
优劣势:
-
队头阻塞问题:QUIC协议是基于UDP协议实现的,在一条链接上可以有多个流,流与流之间是互不影响的,当一个流出现丢包影响范围非常小,从而解决。
-
0RTT 建链:RTT Round-Trip Time,也就是数据包一来一回的时间消耗。
- HTTPS协议要建立完整链接包括:TCP握手和TLS握手,总计需要至少2-3个RTT,普通的HTTP协议也需要至少1个RTT才可以完成握手。
- 使用QUIC协议的客户端和服务端 首次连接 要使用1RTT进行密钥交换。非首次连接跳过密钥交换实现0RTT。
-
连接迁移:
- TCP协议使用五元组来表示一条唯一的连接,当我们从4G环境切换到wifi环境时,IP地址发生变化,创建新的TCP连接才能继续传输数据。
- QUIC协议基于UDP实现摒弃了五元组,使用64位的随机数作为连接的ID,并使用该ID表示连接。切换网络时,或者不同基站之间切换都不会重连,从而提高业务层的体验。
但是TCP协议的势力过于强大,很多网络设备甚至对于UDP数据包做了很多不友好的策略,进行拦截从而导致成功连接率下降。
Q:如何用UDP协议来实现TCP协议的主要功能?
A:基于UDP主体将TCP的重要功能转移到用户空间来实现,从而绕开内核实现用户态的TCP协议。
2.3.5、HTTPS
安全版的HTTP,是由TLS+HTTP协议构建的 可进行加密传输、身份认证的网络协议。
HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的TLS加密传输协议。默认端口443。
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
SSL(Secure Sockets Layer,安全套接字层)是一种标准安全协议,用于在在线通信中建立Web服务器和浏览器之间的加密链接。SSL 通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
TLS(Transport Layer Security,传输层安全)是 IETF 在 SSL 3.0 的基础上设计的协议,它是 SSL 协议的升级版。两者差别极小,可以理解为 TLS 是 SSL 3.1。分成两层:TLS 记录协议(TLS record protocol)、TLS 握手协议(TLS handshake protocol)
2.4、协议详解
2.4.1、请求信息
-
请求行:例如GET /images/logo.gif HTTP/1.1(请求方法 空格 url 协议);
- 它主要支持的请求方法有get、post、put、head、delete、options、trace和connect。
- get:获取资源;
- post:传输一些内容;职能偏向于“新增”;
- put则:将文件和内容传输到服务器上;职能更偏向于“更新”(幂等);
- head:只通过报文的头部来做通信;
- delete:删除文件(幂等);
- options:向服务器去请求了解服务器支持哪些方法;
- trace:调试方法,使服务器原样返回客户端请求的任何内容,主要用于测试或诊断。
- connect:希望通过哪些隧道协议来连接。
- GET和POST的区别:
- GET提交的数据会放在URL之后,POST方法是把提交的数据放在HTTP包的Body中。
- GET提交的数据大小有限制,最多只能有1024字节(url限制),POST方法提交的数据没有限制;
- 获取方式不同,GET方法Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
- GET方式提交数据,会带来安全问题,出现在URL上,可以从历史记录获得该用户的数据。
- 它主要支持的请求方法有get、post、put、head、delete、options、trace和connect。
-
请求头:例如Accept-Language: en;
- Host :请求的资源在哪个主机的端口上
- Connection:该请求支持长连接(heep_alive)
- Content-Length:正文内容长度
- Content-Type:数据类型
- User-Agent:声明用户的操作系统和浏览器版本信息
- Accent:发起了请求
- Referer:当前页面是从哪个页面跳转过来的
- Accept-Encoding:接受的编码
- Accept-Language:接受的语言类型
- Cookie:用于在客户端存储少量信息,通常用于实现会话(session)功能
- Authorization:含有服务器用于验证用户代理身份的凭证。
- Range:bytes=500-600,601-999;bytes=-500;bytes=500-;bytes=0-0,-1(但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK))
-
空行
-
请求体(可选)
2.4.2、响应信息
-
状态行:HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF
-
Code是结果代码,用三个数字表示,主要分为五类:
-
以1开头的往往表示请求正在处理过程中;
- 100——客户必须继续发出请求
- 101——客户要求服务器根据请求转换HTTP协议版本
-
以2开头的则表示请求已经成功得到了处理;
- 200——表明该请求被成功地完成,所请求的资源发送回客户端
- 201——提示知道新文件的URL
- 202——接受和处理、但处理未完成
- 203——返回信息不确定或不完整
- 204——请求收到,但返回信息为空
- 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
- 206——服务器已经完成了部分用户的GET请求
-
以3开头表示资源需要进一步的操作,并且往往表示一种重定向连接;
- 300——请求的资源可在多处得到
- 301——本网页被永久性转移到另一个URL
- 302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
- 303——建议客户访问其他URL或访问方式
- 304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
- 305——请求的资源必须从服务器指定的地址得到
- 306——前一版本HTTP中使用的代码,现行版本中不再使用
- 307——申明请求的资源临时性删除
-
以4开头表示这个服务器无法处理这个请求;
-
400——客户端请求有语法错误,不能被服务器所理解
401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
402——保留有效ChargeTo头响应
403——禁止访问,服务器收到请求,但是拒绝提供服务
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。
-
以5开头则表示服务器处理这个请求,但是却发生了某些内部错误。
-
HTTP 500 - 服务器遇到错误,无法完成请求
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误
HTTP 503:由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常
-
-
Reason-Phrase是个简单的文本描述,解释Status-Code,用于人工理解。
-
-
消息报头
- Allow
- Content-Encoding
- Content-Length
- Content-Type
- Date
- Expires
- Last-Modified
- Location
- Refresh
- Server
- Set-Cookie
- WWW-Authenticate
-
空行
-
响应体
2.4.3 content-type
用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
常见的媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml: XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
2.5、认证方式
HTTP请求报头: Authorization
HTTP响应:状态行:401 Unauthorized; 报头:WWW-Authenticate: Basic realm=“WallyWorld”;
HTTP认证是基于质询/回应(challenge/response)的认证模式。
- 基本认证 basic authentication(HTTP1.0提出的认证方法)
把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端。Authorization: Basic xxxxxxxxxx.
客户端发起GET请求
服务器响应401 Unauthorized,www-Authenticate指定认证算法,realm指定安全域
客户端重新发起请求,Authorization指定用户名和密码信息
服务器认证成功,响应200
- 摘要认证 digest authentication(HTTP1.1提出的基本认证的替代方法)
摘要认证使用随机数+MD5加密哈希函数来对用户名、密码进行加密,在上述第二步时服务器返回随机字符串nonnce,之后客户端发送摘要=MD5(HA1:nonce:HA2),其中HA1=MD5(username:realm:password),HA2=MD5(method:digestURI)
HTTP OAuth Authentication
开放认证允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务者的数据,每一个令牌授权一个特定的第三方系统
HTTP Token Authentication
令牌认证是指当用户第一次登陆时服务器生成一个token并返回给客户端,之后的每次访问客户端都会带上该token,无需再次带上用户名和密码