【HTTP】HTTP通信

【HTTP】HTTP通信

1. HTTP 翻译为 超文本传输协议,还是超文本转移协议 ,图灵社区有讨论,https://www.ituring.com.cn/article/1817 感觉大家都是觉得之前的不妥,应该翻译为 超文本转移协议。

2. REST 的API 格式,看一看 《RESTful Web Services》 了解一下

3. HTTP 和 Socket 的区别,个人感觉是一个东西,Socket 是网络层建立通信用的,HTTP是应用层,规定传输协议用的,具体的区别,以后看看网上的资料。

4. 我认为 ARP是一个 局域网协议,ARP 又称为 IP解析协议,通过IP地址 解析出 机器的MAC地址,看了一些资料,没找到它跟局域网的直接关系。

我理解的现在的网络通信是这样吧。北京的A 要和 上海的B 通信,假如是在QQ上,此时可以获取到B的IP地址,通过路由器定位到IP地址的大概范围,具体到局域网,网段之后,通过 ARP协议,将IP地址解析为 固定不变的MAC值,推送给机器。 大范围的锁定用IP地址,更精确的定位 用MAC值,

关于这块的理解,可能还不太有错,我当下是这么理解的。

5. HTTP 的 PUT 和 POST 方法,都能用来传输文件

PUT 的请求每次都被执行,如果两次请求相同,第二次的请求结果会将第一次的结果覆盖掉
POST 的请求,如果两次请求相同,会新增一个资源文件
但是具体的实现方式 要看 服务端怎么处理,可能是tomcat 或者 是代码应用层面的内容处理

HTTP的方法具体有: GET、POST、PUT、DELETE、OPTIONS、TRACE、HEAD、CONNECT
HEAD: 用来获取资源的首部信息,响应中的首部信息与Get方法一致。主要用来 更新缓存 测试资源可用性 测试资源是否被修改

6. HTTP 的状态码:(可以理解为 通信的一种准则)

(状态码是为了规范浏览器服务器的制定,希望浏览器和服务器的开发过程可以遵循,但是没有办法强制,比如302和303)

1XX :  Informational(信息性)    接收的请求正在处理
2XX :  Success (成功)              请求正常处理完毕
3XX :  Redirection(重定向)      需要进行附加操作以完成请求
4XX :  Client Error(客户端错误)  服务器无法处理请求
5XX :  Server Error(服务端错误) 服务器处理请求出错
(可以自定义,但是类别需要符合以上标准)

HTTP的状态码大概有60多种,常用的有14种:

2XX: 表明请求被正常处理了。

200  OK :请求被正常处理了,在Get方法中,响应内容在报文主体中,在HEAD方法中,响应内容在 头部
204 No Content : 响应报文中没有报文实体,就是说没有资源返回
206 Partical Content: 范围请求,只请求资源文件的一部分,用于 下载续传

3XX:  表明浏览器仍需要执行某些特殊处理,已处理请求。

301  Move Permanently : 永久性重定向,响应头会包含Location,浏览器要继续访问新的URI以获取资源,会更新书签
302 Found: 临时重定向,本次有效,以后可能不生效,不会更新书签
303 See Other l临时重定向,修改访问方法,当服务器返回 新的URI之后,浏览器使用GET方法访问新的URI获取资源,(某些浏览器将302返回的uri,也只用GET的访问新的地址)

当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST请求改成GET请求,并删除报文的主体,通过GET方法请求新的URI。但是301、302是禁止将POST改成GET方法的,但大家实际上都是这么干的

307 Temporary Redirect  临时重定向 ,当服务器返回307状态码,说明浏览器需要继续请求新的URI,此时希望浏览器使用POST方法访问新的URI。

304 Not Modified : 使用浏览器的缓存处理,客户端发送的GET请求报文中有 If-Match、If-Modified-Since、If-None-Match、If-Range、If-Un modified-Since的任意一个时,服务器可能返回304。
通常用在 浏览器发送了If-Modified-Since ,并携带E-tag(当前请求资源的hash值)请求这个时间段之后的该资源,服务器发现资源没有更新时,同意浏览器使用本地的缓存处理时,返回304。关于304还有一个其他 头部标识符,比如强制不使用缓存

(302是在HTTP/1.0的时候就有的,303和307是在HTTP/1.1的时候加入的,为了细化302的规范,需要浏览器在被重定向之后,想要发GET请求,那就使用303,如果浏览器被重定向之后,想要发送POST请求,那就使用307状态码)。

304的响应头:

304的响应头中有Cache-Control :(max-age/public和private/no-cache/no-store/)
 
max-age: 缓存过期时间,在多长时间内,可以使用本地的缓存
 
public :第三方代理可以缓存
 
private:只能浏览器或客户端缓存
 
no-cache:使用缓存时,需要通过E-tag请求服务器,以确定是否需要更新(不使用缓存中的过期资源)
 
no-store: 浏览器和第三方 web代理都不缓存资源,每次都请求服务器(不缓存)
 

If-Match : 如果匹配E-tag,则处理,否则,服务端不处理请求 (资源没有被修改,可以处理)
(倾向于使用浏览器缓存,但是缓存没有了,我想请求一下之前的资源,如果服务器资源更新了,那拒绝我吧)
如果不匹配,可以返回 412 状态码,之后可以使用本地缓存、
 
If-None-Match: 如果不匹配  E-tag,则处理,否则,服务端不处理(资源被修改了,可以处理)
(倾向于使用服务器最新资源文件,如果没有更新,那服务器拒绝我吧,我可以用浏览器缓存资源)
 
(在Get和Head方法中,使用首部字段If-None-Match可以获取最新的资源,这与If-Modified-Since相似)
 
 
Connection : 
标识只转发给代理服务器的首部,代理服务器将Connection标识的首部以及Connection首部信息处理删除,再转发给 服务器。
一般用于 控制不再转发给代理的首部字段 和 管理持久化连接。
 
持久连接:在HTTP/1.1之前,客户端和服务器之间都是非持久连接,
在1.1之后默认是持久性连接,Connection:Keep-alive,Keep-Alive用来保证客户端和服务器之间的持久性连接。
当服务器想要断开连接时,使用Connetion传递一个Close字段即可。

4XX: 客户端错误

400 Bad Request  : 请求报文中存在语法错误
401 Unauthorized : 标识请求的资源需要通过HTTP验证(BASIC、DIGEST),响应头中会包含一个 WWW-Authenticate首部用来质询用户信息,当浏览器第一次接收401响应时,会弹出认证用的对话窗口。(比如ActiveMQ经常见到)
403 Forbidden  :请求的资源地址被拒绝,服务器不允许访问该资源,拒绝没有原因,但可以在响应实体中加以说明,一般出现在没有权限的情况下
404 Not Found : 表示服务器上无法找到请求的资源,也可以在服务器端拒绝请求,并不说明原因
412 Preconditioned Failed : 如果请求中有 If-Match字段,服务器通过E-tag值对比,发现不匹配,可以返回412拒绝该次请求

5XX: 服务器错误

500 Internal Server Error  :在执请求过程遇到问题,可能是 web应用存在的bug或者某些临时的故障
503 Service Unavailable : 服务器暂时处于超负荷或者进行停机维护,现在无法处理请求。如果开发人员之后本次维护的时间,可以将需要的时间写入 RetryAfter 首部字段中

7. 虚拟主机映射 和 云服务器的内网地址

如果只有一台物理设备,需要提供多个Web服务,可以通过 域名匹配的方式映射到IP地址上,当用户使用域名访问时,DNS先将域名解析为IP地址,定位到设备,之后,通过域名访问具体的web应用,比如像 同一个服务器对外提供多个web服务。

云服务一般都有 外网地址和内网地址,外网地址用于网络通信,内网地址用于局域网通信。应该不是同一个物理设备,或者说 每个外网IP对应一块网卡。

8. 代理、网关、隧道

代理: 客户端和服务器之间的转发者,可以用缓存、访问控制、记录访问日志等。两种实现机制:是否使用缓存、是否修改报文

网关:具有处理功能的中间人,存储映射表,他可以对请求进行处理转发到合适的服务器应用上,客户端和网关之间是HTTP通信,网关和服务器之间可以是非HTTP协议,网关还可以连接数据库和其他接口做一些操作处理。

隧道:使用HTTP的Connect方法建立连接,使用SSL加密传输保证数据传输的安全性。透明传输。

8. 什么是 HTTPS通信?

http是应用层协议,HTTP的报文结构有 请求行 、头部信息、实体信息组成。

HTTP的通信是不安全的,可以通过加密方式来进行安全通信,一般有两种实现方式。

第一种,通过HTTP在应用层将 实体信息进行加密,保证内容不被破解。
第二种,使用SSL的方式建立客户端和服务器之间的可靠安全传输。SSL不属于应用层也不属于传输层, 在两层之间的安全套接字,在应用层将报文内容传递给SSL,SLL使用公钥对报文进行加密处理,再交给传输层TCP进行发送,服务器端接到数据之后,在SSL层将数据解密得到HTTP报文格式,再进行处理。

SSL:在建立通信的过程中,依靠CA体系,认证服务器证书,认证证书携带的公钥信息,确定该服务器和公钥信息是一致的
SSL建立通信的过程在 TCP的三次握手成功之后,会请求服务器端证书
TLS 是SSL标准化之后的产物,现在TLS的1.0版本与SSL的3.0版本几乎没有区别

记一下:签名 验签和加密 解密

签名验签:A使用私钥对数据的摘要值做一个签名值,同时发送 原文 签名值 给B,B使用A的公钥对签名值解密,获得摘要值,并对原文做摘要处理,得到一个摘要值,对比。确定 A是否是A,因为只有 A拥有 公钥的对应私钥。

加密解密:A先产生一个密钥(对称密钥),使用堆成公钥对原文做加密处理,得到密文,并使用B的公钥对对称密钥做加密处理,得到数字信封,发送 密文 和 被加密的对称密钥给B。B使用B的私钥对 数字信封进行解密,得到对称密钥,使用对称密钥对密文解密得到 原文。(核心是:对称密钥加解密速度快)

(真实的通信情况是:A先和B协商 对称密钥,对称密钥确定之后,就使用对称密钥进行通信)

9. HTTP认证:

确认请求者身份,一般有 BASIC(基本认证)、DIGEST(摘要认证)、SSL(客户端认证)、FormBase(表单认证)

BASIC和DIGEST,不常用了。而SSL成本较高,需要证书,一般也不用,除了保密性重要的地方,例如银行的U盾等,

常用的就是 表单提交了,通过表单提交用户信息,服务器返回一个 set_Cookie : SESSIONID=xxx。浏览器保存Cookie的内容,下次请求时,在请求头中 添加 Cookie的SESSIONID,服务端就能区分请求来自某个已认证的用户。

10. 如何实现Web服务的信息和客户端之间同步

Ajax:异步通信,异步JavaScript与XML技术,有效利用JavaScript和DOM(文档对象模型)的操作。局部替换web,部分请求

Ajax的核心技术是 XMLHttpRequest 的API,通过JavaScript脚本语言与服务器进行HTTP通信。

Comet :延迟应答,挂起连接,等服务器有更新了,再返回响应给客户端。

SPDY:谷歌在 2010年提出的speedy。在应用层和传输层之间,添加了 会话层,用来管理建立起来的连接。控制对数据的流动。优点:多路复用流、赋予请求优先级、压缩HTTP首部、推送功能、服务器提示功能。但是该技术应用推广不佳。

WebSocket:应用层协议,Web浏览器和Web服务器之间的全双工通信标准。

WebSocket是建立在HTTP基础上协议,第一次请求依靠客户端发起,等TCP连接建立成功之后,服务端会发送 upgrade:WebSocket 字段,来协商切换到 WebSocket协议,已处理之后的通信内容。这样就由WebSocket全权接管了,任然依靠TCP通信,可以传输JSON、XML、HTML或任意格式的数据。(此时客户端和服务端都能主动发送数据)(一共需要四次握手,第四次握手的响应状态码为101 Switching Protocols)

优点:

推送功能,支持服务器端主动推送信息到客户端

减少通信量:建立连接之后,就一直保持着,而且WebSocket的首部信息较少

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments