TCP
三次握手
SYN:建立连接标志
ACK:确认标志
FIN:结束标志
seq:序列号
ack:顺序号 ack = seq+1
过程
TCP的三次握手是指客户端向服务端发送建立连接请求,服务端收到请求后向客户端发送连接确认响应,之后客户端再向服务端发送确认响应。保证了源主机发送的消息能够到达目的主机,也保证
作用
1.防止了历史连接被初始化(通俗已过期的连接请求又被发送),避免资源浪费。
2.让客户端和服务端双方均确认自己和对方发送和接受能力正常。
第一次握手:服务端确认自己的接受能力和对方(客户端)的发送能力;
第二次握手:客户端确认自己的发送能力和接受能力和对方(服务端)接受能力和发送能力;
第三次握手:服务端确认自己的发送能力和接受能力和对方(客户端)接受能力和发送能力;
3.告知对方自己的初始序号值,并确认收到对方的初始序号值。
TCP报文段中的seq、ack分别标记发送的数据的序列号和确认号,能让自己知道并确认对方的序列号和确认号。
二次握手会出现什么问题
两次握手相比于三次握手缺失了客户端向服务端发送确认连接确认,使得服务端无法确认客户端的发送能力和自己的接受能力。若客户端向服务端发送建立连接的请求(SYN)出现超时重传,某次重传后到达了服务端之后(已过期的连接请求又传送到服务器),存在消息连接错误的问题和资源浪费,也无法确认对方和自己的接受和发送能力是否正常,无法告知对方自己的序号值,不能确认对方的序号值。
SYN泛洪攻击
导语
三次握手过程中,前两次握手完成后,此时服务器处于等待第三次握手状态,如果接收到客户端发送的ACK,则TCP连接成功,如果没接收到,服务端会不断请求重发SYN/ACK,直至成功。
定义及过程及危害
SYN泛洪攻击是DOS攻击(拒绝服务攻击的一种,攻击网络协议缺陷或耗尽被攻击对象的资源)的一种,利于TCP协议的缺陷(三次握手实现完整功能正常的数据传输),发送大量半连接请求(SYN、SYN/ACk),耗费CPU和内存资源。再详细一点,SYN攻击者在短时间伪造大量不存在的IP地址,向服务端不断发送【SYN】包,服务端回复【SYN/ACK】包,并等待客户端确认,由于IP源地址不存在,服务端一直未收到【ACK】,一直重发【SYN/ACK】,直至超时,导致系统运行缓慢、网络堵塞、耗费CPU资源。
解决
防火墙、路由器等过滤网关防护
加固TCP协议,缩短超时时间,增加最大半连接数
SYN cookies技术:(根据发送【SYN】计算cookies的值,【SYN/ACK】再次计算cookies的值,看是否相等,相等则发送【ACK】给服务器)
三次握手一定安全吗?
三次握手不一定安全,容易出现SYN泛洪攻击等。
可以怎么解决?
防火墙、SYN Cookies(见上方)、等待队列、加密算法等技术解决。
详细介绍等待队列与加密算法:
引入等待队列
将发送的SYN请求暂存至等待队列,服务端不立即处理这些请求,而是定期处理并分配资源,可防止SYN泛洪攻击,而攻击者要把等待队列填满,反而耗费攻击者的资源,但是为等待队列开辟内存同样耗费CPU资源,存在一定缺点。
引入加密算法
对称加密:加密和解密用的同一套算法,明文用加密算法加密后得到密文,密文用加密算法的逆过程解密得到明文。
非对称加密:加密和解密用不同的算法,明文用加密算法加密后得到密文,密文用加密算法的逆过程解密无法得到明文。
加密算法保证数据的加密性、完整性、身份验证。
四次挥手
介绍
第一次挥手客户端向服务端发送【FIN】,仅仅表示客户端自己不再发送数据,但是任然可以接受数据
第二次挥手服务端向客户端发送【ACK】,服务端确认客户端不再接受数据,但是服务端可能还有数据发送
第三次挥手服务端向客户端发送【FIN】,表示服务端自己不再发送数据
第四次挥手客户端向服务端发送【ACK】,表示客户端确认服务端不再接受数据
close-wait和time-wait
close-wait:服务器端向客户端向发送【ACK】消息后,客户端还未完全停止接受数据,此时服务端等待客户端关闭接受数据,这就是close-wait状态,长时间处于close-wait状态会造成资源浪费。
time-wait:客户端向服务端发送消息【ACK】后,为了确保服务端收到【ACK】报文,客户端处于time-wait,为了使本次会话结束防止对其他会话的干扰(防止已失效的报文段对后续连接请求造成的影响,确保TCP连接的可靠性),等待较长的一段时间,消耗较多的CPU资源。
滑动窗口
当数据包较大时,会将数据包分多个数据包进行发送,TCP协议中需要将数据包确认后才可以发送下一个数据包,而等待确认应答会浪费时间,由此引入滑动窗口解决以上问题。滑动窗口中的窗口指不需要确认而能发送的数据包数量的最大值。滑动窗口由已发送未确认和等待发送的数据包组成,已发送的分组不断被确认的同时等待发送的数据包也会不断被发送,保证数据包的顺序性,保证传输的可靠性,也减少了时间浪费,提高效率。滑动窗口大小取决于拥塞控制窗口和流量控制窗口的最小值。
流量控制
指目的主机告诉源主机自己所能接受的缓冲区的大小,让目的主机知晓源主机的接受能力,从而避免数据包丢失(目的主机未接收收到源主机发送的数据包)和数据包丢失引发的重传机制,实现可靠传输。流量控制窗口与TCP协议报头中窗口大小有关。
拥塞控制
解决传输的数据包足够多时网络会出现拥塞的情况,提高可靠性,提高性能。
实现拥塞控制的方法
慢开始:当网络中出现大量的数据包时,达到网络负载,从小到大的增加拥塞窗口的值,使得在达到拥塞之前及时降低拥塞窗口的值,指数式增长。
拥塞避免(线性):拥塞窗口缓慢增长,提前设置慢开始门限值,当慢开始的拥塞窗口值达到门限值,就会执行拥塞避免算法(每次cwd+1(发送数据包数量的最大值)值),以此降低拥塞窗口值的增长速度,如果超时,门限值改为原来一半,指向快恢复算法。
快重传:发送方发送数据包后,接受方收到后给发送方发送的确认包,若确认包是三个且重复的,接收方会重新发送未收到确认包(已经丢失)的数据包。
快恢复:当发送方连续收到三个重复的确认包,门限值减为原来一半,以门限值作为初始值,执行拥塞避免算法的线性加法增长算法,每次增长一个cwd。
超时重传
源端向目的端发送请求信息,一定时间后,未得到目的端的回复(已丢包),源端会再次向目的端发送
TCP如何实现可靠传输:检验和、序列号/确认号、流量控制、拥塞控制、超时重传、滑动窗口
NAT
引入NAT网关主要为了解决私有网络中的设备如何共享公有网络去访问外部资源。主要功能是修改数据包的源或目标IP地址(以及可能的其他字段、端口号),允许私有网络上的设备访问公共网络,同时隐藏这些设备的真实IP。