管道通信:一个进程往管道输入数据,则会阻塞等待别的进程从管道读取数据。
消息队列:消息队列提供了一种一个进程向另个一进程发送数据块的方法。每个接收块都被认为含有一个类型,接收进程可以独立的接收还有不同类型的数据结构。
共享内存:共享内存可以很好的减少拷贝所需要的时间。我们让两个进程分别拿出一部分虚拟地址空间,然后映射到相同的物理内存中去,从而完成共享内存机制。
信号量:可以实现进程间的同步与互斥。
Socket:使用套接字跟服务器进行通信。
三次握手:
发送方:SYN=1,seq=x;
接收方:SYN=1,ACK=1,ack=x+1,seq=y
发送方:SYN=1,ACK=1,ack=y+1,seq=x+1
避免已失效的连接请求报文发送给对方,引起错误
四次挥手:
发送方:FIN=1,seq=u
接收方:ACK=1,ack=u+1,seq=v
接收方:FIN=1,ack=u+1,seq=w
发送方:ACK=1,ack=w+1,seq=u+1
TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
tcp中的拥塞控制主要依赖于拥塞窗口cwnd
tcp中的流量控制主要依赖于一个端对端的接收流量窗口rwnd
tcp真正的发送窗口为min(cwnd,rwnd)
发送步骤:
1.发送开始时,发送方的拥塞窗口为1,每收到一个ack后,拥塞窗口翻倍。
2.由于指数增长非常快,很快的就会出现确认包超时。
3.此时设置一个慢启动阈值,它是当前拥塞窗口的一半。
4.同时将拥塞窗口大小设置为1,重新进行慢启动过程。
5.由于现在慢启动阈值已经存在,当拥塞窗口重新达到阈值时,不再翻倍,而是线性增加。
6.由于窗口不断增大,可能受到三次确认回答,进入快速重发阶段。
7.这时候TCP将慢启动阈值再次设置为当前拥塞窗口的一半,再将拥塞窗口设置为阈值大小。
8.拥塞窗口又会线性增加,直至下次出现三次重复确认应答。
封装:通常认为封装是把数据和数据操作的方法绑定起来,对数据的访问只能通过已定义的接口
继承:从已有类继承信息创建新的类的过程。
多态:多态性是指允许不同的子类型的对象对同一消息作出不同的响应。
如何实现多态:
1.接口实现
2.继承父类重写方法
3.同一类中进行方法重载
多态的好处:
1.可扩充性:增加新的子类并不影响已经存在的类结构。
2.接口行:多态是父类通过方法签名,向子类提供一个公共接口,由子类完善或者重写来实现。
3.灵活性。
4.简化性。
1.浏览器的地址栏输入URL并输入回车
2.浏览器查询当前URL是否存在缓存,且缓存是否过期
3.DNS解析URL所对应的IP
4.根据IP建立TCP连接(三次握手)
5.HTTP发起请求
6.服务器处理请求,浏览器接收HTTP响应
7.浏览器对加载到的资源进行解析,然后渲染页面。
8.关闭TCP连接(四次挥手)
1.校验和:TCP的校验和是必须的,而UDP的校验和是可选的。
2.序列号:TCP的每个字节都有自己的序列号。
序列号的作用:
1.保证可靠性:当接受的数据少了某个序列号的数据时能马上知道。
2.保证数据的暗示到达。
3.提高效率,实现多次发送,一次确认。
4.去除重复数据。
3.确认应答机制:ACK:TCP通过确认应答的机制实现可靠的传输,接收方对于按序到达的字段进行确认,若有效,则发送ACK=1,而发送方收到了确认报文后才能进行下一次的数据传输,否则等待一段时间后进行重传。
4.超时重传机制:当接收方发送报文一段时间后还没有收到确认应答,发送方进行重传。
5.连接管理机制:三次握手,四次挥手。
6.拥塞控制(慢启动):拥塞窗口:发送方开始定义拥塞窗口为1,每收到一个ack应答,拥塞窗口+1,而发送窗口取拥塞窗口和接收窗口的最小值。
慢启动:在启动初期以指数方式增长,收到确认段超时,设置一个慢启动的阈值为拥塞窗口的一半,设置拥塞窗口为1,重新慢启动,达到阈值后为线性增加。收到连续三次确认回答后,启动快速重传,将阈值设为拥塞窗口的一半,拥塞窗口设为阈值大小。
7.流量控制:接收方将自己可以接受的缓冲区大小放入TCP首部的窗口大小字段,通过ACK发送给发送端。
UDP协议被广泛用到对网络数据传输的实时性很高,对数据准确性不是非常高的场合,语音,视频。
1.UDP是无连接的,即发送结束时也没有连接需要释放,因而减小的开销和发送时的时延。
2.UDP采用最大努力交付,不保证可靠交付。
3.UDP是面向报文的,只把应用层交下来的报文增加首部后就交给网络层。
4.UDP是无拥塞控制的,即网络中存在阻塞,也不影响发送端的发送频率。
5.UDP支持一对一,一对多,多对一,多对多的交互通信。
6.UDP的首部开销小,相对于TCP的20个字节只要8个字节。
分为查询请求和查询响应,整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分
具体见:添加链接描述
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(Temporarily Moved )
401 : (未授权)当前请求需要用户验证。
404 : (未找到)请求失败,请求的数据在服务器上未发现。
其他见添加链接描述
301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
Accept:告诉服务器,客户端支持的数据类型。
Accept-Charset:告诉服务器,客户端采用的编码。
Accept-Encoding:告诉服务器,客户机支持的数据压缩格式。
Accept-Language:告诉服务器,客户机的语言环境。
Host:客户机通过这个头告诉服务器,想访问的主机名。
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境。
Cookie:客户机通过这个头告诉服务器,可以向服务器带数据。
Connection:客户机通过这个头告诉服务器,请求完后是关闭还是保持链接。
Date:客户机通过这个头告诉服务器,客户机当前请求时间。
Location:这个头配合302状态码使用,告诉用户端找谁。
Server:服务器通过这个头,告诉浏览器服务器的类型。
Content-Encoding:服务器通过这个头,告诉浏览器数据采用的压缩格式。
Content-Length:服务器通过这个头,告诉浏览器回送数据的长度。
Content-Language:服务器通过这个头,告诉服务器的语言环境。
Content-Type:服务器通过这个头,回送数据的类型
Last-Modified:服务器通过这个头,告诉浏览器当前资源的缓存时间。
Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次。
Content-Disposition:服务器通过这个头,告诉浏览器以下载的方式打开数据。
Transfer-Encoding:服务器通过这个头,告诉浏览器数据的传送格式。
ETag:与缓存相关的头。
Expires:服务器通过这个头,告诉浏览器把回送的数据缓存多长时间。-1或0不缓存。
Cache-Control和Pragma:服务器通过这个头,也可以控制浏览器不缓存数据。
Connection:服务器通过这个头,响应完是保持链接还是关闭链接。
Date:告诉客户机,返回响应的时间。
长连接 : 在 HTTP/1.0 中,默认使用的是短连接,也就是每次请求都要重新建立一次连接。HTTP 是基于 TCP/IP 协议的,每一次建立或者断开连接,都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大,因此最好能维持一个长连接,可以用长连接来发多个请求。HTTP 1.1 起,默认使用长连接 Connection: keep-alive。 HTTP/1.1 的持续连接,有非流水线方式和流水线方式 。流水线方式,是客户在收到 HTTP 的响应报文之前,就能接着发送新的请求报文;与之相对应的非流水线方式,是客户在收到前一个响应后才能发起下一个请求;
错误响应码:在 HTTP 1.1 中,新增了 24 个错误状态响应码,如 409(Conflict):表示请求的资源与资源的当前状态发生冲突;410(Gone):表示服务器上的某个资源被永久性的删除;
缓存处理:HTTP 1.0 中,主要使用 header 头里的 If-Modified-Since、Expires 来做为缓存判断的标准;HTTP 1.1,则引入了更多的缓存控制策略,如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等;
带宽优化及网络连接的使用:HTTP 1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象传送了过来,并且不支持断点续传功能;HTTP 1.1 中,则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样方便开发者自由的选择,以便于充分利用带宽和连接。
首先把bai所有数据填进一个完全二叉树中。然du后对非终端结点n/2向下zhi进行调整。建小根堆的时候方法dao是:1.元素下调。比较它与两个孩子的大小。哪个孩子比它小也比兄弟小则把它调到那个孩子的位置。然后再判断该位置还要不要往下调。2.从n/2开始,对它之前的所有元素进行1操作。
1.进程是系统进行资源调度和分配的基本单位。线程是系统进行资源调度的最小单位。
2.线程包含在进程之中,是进程中实际运行的单位。
3.一个进程可以并发多个线程,每个线程执行不同的任务。
4.线程可以共享进程的信息。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
对于 GET 和 POST 的区别,总结来说就是:它们的本质都是 TCP 链接,并无区别。但是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中可能会有所不同。
互斥量:最简单的线程同步方法,会阻塞线程。
自旋锁:死循环等待锁被释放
读写锁:方便多读少写。1.读写锁是一种特殊的自旋锁。2.允许多个读者同时访问资源。3.对于写操作则是互斥的。
条件变量:相对复杂,分为睡眠和唤醒。应用场景更加灵活。
端到端服务,透明的传输报文
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
1.脏读是指一个一个事务已经访问了数据,并且修改了数据,而这种修改还没有提交到数据库中,此时另外一个事务也访问了这个数据,并且修改了这个数据。
2.不可重复度:是指在一个食物内,多次读同一数据,而这个事务还没结束时,另外一个事务也访问了该数据。那么在第一个事务的两次读取时,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。
3.幻读:指事务不是独立执行时发生的一种现象,例如第一个事务对表中的数据进行了修改,这种修改设计表中的全部数据行。同时第二个事务也修改了这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还没有被修改的数据行,就像发生幻觉一样。
SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。
读未提交:就是一个事务可以读取另一个未提交事务的数据。
读提交:顾名思义,就是一个事务要等另一个事务提交后才能读取数据。避免脏读。
重复读:就是在开始读取数据(事务开启)时,不再允许修改操作。避免脏读和不可重复读。默认隔离级别。
序列化: 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
事务中的语句要么都执行,要么都不执行。
在数据库里,ACID(Atomicity 原子性、Consistency 一致性、Isolation 隔离性、Durability 持久性)是一系列属性。
原子性:原子性要求每个事物中的所有操作要么全部完成,要么就像全部没有发生一样:如果事物中的部分操作失败了,则整个事物事物失败了。
一致性:一致性确保了任何事物都会使数据库从一种合法的状态变为另一种合法的状态。
隔离性:保证了并发执行多个事物对系统的状态的影响和串行化执行多个事物对系统的状态的影响是一样的。
持久性保证了一个事物一旦被提交以后,其状态就保持不变,甚至是发生了主机断电、奔溃、错误等。
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。
客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。
1)可靠地实现TCP全双工连接的终止
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息TIME_WAIT允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。
2)允许老的重复分节在网络中消逝
TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
滑动窗口本质上是描述接受方(本地)的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为的数据报的到来。