HTTP协议:
超文本传输协议(Hyper Text Transfer Protocol),是web(万维网、全球广域网)的网络协议与规范,用以客户端和服务端的通信。
目前发展版本:2.0
结构:基于B/S结构(Browser/Server,浏览器/服务器模式) // 3层C/S结构,服务器-客户机,即Client-Server(C/S)结构(两层结构)
B/S: 1层:浏览器、2层 Web服务器、3层 数据库服务器
C/S:服务器部分和客户机部分
网络基础:TCP/IP
HTTP协议是TCP/IP协议族的子集
TCP/IP协议族:
起因:计算机与网络设备需要互相通信,如语言、发起方式等,需要基于相同方法、规则,统称为协议(protocol)。
分层:应用层、传输层、网络层、数据链路层(降低耦合度,避免一改全改,各司其职,互不干涉)
应用层:决定了向用户提供应用服务时通信的活动,如文件传输、超文本传输和域名解析等。
常见协议:FTP (File Transfer Protocol ) 文件传输协议、DNS(Domain Name System) 域名系统、HTTP(Hyper Text Transfer Protocol) 超文本传输协议
传输层:为上层应用层提供网络连接中两台计算机的数据传输。
常见协议:TCP(Transmission Control Protocol) 传输控制协议,UDP(User Data Protocol) 用户数据报协议
网络层:处理网络上流动的数据包,换句话说就是规定通过什么方式(传输路线)到达对方计算机,并将数据包给对方。tip: 数据包是网络传输最小单位。常见协议:ICMP(Internet Cntrol Message Protocol)Internet控制报文协议(传输出错报告控制信息,IP子集)、IP (Internet Protocol) 网际互连协议 (TCP/IP核心协议,实现网络互联)
数据链路层:处理连接网络的硬件部分,如操作系统、硬件设备驱动、NIC(Network Interface Card)网卡、光纤等可见部分(还包括连接器等一切传输媒介)。
TCP/IP 通信传输流
流程:发送端从应用层往下走,接收端往应用层走,每经过一层,发送端就会打上该层所属首部信息,接收端则消去一层首部信息。
tip: 这种把数据信息包装起来的做法叫做封装(encapsulate)
举例:客户端发送一个HTTP请求请求某个Web页面,会在传输层把应用层受到数据(HTTP请求报文)进行分割,并在每个报文打上标记序号及端口号传到下层网络层,网络层带上MAC地址(物理地址,具备唯一性,作为通信目的地),再转发到数据链路层。接收端接受数据,往上发送,传输到应用层,才算完成整个请求流程。
与HTTP关系密切的协议:IP、TCP、DNS
IP (Internet Protocol)网际互连协议
位置:网络层
作用:实现网际互联,即各种数据包传输到对方,确保传输到位。
需要条件:IP地址(节点被分配地址,可变换)、MAC地址(网卡所属固定地址、物理地址,唯一)
通信方法:IP间依赖于MAC物理地址。网络通讯一般经过多台计算机和网络设备进行中转连接,中转时,可利用下一个目标设备MAC地址搜索目标。
怎么获取MAC地址?可通过地址解析协议,即ARP(Address Resolution Protocol),根据IP地址获取MAC物理地址进而进行通信。
tip: 中转过程,计算机和路由器等网络设备只能获悉粗略传输路线,有点像送快递,只知道送到哪里,不知道具体细节,这种机制叫做路有选择(routing)
可靠的TCP(Transmission Control Protocol) 传输控制协议
位置:传输层
作用:提供可靠字节流服务。
字节流服务:为方便传输,将大块数据切割成报文段单位数据包进行管理。
可靠服务:能够将数据准确可靠的传给对方。
确保可靠的策略:三次握手
三次握手:
发送端首先发送一个带SYN标志的数据包给对方。
接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。
最后,发送端再回传一个带ACK标志的数据包,代表“握手” 结束。
三次握手是否能够携带数据?
前两次不能,第三次可以,前两次没有建立连接,如果可以携带数据,攻击者将不断发送数据进行恶意攻击,导致服务器崩溃。
负责域名解析的DNS服务
位置:应用层
作用:提供域名到IP地址之间的解析服务
起因:计算机会被赋予IP地址、域名以及主机名,但一般使用者倾向于使用主机名或域名访问,但计算机理解名称会比较困难,计算机更擅长理解数字,所以通过DNS提供对域名进行解析,找到对应IP或者通过IP反向找到域名等服务。
这些协议在HTTP协议的通讯过程中发挥着什么作用?(也就是面试常考题:从输入网址到显示页面的过程分析?)
输入地址后,首先是会查找本地有无缓存,有缓存且没过时就直接返回。
无缓存条件下,通过DNS解析域名找到地址对应IP返回给发送端。
客户端根据HTTP协议生成发送给目标服务器的HTTP请求报文。
接着客户端根据TCP协议将请求报文分割成报文段,通过三次握手与接收端建立TCP连接后,达到可靠传输。
然后客户端通过IP协议定位地址,一边中转一边传输。
服务器接收到报文段后通过TCP协议重组成请求报文。
服务器根据HTTP协议对请求报文进行处理,返回对应资源。
同样通过TCP/IP通信协议进行回传,最后四次挥手断开TCP连接。
最后浏览器对请求回来的资源进行解析,解析HTML为DOM树、CSS为CSS Rule Tree(css规则树),然后浏览器引擎将这两个构建成Render Tree,接着开始进入layout布局处理阶段,即计算出每个节点在屏幕中的位置,最后就是节点渲染上去。
URI 和 URL
URI:
统一资源标识符,用字符串标识某一网络资源。
URL:
统一资源定位符,URI子集,表示资源地点(互联网上所处位置)。
组成:协议、域名、端口号、 路径、查询参数、锚点
HTTP报文
组成:请求报文、响应报文
请求报文: 请求行、请求头、空行、请求体
请求行:http方法、请求地址、http协议、版本
请求头:key:value,告知服务器需要什么内容及类型
空行:区分实体和首部
请求体:参数
响应报文: 状态行、响应头、空行、响应体
状态行:http协议、版本、数字状态码及其英文名称
响应头:key:value,告知服务器需要什么内容及类型
空行:区分实体和首部
响应体:服务端返回数据
HTTP请求方法
CONNECT
要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer 安全套接字)和TLS(Transport Layer Security 传输层安全)协议把通信内容加密后经网络隧道传输。
网络隧道:
作用:构建VPN(虚拟专用网络),即利用一种网络协议来传输另一种网络协议。
分类:二层隧道协议、三层隧道协议
二层隧道协议:用于传输二层网络协议,它主要应用于构建远程访问虚拟专网(Access VPN)。
三层隧道协议:用于传输三层网络协议,它主要应用于构建企业内部虚拟专网(Internet VPN)和扩展的企业内部虚拟专网(Extranet VPN)。
持久连接/长连接
HTTP/1.0版本没进行一次HTTP通信,都需要断开一次TCP连接,大量请求情况下增加了通信的开销。
HTTP/1.1版本提出持久连接(HTTP Persistent Connections, 也称HTTP keep-alive 或HTTP connection reuse)
长连接优缺点
优点
减少CPU及内存的使用,因为不需要经常建立和关闭连接
支持管道化的请求及响应模式
减少网络堵塞,因为减少了TCP请求
减少了后续请求的响应时间,因为不需要等待建立TCP、握手、挥手、关闭TCP的过程
发生错误时,也可在不关闭连接的情况下进行错误提示
缺点
一个长连接建立后,如果一直保持连接,对服务器来说是多么的浪费资源呀,而且长连接时间的长短,直接影响到服务器的并发数。
还有就是可能造成队头堵塞,造成信息延迟。
如何避免长连接资源浪费?
客户端请求头声明:Connection: close,本次通信后就关闭连接。
服务端配置:如Nginx,设置keepalive_timeout设置长连接超时时间,keepalive_requests设置长连接请求次数上限。
系统内核参数设置:
net.ipv4.tcp_keepalive_time = 60,连接闲置60秒后,服务端尝试向客户端发送侦测包,判断TCP连接状态。
net.ipv4.tcp_keepalive_intvl = 10,就在10秒后再次尝试发送侦测包,直到收到ack反馈。
net.ipv4.tcp_keepalive_probes = 5,一共会尝试5次,要是都没有收到就关闭这个TCP连接了。
管线化(管道化)
持久连接使得管线化(pipelining)方式发送成为可能。
HTTP/1.0,发送请求需要等待上一个请求发送并相应回来才能进行下一个。 HTTP/1.1管道化发送请求则可以同时发送。
管线化是在同一个TCP连接里发一个请求后不必等其回来就可以继续发请求出去,这可以减少整体的响应时间,但是服务器还是会按照请求的顺序响应请求,所以如果有许多请求,而前面的请求响应很慢,就产生一个著名的问题队头堵塞
特点:
管线化机制通过持久连接完成,在http1.1版本才支持
只有GET请求和HEAD请求才可以进行管线化,而POST有所限制
初次创建连接时不应启动管线化机制,因为服务器不一定支持http1.1版本的协议
管线化不会影响响应到来的顺序,如上面的例子所示,响应返回的顺序就是请求的顺序
要求客户端和服务端都支持管线化,但并不要求服务端也对响应进行管线化处理,只是要求对于管线化的请求不失败即可
由于上面提到的服务端问题,开户管线化很可能并不会带来大幅度的性能提升,而且很多服务端和代理程序对管线化的支持并不好,因为浏览器(Chrome/Firefox)默认并未开启管线化支持
队头堵塞
http1.0协议采用的是请求-应答模式,报文必须是一发一收,就形成了一个先进先出的串行队列,没有轻重缓急的优先级,只有入队的先后顺序,排在最前面的请求最先处理,就导致如果队首的请求耗时过长,后面的请求就只能处于阻塞状态,这就是著名的队头阻塞问题。解决如下:
并发连接
因为一个域名允许分配多个长连接,就相当于增加了任务队列,不至于一个队列里的任务阻塞了其他全部任务,现在的浏览器标准中一个域名并发连接可以有6~8个,记住是6~8个,不是6个(Chrome6个/Firefox8个)
域名分片
一个域名最多可以并发6~8个,那咱就多来几个域名
比如a.baidu.com,b.baidu.com,c.baidu.com,多准备几个二级域名,当我们访问baidu.com时,可以让不同的资源从不同的二域名中获取,而它们都指向同一台服务器,这样能够并发更多的长连接了
而在HTTP2.0下,可以一瞬间加载出来很多资源,因为支持多路复用,可以在一个TCP连接中发送多个请求
使用Cookie进行状态管理
起因:HTTP是无状态协议优点:不需要保持状态,减少服务器的CPU及内存消耗。也正是因为HTTP协议本身非常简单,所以被应用于不同场景。
解决方案:Cookie
Cookie
作用:通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
主要流程:Cookie会根据服务器端发送的响应报文内的Set-Cookie首部字段信息,通知客户端保存Cookie。当下次客户端再次发送请求,带上该Cookie;服务端根据客户端Cookie鉴定客户端来源,对比服务器记录,得到该客户端之前状态信息。
Get和Post的区别:
1、GET在浏览器回退时是无害的,而POST会再次提交请求。
2、GET产生的URL地址可以被Bookmark(书签),而POST不可以。
3、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4、GET请求只能进行url编码,而POST支持多种编码方式。
5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6、GET请求在URL中传送的参数是有长度限制的,而POST么有。
7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9、GET参数通过URL传递,POST放在Request body中。
常见 HTTP 状态码
1xx: 指示信息——表示请求已接收,继续处理
2xx:成功——表示请求已被成功接收
3xx: 重定向——表示要完成请求必须进行进一步操作
4xx:客户端错误——表示请求有语法错误或请求无法实现
5xx: 服务端错误——表示服务端未能实现合法的请求
HTTP代理
普通代理(中间人代理)
作用:可以过渡、缓存、负载均衡(多台服务器公用一台代理情况)等一些处理。
tip: 实际情况下客户端和服务器之间可能有多个代理服务器。
隧道代理
客户端通过CONNECT方法请求隧道代理创建一个可以到任意目标服务器和端口号的TCP连接,创建成功之后隧道代理只做请求和响应数据的转发,中间它不会做任何处理
为什么需要隧道代理呢?
我们都知道https服务是需要网站有证书的,而代理服务器显然没有,所以浏览器和代理之间无法创建TLS(传输层安全性协议),所以就有了隧道代理,它把浏览器的数据原样透传,这样就实现了通过中间代理和服务端进行TLS握手,然后进行加密传输
代理服务器,到底有什么好处呢?
突破访问限制:如访问一些单位或集团内部资源,或用国外代理服务器(翻墙),就可以上国外网站看片等。
安全性更高:上网者可以通过这种方式隐藏自己的IP,免受攻击。还可以对数据过滤,对非法IP限流等。
负载均衡:客户端请求先到代理服务器,而代理服务器后面有多少源服务器,IP是多少,客户端是不知道的。因此,代理服务器收到请求后,通过特定的算法(随机算法、轮询、一致性hash、LUR(最近最少使用) 算法这里不细说了)把请求分发给不同的源服务器,让各个源服务器负载尽量均衡。
缓存代理:将内容缓存到代理服务器。
网友评论