滴滴二面
- 计算机网络 (TCP三次握手)
TCP协议非常重要,这里把它的连接和释放整理一下。
首先是三次握手:
1、 客户端发起,像服务器发送的报文SYN=1,ACK=0,然后选择了一个初始序号:seq=x。
SYN是干什么用的?
在链接的时候创建一个同步序号,当SYN=1同时ACK=0的时候,表明这是一个连接请求的报文段。如果对方有意链接,返回的报文里面SYN=1,ACK=1,。从这个意义上来说,SYN=1的时候,就表明这是一个‘请求’或者‘接受请求’的报文。
SYN=1的报文段不能携带数据。但是要消耗掉一个序号,
ACK是干什么用的?
仅当ACK=1的时候,确认字号(期望收到对方下一个报文段的第一个数据字节的编号)才有效。因此,TCP规定,当链接建立之后,所有往来的报文里面的ACK都应该是1(事实上,也只有客户端发起的链接请求报文的ACK没有置1)。
现在的状态:客户端进入SYN-SEND状态;
2、 服务器接收到了SYN=1,ACK=0的请求报文之后,返回一个SYN=1,ACK=1的确认报文。
同时,确认号ack=x+1,同时也为自己选择一个初始序号seq=y
现在的状态:服务器进入SYN-REVD状态;
3、 客户端接收到了服务器的返回信息之后,还要给服务器返回最后一条确认,ACK=1,确认号ack=y+1;
现在的状态:客户端进入ESTABLISHED状态。
- tcp链接建立之后server端挂了怎么办?
- 如何避免这种情况(server端挂)?
- 避免不了出现了你会怎么处理?(上面三个连环追问问傻了直接)
如果「服务端挂掉」指的是「服务端进程崩溃」,那么这个读者猜的想法是对的,服务端的进程在发生崩溃的时候,内核会发送 FIN 报文,与客户端进行四次挥手。
但是,如果「服务端挂掉」指的是「服务端主机宕机」,那么是不会发生四次挥手的,具体后续会发生什么?还要看客户端会不会发送数据?
- 如果客户端会发送数据,由于服务端已经不存在,客户端的数据报文会超时重传,当重传次数达到一定阈值后,会断开 TCP 连接;
- 如果客户端一直不会发送数据,再看客户端有没有开启 TCP keepalive 机制?
- 如果有开启,客户端在一段时间后,检测到服务端的 TCP 连接已经不存在,则会断开自身的 TCP 连接;
- 如果没有开启,客户端的 TCP 连接会一直存在,并不会断开。
- TCP和UDP区别?
- 打开网页用的TCP还是UDP(TCP)(刚打开数据量大,刚打开保证可靠回答了这些,面试官没说啥)
- Http和Https区别(一直追问还有什么?)
- Https加密机制
- java实现多线程的方法(一面重复)
- 一般用哪一种?
- java创建线程池有几种方式
- 线程池有哪些状态
- Hashmap的实现(打断好几次,就记得说到红黑树的时候,说先停一下,说一下红黑树的五个特性)
- Hashtable hashmap concurrenthashmap
- (上面说到concurrenthashmap 粒度小,开始追问小到什么程度)
- concurrenthashmap 加锁的时候put 和map怎么加的(详细说说)
- 懒汉饿汉单例
#实习面经##面经##二面##滴滴#