TCP三次握手与四次挥手

1、TCP三次握手建立连接

引用一张图
在这里插入图片描述
三次握手过程:

  • ①、客户端向服务端发送请求,将首部中的同步字段(SYN)置为1,只有SYN = 1才能表明客户端想建立连接,并随机选择一个初始序列号x,但此时SYN中并没有携带数据,但是仍然要消耗一个序列号,也就是说下次发送的时候序列号seq = x + 1,此时进入同步已发送状态。
  • ②、服务器收到客户端的请求,将SYN和ACK都置为1,SYN为1表示服务端想要与客户端建立连接,ACK表示服务端同意与客户端建立连接,确认号为x+1,表示服务端下次想要接收的报文的第一个数据字节的序号,此时服务端SYN也没有携带数据,但是也要消耗一个序列号,然后随机选择一个初始序列号y。
  • ③、客户端ACK表示同意与客户端建立连接,发送序列号为x+1,ack = y + 1,此时第三次握手可以携带数据也可以不携带数据。

TCP的SYN洪水攻击
TCP三次握手存在一些不足之处,对第一次握手和第二次握手而言,如果攻击者发送了大量的SYN包,而服务端会发送SYN+ACK确认,但攻击者不会回应服务端的ACK包,会导致服务端不知道自己是否发送成功,会重试,默认五次,如果攻击者可以切换IP或者是端口,则服务器可用TCP连接队列很快将会阻塞,系统资源和可用带宽急剧下降,无法提供正常的网络服务,从而造成拒绝服务。

对于SYN洪水攻击调整下面三个参数就可以防范大部分的攻击了

  • 增大tcp_max_syn_backlog,用来存放还没有确认ACK的客户端请求的队列,当等待的请求数大于tcp_max_syn_backlog时,后面的会被丢弃
  • 减小tcp_synack_retries,重试次数,默认是5
  • 启用tcp_syncookies,当半连接的请求数量超过了tcp_max_syn_backlog时,内核就会启用SYN cookie机制,不再把半连接请求放到队列里,而是用SYN cookie来检验

第三次握手存在的意义
总的来说是为了防止已失效的连接请求报文段有传到服务器。

当客户端发送第一个来凝结请求因为某些原因造成阻塞,这是又发送第二个连接请求,此时第二个是正常的,此时第二个请求完成了数据的传输并且已经释放。如果此时第一个请求到达了服务端服务器会认为这是一个新的连接请求,如果不存在第三次握手这时连接就建立了,但是此时客户端并不会发送什么,此时会白白浪费连接消耗资源。

2、TCP四次挥手释放连接

引用一张图片
在这里插入图片描述
四次挥手过程:

  • ①、客户端数据发送完毕,将FIN置为1,表示请求与服务器断开连接,序列号为u,u为最后发送的报文的序列号加一。
  • ②、服务器收到请求后将ACK置为1,同意与客户端释放连接,并将ack置为u + 1,seq序列号置为v,这个v同样是服务端发送的报文的最后一个序列号加一。

经过上面两次挥手客户端与服务器的连接就断开了,客户端不能再向服务器发送数据了,但服务器和客户端的连接还没释放,此时处于半连接状态

  • ③、服务端将FIN置为1,ACK置为1,ack置为u + 1,seq序列号置为w,注意此时w可能为v+1,但也可能不是v+1,因为客户端与服务器断开连接后,服务器可能又向客户端发送了一部分数据。
  • ④、客户端收到服务器的释放请求,ACK置为1,seq置为u+1,ack为w+1,至此四次挥手完成,但是此时并没有释放连接,必须再次经过2MSL后服务器才能进入CLOSED状态。

四次挥手结束后为什么还要等2MSL?
首先是为了保证客户端最后发送的那个ACK能到达服务器,如果客户端最后一次ACK发送丢失,服务端会不断发送FIN字段,客户端会在发送出ACK之后进入到TIME_WAIT状态。客户端会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么客户端会重发ACK并再次等待2MSL。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。

推荐阅读
TCP的三次握手与四次挥手理解及面试题

TCP拥塞控制
简单来说拥塞控制是为了防止发送数据太多造成网络的拥挤导致网络来不及处理。

拥塞控制采用慢启动,发送端如何知道已经丢包,有两种情况,一种是定时器超时,另一种是收到三个重复的ACK。

拥塞控制过程大致如下:

  • ①、假设门限值ssthresh为16,刚开始拥塞窗口cwnd设为1
  • ②、在到达门限值之前,拥塞窗口以指数的形式增长,即1,2,4,8等
  • ③、当cwnd大于等于门限值的时候采用拥塞避免算法,cwnd每次加一线性增长
  • ④、当拥塞窗口cwnd大于某个值,比如24,网络出现超时,说明网络阻塞了,此时将门限值设置为cwnd也就是24的一半,即12
  • ⑤、拥塞窗口再次置为1,采用慢启动的方式进行上面的步骤。

TCP流量控制
流量控制主要是为了防止接收端来不及接收发送端发送给过来的数据从而导致丢包,TCP使用的是滑动窗口来实现流量控制,使用滑动窗口可以一次性发送多条数据。

接收端一旦发现自己的缓冲区快满了就将窗口设置为一个更小的值并通知给发送端,发送端接收到这个值之后会减少窗口大小以此减小发送速度。

一旦接收端缓冲区满了,滑动窗口会被置为0,发送端不会再发送数据,但是发送端会定时发送一个窗口探测数据段,使接收端把窗口大小告诉发送端

总结:TCP的流量控制和拥塞控制都是为了数据能够到达对方且到达的数据不重复、不乱序、到达的数据不失真。

另外超时重传和快速重传也是保证数据正确到达并且不重复不乱序的关键:
超时重传:当超时时间到达时,发送方还未收到对端的ACK确认,就重传该数据包
快速重传:当后面的序号先到达,如接收方接收到了1、 3、 4,而2没有收到,就会立即向发送方重复发送三次ACK=2的确认请求重传。如果发送方连续收到3个相同序号的ACK,就重传该数据包。而不用等待超时

推荐阅读:
TCP之 流量控制(滑动窗口)和 拥塞控制(拥塞控制的工作过程)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值