一、面向连接和无连接协议(Connection-OrientedandConnectionlessProtocols)
1、面向连接服务的主要特点有:面向连接服务要经过三个阶段:数据传数前,先建立连接,连接建立后再传输数据,数据传送完后,释放连接。面向连接服务,可确保数据传送的次序和传输的可靠性。
2、无连接服务的特点是:无连接服务只有传输数据阶段。消除了除数据通信外的其它开销。只要发送实体是活跃的,无须接收实体也是活跃的。它的优点是灵活方便、迅速,特别适合于传送少量零星的报文,但无连接服务不能防止报文的丢失、重复或失序。
举个例子:打电话就是面向连接的,手机发送短信就是无连接的。
二、Http介绍
1、Http是面向连接的服务。Http从客户端到服务端的请求都要经过4个步骤:
A:打开端口建立一个TCP连接,默认是80端口
B:客户端向服务器发送消息,请求指定路径上的资源,这个请求包括一个首部,可选地还可以有一个空行,后面是请求的资源
C:服务器向客户端发送响应。响应以响应码开头,后面包含元数据的首部,一个空行以及所请求的文档或错误信息。
D:服务器关闭连接。
2、HTTP请求头中的Key:Value解析。
*User-Agent:Lynx/2.4 libwww/2.1.4
这就是我们经常说的UA,他的Value值一般都是指定的是哪个平台,以及浏览器的版本
*Host: www.cafeaulait.org
用来指定服务器的域名
*Accept:text/html,application/xhtml+xml,application/xml
Accept告诉服务器客户端可以处理哪些MIME数据类型
如以下客户端可以处理4中MIME媒体类型
Accept: text/html,text/plain,image/gif,image/jpeg
这四种类型分别指的是HTML文档,纯文本,GIF图片和JPEG图片
MIME类型分为两级:类型(type)/子类型(subtype) text/html 其中text是类型,html是子类型
在HTTP中一共有八个顶级类型:
text/* 表示可读入的文字
image/* 表示图片
mode/* 表示3D模型,如CRML文件
audio/* 表示声音
video/* 表示移动的图片,可能包括声音
application/* 表示二进制数据
message/* 表示协议特定的信封
multipart/* 表示文档和资源的容器,我们上传文件都用这个类型。
*Connection:Keep-Alive
连接重用,HTTP1.0 会为每个请求打开一个新连接,一个典型Web会话中打开和关闭所有连接所花费的时间远远大于实际传输数据的时间,特别是有很多小的文档的会话(我们的Json,xml都是文档),对于使用SSL或TLS加密的HTTPS请求,问题会更加严重,因为建立一个安全socket的握手过程比建立常规的socket需要做更多的工作。
HTTP1.1之后,服务器不必在发送响应后就关闭连接。(在HTTP1.0的时候response中会有Connection:close),这样可以保持连接,可以在一个TCP连接上连续发送多个请求和响应,不过服务器响应之后,客户端请求的锁步模式还是一样的。
*Content-type:application/x-www-form-urlencoded
指定类型的MIME媒体类型,我们上传的Webfrom数据都是基于这个类型,我们还有的用application/json这个可以传json实体,还有multipart/form-data,用来传输文件流。multipart/form-data也可以传输application/x-www-form-urlencoded传输的类型。那么为啥不直接用multipart/form-data,我了解的原因有两个:
第一个:"multipart/form-data"情况下因为增加了分隔线boundary以及Content-Disposition等内容,请求的内容可能会稍比 “application/x-www-form-urlencoded”要多
第二个:使用multipart/form-data最后数据会以二进制形式提交给服务器,字符不需要编码不会对服务端的获取有影响。
*Content-length:54
指定主体内有多少个字节
*Cookie
很多网站用一些小文本串在连接之间存储持久的客户端状态,这些小文本串称为cookie。cookie在请求和响应的HTTP首部,从服务器传递到客户端,再从客户端传回服务器。Cookie只能是非空白符的ASCII文本,不能包含逗号或分号。
服务器返回时设置cookie
Cookie:cart=ssss
客户端再次请求的时候会带着这个Cookie
Set-Cookie:cookie1
Set-Cookie:cookie2
所以客户端在请求的时候可以设置多个cookie
三、HTTP--response status code状态码解析
响应码和消息 | 含义 |
1XX | 1开头的表示的是信息 |
100-Continue | 服务器准备接受请求主体,客户端应当发送请求主体,这允许客户端在请求中发送大量数据之前询问服务器是否将接受请求 |
101 Switching | 服务器接受客户端在Upgrade首部字段中要求改变应用协议的请求,如从HTTP改为WebSocket |
2XX Successful | 2开头的表示请求成功 |
200 OK | GET或POST方法返回的响应码 |
201 Created | 服务器已经在响应主体中指定的URL处创建了资源。客户端现在应当尝试加载改URL。这个响应码只在响应POST请求时发送 |
202 Accepted | 这是个很不常见的响应,表示请求(一般是POST)已经被处理,但处理尚未结束,所以不会返回任何响应。不过,服务器应当为用户返回一个HTML页面解释这个情况,并估计请求何时能够结束,理想情况下要提供某种状态监视器的链接。 |
203 Nonauthoritative information | 由缓存代理或其他本地源返回资源的表示,不能保证是最新的 |
204 No Content | 服务器已经成功地处理了请求,但没有信息发回给客户端。这一般是由于服务器上的表单处理程序编写的很差,只接受数据却不向用户返回响应 |
205 Reset Content | 服务器已经成功地处理了请求,但没有信息发回给客户端。。此外,客户端应当清除发送请求的表单 |
206 Partial Content | 服务器返回客户端请求的资源的一部分,而不是整个文档 |
226 IM Used | 响应得到deIta编码 |
3XX Redirection | 3开头的表示重定位及重定向 |
300 Multiple Choices | 服务器为所请求的文档提供一组不同的表示 |
301 Moved Permanently | 资源已经移动到一个新的URL。客户端应当自动加载这个URL的资源,更新所有指向原URL的书签 |
302 Moved Temporarily | 这个资源暂时位于一个新的URL,但其位置在不久的将来还会再次改变,所以不应当更新书签。有时有些代理要求用户在访问Web之前先在本地登录,此时会用到这个响应码 |
303 See Other | 一般用于响应POST表单请求,这个响应码表示用户应当使用GET从另一个不同的URL获取资源 |
304 Not Modified | If-Modified-Since首部指示客户端只需要最近更新的文档。如果文档没有更新,就会返回这个状态码。在这种情况下,客户端应当从缓存中加载这个文档。 |
305 Use Proxy | Location首部字段包含将提供响应的代理的地址 |
307 Temporary Redirect | 类似于响应码302,但不允许HTTP方法改变 |
308 Permanent Redirect | 类似于响应码301,但不允许HTTP方法改变 |
4XX | 客户端错误 |
400 Bad Request | 客户端向服务器发出的请求使用了不正确的语法。这在正常的Web浏览时很不常见,但是在调试定制客户端时比较常见 |
401 Unauthorized | 访问这个页面需要身份认证,一般是用户名和口令。用户名和口令中可能有一个没有给出,或者用户名和口令无效 |
402 Payment Required | 现在没有使用,但将来可能用于指示访问该资源需要某种付费 |
403 Forbidden | 服务器理解请求,但有意地拒绝进行处理。身份认证没有任何帮助。当客户超出其配额时有时会使用这个响应码 |
404 NotFound | 最常见的错误响应,指示服务器找不到所请求的资源。它可能指示一个不正确的链接,已经移走而没有转发地址的文档,拼写错误的URL或其他类似情况 |
405 Method Not Allowed | 请求方法不支持指定的资源。例如:试图在不支持Put的web服务器上使用PUT放置文件,或者使用POS提交到只支持GET的URL |
406 Not Acceptable | 所请求的资源不能以客户端希望的格式提供,客户端期望的格式由请求HTTP首部的Accept字段指示 |
407 Proxy Authentication Required | 中间代理服务器要求客户端在获取所请求的资源之前,先对客户端进行身份认证(可能需要用户名和口令) |
408 Request Timeout | 客户端用了太长时间发送请求,可能是因为网络拥塞的原因 |
409 Conflict | 一个临时冲突阻止了请求的实现。例如,两个客户端试图同时PUT相同的文件 |
410 Gone | 与404类似,但更有把握地确定资源的存在性。资源已经有意地被删除(不是移走),不能恢复。应当删除响应的链接 |
411 Length Required | 客户端必须在请求HTTP的首部中发送一个Content-length字段,但没做到 |
412 Precondition Failed | 客户端在请求HTTP首部中指定的一个请求条件没有满足 |
413 Request Entity Too Large | 客户端请求主体大于服务器一次能够处理的大小 |
414 Request-URI Too long | 请求的URI太长。这对于防止某种缓冲区溢出攻击很重要 |
415 Unsupported Media Type | 服务器不理解或不接受请求主体的MIME content-type |
416 Requested range Not Satisfiable | 服务器无法发送客户端所请求的字节范围 |
417 Expectation Failed | 服务器无法满足客户端在Expectrequest首部字段中给定的期望 |
418 I'm a teapot | 尝试用蜜罐泡咖啡 |
420 Enhance Your Calm | 服务器分级限制请求。这是非标准的,仅用于Twitter |
422 Unprocessable Entity | 不能识别请求主体的内容类型,请求主体的语法是正确的,只是服务器无法处理 |
424 Faild Dependency | 由于之前一个请求的失败。导致这个请求失败 |
426 Upgrade Required | 客户端使用一个太老或不安全的HTTP协议版本 |
428 Precondition Required | 请求必须提供一个IF-Match首部 |
429 Too Many Request | 客户端被分级限制,要慢下来 |
431 Request Header Fields | 可能首部作为一个整体太大,或者某个首部字段太大 |
451 Unavailable For Legal Reasons | 这是一个试验性的响应码,由于法律原因禁止服务器提供请求服务 |
5XX | 服务器错误 |
500 Internal Server Error | 发生了意外情况,服务器不知道如何处理 |
501 Not Implemented | 服务器不具有完成这个请求所需的一个特性。不能处理PUT请求的服务器可能会向试图PUT表单数据的客户端发送这个响应 |
502 Bad Gateway | 这个响应码只用于作为代理或者网关的服务器。它指示该代理在试图完成请求时,从它连接的服务器接收到一个无效的响应 |
503 Service Unavailable | 服务器暂时无法处理请求,可能是超负荷或维护原因。 |
504 Gateway Timeout | 代理服务器在合理的时间内未能接收到上游服务器的响应。所以无法将向客户端发送所需的响应 |
505 HTTP Version Not Supported | 服务器不支持客户端正在使用的HTTP版本 |
507 Insufficlient Storage | 服务器没有足够的空间来存放所提供的请求实体,通常用POST或者PUT |
511 Network Authentication Required | 客户端需要身份认证才能访问网络 |
200-299表示成功响应码
300-399 表示重定向
400-499表示客户端错误
500-599表示服务器错误