1,概念理解
HTTP(超文本传输协议),是一种建立在TCP上的无状态连接,
工作流程:客户端发送一个HTTP请求,说明想要访问的资源和请求的方式,服务端收到请求后进行处理,根据请求的方式访问服务器资源,最后通过http响应把结果返回给客户端。结束后会在服务端添加一条日志条目。
2,http头部信息
1,请求头
- Accept:告诉web服务器 浏览器能够处理的内容类型
- Accept-Charset:浏览器能够显示的字符集
- Accept-Encoding:浏览器申明自己接收的编码方法
- Accept-Language:浏览器申明自己接收的语言,浏览器当前设置的语言
- Connection:浏览器和服务器之间的链接类型
- Cookie ,在请求头中,注意:只有cookie的domain和path与发送的URL匹配才能发送
- Host:发出请求的页面所在的域
- referer:发出请求的页面的url
- user-Agent:浏览器的用户代理字符串
用setRequestHeader()可以设置请求头信息
2,响应头 - Set-Cookie 服务端返回,包含在响应头中,用来在客户端创建一个cookie
name=‘’;expires=‘’;path=’ - Date:消息发送的时间
- server:服务器名
- Connection:Client和server之间的连接类型
- content-type:表示后面的文档属于什么MIME类型
- Cache-Control:控制Http缓存
正则判断域名
三次握手
- 第一次:客户端发送一个SYN和ack包,服务端知道客户端的发送能力ok和自己的接收能力ok
- 第二次:客户端收到回应返回一个ACK包,知道自己和服务端的发送接收能力ok,但是服务端不知道自己发送能力ok不ok,
- 第三次:服务端知道自己的发送接收能力ok
四次挥手 - 第一次:客户端发送一个FIN包,用来关闭客户端到服务端的数据发送,告诉服务端不再发送消息(此时还可以接收数据)
- 第二次:服务端收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1
- 第三次:服务端再发送一个FIN,用来关闭服务端到客户端的数据传送,也告诉客户端,我不再发送数据了。
- 第四次:客户端收到FIN后,发送一个ACK给服务端
3,为什么要三次握手
前两次是为了基本的连接,第三次是为了防止失效的请求报文突然发送到服务端引起错误,
比如因为某些原因,请求报文在网络中停滞延迟了,如果没有第三次握手,服务端收到这个延迟的报文后会发送数据到客户端,但是客户端此时已经没有数据要传输了,而服务端还在傻傻得等着,造成极大的资源浪费,如有有第三次的话,客户端通知一下服务端就可以避免这种情况了。
4,http1.0的缺点
- 1,连接无法复用,导致每次都经历三次握手和慢启动
- 2,对头阻塞,导致宽带无法被充分利用,以及后续请求被阻塞。
4.1针对http1.0的缺点优化方案
- 1,解决连接无法复用
- (1)基于TCP的长连接 Connection:keep-alive
信息的上报和推送变得更及时,在请求量爆发的时间点还能减轻服务器压力 - (2)http long-polling
客户端发送一个polling请求到服务器,服务器并不会马上返回业务数据,而是等待新的业务数据产生的时候再返回。
缺点:用户增长的时候会增加服务器压力,稳定性不好,措施(重发和ack机制),polling的response可能会被中间代理cache住,处理好过期机制,每次请求都会带上重复的header信息,数据通道是单向的,主动权在服务端,客户端的请求无法及时传送。
- (3)http streaming
- (4) websocket
和tcp socket一样是基于TCP协议,提供双向数据通道,优势在于利用了message的概念,比基于字节流的tcp socket使用简单,提供了长连接,缺点:不是所有浏览器都支持。
- (1)基于TCP的长连接 Connection:keep-alive
- 解决 head of blocking
- 使用pipelining机制
缺点:
- 1,解决连接无法复用
- 只适用于http1.1
- 只有幂等请求(get ,head)能使用,非幂等不能
- 阻塞并未解决,FIFO
- 大部分代理不支持pipelining