TCP问题
TCP为什么两次握手不行?四次呢
目的:防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
通俗讲解:客户端发送一个SYN报文给服务端,这里的SYN是一个标志位表示发起一个连接,并且这个SYN标志位置为1,还会把序列号置于TCP首部的序号字段中(我的理解是就相当于挂了一个车牌,车上路去往目的地时必须有一个车牌才能上路),服务端收到客户端的SYN报文后,会返回一个ACK报文,其中填入客户端序列号+1(用来验证表示这个回复回复对人了)然后也会随机一个Seq序列号,和SYN报文一块发送给客户端,客户端收到这次的报文后,会返回一个ACK的报文填入服务器端的序列号+1,注意这次可以携带客户端到服务器的数据
过程:
-
客户端会随机初始化序号Seq ,将次序号置于tcp首部的序号字段中,同时把SYN标志位置为1,表示SYN报文,接着把第一个SYN报文发送给服务端,表示向服务端发起请求,该报文不含应用层数据
-
服务端收到客户端的SYN报文后,首先服务端也随机初始化自己的序号Seq,将此序号填入TCP首部的序号字段中,其次包TCP首部的确认应答号ACK字段填入客户端初始化序列号Sqe+1,接着把SYN和ACK的标志位置为1,最后把报文发给客户端,该报文也不包含应用层数据,服务端处于同步收到状态
-
客户端收到服务端报文后,还要向服务端回应一个应答报文,首先该应答报文TCP首部ACK标志位置为1,其次确认应答号ACK填入服务段初始化序列号Seq+1,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据
这是3次握手连接的结果
但是如果在连接之前因为延迟等的一些的原因导致第一个连接丢了,于是客户端发送第二个请求建立了连接,但是就在退出连接的时候第一条丢了的,他找回来了,那么此时如果只有2此握手的话,就会照成新的连接建立了,但是此时客户端没有发出建立的请求,所以不会理睬服务端的确认,也不会向服务端发送任何数据,而服务端却会一直等这,这样以来就会浪费服务端的很多资源
所以在3次握手下,必须又客户端的回复才能连接,没有的话,就证明此次连接到此为止了
4次:把ACK(i+1),SYN(k)合而唯一,顾四次优化成3次、
TCP的四次挥手
客户主动发起TCP报文断开连接标志位是FIN表示释放一个连接,并且还有一个随机的32位序列号Seq,服务器接收到后会发送一个ACK报文并且为了证明正确性(证明确实是回复这个客户端的)这个ACK报文填入的是是序列号+1 ,然后还会发送一个断开连接的信号,FIN报文+ACK报文,这里的ACK报文填入的还是之前的序列号+1,为的是表明是客户端发起的断开连接,然后还会随机生成一个Seq码,之后客户端收到后会断开连接并且发送ACK报文,ACK序号为Seq+1