TCP三次握手和四次挥手理解

  • 在了解三次握手和四次挥手之前,先知道TCP报文内部包含了哪些东西。

一、TCP报文格式

TCP三次握手和四次挥手理解_第1张图片

  • TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

  • TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要保存对方信息(例如:IP,Port…)

  • 报文主要段的意思

序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号

确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。

ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息

SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接

FIN:结束标志,用于释放连接,为1表示关闭本方数据流

二、三次握手

2.1 三次握手过程

  • 建立TCP连接时,需要客户端和服务器共发送3个包。
第一次:客户端发送初始序号x和syn=1请求标志

第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1

第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1

TCP三次握手和四次挥手理解_第2张图片

2.2 三次握手过程分析:

  • 第一次:客户端发送请求到服务器,服务器知道客户端发送,自己接收正常。
    SYN=1,seq=x
  • 第二次:服务器发给客户端,客户端知道自己发送、接收正常,服务器接收、发送正常。
    ACK=1,ack=x+1,SYN=1,seq=y
  • 第三次:客户端发给服务器,服务器知道客户端发送,接收正常,自己接收,发送也正常。
    seq=x+1,ACK=1,ack=y+1

结论:从分析过程可以看出,握手两次达不到能让双方能正常的进行数据传输。

三、四次挥手

3.1 四次挥手过程

客户端请求断开连接

  • 第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
  • 第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
  • 第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
  • 第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。

TCP三次握手和四次挥手理解_第3张图片

3.2 四次挥手过程分析

第一次:客户端请求断开FIN,seq=u

第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v

第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1

第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1

四、其他问题

4.1 为什么三次握手和四次挥手?

  • 三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里
  • 四次挥手时,当收到对方(客户端)的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方(服务端)是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。

4.2 为什么三次握手是三次?

  • 也可以理解为,为什么TCP客户端最后还要发送一次确认呢?
1) 主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
2) 如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出
确认。由于服务器收不到确认,就知道客户端并没有请求连接。

4.3 为什么四次挥手是四次?

  • 因为挥手过程中有一个半关闭状态
	在半关闭状态下,客户端没有请求/数据需要向服务端传输(即客户端不再发送数据给服务端,但能接收数据),但是服务端需要持续
的连接客户端,下载数据。所以,在客户端申请了断开连接的请求后,会等待服务端确认并且提出断开请求后,才会断联。
  • 所以,在服务端下载完数据前,不会发送断开请求,这是挥手需要四次的原因。

4.4 为什么客户端最后还要等待2MSL?

  • 客户端需要保证最后一次发送的ACK报文到服务器,如果服务器未收到,可以请求客户端重发,这样客户端还有时间再发,重启2MSL计时。

4.5 如果已经建立了连接,但是客户端突然出现故障了怎么办?

  • TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。
  • 服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

你可能感兴趣的:(网络,网络协议)