【背】1/9,1/20 TCP,HTTP,Netty
- 第20题:BIO、NIO(如何实现的)、AIO。 BIO同步阻塞:数据的读写必须在一个线程内。 NIO同步非阻塞:同时支持阻塞与非阻塞,一个线程不断轮训。NIO用于连接多且连接比较短,比如聊天服务器。 AIO异步非阻塞:相应的状态改变后,系统通知对应线程来处理。AIO用于连接多且连接比较长,比如相册服务。 同步与异步区别:发送一个请求,等待返回,再发送下一个请求。同步可以避免死锁,脏读。 阻塞与非阻塞: 阻塞:读写期间,该线程不能执行其他任务。每个请求一个单独的线程来处理。 非阻塞:读写期间,线程去执行其他人了,一个或者几个线程处理所有客户端。 NIO3个概念:Channel通道,Buffer缓冲区,Selector选择器。 NIO面向缓冲区,IO面向流。
第14题:NIO和IO有什么区别。 IO面向流,NIO面向缓冲区。 IO为阻塞IO,NIO为非阻塞IO。 NIO有选择器Selector。
第15题:Nio和aio的区别。 NIO适用于连接多且连接比较短/轻操作,比如聊天服务器。 AIO适用于连接多且连接比较长/重操作,比如相册服务器。
-
第3题.TCP,UDP区别,为什么可靠和不可靠.6个 TCP 是面向连接的,UDP 是面向无连接的。 UDP程序结构较简单。 TCP 是面向字节流的,UDP 是基于数据报的。 TCP 保证数据正确性,UDP 可能丢包。 TCP 保证数据顺序,UDP 不保证。 TCP发送数据后等待确认接收端的确认消息,如果没有收到接收端的确认消息则重新传,而UDP发送数据后没有接收端的确认消息过程。
-
第4题.一次HTTP请求的全过程,包括域名解析、定位主机等。 2、DNS解析 3、建立tcp连接 4、客户端发送HTPP请求 5、服务器处理请求 6、服务器响应请求 7、浏览器展示HTML。 什么是DNS?域名与IP地址互换的分布式数据库。 DNS查询的两种方式:递归查询和迭代查询。 DNS负载均衡:一个url地址有几个IP,轮训返回IP。
-
第5题.TCP三次握手。 1.客户端发送syn包进入SYN_SENT状态。 2.服务端接收syn包回复ACK包,同时发送syn包,服务器进入SYN_RECV状态。/SYN,Synchronize 3.客户端接收syn+ack,发送确认ack包,客户端与服务端进入ESTABLISHED状态。 第6题:TCP三次握手的过程,如果没有第三次握手有什么问题。 TCP3次握手有两个意义(2):客户端与服务端做好发送数据的准备,协商发送数据的序列号。 如果改为2次握手,可能发生死锁。
第18题:TCP/IP协议的四次挥手。/fin-wait, 1客户端发送释放报文首部:FIN=1,seq=u,客户端进入终止等待,FIN-WAIT-1 2服务端收到释放报文,发送确认报文:ACK=1,ack=u+1,并带上自己的序号 seq=v,服务器进入关闭等待,CLOSE-WAIT 3客户端收到确认请求,进入终止等待2,FIN-WAIT-2,等待服务器发送释放报文。 4服务器发送完最后数据后,发送释放报文,FIN=1,ack=u+1,服务器进入LAST-ACK。 5客户端收到释放报文后,发送客户端确认报文,ACK=1,ack=w+1,seq=u+1,客户端进入TIME-WAIT,经过2MSL时间后客户端CLOSE
- 第12题:讲讲TCP四次挥手,如何处理服务器大量端口处在timewait? 编辑内核文件/etc/sysctl.conf,简单来说,就是打开系统的TIMEWAIT重用和快速回收。 加入以下内容: net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间 然后执行 /sbin/sysctl -p 让参数生效. /etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。
第4题:TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作用是什么,为什么要time wait,为什么是2msl。 2MSL:MSL一个片段在网络中存活的最大时间,2MSL是一个发送和一个回复最大存活时间。客户端没再次收到FIN断定ACK成功收到结束TCP链接。 为什么TIME WAIT:time-wait时间内没有再次收到FIN可以断定ACK成功收到,客户端进一步Close。 最后一次ACK作用:客户端确认服务器断开。
第17题:网络攻击:CSRF和XSS。 CSRF:跨站请求伪造原理攻击者盗用了你的身份,以你的名义发送恶意请求。 CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的! CSRF防御方式:1.验证码;2. 后台生成token,让前端请求携带。3.使用对称加密,后端随机给前端一个密钥,前端进行加密,后端解密。 XSS攻击:是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的。 XSS攻击解决方法:1.在表单提交或者url参数传递前,对需要的参数进行过滤。 2.过滤用户输入。检查用户输入的内容中是否有非法内容。
第19题:DDos攻击。 DDoS全称是分布式拒绝服务,简单的说就是攻击者操控大量的傀儡机,对你的服务器进行大量看似合法的访问,占用服务器的带宽资源,从而使真正的用户的请求无法得到服务的响应。
- 第13题:RPC与http的区别? rpc是基于tcp-ip协议,http是基于http 协议的。 rpc快于http。
拥塞控制-网络,流量控制-接收端
-
第5题:拥塞控制/过程,阀值。14-6 什么是拥塞控制?防止发送太快,网络来不及处理,导致网络拥塞。 拥塞控制的机制:慢启动,加法增加,增加一个MSS大小,乘法减少,当前拥塞窗口值乘与0.5。 拥塞控制的表现:丢包,延时变长。 拥塞控制的过程:1初始化拥塞控制窗口,慢启动阶段。2加法增加,遇到网络拥塞后,乘法减少,拥塞窗口重新设置1从慢启动开始。
-
第6题:流量控制与滑动窗口。14-6 什么是流量控制?防止发送太快,耗尽接收方资源,从而接收方来不及处理。 如何实现流量控制?使用滑动窗口。 什么事滑动窗口?告诉发送端接收端的缓冲区/Buffer大小。 使用滑动窗口可以一次发送多条数据,提高性能。
-
流量控制和拥塞控制的相同点和不同点。 相同点:丢包,实现都是发送端发的慢一点发的小一点 不同点:丢包的位置不一样,拥塞控制在路由器丢包,流量控制在接收端丢包。 作用的对象不一样:拥塞控制的作用对象是网络,流量控制的作用对象是接收端。
-
第3题:OSI7层协议与4层协议。 OSI7层协议:物理层,数据链路层,网络层,传输层,会话层,表达层,应用层。 4层协议:链路层,网络层,运输层,应用层。
-
第4题:http 1.0,1.1, 2.0。 http 1.0:需要keep-alive参数告诉服务器需要建立长连接。 http 1.1:默认长连接,支持只发送header用作权限请求,支持Host域。 http 2.0:多路复用技术,一个连接并发处理多个请求,HPACK算法对header数据压缩,web server请求数据的时候服务器把资源一起推送到客户端,这种非常适合加载静态资源。
Netty
第3题:Netty的线程模型,零拷贝实现? Reactor线程模型: Reactor单线程模型:所有的IO操作在同一个单线程完成。 Reactor多线程模型:一组NIO线程处理IO操作。 主从Reactor多线程模型:服务端独立的NIO线程池接收客户端请求。 根据启动参数,选择不同的reactor线程模型。 什么是零拷贝?14-78 OK 传统的零拷贝:数据传输过程中,不需要CPU进行数据的拷贝,这里的CPU拷贝指用户空间与内核间的数据拷贝。 数据从磁盘文件copy到内核readbuffer,从内核readbuffer将数据copy到网卡接口的buffer。 Netty的零拷贝: 1.Netty的接收和发送的bytebuffer使用DirectBuffers,使用JVM堆外直接内存进行socket读写,不需要缓冲区的二次copy。传统的,堆内存进行socket读写,JVM将堆内存Buffer拷贝到直接内存中,然后写入socket。 2.聚合多个buffer对象为一个大buffer对象。传统的,用内存copy的方式几个小的buffer对象合并成一个大buffer对象。 3.文件传输中,磁盘文件copy到内核read buffer,从内核read buffer将数据copy到网卡接口的buffer。
TCP拆包/粘包: 拆包:一个完整的包拆分成多个包进行发送。 粘包:多个小的TCP包封装成一个大的数据包。 Netty的半包解码器:?
Netty线程模型 Netty采用Reactor线程模型4: Reactor单线程模型:一个NIO线程处理所有I/O操作。 Reactor多线程模型:一组NIO线程处理所有I/O操作。一个NIO线程/Acceptor线程,接收TCP连接请求。I/O操作由一个NIO线程池负责(一个任务队列和N个可用线程)。缺点:并发几百万客户端连接,或者对客户端进行安全连接,单独一个Acceptor线程可能性能不足。 主从Reactor多线程模型:一个独立的NIO线程池接收客户端连接,将新创建的SocketChannel注册到I/O线程池。
Netty的零拷贝:体现在3个方面, 第一种:接收和发送ByteBuffer使用堆外直接内存进行Socket读写,从堆外内存直接发送到网络接口。 第二种:将多个ByteBuf封装成一个ByteBuf。 第三种:文件传输,从磁盘读取到文件缓冲区,从文件缓冲区直接发送到网络接口。
RPC性能模型