面试-计算机网络知识点整理
网络模型
OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP四层模型:网络接口层、网络层、传输层、应用层
其中ARP和RARP在OSI模型中是数据链路层协议,在TCP/IP模型中是网络层协议
网络层协议包括IP、ICMP
传输层协议包括TCP、UDP
应用层协议包括DNS、HTTP、SMTP、FTP
TCP协议
三次握手
过程
- Client发送带有SYN(seq=j)标志的数据包给Server (序列号是随机的,防止被黑客搞到后获得与其他主机之间通信的初始序列号)
- Server发送带有SYN(seq=k)/ACK(ack=j+1)标志的数据包给Client
- Client发送带有ACK(ack=k+1)标志的数据包
为什么要三次握手?
-
为了建立可靠的通信通道,即确认Client和Server的收发功能都正常
第一次握手,Client什么都无法确认;Server确认发送端发送正常,自己接收正常
第二次握手,Client确认自己和Server发送、接收正常;Server确认Client发送正常,自己接收正常
第三次握手,双方都确认自己和对方发送、接收正常
-
防止超时的连接到达服务器,让服务器打开错误的连接(为什么不是两次握手的原因)
-
SYN/ACK在同一个包中发送,提高连接的速度和效率(为什么不是四次握手的原因)
为什么要回传SYN?回传SYN是为了建立并确认从Server到Client的通信
为什么三次握手的时候ack=seq+1?用于向发送端表示接收端已经收到了,且收到的信息确实就是你发送的信息
四次挥手
过程
- 主动关闭方A发送一个FIN,用来关闭A到被动关闭方B的数据传送
- B收到FIN,发回一个ACK,进入COLSE_WAIT状态。
- B发送一个FIN,用来关闭与A的连接
- A收到FIN后,进入TIME_WAIT状态,发回ACK并等待2MSL(MSL大于TTL衰减至0的时间,即报文最大生存时间),如果又收到B的FIN,则重发ACK并重新计时
为什么连接的时候是三次握手,而断开连接的时候是四次呢?
建立连接时,Server将ACK和SYN放在一个报文里发送给Client;而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,自己也许还有一些数据要发给对方,发送完后再发送FIN报文表示同意关闭连接,因此,ACK和FIN一般都会分开发送。
为什么要有CLOSE_WAIT状态? 通知应用程序发送剩余数据,处理现场,关闭相关资源。
服务器有大量CLOSE_WAIT可能的原因:1)资源没有关闭;2)请求调用超时引起连接关闭(SLB关闭连接)
为什么Client收到FIN后还要等待2MSL?
-
保证TCP协议的全双工连接能够可靠关闭
如果Server没有收到Client最后回复的ACK,超时后Server再次发送FIN,Client再次收到FIN时能保证对方收到ACK
-
保证这次连接的重复数据段从网络中消失
如果Client直接关闭后又请求建立新连接,且端口号与老连接的相同,如果前一次连接某些数据滞留在网络中,在新连接建立后才到达,Client会将这些旧数据与新连接的数据发生混淆
保证可靠传输
-
校验和:首部与数据都参与校验
-
序列号与确认应答:接收端每次收到数据报后,都会发送确认应答
-
超时重传:当TCP发出报文后,它启动一个定时器,等待接收端的确认应答。如果不能及时收到一个确认,将重发这个报文段。
使用ARQ(Automatic Repeat-reQuest)协议实现超时重传,包括停止等待ARQ协议和连续ARQ协议
-
停止等待ARQ协议:每发完一个分组就停止发送,等待对方确认。如果超时后,还是没有收到ACK确认,则重新发送,直到收到确认后再发下一个分组;若接收方收到重复分组,就丢弃该分组,但同时还要发送确认
优点:简单
缺点:1)信道利用率低;2)等待时间长
-
连续ARQ协议:发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优点:信道利用率高,容易实现
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
-
-
流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP用可变大小的滑动窗口协议实现流量控制
-
拥塞控制:当网络拥塞时,减少数据的发送。
拥塞控制和流量控制的区别
拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。发送方让自己的发送窗口取为拥塞窗口(cwnd)和接收方的接受窗口中较小的一个。
TCP的拥塞控制算法包括慢开始、拥塞避免、快重传/快恢复
- 慢开始:由小到大逐渐增大拥塞窗口数值。拥塞窗口初始值为1,每经过一个传播轮次,拥塞窗口加倍。阈值(门限值)是默认的64KB,或者是和接收方协商过的阈值,超过阈值时进入拥塞避免
- 拥塞避免:让拥塞窗口缓慢增大,即每经过一个往返时间RTT就把发送方的拥塞窗口加1
- 快重传/快恢复:当发送方收到三个重复确认(TCP在收到乱序到达包时会立即发送ACK),它认为数据丢失了,立即重传这些丢失的数据。
UDP协议
什么时候数据会乱序?网络非常拥塞的时候
数据乱序会产生什么影响?会造成音、视频的卡顿(因为少帧),但不会有太严重的影响
如何解决数据乱序问题?在数据报中加入数据报序号
使用场景?音、视频传输
可靠、低延迟的UDP协议(QUIC)
QUIC(Quick UDP Internet Connection),在UDP基础上实现类似于TCP+TLS+HTTP2的功能
特点:
- 0RTT快速连接
- 连接迁移:比如WIFI切换到4G时,客户端的IP会发生变化,需要重新建立TCP连接。而QUIC不以IP和端口作为标识,而是以客户端产生的一个64位作为连接标识
- 改进的拥塞控制
- 由应用程序实现不同的拥塞算法;
- 一个应用程序不同的连接能配置不同的拥塞控制算法;
- 拥塞算法的变更不需要停止服务,只需要修改配置然后reload
- 双级别流控:基于Stream(类比于HTTP请求)和Connection(类比于TCP连接)级别的流量控制
- 没有队头阻塞的多路复用:多路复用让所有请求在一个TCP连接上,如果某个资源的某个包丢失了,由于TCP用序列号标识数据的顺序,就会在接收端形成队头阻塞,直到丢包恢复;QUIC基于UDP,UDP一个连接上的多个Stream之间没有依赖,如果某个资源的某个包丢失了,只会影响单个资源(单个Stream)
- 单调递增的 Packet Number:代替TCP的序列号。严格递增可以解决延迟情况下RTT采样不准确的问题(TCP延迟时重发同一个序列号,接收端拿到序列号不能判断是延迟到达的数据还是后面新发的数据)。保证有序的方式是用Stream的offset保证的
- Ack Delay:TCP没有减去接收端从收到数据到发送ACK的时间差,导致RTT计算有误差;而QUIC减去了这段时间
- 不允许Reneging:一个Packet只要被Ack,就认为它一定被正确接收,不允许丢弃该数据
- 加密认证的报文:QUIC的头部是经过认证的,报文内容是经过加密的
https://cloud.tencent.com/developer/article/1405624
https://zhuanlan.zhihu.com/p/32553477
TCP与UDP的区别
TCP:面向连接的;可靠交付;面向字节流;只能一对一
UDP:无连接;尽最大努力交付;面向报文;支持一对一、一对多和多对多;无拥塞控制
网络攻击
DDOS攻击
SYN攻击
Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址不存在,因此Server需要不断重发直至超时。服务器端为了维护数以万计的半连接而消耗非常多的资源,无暇理睬客户的正常请求,甚至崩溃。
防御:
- 减少SYN的超时时间
- 增加半连接的队列
CC攻击
应用层攻击。
原理:对一些资源消耗较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的(服务器查询数据库、计算等操作)
防御:
- 数据缓存,从而减轻数据库检索压力和服务器计算压力
- 页面静态化
前端攻击
CSRF攻击
跨站请求伪造(Cross Site Request Forgery)
如何攻击?
- 用户在A网站登录,并用Cookie作登录凭证
- 攻击者诱导用户访问B网站
- B网站向A网站发送请求,浏览器默认会携带A网站的Cookie
- A网站验证了请求并进行了处理
如何防范?
可以用token来防范。用户登录获得token后,将它放到local storage中,当需要向服务端请求的时候,加上token
如何生成token?一种方法是使用JWT(Json Web Token)。JWT是无状态的,它包括JWT头、有效载荷、签名三部分,认证过程为:
- 用户登录成功后,服务器通过密钥生成一个JWT对象,返回给客户端
- 客户端每次请求都要携带JWT对象
- 服务端收到请求,用密钥计算用户信息的签名
- 比较JWT携带的签名和计算出来的签名是否一致,如一致可以进行处理并返回请求结果
XSS攻击
跨站脚本攻击(Cross Site Scripting)。攻击者将脚本嵌入到正常页面中,当用户访问该页面时,恶意脚本会执行。
如何防范?
- 过滤标签,如