目录
- 握手三次,挥手四次
- TCP 如何保证可靠的传输
- CRC 循环校验算法
- 如何使用 UDP 实现可靠传输
- HTTPs 与 HTTP
-
- HTTP连接管理
- HTTPS 与 HTTP的区别
- HTTPS 为什么客户端信任第三方证书?
- HTTP 方法
-
- HTTP 请求/响应步骤:
- HTTP请求消息Response
- HTTP 异常状态码
- GET与POST
- HTTP 场景长连接短连接
- ARP 攻击
-
- ARP协议
- ARP攻击的发现
- ARP攻击过程
- ARP攻击的防护
- NAT 原理
-
- NAT是什么
- NAT分类
- NAT原理
- NAT应用
- NAT缺陷
- DNS 服务器与提供内容的服务器的区别
- DNS 劫持的原则和实现
- 对称加密和非对称加密的区别是什么
- AES 的过程
- 什么是安全攻击?
- DDOS 什么,如何预防
-
- DDOS攻击过程和目标
- DDOS解决方案
握手三次,挥手四次
三次握手 ??所谓三次握手TCP建立连接。一方接必须由一方主动打开,另一方被动打开。以下是客户主动发起连接的图表:
??握手前主动打开连接的客户端CLOSED阶段,被动打开的服务器端也结束CLOSED并进入阶段LISTEN阶段。然后开始三次握手:
- :首先,客户端将一段时间发送到服务器端TCP其中: 标记位为SYN,表示要求建立新的连接; 序号为Seq=X;初始化序号ISN动态随机; 然后客户端进入SYN-SENT阶段。
- :服务器端从客户端接收服务器端TCP报文结束后,结束LISTEN阶段。回到一段TCP其中: 标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器可以正常接收客户端发送的数据,并同意创建新的连接 序号为Seq=y; 确认号为Ack=x 1.表示收到客户端的序号Seq并将其值加1作为自己的确认号Ack服务器端进入SYN-RCVD阶段。
- :客户端接收到来自服务器端的确认收到数据的TCP报告结束后,从客户端到服务器的数据传输是正常的SYN-SENT回到最后一段。TCP其中: 标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了); 序号为Seq=x 1.表示收到服务器端的确认号Ack,并将其值作为自己的序号值; 确认号为Ack=y 1.表示收到服务器端号Seq,并将其值加1作为自己的确认号Ack的值; 然后客户端进入ESTABLISHED阶段。 服务器从客户端收到确认服务器数据TCP从服务器到客户端的数据传输是正常的。SYN-SENT阶段,进入ESTABLISHED阶段。
??传输到客户端和服务器端TCP报文中,双方确认号Ack和序号Seq所有的值对方Ack和Seq在计算值的基础上,这确保了TCP报纸传输的连贯性。一旦出现一方发出的信息TCP如果报纸丢失,就不能继续"握手",以此确保了"三次握手"顺利完成。 Q:为什么握手三次? ??为了防止服务器端打开一些无用的连接,增加服务器成本,防止故障的连接请求报告段突然传输到服务端,导致错误。
??由于网络传输延迟(通过网络光纤和各种中间代理服务器),在传输过程中,如客户端发起SYN=创建连接请求(第一次握手)。如果服务器端直接创建此连接并返回包含SYN、ACK和Seq等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。
??客户端可能会设置一个超时间,并关闭连接创建的请求。然后发出创建连接的请求,但服务器端不知道。如果服务器端客户端没有第三次握手告诉服务器端传输到服务器端的数据,服务器端不知道客户端是否收到服务器端返回的信息。这个过程可以理解为: ??这样,如果没有要求创建或关闭服务器端口,服务器端口将始终打开。当客户端因加班而重新发出请求时,服务器将重新打开端口连接。然后,服务器端上未收到请求数据的最后一个端口将始终打开。从长远来看,如果有更多这样的端口,将严重浪费服务器端的费用。
??另一种情况是无效客户端发送的请求信息,由于某种原因传输到服务器端,服务器端认为是客户端发送的有效请求,接收后出现错误。
??因此,我们需要第三次握手来确认这个过程,这样客户端和服务器端就可以及时检测到网络等问题导致的连接创建失败,从而关闭服务器端的端口,减少服务器成本,接收失败请求的错误。
四次挥手 那TCP 四次挥手是为了确保通信双方关闭连接,具体流程如下:
1)客户端 A 发送一个 FIN,关闭客户 A 到服务器 B 数据传输; 2)服务器 B 收到这个 FIN,它发回一个 ACK,确认序号是收到的序号 1。和 SYN 一样,一个 FIN 占用一个序号; 3)服务器 B 关闭客户端 A 发送一个连接 FIN 给客户端 A; 4)客户端 A 发回 ACK 确认报纸,并将确认序号设置为接收序号 1。 Q:为什么连接协议是三次握手,而关闭连接是四次握手?
??这是因为服务端 LISTEN 状态下的 SOCKET 当收到 SYN 报文建连请求后,可以使用 ACK 和 SYN(ACK 和 SYN 起同步作用)放在报纸上发送。但关闭连接时,收到对方时 FIN 报告通知时,只是说对方没有数据发送给你,但是,,因此,您不能立即关闭连接,也就是说,您可能需要将传输过程中的数据传输给另一方,或者在发送之前,您仍然需要将一些数据传输给另一方(然后关闭连接)FIN 对方同意现在可以关闭连接,所以它在这里 ACK 报文和 FIN 在大多数情况下,报纸是分开发送的。
Q:为什么客户端在?TIME_WAIT 状态还需要等待 2MSL回来之前 CLOSED 状态?
??;当客户端发出最后一个ACK在确认报文时,服务器端无法确定能够收到该报文。因此,客户端正在发送ACK确认报纸后,将设置2个时间MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报纸在传输过程中的最大生命周期。2MSL即服务器端发出FIN发布的报文和客户端ACK确认报纸能保持最大有效时间(一次来回)。服务器端在1MSL未收到客户端发送的内部信息ACK如果确认报纸,将再次发送给客户端FIN报文;
序列号的初始化 ISN(s) ISN代表什么?意义何在?
??ISN,字节数据节数据编号的起源使对方能够生成合法的接收窗口。
ISN是固定的吗?
??动态随机。
ISN为什么要动态随机?
??为了避免被第三方猜测,增加安全性,被第三方伪造RST报文Reset。
刚才你提到第三方可以伪造RST成功需要满足哪些条件? ??需要sequence number 位于对方合法接收窗口内。 而由于ISN是动态随机的,很难猜出对方合法接收窗口。ISN = 0,很容易猜出来;
第一次三次握手可以携带数据吗?为什么? ??不,三次握手还没有完成;
对方不能在握手成功后将数据缓存并提交给应用程序吗? ??这样会放大SYN FLOOD攻击。如果攻击者伪造了成千上万的握手报纸,并携带了1K 字节数据,而
TCP 如何保证可靠传输
TCP协议保证数据传输可靠性的方式主要有:
1. 校验和 计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。 发送方:在发送数据之前计算检验和,并进行校验和的填充。 接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。 注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。
2. 确认应答和序列号 序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。 确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
确认应答=序列号结尾+1,即告诉它下一次发送数据要从这里发起; 序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一;
3. 超时重传 在进行TCP传输时,由于确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟没有等到接收方的ACK报文,这该怎么办呢?而没有收到ACK报文的原因可能是什么呢?
首先,发送方没有介绍到响应的ACK报文原因可能有两点:
- 数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到;
- 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了;
TCP在解决这个问题的时候引入了一个新的机制,叫做
4. 连接管理 接管理就是三次握手与四次挥手的过程;保证可靠的连接,是保证可靠性的前提。 5. 流量控制 收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,超时重传呀什么的。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是
在TCP协议的报头信息当中,有一个16位字段的窗口大小。在介绍这个窗口大小时我们知道,窗口大小的内容实际上是接收端接收数据缓冲区的剩余大小。这个数字越大,证明接收端接收缓冲区的剩余空间越大,网络的吞吐量越大。接收端会在确认应答发送ACK报文时,将自己的即时窗口大小填入,并跟随ACK报文一起发送过去。而发送方根据ACK报文里的窗口大小的值的改变进而改变自己的发送速度。如果接收到窗口大小的值为0,那么发送方将停止发送数据。并定期的向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。
6. 拥塞控制 TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,就对大量的超时重传,严重影响传输。
TCP的四种拥塞控制算法 1.慢开始 2.拥塞控制 3.快重传 4.快恢复 假定: 1.数据是单方向传送,而另一个方向只传送确认 2.接收方总是有足够大的缓存空间,因而发送发发送窗口的大小由网络的拥塞程度来决定 3.以TCP报文段的个数为讨论问题的单位,而不是以字节为单位 传输轮次:发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间就是往返时间RTT(RTT并非是恒定的数值),使用传输轮次是为了强调,把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认,拥塞窗口cwnd会随着网络拥塞程度以及所使用的拥塞控制算法动态变化。
在tcp双方建立逻辑链接关系时, 拥塞窗口cwnd的值被设置为1,还需设置慢开始门限ssthresh,在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口cwnd的值加一,然后开始下一轮的传输,当拥塞窗口cwnd增长到慢开始门限值时,就使用拥塞避免算法。
慢开始: 假设当前发送方拥塞窗口cwnd的值为1,而发送窗口swnd等于拥塞窗口cwnd,因此发送方当前只能发送一个数据报文段(拥塞窗口cwnd的值是几,就能发送几个数据报文段),接收方收到该数据报文段后,给发送方回复一个确认报文段,发送方收到该确认报文后,将拥塞窗口的值变为2,发送方此时可以连续发送两个数据报文段,接收方收到该数据报文段后,给发送方一次发回2个确认报文段,发送方收到这两个确认报文后,将拥塞窗口的值加2变为4,发送方此时可连续发送4个报文段,接收方收到4个报文段后,给发送方依次回复4个确认报文,发送方收到确认报文后,将拥塞窗口加4,置为8,发送方此时可以连续发送8个数据报文段,接收方收到该8个数据报文段后,给发送方一次发回8个确认报文段,发送方收到这8个确认报文后,将拥塞窗口的值加8变为16; 即慢开始阶段的拥塞窗口呈指数增长;
当前的拥塞窗口cwnd的值已经等于慢开始门限值,之后改用拥塞避免算法。
拥塞避免: 也就是每个传输轮次,拥塞窗口cwnd只能线性加一,而不是像慢开始算法时,每个传输轮次,拥塞窗口cwnd按指数增长。同理,16+1……直至到达24,假设24个报文段在传输过程中丢失4个,接收方只收到20个报文段,给发送方依次回复20个确认报文段,一段时间后,丢失的4个报文段的重传计时器超时了,发送发判断可能出现拥塞,更改cwnd和ssthresh.并重新开始慢开始算法,如图所示:
快速重传: 快恢复:
拥塞控制是TCP在传输时尽可能快的将数据传输,并且避免拥塞造成的一系列问题。是可靠性的保证,同时也是维护了传输的高效性。
CRC 循环校验的算法
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。 接收到的信息为101101001,生成多项式为G(x)= x3+ x2+1,判断传输是否误码;就拿101101001除以1101,因为之前余数为001,所以这个如果没有差错,必然会整除从而使得余数为0,即没有误码;如果余数不为0,说明存在误码;
如何使用 UDP 实现可靠传输
UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响;
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
1、添加seq/ack机制,确保数据发送到对端 2、添加发送和接收缓冲区,主要是用户超时重传。 3、添加超时重传机制。
详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。
1、RUDP(Reliable User Datagram Protocol) RUDP 提供一组
2、RTP(Real Time Protocol) RTP为数据提供了
RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于底层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。
3、UDT(UDP-based Data Transfer Protocol) 基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是
顾名思义,UDT建于UDP之上,并
HTTPs 与 HTTP
HTTP连接管理
搭载 HTTP 的 TCP HTTP 这个应用层协议是以 TCP 为基础来传输数据的。当你想访问一个资源(资源在网络中就是一个 URL)时,你需要先解析这个资源的 IP 地址和端口号,从而和这个 IP 和端口号所在的服务器建立 TCP 连接,然后 HTTP 客户端发起服务请求(GET)报文,服务器对服务器的请求报文做出响应,等到不需要交换报文时,客户端会关闭连接,下面我用图很好的说明了这个过程; 上面这幅图很好的说明了 HTTP 从
由于 HTTP 位于 TCP 的上层,所以 HTTP 的请求 -> 响应过程的时效性(性能)很大程度上取决于底层 TCP 的性能,只有在了解了 TCP 连接的性能之后,才可以更好的理解 HTTP 连接的性能,从而才能够实现高性能的 HTTP 应用程序。
通常把一次完整的请求 -> 相应过程称之为 HTTP 事务。
HTTP 时延损耗 从图中可以看出,主要是有下面这几个因素影响 HTTP 事务的时延:
- 客户端会根据 URL 确定服务器的 IP 和端口号,这里主要是 DNS 把域名转换为 IP 地址的时延,DNS 会发起 DNS 查询,查询服务器的 IP 地址。
- 第二个时延是 TCP 建立连接时会由客户端向服务器发送连接请求报文,并等待服务器回送响应报文的时延。每条新的 TCP 连接建立都会有建立时延。
- 一旦连接建立后,客户端就会向服务器请求数据,这个时延主要是服务器从 TCP 连接中读取请求报文,并对请求进行处理的时延。
- 服务器会向客户端传输响应报文的时延。
- 最后一个时延是 TCP 连接关闭的时延。
试想一个问题,假设一个页面有五个资源(元素),每个资源都需要客户端打开一个 TCP 连接、获取资源、断开连接,而且每个连接都是串行打开的,如下图所示: 串行的意思就是,这五个连接必须是有先后顺序,不会出现同时有两个以上的连接同时打开的情况。
上面五个资源就需要打开五条连接,资源少还好说,CPU 能够处理,如果页面资源达到上百或者更多的时候呢?每个资源还需要单独再打开一条连接吗?这样显然会急剧增加 CPU 的处理压力,造成大量的时延,显然是没有必要的。
串行还有一个缺点就是,有些浏览器在对象加载完毕之前是无法知道对象的尺寸(size)的,并且浏览器需要对象尺寸信息来将他们放在屏幕中合理的位置上,所以在加载了足够多的对象之前,屏幕是不会显示任何内容的,这就会造成,其实对象一直在加载,但是我们以为浏览器卡住了。
所以,怎么
但是并行连接并不一定快,如果带宽不够的情况下,甚至页面响应速度还不如串行连接,因为在并行连接中,每个连接都会去竞争使用有效的带宽,每个对象都会以较慢的速度加载,有可能连接 1 加载了 95% ,连接 2 占用带宽加载了 80%,连接 3 ,连接 4 。。。。。。虽然每个对象都在加载,但是页面上却没有任何响应。
而且,打开大量连接会消耗很多内存资源,从而出现性能问题,上面讨论的就五个连接,这个还比较少,复杂的 web 页面有可能会有数十甚至数百个内嵌对象,也就是说,客户端可以打开数百个连接,而且有许多的客户端同时发出申请,这样很容易会成为性能瓶颈。
这样看来,
2. 持久连接 Web 客户端通常会打开到同一个站点的连接,而且初始化了对某服务器请求的应用程序很可能会在不久的将来对这台服务器发起更多的请求,比如获取更多的图片。这种特性被称为站点局部性(site locality)。
因此,HTTP 1.1 以及 HTTP1.0 的允许 HTTP 在执行完一次事务之后将连接继续保持在打开状态,这个打开状态其实指的就是 TCP 的打开状态,以便于下一次的 HTTP 事务能够复用这条连接。
在一次 HTTP 事务结束之后仍旧保持打开状态的 TCP 连接被称为持久连接。
非持久连接会在每个事务结束之后关闭,相对的,持久连接会在每个事务结束之后继续保持打开状态。持久连接会在不同事务之间保持打开状态,直到客户端或者服务器决定将其关闭为止。
长连接也是有缺点的,如果单一客户端发起请求数量不是很频繁,但是连接的客户端却有很多的话,服务器早晚会有崩溃的时候。
持久连接一般有两种选型方式,一种是
HTTP 1.1 之前的版本默认连接都是非持久连接,如果想要在旧版本的 HTTP 上使用持久连接,需要指定 Connection 的值为 Keep-Alive。
HTTP 1.1 版本都是持久性连接,如果想要断开连接时,需要指定 Connection 的值为 close,这也是我们上面说的两种选型方式的版本因素。
下面是使用了持久连接之后的 HTTP 事务与使用串行 HTTP 事务连接的对比图: 这张图对比了 HTTP 事务在串行连接上和持久连接的时间损耗图,可以看到,
在持久性连接中,还有一个非常有意思的地方,就是 Connection 选项,Connection 是一个通用选项,也就是客户端和服务端都具有的一个标头,下面是一个具有持久性连接的客户端和服务端的请求-响应图 从这张图可以看出,持久连接主要使用的就是 Connection 标头,这也就意味着,Connection 就是持久性连接的实现方式。
Connection 标头 Connection 标头具有两种作用
- 和 Upgrade 一起使用进行协议升级 也就是说,客户端发起 Connection:upgrade 就表明这是一个连接升级的请求,如果服务器决定升级这次连接,就会返回一个 101 Switching Protocols 响应状态码,和一个要切换到的协议的头部字段 Upgrade。如果服务器没有(或者不能)升级这次连接,它会忽略客户端发送的 Upgrade 头部字段,返回一个常规的响应:例如返回 200。
- 管理持久连接 我们上面说持久连接有两种方式,一种是 HTTP 1.0 + Keep-Alive ;一种是 HTTP 1.1 + persistent。
Connection: Keep-Alive
Keep-Alive: timeout=10,max=500
在 HTTP 1.0 + Keep-Alive 这种方式下,客户端可以通过包含 Connection:Keep-Alive 首部请求将一条连接保持在打开状态。
这里需要注意⚠️一点:Keep-Alive 首部只是将请求保持在活跃状态,发出 Keep-Alive 请求之后,客户端和服务器不一定会同意进行 Keep-Alive 会话。它们可以在任何时刻关闭空闲的 Keep-Alive 连接,并且客户端和服务器可以限制 Keep-Alive 连接所处理事务的数量。
Keep-Alive 这个标头有下面几种选项:
- timeout:这个参数估计了服务器希望将连接保持在活跃状态的时间。
- max :这个参数是跟在 timeout 参数后面的,它表示的是服务器还能够为多少个事务打开持久连接。
- Keep-Alive 这个首部是可选的,但是只有在提供 Connection:Keep-Alive 时才能使用它。
Keep-Alive 使用限制和规则 在 HTTP/1.0 中,Keep-Alive 并不是默认使用的,客户端必须发送一个 Connection:Keep-Alive 请求首部来激活 Keep-Alive 连接。
通过检测响应中是否含有 Connection:Keep-Alive 首部字段,客户端可以判断服务器是否在发出响应之后关闭连接。
代理和网管必须执行 Connection 首部规则,它们必须在将报文转发出去或者将缓存之前,删除 Connection 首部中的首部字段和 Connection 首部自身,因为 Connection 是一个 Hop-by-Hop 首部,这个首部说的是只对单次转发有效,会因为转发给缓存/代理服务器而失效。
严格来说,不应该与无法确定是否支持 Connection 首部的代理服务器建立 Keep-Alive 连接,以防止出现哑代理问题;
代理服务器
代理服务器就是代替客户端去获取网络信息的一种媒介,通俗一点就是网络信息的中转站。
为什么我们需要代理服务器?
最广泛的一种用处是我们需要使用代理服务器来替我们访问一些我们客户端无法直接访问的网站。除此之外,代理服务器还有很多功能,比如缓存功能,可以降低费用,节省带宽;对信息的实时监控和过滤,代理服务器相对于目标服务器(最终获取信息的服务器)来说,也是一个客户端,它能够获取服务器提供的信息,代理服务器相对于客户端来说,它是一个服务器,由它来决定提供哪些信息给客户端,以此来达到监控和过滤的功能。
哑代理问题 哑代理问题主要是,http客户端和服务器端进行通信时,会经过代理服务器,但是代理服务器不一定支持keep-alive。 哑代理问题出现就出现在代理服务器上,再细致一点就是出现在不能识别 Connection 首部的代理服务器,而且不知道在发出请求之后会删除 Connection 首部的代理服务器; Proxy-Connection 解决哑代理 网景公司提出了一种使用 Proxy-Connection 标头的办法,首先浏览器会向代理发送 Proxy-Connection 扩展首部,而不是官方支持的 Connection 首部。如果代理服务器是哑代理的话,它会直接将 Proxy-Connection 发送给服务器,而服务器收到 Proxy-Connection 的话,就会忽略这个首部,这样不会带来任何问题。如果是一个聪明的代理服务器,在收到 Proxy-Connection 的时候,就会直接将 Connection 替换掉 Proxy-Connection ,再发送给服务器。 HTTP/1.1 持久连接 HTTP/1.1 逐渐停止了对 Keep-Alive 连接的支持,用一种名为 persistent connection 的改进型设计取代了 Keep-Alive ,这种改进型设计也是持久连接,不过比 HTTP/1.0 的工作机制更优。
与 HTTP/1.0 的 Keep-Alive 连接不同,HTTP/1.1 在默认情况下使用的就是持久连接。除非特别指明,否则 HTTP/1.1 会假定所有连接都是持久连接。如果想要在事务结束后关闭连接的话,就需要在报文中显示添加一个 Connection:close 首部。这是与以前的 HTTP 协议版本很重要的区别。
使用 persistent connection 也会有一些限制和规则:
- 首先,发送了 Connection: close 请求后,客户端就无法在这条连接上发送更多的请求。这同时也可以说,如果客户端不想发送其他请求,就可以使用 Connection:close 关闭连接。
- HTTP/1.1 的代理必须能够分别管理客户端和服务器的持久连接 ,每个持久连接都只适用于单次传输。
- 客户端对任何服务器或者代理最好只维护两条持久连接,以防止服务器过载。
- 只有实体部分的长度和相应的 Content-Length保持一致时,或者使用分块传输编码的方式时,连接才能保持长久。
管道化连接 HTTP/1.1 允许在持久连接上使用请求管道。这是相对于 Keep-Alive 连接的又一个性能优化。管道就是一个承载 HTTP 请求的载体,我们可以将多个 HTTP 请求放入管道,这样能够降低网络的环回时间,提升性能。下图是使用串行连接、并行连接、管道化连接的示意图: 使用管道化的连接也有几处限制:
- 如果 HTTP 客户端无法确认连接是持久的,就不应该使用管道。
- 必须按照与请求的相同顺序回送 HTTP 响应,因为 HTTP 没有序号这个概念,所以一旦响应失序,就没办法将其与请求匹配起来了。
- HTTP 客户端必须做好连接会在任何时刻关闭的准备,还要准备好重发所有未完成的管道化请求。
HTTP 关闭连接 所有 HTTP 客户端、服务器或者代理都可以在任意时刻关闭一条 HTTP 传输连接。通常情况下会在一次响应后关闭连接,但是保不准也会在 HTTP 事务的过程中出现。
但是,服务器无法确定在关闭的那一刻,客户端有没有数据要发送,如果出现这种情况,客户端就会在进行数据传输的过程中发生了写入错误。
即使在不出错的情况下,连接也可以在任意时刻关闭。如果在事务传输的过程中出现了连接关闭情况,就需要重新打开连接进行重试。如果是单条连接还好说,如果是管道化连接,就比较糟糕,因为管道化连接会把大量的连接丢在管道中,此时如果服务器关闭,就会造成大量的连接未响应,需要重新调度。
如果一个 HTTP 事务不管执行一次还是执行 n 次,它得到的结果始终是一样的,那么我们就认为这个事务是幂等的,一般 GET、HEAD、PUT、DELETE、TRACE 和 OPTIONS方法都认为是幂等的。客户端不应该以管道化的方式发送任何非幂等请求,比如 POST,否则就会造成不确定的后果。
由于 HTTP 使用 TCP 作为传输层的协议,所以 HTTP 关闭连接其实还是 TCP 关闭连接的过程。
应用程序可以关闭 TCP 输入和输出信道中的任何一个,或者将二者同时关闭。调用套接字 close() 方法会讲输入和输出同时关闭,这就被称为完全关闭。还可以调用套接字的 shutdown 方法单独关闭输入或者输出信道,这被称为半关闭。HTTP 规范建议当客户端和服务器突然需要关闭连接的时候,应该正常关闭,但是它没有说如何去做。
参考文章:https://mp.weixin.qq.com/s/MksdIMNCdL4CRfJS5Q-gMQ
HTTPS 与 HTTP的区别
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了
HTTPS和HTTP的区别主要如下:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTPS 的原理,客户端为什么信任第三方证书
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。 (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。 (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。 (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。 (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。 (5)Web服务器利用自己的私钥解密出会话密钥。 (6)Web服务器利用会话密钥加密与客户端之间的通信。
Q:HTTPS 客户端验证 服务端证书流程 证书预置和申请 1:客户端浏览器会预置根证书, 里面包含CA公钥 2:服务器去CA申请一个证书 3: CA用自己的签名去签一个证书,指纹信息保存在证书的数字摘要里面, 然后发送给服务器
一次访问流程(简化) 1: 客户端 sayHello 2: 服务器返回证书 3-1: 客户端验证证书内容有效性(过期时间, 域名是否相同等) 3-2: 验证证书的有效性 (是否被串改), 通过本地根证书的CA公钥解密数字摘要,看是否匹配。 3-3:如果数字签名验证通过, 就可以使用服务器证书里面提供的公钥进行下一步通信。
https优点 尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处: (1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器; (2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。 (3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。 (4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
https缺点 虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的: (1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电; (2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响; (3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。 (4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。 (5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。
HTTP 方法
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式; HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法; HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法;
1、OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 2、HEAD 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。 3、GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url 4、POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form 5、PUT 向指定资源位置上传其最新内容 6、DELETE 请求服务器删除Request-URL所标识的资源 7、TRACE 回显服务器收到的请求,主要用于测试或诊断 8、CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意: 1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。 2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
HTTP 请求/响应的步骤:
客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容
1、客户端连接到Web服务器 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com
2、发送HTTP请求 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应 Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。 4、释放连接TCP连接 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
客户端发送一个HTTP请求到服务器的请求消息包括以下格式 请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本 Get请求例子,使用Charles抓取的request:
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本. GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息 从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的 即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,可以添加任意的其他数据。 这个例子的请求数据为空。
POST请求例子,使用Charles抓取的request:
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,第一行明了是post请求,以及http1.1版本。 第二部分:请求头部,第二行至第六行。 第三部分:空行,第七行的空行。 第四部分:请求数据,第八行。
HTTP请求消息Response
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文 第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。 第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息 第二行和第三行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的 第四部分:响应正文,服务器返回给客户端的文本信息。 空行后面的html部分为响应正文。