美文网首页
TCP连接管理

TCP连接管理

作者: 李die喋 | 来源:发表于2019-08-12 17:29 被阅读0次

TCP的特点及目的

TCP是一种面向有连接的协议,只有在确认通信对端存在时才会发送数据。它充分的实现了数据传输时各种控制功能,TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制实现可靠性传输,是可靠传输

TCP可靠传输的技术

  1. 利用窗口滑动技术提高速度

发送端的窗口大小由接收端的窗口大小决定。发送端窗口接收到数据向发送端发送确认数据包,窗口移动,清理缓冲区。若发生数据丢失,会重发请求数据包并在可选字段设置SACK(选择性确认),注明缺失的那一部分,目的就是不用将丢失后的所有部分重新发送。

  1. 流量控制

发送端主机根据接收端主机的窗口大小通知进行流量控制

  1. 拥塞控制

最初将发送端的窗口设置为1。每收到一个确认应答,窗口的值会增加1个段。

  1. 连接管理

三次握手和四次挥手

三次握手和四次挥手是面试中的重要考点,这里会对这两个过程进行详细的分析

三次握手

三次握手的过程

刚开始客户端处于Closed的状态,服务端处于Listen状态。

  • 第一次握手:客户端给服务器发送一个SYN报文,并指明客户端的初始化序列号seq = x。此时客户端处于SYN_Send状态。
  • 第二次握手:服务器收到客户端的SYN报后,会以自己的SYN报作为应答,并且指定自己的初始化序列号seq = y。同时会把客户端的序列号值+1作为确认号ack的值,即ack = x+1,表示自己已经收到了客户端的SYN,此时服务器处于SYN_REVD的状态。
  • 第三次握手:客户端收到SYN报文后,会发送一个ACK报文,把服务器的序列号值+1作为确认号的值,即ack = y+1,表示已经收到了SYN报文。并以x+1作为自己的序列号值,此时客户端处于established状态。
  • 服务器收到ACK报文后,也处于established状态,此时,双方已建立起了联系。

三次握手的作用

  • 确认双方的接收能力、发送能力是否正常。
  • 指定自己的初始化序列号,为后面的可靠传送做准备。
  • 如果是HTTPS协议的话,三次握手这个过程,还会进行数字证书的验证以及加密秘钥的生成。

为什么要采用三次握手,两次不行么?

有一种情况是A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放后的某个时间才能到达B。本来这是个早已失效的报文段,但B收到此失效的连接请求报文段后,就误以为A又重新发出了一次新的连接请求。于是又向A发送确认报文段,同意建立连接。若不采用三次握手,只要B发出确认报文,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。

三次握手图解

image

四次挥手

四次挥手的过程描述

刚开始双方都处于established状态,如果客户端先发起关闭请求,则:

  • 第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号seq = x。此时客户端处于FIN_WAIT1状态。
  • 第二次挥手:服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值+1作为ACK报文的应答号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态。
  • 客户端接收到服务端第二次挥手发送的ACK报文后,处于FIN_WAIT2状态。
  • 第三次挥手:如果服务器也想断开连接了,和客户端的第一次挥手一样,给客户端发送FIN报文,且指定一个序列号。此时服务端处于LAST_ACK状态。
  • 第四次挥手:客户端收到FIN之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为自己ACK报文的应答值,此时客户端处于TIME_WAIT状态。
  • 服务器收到ACK报文后,就处于关闭连接了,处于CLOSED状态。

四次挥手图解

image

特别要注意的是TIME_WAIT状态,在服务器发送想要关闭连接的FIN-ACK报文后,客户端不会立即关闭,而是等一段时间再关闭。原因就是要确保服务器接收到ACK报文。如果服务器没有接受到,服务端会重新给客户端发送FIN-ACK报文,客户端再次接收到就知道之前的ACK报文丢失了,会再次发送ACK报文。

一些面试可能会问到的问题

  1. ISN是固定的么?
    ISN可以理解为序列号。ISN如果是固定的,攻击者很容易猜出后序的确认号,因此ISN是动态生成的。

  2. 什么是半连接队列?
    我理解的这个问题的大概意思就是在两个端进行连接时,请求的包会放在一个队列中,客户端发送的第一个请求和服务端连接的SYN包放入队列中,此时服务端还未做出应答的情况叫半连接队列。三次握手全部完成后的叫全连接队列。

  3. 关于SYN-ACK重传次数的问题

  • 服务器发送完SYN-ACK包,如果未收到客户端确认包,服务器进行首次重传,等待一段时间仍未收到客户端确认包,进行第二次重传。
  • 如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。

每次重传的时间不一定相同,一般会是指数增长,例如时间间隔为1s,2s,4s,8s......

  1. 三次握手过程中可以携带数据么?
    前两次不可以,第三次可以。如果前两次收发成功,就意味着客户端与服务端之间可以建立连接,第三次就可以发送数据了。

我在网上看到的解释是若第一次携带大量数据的话,会让服务器更容易受到攻击。因为攻击者不会管服务器是否收发数据正常,受到攻击的服务端接收不到SYN报文,客户端会重复发送,会让服务器花费更多的时间、内存空间来接收。

三握四挥大概就是目前这些,主要是先将内容搞清楚,自己能口述下来,后面有新的问题会继续补充。

相关文章

网友评论

      本文标题:TCP连接管理

      本文链接:https://www.haomeiwen.com/subject/mytpjctx.html