[计算机网络基础] TCP协议 & 三次握手/四次挥手 及原因
前言
在上一章节. 我们解释了OSI 7层模型
. 及数据的处理流程. 今天我们来看TCP协议
及其特性约定三次握手和四次挥手
.
在本章中, 我们会介绍三次握手
和四次挥手
分别是什么. 并最后总结, 为什么需要3握4挥的这样的一个设计模式.
正文
三次握手
计算机网络的图是这样. 但是这个图理解起来不是很好.
推荐使用上图进行理解:
首先我们要知道的是TCP协议是一个双向通信的可靠协议. 这里我们把通信的双方认为是A端和B端.
- 第一次握手(A->B): A端发送协同请求
SYNbit=1 (A)
, 并且带上请求开始队列Seq=x (A)
.(SYNBit=1 Seq=x) (A)
- 第二次握手(B->A):
- B端已经收到A端的
建立链接请求
. 所以要进行响应.(ACKBit=1 ACKnum=x+1 (响应A))
- B端也要向A端发送消息链接通道. 所以B端可要发送自己的
SYNBit与ACKnum
. 即协同请求和协同通道.SYNBit=1 Seq=y (B)
- B端已经收到A端的
- 第三次握手(A->B):
- A端已经收到B端
链接响应
. 所以A->B
的发送通道已经建立. 下一次发送从Seq=x+1
发送即可. - A端也收到B端的
建立链接请求
. A端也要准备接收B端的消息. 所以ACKBit=1 ACKnum=y+1 (响应B)
- A端已经收到B端
- B端接收A端的第三次请求. 链接执行完毕. 其中B发送给A时, 可以拆分成2次发送. 即
4次握手
.
总体上来说发送了3次请求链接和3次接收. 其实个人觉得3次握手这个名字起的并不是很好. 这只能表示一个建立链接的双向流程.
为什么要3次握手?
答: 因为TCP请求是基于链接的稳定传输, 且链接通道是双向的. 在发送请求时, 需要双方都进行链接确认. (确认双方的消息发送和接收能力)
- 第一次A向B发送链接请求.
- 第二次 B响应A的链接请求. 并发送自己的链接请求B->A.
- 第三次 A收到B的响应通知. 并收到B的链接建立请求. 所以需要发送 B的链接请求响应.
- 第四段 B接收到A的响应通知.
感谢好兄弟. 终于懂了.
- 书上的解释 (个人感觉这不是原因, 而是可能产生的一个现象)
书上的解释: “为什么A最后还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而“产生错误。
所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况,A发出连接请求,但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B,没有“已失效的连接请求报文段”。
现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用报文握手,那么只要B发出确认,新的连接就建立了。”
四次挥手
四次挥手在链接断开时发送. 其主要流程如下所示:
- A->B A端发送链接断开请求.
(FINbit=1 Seq=x) (A)
- B->A:
- 接收A端链接断开请求. 并发送收到响应.
(ACKbit=1, ACKnum=x+1) (响应A)
- 但是此时. B端之前向A发送端数据流还没结束. 所以还在继续发送数据.
- 接收A端链接断开请求. 并发送收到响应.
- B->A
- B向A发送的数据流已经结束. 发送断开链接请求.
(FINBit=1,seq=y) (B)
- B向A发送的数据流已经结束. 发送断开链接请求.
- A->B
- A 收到B发送的断开链接请求. 发送响应
(ACKbit=1, ACKnum=y+1)(响应B)
- A 收到B发送的断开链接请求. 发送响应
- B
- B端收到A发送的响应.
为什么要四次挥手?
- 首先还是因为TCP是一个可靠的, 基于链接的双向协议. 链接断开必须要经过双方确认.
- 为什么是
四次
而不是三次
? 因为A发送链接断开请求时. B还有数据没有发送完毕. 待B发送完毕后又发送了一遍请求. 所以是四次而不是三次.
Others
-
ACK
ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。
百度词条-ACK -
SYN
SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
TCP连接的第一个包,非常小的一种数据包。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。每个机器的欺骗包都要花几秒钟进行尝试方可放弃提供正常响应。
百度词条-SYN -
数据报文
Reference
[1]. “三次握手,四次挥手”你真的懂吗?
[2]. [计算机网络-谢希仁]
[3]. TCP 为什么三次握手而不是两次握手(正解版)
[4]. 为什么有三次握手和四次挥手(传统答复 存疑)