工作生活

tcp/ip网络笔记

2019-06-30  本文已影响0人  UPDOWN_GG

tcp三次握手和四次挥手

为什么需要三次握手

TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双工。 单工为只能A给B发,B不能给A发; 或者是只能B给A发,不能A给B发。

假如只有两次握手,B无法确定B的信息A是否能听到。

假如四次握手,那就造成浪费了,因为第二个握手报文中syn和ack可以同时设置,三次握手后就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。

为什么需要四次挥手

TCP是全双工的,通信的双方都可以独立关闭自己的通信通道

TIME_WAIT状态以及2msl

 1 可靠实现tcp全双工连接的终止。如果四次握手中最后一个ack丢失(A发给B),对方将重发最终的fin,如果A端不维持TIME_WAIT状态,A端将响应RST,B端会抛出异常

2 保证旧连接的分组在网络中消逝。网络情况不好时,如果A端无TIME_WAIT状态,A端跟B端又新建一个新的tcp连接(采用相同的端口号),这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接。TIME_WAIT状态持续2MSL,足以让某个方向的分组最多存活msl秒被丢弃。

服务器大量time_wait的原因、影响、解决方法

原因:在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态

影响:持续的的高并发短连接,会使服务器因端口资源不足而拒绝为一部分客户服务

解决方法:1 可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。 2 由于time_wait状态是在主动关闭的一方出现的,所以在设计协议逻辑的时候,尽量由客户端主动关闭,避免服务端出现time_wait

第三次握手失败了怎么办

当client与server的第三次握手失败了之后,即client发送至server的确认建立连接报文段未能到达server,server在等待client回复ACK的过程中超时了,那么server会向client发送一个RTS报文段并进入关闭状态,即:并不等待client第三次握手的ACK包重传,直接关闭连接请求,这主要是为了防止泛洪攻击,即坏人伪造许多IP向server发送连接请求,从而将server的未连接队列塞满,浪费server的资源

三次握手有什么缺陷会被黑客利用,如何防范

黑客仿造IP大量的向server发送TCP连接请求报文包,从而将server的半连接队列(即server收到连接请求SYN之后将client加入半连接队列中)占满,从而使得server拒绝其他正常的连接请求。即拒绝服务攻击

防范方法:

1 缩短服务器接收客户端SYN报文之后的等待连接时间,即SYN timeout时间,,但是过低的SYN timeout可能会影响正常的TCP连接的建立,一旦网络不通畅便可能导致client连接请求失败

2 SYN cookie:当server接收到client的SYN之后,不立即分配资源,而是根据client发送过来的SYN包计算出一个cookie值,这个cookie值用来存储server返回给client的SYN+ACK数据包中的初始序列号,当client返回第三次握手的ACK包之后进行校验,如果校验成功则server分配资源,建立连接

3 SYN proxy代理,作为server与client连接的代理,代替server与client建立三次握手的连接,同时SYN proxy与client建立好了三次握手连接之后,确保是正常的TCP连接,而不是TCP泛洪攻击,那么SYN proxy就与server建立三次握手连接

tcp的拥塞控制

TCP通过一个定时器(timer)采样了RTT并计算RTO,但是,如果网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,然而重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这就导致了恶性循环,最终形成“网络风暴”。为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(Congestion Window),在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限

拥塞控制与流量控制的区别

拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。 流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收

慢开始算法

刚刚加入网络的连接,一点一点地提速,不要一上来就把路占满。主机刚开始发送报文段时设置cwnd=1,每收到一个对新的报文段的确认后,将cwn加1。慢开始算法每经过一个传输轮次,拥塞窗口cwnd就加倍,一个传输轮次就是把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认,传输轮次所经历的时间就是往返时间RTT

拥塞避免算法

拥塞避免算法的思路是让拥塞窗口cwnd缓慢地增大,即每经过一个往返rtt时间吧发送方的拥塞窗口cwnd加1,而不是慢开始算法的加倍,使拥塞窗口cwn按线性规律缓慢增长

当cwnd < ssthresh时,使用慢开始算法

当cwnd > ssthresh时,使用拥塞避免算法

当cwnd = ssthresh时,既可使用慢开始,也可使用拥塞避免

网络拥塞时

无论在慢开始还是拥塞避免阶段,只要发送方判断网络出现拥塞,就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半,把拥塞窗口cwnd设置为1,执行慢开始算法。这样做的目的是为了迅速减少主机发送到网络中的分组数。

快重传

如果发送方设置的超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口 cwnd 减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的情况。使用快重传时,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段,

快恢复

与快重传配合使用,当发送端收到连续三个重复的确认时,发送方认为网络很可能没有发生拥塞(没有快重传时,只要发生重传,就认为网络发生拥塞,需要执行慢开始),把慢开始的门限ssthresh减半,但不执行慢开始算法,cwnd现在不设置为1,设置为ssthresh减半后的数值,然后开始执行拥塞避免算法

TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免 - losbyday - 博客园

tcp的流量控制

流量控制跟拥塞控制相比就简单很多了,tcp利用滑动窗口实现流量控制

流量控制就是让发送方的发送速率不用太快,要让接收方来得及接收,通过接收方通知的窗口大小来实现流量控制

上一篇下一篇

猜你喜欢

热点阅读