4116 字
21 分钟
三次握手复习

1. 三次握手的实质#

1 1 1 1 1 在建立一个TCP连接时,三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤

2. 作用2#

1 1 1 1 1

  • 为了确认双方的接收能力和发送能力是否正常
  • 指定自己的初始化序列号为后面的稳定性传送做准备

3. 实际做了什么3#

1 1 1 1 1

  • 连接服务器的指定端口,建立TCP连接
  • 同步连接双方的序列号和确认号
  • 交换TCP窗口大小信息

4. 开始状态#

1 1 1 1 1 客户端:Closed 服务器:Listen

5. 三次握手过程,给谁发,发什么,啥状态,注意什么#

1 1 1 1 1

  • 第一次握手:

    • 客户端给服务器发送一个SYN报文
    • 指明客户端的初始化序列号ISN,首部同步位SYN=1,初始序号seq=x
    • 客户端处于SYN_SENT状态
    • SYN=1的报文不能携带数据,但要消耗一个序号
  • 第二次握手:

    • 服务器收到客户端发的SYN报文后,发一个SYN报文作为应答
    • 指定自己的初始化序列号ISN,把客户端的ISN+1作为ACK的值,表示自己收到了客户端的SYN,确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y
    • 服务器处于SYN_RCVE状态
  • 第三次握手

    • 客户端收到SYN报文后,发送一个ACK报文作为应答
    • 把服务器的ISN+1作为ACK的值,表示已经收到了服务器的SYN报文,在服务器收到ACK的报文后,双方建立起连接,确认报文段ACK=1,确认号ack=y+1(初始为seq=x,所以第二个报文段要+1)
    • 发送ACK报文时客户端处于ESTABLISHED状态,服务器收到ACK报文后处于ESTABLISHED状态
    • ACK报文段可以携带数据,不携带数据不消耗序列号

6. 为什么不能两次握手#

为了实现(),三次握手过程实质 如果只是两次握手() 1 1 1 1 1

  • 为了实现可靠数据传输,TCP协议的通信双方都必须维护一个序列号,来标识发送出去的数据包中,哪些是已经被对方接收到的。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤
  • 如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认

7. 为什么需要三次握手而非两次#

为了实现(?) 序号从(?)开始 TCP是(哪种?)协议,通信双方(),因此() 以发送10Byte数据包同时送上序号500为例 1 1 1 1 1

  • 为了实现可靠传输,发送方和接收方始终要同步序号
  • 序号并不是从0开始,而是由发送方随机选择的初始序列号(ISN:Initial Sequence Number)开始
  • TCP是一个双向通信协议,通信双方都有能力发送信息并接收响应,因此,通信双方都需要随机产生一个初始的序列号,并把这个起始值告诉对方
  • 例如发送方发送一个大小为10byte的数据包,同时送上一个序号500,那么接收方收到这个数据包后,回复确认号510(500+10)告诉发送方“我已经收到了你的数据包,你可以发送下一个数据包,序号从510开始”

8. TCP数据包结构#

1 1 1 1 1

9. 区分ACK标志位与确认号#

二者大小区别 在TCP首部中的位置 ACK报文中ACK=x+1的含义 1 1 1 1 1

  • ACK标志位(1bit)
  • 确认号(acknowledgement number)
  • 通过ACK=x+1的含义来区分:
    • TCP包中ACK标志位置为1
    • TCP包的确认号值赋值为x+1

10. 区分SYN标志位与序号#

二者大小区别 在TCP首部中的位置 1 1 1 1 1

  • SYN标志位(1bit)
  • 序号(sequence number)也可以叫序列号

11. 三次握手的序号#

确认号如何理解 TCP对SYN报文的规定? TCP对ACK报文的规定? 1 1 1 1 1

  • 确认号(acknowledgement number)是向对方表示我期待收到的下一个序号,例如向对方回复ack=31,代表我已经收到了序号截止到30的数据,期待下一个数据起点是31
  • TCP规定:SYN报文段(SYN=1的报文段)不能携带数据,但要消耗一个序号
    • 三次握手的第一次和第二次握手就是这样,要消耗一个序号
    • 第一次握手SYN位置为1
    • 第二次握手SYN位和ACK位都置为1
  • TCP还规定:ACK报文段可以携带数据,但如果不携带数据则不消耗序号
    • 第三次握手时ACK置为1,确认号ack=y+1,自己的序号seq=x+1,下一个数据报文段的序号仍是seq=x+1

12. 三次握手示意图#

1 1 1 1 1

13. 半连接队列#

半连接队列的概念 全连接队列 队列满了会有什么现象 SYN-ACK重传 重传次数超过系统最大重传次数会怎样 重传时间 1 1 1 1 1 第一次握手,客户端向服务器发送一个SYN报文,服务器收到这个报文后,就会处于SYN_RCVD状态,此时双方没有完全建立连接,服务器把这种状态下的请求连接放在一个队列里,这个队列就是半连接队列

全连接队列:已经完成三次握手,建立起的连接就会放在全连接队列中

队列满了可能就会出现丢包现象

==SYN-ACK重传次数== 服务器发送完SYN-ACK包,如果未收到客户端确认包,服务器进行首次重传,等待一段时间还没有收到客户端确认包,进行二次重传。 如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除 每次重传时间不一定相同,一般是指数增长,例如间隔为1、2、4、8等

14. ISN是固定的吗#

什么时候有初始化序列号 初始化序列号可以看作什么 选择序号的目的 为什么ISN不是固定的 1 1 1 1 1 当一端为建立连接 而发送SYN报文时,它为连接选择一个 初始化序列号。这个初始化序列号(ISN:Initial Sequence Number)随时间变化,每个连接 都有不同的初始化序列号。

初始化序列号可以看作是一个32比特计数器,每4ms加1。

这样选择序号的目的是 防止在网络中被延迟的分组 在以后又被传送,导致 某个连接的一方对它做出错误的解释。

三次握手中一个重要的功能是 客户端和服务器交换初始化序列号,让对方知道 接下来接收数据的时候 如何按序号组装数据,而且 如果ISN是确定的,攻击者很容易猜出后续的确认号

15. 三次握手的过程中可以携带数据吗#

TCP规定:SYN报文,所以() TCP还规定:ACK报文,所以() 从攻击服务器的角度想 1 1 1 1 1 TCP规定:SYN报文段(SYN=1的报文段)不能携带数据,但要消耗一个序号 三次握手的第一次和第二次握手就是这样,要消耗一个序号 第一次握手SYN位 置为1 第二次握手SYN位和ACK位都 置为1 所以第一次和第二次握手都消耗一个序号

TCP还规定:ACK报文段可以携带数据,但如果不携带数据 则不消耗序号 第三次握手时ACK置为1,确认号ack=y+1,自己的序号seq=x+1,如果这个ACK报文没有携带数据,那么下一个数据报文段的序号仍是seq=x+1

从攻击服务器的角度想,如果第一次握手可以携带数据,那只要在第一次握手的报文中放大量数据,服务器就要用更多的时间和内存去处理这些数据,会增加服务器被攻击的风险。而第三次握手时,客户端已经处于ESTABLISHED状态,也确认了服务器的接收和发送能力正常,就可以携带数据了

第一次和第二次握手不能携带数据,第三次握手的时候可以携带数据

16. SYN攻击是什么#

为什么服务器容易受到攻击 解释一下SYN攻击 检测SYN攻击 常见的防御SYN攻击方法 1 1 1 1 1 服务器端的资源分配 是在二次握手时分配的,而客户端的资源 是在完成三次握手时分配的,所以服务器容易受到 SYN泛洪攻击。

SYN攻击就是 客户端在短时间内伪造大量不存在的IP地址,并向服务器不断地发送SYN包,服务器则回复确认包并等待客户端确认,由于源地址不存在,因此服务器需要不断重发直到超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因队列满而被丢弃,引起网络拥塞 甚至系统瘫痪,SYN攻击是一种典型的DoS/DDoS攻击

检测SYN攻击非常方便,当在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本可以确定这是一次SYN攻击,在Linux/Unix上可以使用系统自带的netstats命令来检测SYN攻击

netstat -n -p TCP | grep SYN_RECV

常见的防御SYN攻击方法如下: 缩短超时(SYN Timeout)时间 增加最大半连接数 过滤网关防护 SYN cookies技术

17. 四次挥手#

挥手要四次是由于什么造成的 什么是半关闭 四次挥手过程,发什么,啥状态 1 1 1 1 1 终止一个连接需要经过四次挥手,这是由TCP的半关闭(half-close)造成的。

什么是半关闭 半关闭:TCP提供了 连接的一端 在结束它的发送后 还能接收来自另一端数据的能力

四次挥手过程 发什么 啥状态 第一次挥手:客户端发送一个FIN报文,FIN置为1,序号seq=u,并停止发送数据,主动关闭TCP连接; 进入FIN_WAIT1(终止等待1)状态,等待服务器确认

第二次挥手:服务器收到FIN报文后,返回ACK报文,ACK标志位置为1,确认号ack=u+1(即客户端发送的序号值+1,表明已经收到客户端的报文了),序号seq=v; 服务器进入CLOSE_WAIT(关闭等待)状态; 此时TCP处于半关闭状态,客户端到服务器的连接释放,客户端收到服务器的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务器发出的连接释放报文

第三次挥手:如果服务器也想断开连接了,和客户端第一次挥手一样,发送一个FIN报文(FIN=1,序号seq=w,ACK=1,确认号ack=u+1); 服务器进入LAST_ACK(最后确认)状态,等待客户端确认

第四次挥手:客户端收到FIN报文后,一样发送一个ACK报文(ACK=1,ack=w+1,seq=u+1)作为应答; 客户端进入TIME_WAIT(时间等待)状态,此时TCP未释放掉,需要经过2MSL的时间后才进入CLOSED状态

18. 在socket编程中,使用什么方法触发三次握手,使用什么方法触发四次挥手#

1 1 1 1 1 客户端执行connect()时,触发三次握手 任何一方执行close()操作,触发四次挥手

19. 挥手为什么需要四次#

三次握手的第二次握手与四次挥手的二三次挥手 1 1 1 1 1 在三次握手的第二次握手过程中,可以直接发送SYN+ACK报文,其中ACK报文是用来应答的,SYN报文是用来同步 的。

但在关闭连接时,服务器收到FIN报文时,可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端:“你发的FIN报文我收到了”,只有等到我服务器的所有报文都发送完了,才能向你客户端发送FIN报文,因此不能一起发送,故需要四次挥手

20. 2MSL等待状态是什么#

哪个状态 TCP必须选择一个(),这个东西的具体细节 对于一个MSL值的处理原则 2MSL等待的另一个作用 1 1 1 1 1 TIME_WAIT状态也称为2MSL等待状态

每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间,这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段

对一个具体实现所给定的MSL值,处理原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL,这样可以让TCP再次发送最后的ACK防止这个ACK丢失(另一端超时并重发最后的FIN)

这种2MSL等待的另一个作用是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户端的IP地址和端口号,服务器的IP地址和端口号)不能再被使用,这个连接 只能在2MSL结束之后 才能再次被使用

21. 四次挥手释放连接时,等待2MSL的意义#

MSL的意义 等待2MSL的目的,为什么,假如客户端不等待2MSL 1 1 1 1 1 MSL是Maximum Segment Lifetime的英文缩写,意为报文段最大生存时间,它是任何报文段在网络上存在的最长时间,超过这个时间报文将被丢弃

为了保证 客户端发送的最后一个ACK报文段 能够到达服务器 因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器 收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器,最后客户端和服务器都能正常关闭。 假如客户端不等待2MSL,而是在发送完ACK后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态

22. TIME_WAIT状态等待2MSL的两个理由,该理由的具体内容#

1 1 1 1 1 ⚪ 保证客户端最后一次发送的ACK报文段能够到达服务器

这个ACK报文段有可能丢失,使得处于LAST-ACK状态的服务器收不到 对已发送的FIN+ACK报文的确认,服务器超时重传FIN+ACK报文段,而客户端能在2MSL时间内 收到这个重传的FIN+ACK报文,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务器都进入CLOSED状态,如果客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文后立即释放连接,就收不到服务器重传的FIN+ACK报文,也就不会再发送一次确认报文,最后导致服务器无法正常进入CLOSED状态

⚪ 防止==已经失效的连接请求报文段==出现在本连接中

客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内 所产生的所有报文段都从网络中消失,使下一个新的连接中 不会出现这种旧的连接请求报文段

三次握手复习
https://fuwari.cbba.top/posts/三次握手复习/
作者
Chen_Feng
发布于
2023-08-15
许可协议
CC BY-NC-SA 4.0