目录
一、三次握手和四次挥手的目的
二、TCP可靠的方面
三、什么是三次握手
四、第三次握手的目的
五、什么是四次挥手
六、超时时间的目的
七、SYN包、ACK包、FIN包
八、解决丢包和乱序
九、参考资料
一、三次握手和四次挥手的目的
TCP三次握手的目的主要是为了确保两个网络端点(即客户端和服务器)在数据传输开始前能够建立一个可靠的连接。
TCP四次挥手的目的是为了正确、可靠地终止两个网络端点(客户端和服务器)之间的已建立连接。这个过程确保了双方都有机会完成数据的发送和接收,同时正确地关闭连接。
这两个目的也就造就了TCP连接、可靠的特点。
二、TCP可靠的方面
1.序列号和确认应答:
TCP为每个发送的数据包分配一个序列号,并要求接收端对收到的数据包发送确认应答(ACK)。如果发送端在合理的超时时间内没有收到确认应答,它会重新发送该数据包。这确保了数据的有序传输和不丢失。
2.数据重传:
如果因为网络拥堵、路径变化或其他原因导致数据包丢失或错误,TCP会自动重传这些数据包,直到收到确认应答为止。这保证了数据的可靠传输。
3.流量控制:
TCP使用窗口大小控制机制来防止发送方过快发送数据,使得接收方来不及处理。窗口大小可以动态调整,以适应接收方的处理能力,避免数据溢出。
4.拥塞控制:
TCP实现了拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复),以减少网络拥堵情况下的数据包丢失。这些算法通过动态调整数据的发送速率来适应网络状况。
5.有序数据传输:
即使数据包在网络中的传输过程中到达顺序发生了变化,TCP也能确保数据以正确的顺序交付给应用程序。
6.错误检测:
TCP头包含了校验和字段,用于检测数据在传输过程中是否出现错误。如果检测到错误,受影响的数据包将会被丢弃并重新请求传输。
三、什么是三次握手
客户端先向服务端发送 SYN 包请求建立连接,然后服务端向客户端发送 SYN+ACK 包同意连接,客户端收到 SYN+ACK 包后发送 ACK 包,服务端收到这个 ACK包 后,连接建立。因为这个过程中互相发送了三包数据,所以称之为三次握手。
四、第三次握手的目的
客户端先向服务端发送 SYN 包请求建立连接,然后服务端向客户端发送 SYN+ACK 包同意连接后大可以直接连接,为什么客户端要再发送一个 ACK 包,服务端接收到这个 ACK 包后再进行连接?
这是为了防止失效的连接请求突然被接受,如果一个旧的连接请求在网络中延迟,并在连接已经建立后到达,三次握手可以帮助识别和拒绝这些失效的请求,避免可能的连接混乱。
例如:client端先向server端发送一个 SYN1 包请求建立连接,但是这个 SYN1 包在网络中延迟没有到达server端,client端又向server端发送一个 SYN2 包请求建立连接,SYN2 包到达了server端,如果紧接着 SYN1 包也到达了server端,那么对于server端来说认为client端建立了两次连接,而client端任务连接了一次连接。
五、什么是四次挥手
下面假设主动关闭方为客户端,被动关闭方为服务端。
客户端发起连接终止请求:发送一个 FIN 包,表示它已经完成了数据发送,并希望关闭连接。
服务端关闭确认收到 FIN 包:发送一个 ACK 包来确认收到的 FIN 包。
服务端关闭发送自己的 FIN 包:发送一个 FIN 包,表示它也准备好关闭连接。
客户端确认收到对方的 FIN 包:发送一个 ACK 包来确认收到的 FIN 包。
服务端收到 ACK 包 后立即关闭连接,客户端必须要经过超时时间(Timeout)后关闭连接。
六、超时时间的目的
超时时间(Timeout)主要用于确保连接能够在特定时间内正确地终止,即使在面对网络延迟、数据包丢失或对方无响应等不稳定因素时也能保证连接的可靠关闭。
例如:FIN-WAIT-2 发送的 ACK 包在网络中丢失了或者因为延迟被关闭方迟迟没有收到 ACK 包,此时如果关闭方关闭连接,被关闭方收不到 ACK 包就会一直处于等待关闭的状态,为了避免这种情况,关闭方必须进行一段超时时间等待,以便被关闭方重新发送一个 FIN 包,关闭方则会重发一个 ACK 包。
七、SYN包、ACK包、FIN包
TCP协议中,SYN包和ACK包是用于建立、确认和管理连接的重要控制包。它们在三次握手和四次挥手过程中起着关键作用:
(一)、SYN包(同步包)
全称:Synchronize packet
作用:用于发起和建立一个新的TCP连接。SYN包是TCP连接建立过程中发送的第一个包。
特性:SYN包包含一个同步标志位(SYN=1)和初始序列号。它不包含实际的数据,只是用于连接初始化。
使用场景:在三次握手的第一步和第二步中使用。
第一步:客户端向服务器发送一个SYN包,以请求建立连接。
第二步:服务器收到SYN包后,回送一个包含SYN和ACK标志的包(SYN=1, ACK=1),以确认收到客户端的请求。
(二)、ACK包(确认包)
全称:Acknowledgment packet
作用:用于确认已经接收到的数据包。ACK包是TCP协议中几乎每个数据包都会带有的一个标志,用于确保数据的可靠传输。
特性:ACK包包含一个确认标志位(ACK=1)和确认号。确认号是对已成功接收到的数据包的下一序列号。
使用场景:三次握手:第二步:服务器向客户端发送SYN+ACK包,确认收到客户端的SYN请求,同时向客户端发送自己的SYN请求。
第三步:客户端收到服务器的SYN+ACK包后,回送一个ACK包(ACK=1),确认收到服务器的SYN请求。
四次挥手:每一步:在连接的终止过程中,双方发送FIN包(结束标志),并对收到的FIN包发送ACK包以确认。
数据传输:在数据传输过程中,每发送一个数据包后,接收方都会发送一个ACK包来确认接收到的数据,确保数据的可靠传输。
三次握手过程中的SYN和ACK包示意图:
①客户端 -> 服务器:
SYN=1, Seq=x
②服务器 -> 客户端:
SYN=1, ACK=1, Seq=y, Ack=x+1
③客户端 -> 服务器:
ACK=1, Seq=x+1, Ack=y+1
通过这些控制包,TCP能够建立可靠的连接,确保数据的有序和完整传输。
(三)、FIN包(结束包)
全称:Finish packet
作用:用于终止一个TCP连接。FIN包表示发送方已经完成数据发送,并希望关闭连接。
特性:FIN包包含一个结束标志位(FIN=1),通常还包括一个序列号。它不包含实际的数据。
使用场景:在四次挥手过程中使用。
四次挥手过程的详细示意图:
客户端 -> 服务器:
FIN=1, Seq=u
服务器 -> 客户端:
ACK=1, Seq=v, Ack=u+1
服务器 -> 客户端:
FIN=1, Seq=w
客户端 -> 服务器:
ACK=1, Seq=u+1, Ack=w+1
通过这种方式,TCP确保在关闭连接时,双方都能完成数据发送和接收,并且资源能够被正确释放,避免了潜在的资源泄露和连接混乱问题。这种优雅的关闭过程确保了网络通信的可靠性和稳定性。
八、解决丢包和乱序
推荐大家观看视频一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili
一包数据有可能会被拆成多包发送,如何处理丢包问题;这些数据包到达的先后顺序不同,如何处理乱序问题。
针对这些要求,TCP协议为每一个连接建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。
发送数据时从发送缓冲区取一部分数据组成发送报文,在发送报文 tcp 协议头中会附带序列号和长度,接受端在收到数据后需要回复确认报文,确认报文中的 ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式能够使发送端确认发送的数据已经被对方收到,发送端也可以一次发送连续的多包数据,接收端只需要回复一次ACK就可以了。
这样发送端可以把待发送的数据分割成一系列的碎片发送到对端,对端根据序列号的长度在接收后重构出完整的数据,假设其中丢失了某些数据包,则接收端可以要求发送端重传。
比如丢失了100-199这100个字节,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包数据,接收端进行补齐。以上过程不区分客户端和服务端,tcp 连接是全双工的,对于两端来说均采用上述机制。
九、参考资料
谢希仁. 计算机网络(第8版). 电子工业出版社. 2021
https://www.youtube.com/watch?v=Iuvjwrm_O5g
TCP三次握手和四次挥手_哔哩哔哩_bilibili
一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili