计算机网络:TCP 三次握手
三次握手简单示意图
TCP 三次握手的简单示意图如下:
客户端 -> 服务器: SYN(seq=x)
服务器 -> 客户端: SYN(seq=y, ack=x+1)
客户端 -> 服务器: ACK(seq=x+1, ack=y+1)
三次握手详细分析

-
客户端向服务器发送 SYN 段,表示请求建立TCP连接。在这个段中,客户端随机生成一个初始序列号 seq,用于标识数据包的顺序和可靠性。
-
服务器收到客户端的 SYN 段后,回复 SYN+ACK 段,表示确认客户端的请求,并请求建立连接。在这个段中,服务器也随机生成一个初始序列号 seq,同时将确认号设为客户端的序列号加1。
-
客户端收到服务器的 SYN+ACK 段后,回复 ACK 段,表示确认服务器的请求,并告知服务器自己已经准备好发送数据。在这个段中,客户端的序列号被设置为服务器的确认号,而服务器的序列号则为客户端的确认号加1。
一些思考
为什么是三次握手?
三次握手可以确保数据传输的可靠性,因为它可以建立一个可靠的连接,防止数据包的丢失和重复。如果只有两次握手,那么就会出现数据包丢失或重复的情况,从而导致数据传输的不可靠。
SYN 攻击

什么是 SYN 攻击?
SYN 攻击是一种常见的网络攻击方式,攻击者通过发送大量的 SYN 段来占用服务器的资源,从而导致服务器无法响应正常的客户端请求。SYN 攻击还可以用来欺骗服务器,从而进行其他恶意行为。
如何防止 SYN 攻击?

为了防止 SYN 攻击,可以采取一些常见的防御措施,例如:
-
增加服务器的并发连接数限制,可以限制每个 IP 地址的连接数,从而减轻服务器的压力。
-
使用 SYN Cookie 技术,这是一种在服务器端动态生成随机数的技术,可以防止 SYN 攻击。
-
使用防火墙和入侵检测系统等安全设备,可以及时发现和阻止 SYN 攻击。
数据包丢失了该怎么办?
如果数据包丢失了,可以采取一些常见的处理方法,例如:
-
重传数据包,可以通过重新发送数据包来恢复丢失的数据。
-
超时重传,如果一个数据包没有得到确认,那么就可以通过超时重传来重新发送这个数据包。
-
使用快速重传,如果接收方连续收到了相同的数据包,那么就可以马上发送一个 ACK 段来确认数据包的到达。
初始序列号为什么随机产生?
初始序列号的随机产生可以防止攻击者伪造数据包,从而影响数据传输的可靠性。如果序列号是固定的,那么攻击者就可以使用这个序列号来欺骗服务器,从而进行攻击。
为什么 SYN 段不携带数据却要消耗一个序列号呢?
SYN 段不携带数据是因为它只是用来建立连接的,不需要传输任何数据。但是,为了保证数据传输的可靠性,每个数据包都需要携带序列号和确认号,用于标识数据包的顺序和可靠性。
每次握手可以确定哪些东西?
每次握手可以确定以下内容:
-
序列号和确认号,用于标识数据包的顺序和可靠性。
-
双方的初始序列号,用于防止攻击者伪造数据包。
-
数据传输的方向,即数据是从客户端传输到服务器还是从服务器传输到客户端。
一个已经建立的 TCP 连接中,客户端中途宕机了,客户端恢复后,向服务端发送 SYN 包重新建立连接,此时服务端会怎么处理?

如果客户端中途宕机了,那么服务器端会认为连接已经断开,从而释放相关资源。当客户端恢复后,向服务器发送 SYN 包重新建立连接时,服务器会认为这是一个新的连接请求,从而重新进行三次握手建立连接。
如何手动关闭一个 TCP 连接?
TCP 连接的关闭分为两个阶段:主动关闭和被动关闭。
-
主动关闭阶段:当客户端或服务器想要关闭连接时,会发送 FIN 段来请求关闭连接。在这个阶段,双方都可以发送 FIN 段,从而结束连接。
-
被动关闭阶段:当一方收到另一方发送的 FIN 段时,会发送 ACK 段来确认收到关闭请求。在这个阶段,只有被动方可以发送 ACK 段,主动方不能再发送数据。当被动方发送完 ACK 段后,连接就会被关闭。
文章评论