2020-08-24

  1. 排序,快排,再找前k个,nlgn
  2. 冒泡,找到最大k个,n*k
  3. 堆排,建前k个数的小顶堆,然后遍历剩余n—k,再和堆顶比较,大于则加入,最后完成。 n*lgk
  4. 随机选择+partition   nlogn
  5. bfprt

分为n/5个小组,小组内排序,然后取中位数,再递归调用得到这些数第n/5/2小的数,即这些数的中位数,

 

 

 

 

 

Shared_ptr

通过指针作为引用计数,当对同一个对象进行操作的时候,会相应的对这个计数进行修改。

这个计数的指针是在堆上的,如果有多个shared_ptr指向同一个对象,他们指向的也是同一个引用计数指针。

当指针减少为0的时候,才会调用析构函数来对这个指针析构

 

为什么析构函数要虚函数

因为如果一个基类指针或引用指向派生类对象,

 

 

 

 

TCP

Tcp长链接、短链接:https://www.cnblogs.com/gotodsp/p/6366163.html

来源连接端口(16位长)-识别发送连接端口

目的连接端口(16位长)-识别接收连接端口

序列号(seq,32位长)

如果含有同步化旗标(SYN),则此为最初的序列号;第一个资料比特的序列码为本序列号加一。

如果没有同步化旗标(SYN),则此为第一个资料比特的序列码。

确认号(ack,32位长)—期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。

资料偏移(4位长)—以4字节为单位计算出的数据段开始地址的偏移值。

保留(3比特长)—须置0

标志符(9比特长)

NS—ECN-nonce。ECN显式拥塞通知(Explicit Congestion Notification)是对TCP的扩展,定义于RFC 3540(2003)。ECN允许拥塞控制的端对端通知而避免丢包。ECN为一项可选功能,如果底层网络设施支持,则可能被启用ECN的两个端点使用。在ECN成功协商的情况下,ECN感知路由器可以在IP头中设置一个标记来代替丢弃数据包,以标明阻塞即将发生。数据包的接收端回应发送端的表示,降低其传输速率,就如同在往常中检测到包丢失那样。

CWR—Congestion Window Reduced,定义于RFC 3168(2001)。

ECE—ECN-Echo有两种意思,取决于SYN标志的值,定义于RFC 3168(2001)。

URG—为1表示高优先级数据包,紧急指针字段有效。

ACK—为1表示确认号字段有效

PSH—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。

RST—为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。

SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步

FIN—为1表示发送方没有数据要传输了,要求释放连接。

窗口(WIN,16位长)—表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。

校验和(Checksum,16位长)—对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。

紧急指针(16位长)—本报文段中的紧急数据的最后一个字节的序号。

 

 

 

IP

版本:IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。

首部长度:IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。

服务类型:Type Of Service。

总长度:IP报文的总长度。报头的长度和数据部分的长度之和。

标识:唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。

标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。

片位移:本分片在原先数据报文中相对首位的偏移位。(需要再乘以8)

生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。

协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.

首部校验和:计算IP头部的校验和,检查IP报头的完整性。

源IP地址:标识IP数据报的源端设备。

目的IP地址:标识IP数据报的目的地址

 

 

三次握手:  

1.客户端发送一个创建连接请求给服务器,SYN标志置1。

2.服务器正常收到后,如果同意链接,就会向客户端返回一个确认报文,SYN和ACK置1,并且为此TCP分配TCP缓存和变量资源(包括内核内存(包括各种数据结构及分配的缓冲区)、文件描述符、端口号、地址(五元组,大半比较固定,剩下的就不多了)。应该也会消耗系统总的打开文件数。如果开了 keep alive,还会时不时地占用一丁点带宽及 CPU。)

3.客户端收到服务器的响应报文之后,向服务器给出确认,同时也分配缓存和变量,ack置1,并且这个报文可以携带数据。

TCP全双工。

 

 

为什么不是两次?

如果两次握手就完成链接的话,服务器也就是一收到连接请求就创建了链接,分配了资源。而如果服务器回传的响应没有被客户端接收到,客户端超时重传给服务器又新建了链接,如果网络不好,这样的情况反复多次,就会导致服务器的资源大大被消耗。

防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。同时三次握手是为了能够正确的在服务器和客户端维护一个序列号,来标识发送的数据包哪些是已经收到的。如果是两次,那只有发起链接的起始序列号能被确认,被动链接的一方的序列号不能被确认。

 

泛洪攻击:只发送第一个SYN包,让TCP连接处于挂起状态,半连接状态,来浪费服务器资源

 

 

 

四次挥手:

  1. 客户端主动关闭,发送一个中断连接请求,FIN置1
  2. 服务器收到后,返回一个响应,ACK置1.并且继续数据传输,进入close_wait。客户端收到后进入半中断状态
  3. 服务器将所有数据传输完毕,发送一个关闭请求,ACK置1,FIN置1。服务器进入半中断。
  4. 客户端收到后,返回一个关闭ACK,ACK置1.并且在等待两个MSL之后没有收到新的关闭请求,关闭客户端TCP连接
  5. 服务器收到ACK之后,关闭服务器连接,没收到超时重传。

 

为什么要等待2个MSL?

因为客户端不等待就直接关闭,那最后客户端对服务器关闭连接请求的响应如果没有正确被收到,那服务器就不会完全关闭连接,并且超时重传

但是超时客户端关闭了就不会再接受这个包,服务器永远不能正常关闭。而2MSL是表示一个包在客户端和服务器最长的一个来回,也就是当客户端的ack

发出之后,在1个MSL内被服务器收到了,服务器就不会超时再重传。如果服务器没有在这个ACK发后1MSL收到,那么服务器知道这个包超时需要重传。

重传的包最长到达时间是MSL,加起来就是两个

 

 

 

 

 

TCP可靠传输怎么实现

 

 

TCP如何实现有连接的可靠传输(和UDP对比)

连接:通过三次握手和四次挥手来保证传输前是

可靠:

1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。

2、数据校验:TCP报文头有校验和,用于校验报文是否损坏

3、数据合理分片和排序:

tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排序后交给应用层。

而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报。

4、流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。

5、拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。

UDP

http://c.biancheng.net/uploads/allimg/191111/6-1911111249535K.gif

 

 

 

 

 

 

 

 

智能指针

Shared_ptr会循环引用,无法彻底释放,使用weak_ptr

https://blog.youkuaiyun.com/weizhengbo/article/details/68957993

shared_ptr传参是传值还是传引用(传引用线程不安全):https://exp.newsmth.net/topic/article/d9b68c4cc62c0a01276f5e85e5db22d5

尽量使用make_shared初始化; https://www.jianshu.com/p/03eea8262c11

优点:1、提高性能2、 异常安全

 

Weak_ptr使用: https://www.cnblogs.com/DswCnblog/p/5628314.html

 

 

 

 

 

 

Vector

 

 

 

实现

智能指针实现:https://blog.youkuaiyun.com/u014796694/article/details/81218033

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值