UDP协议
UDP协议报文结构
只有源端口,目标端口,长度,奇偶检验值,非常精简。
特点
TCP和UDP比较面向连接——无连接
可靠——不可靠
有序——可能无序
速度慢——速度快
重量级——轻量级(体现在报头大小)
TCP的滑动窗口
TCP的滑动窗口RTT和RTO
RTT:发送一个数据包到收到对应的ACK,所花费的时间
RTO:重传时间间隔(RetransmitTimeOut),TCP在发送一个数据包后会启动一个重传定时器,即RTO,如果超时没收到ACK就重传。
RTO不是固定写死的数据,而是根据RTT算出来的。
TCP使用滑动窗口做流量控制与乱序重排滑动窗口的作用:
保证TCP的可靠性
提供TCP的流控特性
流量控制:TCP报文头中的Window字段用于接收方通知发送方自己还有多少缓冲区可以接收数据。发送方根据接收方的处理能力来发送数据。不会导致接收方处理不过来
窗口数据的计算过程:
左图是TCP协议的发送方的缓冲区,右图是接收端端缓冲区,下面是字节流,从左往右发送/接收
AdvertisedWindow:接收方返回的还可以接收的缓冲区大小
MaxRcvBuffer:接收方能接收的最大数据量
LastByteRcvd - LastByteRead:已占用的缓存空间
EffectiveWindow:发送方剩余可发送大小
LastByteSent - LastByteAcked: ...
HTTP
HTTPHTTP简介超文本传输协议HTTP的主要特点
支持客户/服务器模式
简单快速
灵活
无连接
限制每次连接只处理一个请求,服务器处理完客户的请求并收到客户的应答后就断开连接
默认使用长连接,即服务器需要等待一定时间后才断开连接,以保证连接特性
无状态
协议对于事物处理没有记忆能力,如果后续处理需要前面的信息则必须重传。
HTTP请求结构
请求行:
请求方法:Get、Post等
URL:URL
协议版本号:HTTP/1.0、1.1
请求头部:
若干报头组成
设置请求的参数
请求正文:
数据体,只在post中用到,表示上传的数据
HTTP响应结构
状态行:
协议版本、状态码、状态码描述
响应头部
说明客户端要使用的附加信息
响应正文
请求/响应的步骤
客户端连接到Web服务器,建立TCP连接
发送HTTP请求
服务器接受请求并返回HTTP响应
Web服务器解析该请求,定义请求资源,然后将该资源副本写到TCP套接字,由客户端读取。
释放TCP连接
若HTTP连接模式为close则服务器主 ...
HTTPS
HTTPSHTTPS简介
SSL(Security Sockets Layer,安全套接层)
为网络通信提供安全及数据完整性的一种安全协议。
是操作系统对外的API,SSL3.0后更名为TLS。
采用身份验证和数据加密保证网络通信的安全和数据的完整性。
HTTPS数据传输流程
浏览器将支持的加密算法信息发送给服务器
服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。
证书中有一个公钥来加密信息,私钥由服务器持有。证书中包含发布证书的CA机构,证书的有效期,公钥,证书的所有者,签名等
验证证书的合法性
客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。
生成随机密码(RSA签名)
如果验证通过,或用户接受了不受信任的证书,浏览器就会生成一个随机的对称密钥(session key)并用公钥加密,让服务端用私钥解密,解密后就用这个对称密钥进行传输了,并且能够说明服务端确实是私钥的持有者。
生成对称加密算法
验证完服务端身份后,客户端生成一个对称加密的算法和对 ...
Socket相关
Socket
Socket通信流程
Socket相关面试题
TCPLengthCalculator类123456789101112131415161718192021222324252627282930313233public class LengthCalculator extends Thread { //以socket为成员变量 private Socket socket; public LengthCalculator(Socket socket) { this.socket = socket; } @Override public void run() { try { //获取socket的输出流 OutputStream os = socket.getOutputStream(); //获取socket的输入流 InputStream is = socket.getIn ...
volatile
Volatilevolatile有三个作用:
volatile变量读写时会增加内存屏障
volatile变量读写时会禁用局部指令重排
保证对volatile的操作happens-before另一个操作
读屏障,就是在读取volatile变量之前增加一条将变量内容从内存读入CPU缓存的指令;写屏障就是在volatile变量写入之后,将变量的值从CPU缓存写入内存。
指令重排是一种CPU策略,通过交换指令执行的顺序获得最佳性能。
红黑树
红黑树红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则:
每个节点都有红色或黑色
树的根始终是黑色的 (黑土地孕育黑树根, )
没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
从节点(包括根)到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点
2-3树一颗2-3树或为一颗空树,或有以下节点组成:
2-节点,含有一个元素和两个子树(左右子树),左子树所有元素的值均小于它父节点,右子树所有元素的值均大于它父节点;
3-节点,还有两个元素和三个子树(左中右子树),左子树所有元素的值均小于它父节点,中子树所有元素的值都位于父节点两个元素之间,右子树所有元素的值均大于它父节点;
子树也是空树、2-节点或者3-节点;
没有元素相等的节点。
插入时像叶节点插入,如果节点有三个值(变成了4-节点)就拆分,并向上合并
为什么用B+数
为什么使用B+树B+树的优势:
1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询。
B树缺点:1. 索引存值,然而数据库内容和索引分开存储的2. 索引存值,每次查找都要访问数据库,效率低3. 不适合范围查找在B树的每一个节点中,都不止存储一个值,具体存储的值的个数依赖于B树的阶。而我们在查找一个值的过程中,需要对当前所在的节点包含的所有值进行一个遍历,以此来确定当前查找的值是否在当前节点中。这也就意味着,相比于二叉搜索树,平衡二叉树,红黑树等数据结构,B树查找一个值需要比较更多的次数。假设一棵B树的阶是100,那也就意味着在最坏情况下,我们在每一个访问到的节点中,都需要比较100次,而前面提到的三种数据结构比较的次数不会超过树的深度,也就是只需要少量的比较次数。既然B树相比较于它们需要比较更多的次数才能找到相应的值,那为什么还要B树呢?这取决于实际的应用场景。
说到B树,大部分首先想到的就是数据库的索引,MySQL中使用的索引主要为BTree索引(实际是B+树实现的,这个后面再谈)。 ...
AQS
AQSAQS是Java的一个同步器开发框架,解决的一个最核心问题,就是将高端用户人群和真正意义的底层隔离(JVM的机制和底层的JNI)。一种同步器往往不能解决所有问题,用户经常需要自己实现同步器,这个时候,如果没有AQS,用户就会去用底层的JVM或者映射到JNI的API(例如:LockSupport.park、CAS、Unsafe等等),这种情况会让Java编程变得非常复杂。因此Java提供了AQS,让需要实现同步器的用户在一个同步器框架上编程。
比如下面的程序,就可以让用户轻松的实现一个Mutex(互斥锁)数据结构:
1234567891011121314151617public class Mutex { private final Sync sync = new Sync(); static class Sync extends AbstractQueuedSynchronizer{ protected boolean tryAcquire(int arg) { return compareAndS ...
static关键字
Static关键字